fpga中always時(shí)序模塊對(duì)變量賦值(變量何時(shí)更新值)
在verilog語(yǔ)句中
一個(gè)always就是一個(gè)獨(dú)立的程序塊.
"獨(dú)立"說(shuō)明是,單獨(dú)運(yùn)行.
多個(gè)always之間是并行的.

通常情況下:
按照程序的習(xí)慣,最好是一個(gè)always只處理一個(gè)信號(hào).否則容易邏輯混亂.
比如:
(如下圖, 里面包含data和key兩個(gè)變量,放到了一個(gè)always模塊中? ,不推薦這種寫(xiě)法).

對(duì)于上面代碼有些疑問(wèn),起中244行和245行:
// 在復(fù)位后,第一個(gè)時(shí)鐘上升沿,key從0變?yōu)?,
//那么,第第一個(gè)時(shí)鐘上升沿時(shí),那一刻,key的值是多少?
key <= ~key;?
// 上面key從上升沿的時(shí)候,從0變成了1,那么,下面的if是否滿(mǎn)足呢?
if(key == 1)?
??? data <= 1;
這里可以先給大家答案, 復(fù)位后第一個(gè)上升沿到來(lái)時(shí),
key 的值是1.
if里key的值還沒(méi)有來(lái)得及更新,所以data是0.

下面就開(kāi)始分析一下:
上面代碼雖然是一個(gè)always,
但是它包含了兩個(gè)變量,所以,為了看清楚,可以把兩個(gè)變量拆分到不同的always模塊中,推薦這種風(fēng)格的代碼寫(xiě)法.
即:(這個(gè)代碼和上面的代碼是等效的.)

運(yùn)行結(jié)果:


總結(jié):
一個(gè)變量在always模塊中進(jìn)行變化,
如果key在上升沿加加,那么key值會(huì)立刻進(jìn)行變化.
但是變化的key值,在其他always模塊中并沒(méi)有即時(shí)更新,
在其他模塊中key值還是原來(lái)的值,
這就有了滯后.

為了更加清楚,再次舉例:

運(yùn)行結(jié)果:
data會(huì)滯后key一拍,雖然代碼中是同時(shí)運(yùn)行的.
