|
本帖最后由 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 [7:0]iDATA;
input iRS;
output LCD_RW,LCD_ON,LCD_BLON;
output LCD_RS;
output reg LCD_EN;
output [7:0]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 [3:0]ST; //状态寄存器
reg [3:0]count;
reg [1:0]count0;
//reg [15:0]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
else if(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 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|