sorliran1 发表于 2012-4-9 20:01:45

Verilog 写LCD1602 IP时一个搞不懂的问题?很诡异

本帖最后由 sorliran1 于 2012-4-9 20:03 编辑

写代码时碰到的搞不懂的一个问题,很诡异,求朋友解答我的疑惑,真的很奇怪。。
下面是,我写的LCD控制器的部分代码:
module LCD_Control(
                                        iSTART,iDATA,iRS,iCLK,iRST,
                                        LCD_DATA,LCD_EN,LCD_RW,LCD_RS,LCD_ON,LCD_BLON);
                                       
input iSTART,iRST,iCLK;
input iDATA;
input iRS;
output LCD_RW,LCD_ON,LCD_BLON;
output LCD_RS;
output reg LCD_EN;
output LCD_DATA;

///////////默认信号设置////////////////////
wire LCD_RW=1'b0;//只写
wire LCD_ON=1'b1;        //LCD电源开关,置1
wire LCD_BLON=1'b1;
///////////////////////////////////////////
assign LCD_DATA=iDATA;
assign LCD_RS=iRS;

////////////Internal Resigter//////////////
reg ST;//状态寄存器
reg count;
reg count0;
//reg count1;
///////////////状态表//////////////////////
parameter IDLE=7'b0000001;
parameter    A=7'b0000010;
parameter    B=7'b0000100;
parameter    C=7'b0001000;
parameter    D=7'b0010000;
parameter    E=7'b0100000;
parameter    F=7'b1000000;
///////////////iSTART的上升沿检测//////////
reg Pre_start;

always @(posedge iCLK or negedge iRST)
begin
if(!iRST)
        Pre_start<=1'b0;
else
        Pre_start<=iSTART;//注:iSTART连接着write
end

////////////////主状态机///////////////////
always @(posedge iCLK or negedge iRST)
begin
        if(!iRST)
                begin
                        ST<=IDLE;
                        count<=4'b0000;
                        count0=2'b00;
                        LCD_EN<=1'b0;
                end
        elseif(iSTART)
                case(ST)
                        IDLE:        if(count0==2'b11)
                                        begin
                                                ST<=A;
                                                count0<=2'b00;
                                        end
                                        else
                                                count0<=count0+1;
                           A:        begin
                                                LCD_EN<=1'b1;
                                                ST<=B;
                                        end
                           B:        if(count==4'hf)
                                        begin
                                                ST<=C;
                                                count<=4'h0;                                               
                                        end
                                        else
                                                count<=count+1;       
                           C:        begin
                                        LCD_EN<=1'b0;
                                        if({Pre_start,iSTART}==2'b01) //iSTART的上升沿检测
                                                ST<=IDLE;
                                        else
                                                ST<=C;               
                                end
                endcase
end


endmodule
注意我的状态C是这样写的:
                           C:        begin
                                        LCD_EN<=1'b0;
                                        if({Pre_start,iSTART}==2'b01) //iSTART的上升沿检测
                                                ST<=IDLE;
                                        else
                                                ST<=C;               
                                end
仿真后,结果是对的,与想象中的相符,如下图:
注意,程序能将LCD_EN拉高后再拉低,检测到write信号第二个上升沿,然后再将LCD_EN拉高之后再拉低


可是当我把状态C分成两部分后写,如下:

                           C:        begin
                                                LCD_EN<=1'b0;
                                                ST<=D;
                                        end        
                          D:        begin
                                        if({Pre_start,iSTART}==2'b01) //iSTART的上升沿检测
                                                ST<=IDLE;
                                        else
                                                ST<=D;               
                                end               
结果就不行了,仿真如下:

LCD_EN拉低后就不能拉高了,并且在wirte信号的第二个上升沿到达后,LCD_EN依旧没有变化,不知道这是为什么???????小弟不才,求人解答!!QQ:793679231
页: [1]
查看完整版本: Verilog 写LCD1602 IP时一个搞不懂的问题?很诡异