FPGA|CPLD|ASIC论坛
直播中

chenbingjy

13年用户 430经验值
擅长:嵌入式技术 嵌入式
私信 关注
[问答]

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

我看到一个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;

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

回帖(3)

卿小小_9e6

2022-10-14 21:26:50

最佳答案

//------显示“haa”的原因不知。
你贴出来的应该不是原始代码吧,貌似是被你魔改之后出了问题。
建议仿真一下,或者添加DEBUG接口观察信号状态。
//------assign语句
  1. //------assign语法
  2. assign条件判断语句/条件赋值语句。下面两条语句是等效的。
  3. assign result = a?a1:b?b1:0;
  4. assign result = (a)? a1 : ((b) ? b1 : 0);
  5. 1.条件a成立的化,result赋值a1;
  6. 2.条件a不成立,则赋值给(b?b1:0);
  7. 3.条件b成立(此时a不成立),则result赋值b1;
  8. 4.条件b不成立(此时a不成立),则result赋值0.
  9. //------现在说你的代码
  10. assign lcd_en=current_state==lcd8?1'b0:ms==15?1'b1:1'b0;
  11. 1.当前状态机是lcd8,则lcd_en=1'b0;
  12. 2.当前状态机不是lcd8,则判断ms=15是否成立:成立则lcd_en=1'b1,否则为1'b0。
举报

chenbingjy

2022-10-16 07:01:36
谢谢!是原始代码
举报

infortrans

2022-10-19 09:23:25
可以尝试添加一些括号,方便理解
1 举报
  • chenbingjy: 这是别人的代码。我不理解,不知道怎么加括号。

更多回帖

发帖
×
20
完善资料,
赚取积分