找回密码
 注册
关于网站域名变更的通知
查看: 167|回复: 2
打印 上一主题 下一主题

这条语句到底什么意思?怎么理解?

[复制链接]
  • TA的每日心情
    慵懒
    2022-1-21 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2022-10-24 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x

    我看到一个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
    • ! K  K1 y5 F2 t4 O" ^* o0 X

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

    还有这一句:

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

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


    + ]$ u, e3 T  g( @# M' q( u
  • TA的每日心情
    开心
    2022-1-21 15:22
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2022-10-24 13:11 | 只看该作者
    这个“?”应该是表示判断的,若成立则执行后面语句,不成立则执行“:”后面的语句,你这是你这条代码相当于有两条判断语句嵌套
  • TA的每日心情
    开心
    2022-1-29 15:05
  • 签到天数: 2 天

    [LV.1]初来乍到

    3#
    发表于 2022-10-24 13:20 | 只看该作者
    assign lcd_en=current_state==lcd8?1'b0:ms==15?1'b1:1'b0;& G  w; p. p" x3 |! J9 e
    if (current_state==lcd8) lcd_en=1'b0, p; m' S5 T5 x2 V
    else  z) _3 V1 ^  [. ?4 V
    if(ms==15) lcd_en=1'b1- `5 P& W& |5 d( D. K9 [- X
    else
    : b+ i* B# V& z* n. @lcd_en=1'b0
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-20 20:51 , Processed in 0.109375 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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