?? lcm240128zk03_interface.v
字號:
/****************************************Copyright (c)**************************************************
** 張敏 西北核技術研究所一室 2008
**
**--------------File Info-------------------------------------------------------------------------------
** File name: lcm240128zk03.v
** Last modified Date: 2008-7-26
** Last Version: 1.0
** Descriptions: lcm240128zk03控制邏輯
**------------------------------------------------------------------------------------------------------
** Created by: 張敏 西北核技術研究所一室
** Created date: 2008-7-26
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
module lcm240128zk03_interface(
//模塊輸入
clk,
reset_n,
lcd_int,
chipselect,
read,
write,
lcd_busy,
address,
writedata,
//模塊輸出
lcd_rs,
lcd_rw,
lcd_en,
lcd_cs1,
lcd_cs2,
lcd_rst,
irq, //LCD 中斷信號
readdata,
lcd_data //lcd 數據線
);
//Inputs
input clk; //Input Clock
input reset_n; //Reset
input lcd_int; //lcd 中斷
input chipselect; //Avalon Chip select signal
input read; //Avalon read
input write; //Avalon read signal
input lcd_busy; //lcd busy
input [1:0] address;//Avalon Address bus
input [7:0] writedata;//Avalon ritedata
//Outputs
output lcd_rs; //lcd 指令、數據控線
output lcd_rw; //lcd 讀寫線
output lcd_en; //lcd 使能線
output lcd_cs1; //lcd cs1
output lcd_cs2; //lcd cs2
output lcd_rst; //lcd rst
output irq; //lcd 中斷
output reg [7:0] readdata; //IP的輸出,LCD寄存器的值
//inout
inout reg [7:0] lcd_data;//lcd 數據線
//中間寄存器聲明
reg lcd_rs_r; //lcd rs
reg lcd_rw_r; //lcd rw
reg lcd_en_r; //lcd en
reg lcd_rst_r; //lcd rst
reg [10:0] timecount; //狀態機狀態變量
//寄存器輸出
assign irq = lcd_int; //直接將LCD中斷向上報告
assign lcd_cs1 = 1'h0; //直接將LCD cs1 置0
assign lcd_cs2 = 1'h1; //直接將LCD cs2 置1
assign lcd_rs = lcd_rs_r;
assign lcd_rw = lcd_rw_r;
assign lcd_en = lcd_en_r;
assign lcd_rst = lcd_rst_r;
//初始化狀態
initial
begin
readdata<=8'h0;
lcd_rs_r<= 1'h1;
lcd_rw_r<= 1'h1;
lcd_en_r<= 1'h0;
lcd_rst_r<= 1'h1;
lcd_data<=8'h0;
timecount = 10'h0;
end
//合成讀、寫控制
wire read_act;
assign read_act = chipselect & read;
wire write_act;
assign write_act = chipselect & write &!lcd_busy;
parameter tcntwritemax = 10'h37;//寫LCD比較耗時,一般需要用到55個時鐘周期約550ns
//write and read
always @(posedge clk )
begin
if (write_act && !read_act)//AVALON 寫數據
begin
case (address)
2'h0: //寫指令
begin
/*
LCD_ChkBusy(); //Call LCD_ChkBusy to Check Busy Bit
LCD_Command = Cmd_Data;
P2 = 0x91;
EN = 1;
_nop_();
EN = 0;
P2 = 0x93;
*/
if(timecount==10'h0)//首先配置RS、RW,輸出數據
begin
lcd_rs_r<= 1;//指令
lcd_rw_r<= 0;//寫入
lcd_data<=writedata;//將指令輸出到LCD的數據線
end
else if(timecount==10'h8)//第8個時鐘周期輸出lcd的enable高電平,以100M計地址、數據的建立時間約80ns,符合63ns的最小要求
begin
lcd_en_r<= 1;
end
else if(timecount==10'h35)//0x35=53輸出lcd的enable低電平,以100M計地址、enable的脈寬約450ns,符合400ns的最小要求
begin
lcd_en_r<= 0;
end
else if(timecount==10'h37)//0x37=55可以拆消地址和數據了,以100M計地址、數據的保持時間約20ns,符合10ns的最小要求,至此寫數據就已經完成了
begin
lcd_rs_r<= 1;//指令
lcd_rw_r<= 1;//讀入
lcd_data<=8'h0;//將LCD的數據線置0
end
else if(timecount>=10'h0 && timecount<=tcntwritemax)
begin
end
else
begin
readdata<=8'h0;
lcd_rs_r<= 1'h1;
lcd_rw_r<= 1'h1;
lcd_en_r<= 1'h0;
lcd_data<=8'h0;
timecount = 10'h0;
end
if(timecount<=tcntwritemax&&timecount>=0) begin timecount = timecount+1; end
else begin timecount =0; end
end
2'h1: //寫數據
begin
/*
LCD_ChkBusy(); //Call LCD_ChkBusy to Check Busy Bit
LCD_Data = Data_Data;
P2 = (0x90);
EN = 1;
_nop_();
EN = 0;
P2 = (0x93);
*/
if(timecount==10'h0)//首先拉低RS、RW,輸出數據
begin
lcd_rs_r<= 0;//數據
lcd_rw_r<= 0;//寫入
lcd_data<=writedata;//將數據輸出到LCD的數據線
end
else if(timecount==10'h8)//第8個時鐘周期輸出lcd的enable高電平,以100M計地址、數據的建立時間約80ns,符合63ns的最小要求
begin
lcd_en_r<= 1;
end
else if(timecount==10'h35)//0x35=53輸出lcd的enable低電平,以100M計地址、enable的脈寬約450ns,符合400ns的最小要求
begin
lcd_en_r<= 0;
end
else if(timecount==10'h37)//0x37=55可以拆消地址和數據了,以100M計地址、數據的保持時間約20ns,符合10ns的最小要求,至此寫數據就已經完成了
begin
lcd_rs_r<= 1;//指令
lcd_rw_r<= 1;//讀入
lcd_data<=8'h0;//將LCD的數據線置0
end
else if(timecount>=10'h0 && timecount<=tcntwritemax)
begin
end
else
begin
readdata<=8'h0;
lcd_rs_r<= 1'h1;
lcd_rw_r<= 1'h1;
lcd_en_r<= 1'h0;
lcd_data<=8'h0;
timecount = 10'h0;
end
if(timecount<=tcntwritemax&&timecount>=0) begin timecount = timecount+1; end
else begin timecount =0; end
end
2'h2: //重啟LCK,由于RESET時延要求100ms ,過長,無法由硬件產生這么長的時序,改由上層軟件分兩次控制
begin
//使用方法為:RESET_LCM240128(base,0),100ms后再RESET_LCM240128(base,1)
lcd_rst_r <= writedata[0];
end
default: //非法地址,將各路信號置為默認狀態
begin
//readdata<=8'h0;
lcd_rs_r<= 1'h1;
lcd_rw_r<= 1'h1;
lcd_en_r<= 1'h0;
lcd_data<=8'h0;
timecount = 10'h0;
end
endcase
end if (read_act && !write_act)//AVALON 讀數據,讀數據只用0個等待周期
begin
case (address)
2'h0: //讀指令
begin//未用到,返回0
readdata <= 8'h0;
end
2'h1: //讀數據
begin//未用到,返回0
readdata <= 8'h0;
end
2'h2: //讀取LCD的BUSY情況
begin
//使用方法為:CHECK_BUSY_LCM240128(base)
readdata <= {7'h0,lcd_busy};
end
default: //非法地址,將各路信號置為默認狀態
begin
readdata<=8'h0;
lcd_rs_r<= 1'h1;
lcd_rw_r<= 1'h1;
lcd_en_r<= 1'h0;
lcd_data<=8'h0;
timecount = 10'h0;
end
endcase
end
else if(lcd_busy)//如果處于忙碌狀態,則跳過此次操作,嚴格來講,應該是busy只影響寫操作
begin
end
else//非讀、非寫、非忙時,將各路信號置為默認狀態
begin
readdata<=8'h0;
lcd_rs_r<= 1'h1;
lcd_rw_r<= 1'h1;
lcd_en_r<= 1'h0;
lcd_data<=8'h0;
timecount = 10'h0;
end
end
endmodule
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -