搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2012-4-9 20:01:45 | 显示全部楼层 |阅读模式
本帖最后由 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, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 11:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表