fpga中always时序模块对变量赋值(变量何时更新值)
在verilog语句中
一个always就是一个独立的程序块.
"独立"说明是,单独运行.
多个always之间是并行的.

通常情况下:
按照程序的习惯,最好是一个always只处理一个信号.否则容易逻辑混乱.
比如:
(如下图, 里面包含data和key两个变量,放到了一个always模块中 ,不推荐这种写法).

对于上面代码有些疑问,起中244行和245行:
// 在复位后,第一个时钟上升沿,key从0变为1,
//那么,第第一个时钟上升沿时,那一刻,key的值是多少?
key <= ~key;
// 上面key从上升沿的时候,从0变成了1,那么,下面的if是否满足呢?
if(key == 1)
data <= 1;
这里可以先给大家答案, 复位后第一个上升沿到来时,
key 的值是1.
if里key的值还没有来得及更新,所以data是0.

下面就开始分析一下:
上面代码虽然是一个always,
但是它包含了两个变量,所以,为了看清楚,可以把两个变量拆分到不同的always模块中,推荐这种风格的代码写法.
即:(这个代码和上面的代码是等效的.)

运行结果:


总结:
一个变量在always模块中进行变化,
如果key在上升沿加加,那么key值会立刻进行变化.
但是变化的key值,在其他always模块中并没有即时更新,
在其他模块中key值还是原来的值,
这就有了滞后.

为了更加清楚,再次举例:

运行结果:
data会滞后key一拍,虽然代码中是同时运行的.


