1732|3

3241

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

这条语句到底什么意思?怎么理解? [复制链接]

我看到一个verilog驱动LCD1602的程序,代码如下:

module LCD1602(                //50Mhz
         clk,rst_n,            //input
          
         lcd_en,lcd_rw,lcd_rs,  
         lcd_data
);
 
input clk,rst_n;
output lcd_rw;
output reg lcd_rs;
output wire lcd_en;
output reg [7:0] lcd_data;
//-------------------------------------

assign lcd_rw=1'b0;     //设置高延迟 就不check busy 无需读取状态
//--------------input clk 50000,000----------------------
//---------------2^16==65536>50000 1ms-------------------
//------------------------分频成1ms---------------------
reg [15:0] cnt;
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n) cnt<=16'b0;
    else if(cnt==50_000) cnt<=16'b0;
    else cnt=cnt+1'b1;
end
 
reg [3:0] ms;
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n) ms<=1'b0;
    else if(cnt==50_000) ms<=ms+1'b1;
end
 
//--------------------------------------------------------
//初始化以及显示字符  只初始化一次 一直显示一个字符
parameter lcd1=4'b0000;
parameter lcd2=4'b0001;
parameter lcd3=4'b0010;
parameter lcd4=4'b0011;
parameter lcd5=4'b0100;
parameter lcd6=4'b0101;
parameter lcd7=4'b0110;
parameter lcd8=4'b0111;
parameter lcd9=4'b1000; 
//状态转移
reg [2:0] current_state,next_state;
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n) current_state<=0;
    //一开始设置的条件是  ms==15 但是时钟是clk 所以状态会一直转移 无法正确驱动lcd
    // add cnt==16'h0000   确保状态只转移一次
    else if(ms==15 && cnt==16'h0000)  
         current_state<=next_state; 
end
 
//判断下一个状态 初始化完了之后一直循环1个状态
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n) next_state<=lcd1;
    else
     case(current_state)
      lcd1:next_state<=lcd2;
      lcd2:next_state<=lcd3;
      lcd3:next_state<=lcd4;
      lcd4:next_state<=lcd5;
      lcd5:next_state<=lcd6;
      lcd6:next_state<=lcd7;
      lcd7:next_state<=lcd8;
      lcd8:next_state<=lcd8;
		//lcd9:next_state<=lcd9;
     endcase
end
 
//根据状态输出相应数据
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n) 
    begin
        lcd_rs=0;
    end
    else
     case(current_state)
      lcd1:begin lcd_rs=0; lcd_data=8'h38; end
      lcd2:begin lcd_rs=0; lcd_data=8'h08;  end
      lcd3:begin lcd_rs=0; lcd_data=8'h01;  end
      lcd4:begin lcd_rs=0; lcd_data=8'h06;  end
      lcd5:begin lcd_rs=0; lcd_data=8'h0c;  end
      lcd6:begin lcd_rs=1; lcd_data="h";  end       //cs
      lcd7:begin lcd_rs=1; lcd_data="a";  end       //show
      lcd8:begin lcd_rs=1; lcd_data="h";  end       //cs
		//lcd9:;       //cs    
		//default:;
     endcase
end
 
//----------------lcd_en使能1ms---------------------
assign lcd_en=current_state==lcd8?1'b0:ms==15?1'b1:1'b0;
//assign lcd_en=current_state==lcd8?1'b0:ms==15?(cnt[15]==1?1'b1:1'b0):1'b0;  //以上会多输出一个a
endmodule 

程序下载进去,按道理讲应该显示"hah",可是显示“haa”

还有这一句:

assign lcd_en=current_state==lcd8?1'b0:ms==15?1'b1:1'b0;

这条语句应该怎么理解?我被她绕晕了。谢谢!

最新回复

assign lcd_en=current_state==lcd8?1'b0:ms==15?1'b1:1'b0; if (current_state==lcd8) lcd_en=1'b0 else if(ms==15) lcd_en=1'b1 else lcd_en=1'b0   详情 回复 发表于 2022-10-17 00:31
点赞 关注
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
 

回复
举报

11

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
这个“?”应该是表示判断的,若成立则执行后面语句,不成立则执行“:”后面的语句,你这是你这条代码相当于有两条判断语句嵌套
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

assign lcd_en=current_state==lcd8?1'b0:ms==15?1'b1:1'b0;

if (current_state==lcd8) lcd_en=1'b0

else

if(ms==15) lcd_en=1'b1

else

lcd_en=1'b0

 
 
 

回复

3241

帖子

0

TA的资源

纯净的硅(高级)

4
 

谢谢两位

个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表