跳轉到內容

可程式設計邏輯/Verilog Always 和 Initial

來自華夏公益教科書,開放的書籍,開放的世界

此頁面將介紹 Verilog 關鍵字alwaysinitial

同步和非同步

[編輯 | 編輯原始碼]

always 塊可以是同步或非同步結構。這些結構中的指令被稱為與給定條件同步發生,或者非同步發生(如果未指定條件)。

Initial 塊

[編輯 | 編輯原始碼]

Initial 塊可以在可綜合或不可綜合的塊中使用。它們通常用在測試平臺中。Initial 塊會導致某些指令在模擬開始時執行,在任何其他指令操作之前。Initial 塊只操作一次。

可綜合的 initial 塊可用於設定 FPGA 中暫存器、RAM 和 ROM 的上電值。但是,initial 塊不能在 CPLD 或 ASIC 中綜合。

Always 塊

[編輯 | 編輯原始碼]

Always 塊描述了應該無限期重複的事情,或者應該在給定的同步條件下重複的事情。沒有條件的 always 塊是非同步的

always
begin
   ...
end

這塊程式碼將連續執行,無論電路的時鐘訊號如何。

硬體模組不能在 always 塊內例項化。模組中所有的 always 塊都被認為是並行的硬體塊。同樣,模組被認為是並行操作的獨立硬體塊。但是,函式可以在 always 塊內例項化。

一個線或暫存器不能被多個 always 塊寫入。但是,一個 wand 或 wor 可以被多個塊寫入。它分配值給

always @ 結構是同步條件結構。它採用以下形式

always @(<condition> <signal>)

其中 <condition> 可以是posedgenegedge 或省略。<signal> 引數是要同步的訊號(通常是時鐘訊號)。例如,如果我們希望在每個時鐘脈衝的正邊沿執行特定的程式碼塊,我們將編寫

always @(posedge clock)

如果我們不放入 posedge 或 negedge 限定符,always 塊將在每次變化(訊號的每個正邊沿和負邊沿)時觸發。例如

always @(clock)

將在時鐘訊號的正邊沿和負邊沿執行。

Always 塊可以被認為是電路結構,其中該電路的輸入由一個鎖存器控制。觸發 always 塊的事件被認為是鎖存器的時鐘輸入。只有當鎖存器的觸發輸入接收到正確的條件時,電路才會接收新的輸入。

邊沿觸發

[編輯 | 編輯原始碼]

關鍵字posedgenegedge 是邊沿觸發條件,只與always 塊一起使用。

華夏公益教科書