適用於DE2-70
S0-S7 狀態顯示於LEDG[2:0]
LEDG[7] 顯示Reset_Delay 完成
最後ADDR , 及InData 設定LCD1602 顯示的位置及字形
//*************************************
// LCM 液晶顯示模組
module LCM (CLOCK_50,KEY,LCD_DATA,LEDG,
LCD_EN,LCD_RS,LCD_RW,LCD_ON,LCD_BLON
);
input CLOCK_50;
input [3:0]KEY;
inout [7:0] LCD_DATA;
output [7:0] LEDG;
output LCD_EN;
output LCD_RS;
output LCD_RW;
output LCD_ON;
output LCD_BLON;
wire [7:0]ADDR;
wire [7:0]InData;
wire RTSN;
assign RSTN=KEY[0];
wire [7:0] LCD_DATA;
wire LCD_RS;
wire LCD_RW;
wire LCD_EN;
wire DLY_RST;
assign LCD_ON=1'b1;
assign LCD_BLON=1'b0;
assign ADDR=8'h81; //setting Address
assign InData=8'h41; //Setting Data
Reset_Delay r0(.iCLK(CLOCK_50),.iRST(RSTN),.oRESET(DLY_RST));
assign LEDG[7]=DLY_RST;
//module LCD_1602(Clk10M,Clr,EN,RS,RW,D,Cs);
LCD_1602(
.Clk10M(CLOCK_50),
.Clr(DLY_RST),
.ADDR(ADDR),
.InData(InData),
.EN(LCD_EN),
.RS(LCD_RS),
.RW(LCD_RW),
.D(LCD_DATA),
.Cs(LEDG[2:0])
);
endmodule
//*************************************
module Reset_Delay(iCLK,iRST,oRESET);
input iCLK;
input iRST;
output reg oRESET;
reg[19:0] Cont;
always@(posedge iCLK or negedge iRST)
begin
if (!iRST)
Cont<=20'h0;
else if(Cont!=20'hfffff)
begin
Cont<=Cont+1'b1;
oRESET<=1'b0;
end
else
oRESET<=1'b1;
end
endmodule
//*************************************
module LCD_1602(Clk10M,Clr,ADDR,InData,EN,RS,RW,D,Cs);
input Clk10M,Clr; // 一位元輸入
input [7:0] ADDR;
input [7:0] InData;
output EN,RS,RW; // 一位元輸出
output [7:0] D; // 八位元輸出
output [2:0] Cs; // 二位元輸出
reg Clk,Clk_en; // 宣告為暫存器資料
reg [7:0] D; // 宣告為暫存器資料
wire [7:0] ADDR,InData;
reg [23:0] Cnt; // 宣告為暫存器資料
reg [1:0] Cn; // 宣告為暫存器資料
reg [2:0] Cs, Ns; // 宣告為暫存器資料
parameter [2:0] // 宣告狀態參數, 二進制編碼
S0=3'b000, S1=3'b001, S2=3'b010, S3=3'b011,
S4=3'b100, S5=3'b101, S6=3'b110, S7=3'b111;
// 除頻
always@ (posedge Clk10M or negedge Clr)
begin
if(!Clr)
Cnt = 0;
else
Cnt = Cnt + 1;
//Clk = Cnt[0]; // 模擬用
Clk = Cnt[23]; // 實際電路用
end
// 取得 Clk_state, Clk_en
always@ (posedge Clk or negedge Clr)
begin
if (!Clr)
begin
Cn = 0;
Cs = 3'b000;
end
else if (Cn == 2'b10)
begin
Cn = 0;
Cs = Ns;
end
else
Cn = Cn + 1;
Clk_en = Cn[0];
end
// 決定次一狀態 Ns 與輸出 Q, 組合邏輯電路
always@ (Cs)
case (Cs)
S0 : begin
Ns = S1;
D = 8'b00111000; // 8'h38
end
S1 : begin
Ns = S2;
D = 8'b00111000; // 8'h38
end
S2 : begin
Ns = S3;
D = 8'b00001110; // 8'h0E
end
S3 : begin
Ns = S4;
D = 8'b00000110; // 8'h06
end
S4 : begin
Ns = S5;
D = 8'b00000001; // 8'h01
end
S5 : begin
Ns = S6;
D = ADDR; //8'b11000100; // 8'hC4
// DD RAM ADDRESS 8'h44
end
S6 : begin
Ns = S7;
D = InData; //8'b01000001; DD RAM DATA 8'h41='A'
end
S7 : begin
Ns = S7;
D = 8'b00000000;
end
endcase
assign EN = (Cs == S7) ? 0 : Clk_en;
assign RS = (Cs == S6) ? 1 : 0;
assign RW = 0;
endmodule
//*************************************
沒有留言:
張貼留言