硬件描述语言的特点是所有语句并行执行。
可以这样简单理解,always语句中在时钟开始时,硬件瞬间将时钟沿到达前一时刻的所有值全部记录下来并锁死,然后硬件电路再根据记录下来的值完成所有需要的计算,再在时钟沿到达的一瞬间完成所有赋值。
其原因是无论触发器D端的值如何变化,其Q端的值只有在每个时钟沿到达时才进行更新。
这也就是为什么在时序逻辑中要采用非阻塞赋值,看似顺序执行的两条语句实际上是并行执行的,否则第47行两个寄存器内的值将永远相等,程序将无法正常工作
//内置计数器
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
key_flag <= 1'b1; //复位状态时,标志位无效
cnt <= 20'd0; //同时清零计数器
end
else begin
key_reg <= key; //给内部寄存器赋值
if(key_reg != key) //*47
cnt <= CNT_MAX; //如果检测到不相等则重置计数器
else begin
if(cnt > 20'd0)
cnt <= cnt - 1'b1; //相等时计数器开始工作
else
cnt <= 20'd0; //一直相等则保持计数器不工作
end
end
end