always@(posedge clk or negedge rst) begin if(!rst) begin
count<=0;
state<=Warmup; end else
begin
case(state) Warmup: begin
if(clk_en) begin if(count==4'b0111) begin
state<=Funcset; count<=0; end else
begin
state<=Warmup;
count<=count+4'b0001; end end end Funcset: begin
if(clk_en) begin
if(count==4'b1111) begin
state<=Dspoff; count<=0; end else
begin
state<=Funcset;
count<=count+4'b0001; end end end
Dspoff:
state<=Clsdsp;
Clsdsp: begin
if(clk_en) begin
if(count==4'b0101) begin
state<=Modeset; count<=0; end else
begin
state<=Clsdsp;
count<=count+4'b0001; end end end
Modeset: begin
if(clk_en)
state<=Dspon; end Dspon:
begin
if(clk_en) begin if(count==4'b0100) begin
state<=Setaddr1; count<=0; end else
begin
state<=Dspon;
count<=count+4'b0001; end end end
Setaddr1: begin
if(clk_en) state<=Indata1; end Indata1: begin
if(clk_en) begin
if(count==4'b1101) begin
state<=Setaddr2; count<=0; end else
begin
state<=Indata1;
count<=count+4'b0001; end end end
Setaddr2: begin
if(clk_en) state<=Indata2; end Indata2: begin
if(clk_en) begin if(count==4'b1001) begin
state<=Setaddr1; count<=0; end else
begin
state<=Indata2;
count<=count+4'b0001; end end end
default:state<=Warmup; endcase end end
always @(state or count or lcd_data_in) begin
case(state) Warmup: begin RS<=0; RW<=0;
lcd_data_out<=8'b00000000; end
Funcset:lcd_data_out<=8'b00111000; Dspoff: lcd_data_out<=8'b00001000; Clsdsp: lcd_data_out<=8'b00000001; Modeset:lcd_data_out<=8'b00000110; Dspon: lcd_data_out<=8'b00001100; Setaddr1:begin RS<=0; RW<=0;
lcd_data_out<=8'b10000000; end Indata1:begin RS<=1; RW<=0;
case(count)
4'b0000:lcd_data_out<={4'b0011,lcd_data_in[27:24]}; 4'b0001:lcd_data_out<={4'b0011,lcd_data_in[23:20]}; 4'b0010:lcd_data_out<={4'b0011,lcd_data_in[19:16]};
4'b0011:lcd_data_out<={4'b0011,lcd_data_in[15:12]}; 4'b0100:lcd_data_out<=8'b00101110;
4'b0101:lcd_data_out<={4'b0011,lcd_data_in[11:8]}; 4'b0110:lcd_data_out<={4'b0011,lcd_data_in[7:4]}; 4'b0111:lcd_data_out<={4'b0011,lcd_data_in[3:0]}; 4'b1000:lcd_data_out<=8'b00100000; 4'b1001:lcd_data_out<=8'b00100000; 4'b1010:lcd_data_out<=8'b00100000; 4'b1011:lcd_data_out<=8'b00100000; 4'b1100:lcd_data_out<=8'b00100000; default:lcd_data_out<=8'b00100000; endcase end
Setaddr2:begin RS<=0; RW<=0;
lcd_data_out<=8'b11000000; end Indata2:begin RS<=1; RW<=0;
case(count)
4'b0000:lcd_data_out<=8'b00100000; 4'b0001:lcd_data_out<=8'b00100000; 4'b0010:lcd_data_out<=8'b00100000; 4'b0011:lcd_data_out<=8'b00100000; 4'b0100:lcd_data_out<=8'b00100000;
相关推荐: