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]