2012年11月21日 星期三

LAB07 LCD Display FSM有限狀態機方式

LAB07 LCD Display FSM有限狀態機方式 
適用於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

//*************************************

沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...