希望能给跟我一样当时对这段程序有疑惑的同学有所帮助
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
key_reg <= 1'b1;
delay_cnt <= 32'd0;
end
else begin
key_reg <= key; //感到疑惑与不解的地方
if(key_reg != key) //一旦检测到按键状态发生变化(有按键被按下或释放)
delay_cnt <= 32'd1000000; //给延时计数器重新装载初始值(计数时间为20ms)
else if(key_reg == key) begin //在按键状态稳定时,计数器递减,开始20ms倒计时
if(delay_cnt > 32'd0)
delay_cnt <= delay_cnt - 1'b1;
else
delay_cnt <= delay_cnt;
end
end
end
为什么在这个顺序语句中先赋值再去判断,岂不是会得出一定相等的结果。
这个疑惑在我回溯基础的赋值方面的知识时找到了答案
(1).非阻塞(Non_Blocking)赋值方式( 如 b <= a; )
- 块结束后才完成赋值操作。
- b的值并不是立刻就改变的。
- 这是一种比较常用的赋值方法。(特别在编写可综合模块时)
非阻塞赋值是在结束后才会改变,在没有结束时还是上一个时序的值。