HDLBits (95) — 檢測單個邊緣
本題鏈接:
https://hdlbits.01xz.net/wiki/Edgedetect
對于8位向量中的每一位,檢測一個邊緣意為檢測輸入信號何時從一個時鐘周期的0變?yōu)橄乱粋€時鐘周期的1(類似于檢測上升沿)。在發(fā)生0到1轉換后,應將輸出位循環(huán)設置。
下面是一些例子。為清楚起見,in[1]和pedge[1]中分開顯示。


題目

答案

輸出波形


過程結構語句有 2 種,initial 與 always 語句。它們是行為級建模的 2 種基本語句。
一個模塊中可以包含多個 initial 和 always 語句,但 2 種語句不能嵌套使用。
這些語句在模塊間并行執(zhí)行,與其在模塊的前后順序沒有關系。
但是 initial 語句或 always 語句內(nèi)部可以理解為是順序執(zhí)行的(非阻塞賦值除外)。
每個 initial 語句或 always 語句都會產(chǎn)生一個獨立的控制流,執(zhí)行時間都是從 0 時刻開始。
always 語句是重復執(zhí)行的。always 語句塊從 0 時刻開始執(zhí)行其中的行為語句;當執(zhí)行完最后一條語句后,便再次執(zhí)行語句塊中的第一條語句,如此循環(huán)反復。
由于循環(huán)執(zhí)行的特點,always 語句多用于仿真時鐘的產(chǎn)生,信號行為的檢測等。
在 Verilog 中,事件是指某一個 reg 或 wire 型變量發(fā)生了值的變化。
基于事件觸發(fā)的時序控制又主要分為以下幾種。
一般事件控制
事件控制用符號?@?表示。
語句執(zhí)行的條件是信號的值發(fā)生特定的變化。
關鍵字 posedge 指信號發(fā)生邊沿正向跳變,negedge 指信號發(fā)生負向邊沿跳變,未指明跳變方向時,則 2 種情況的邊沿變化都會觸發(fā)相關事件。例如:
命名事件控制
用戶可以聲明 event(事件)類型的變量,并觸發(fā)該變量來識別該事件是否發(fā)生。命名事件用關鍵字 event 來聲明,觸發(fā)信號用?->?表示。例如:
敏感列表
當多個信號或事件中任意一個發(fā)生變化都能夠觸發(fā)語句的執(zhí)行時,Verilog 中使用"或"表達式來描述這種情況,用關鍵字?or?連接多個事件或信號。這些事件或信號組成的列表稱為"敏感列表"。當然,or 也可以用逗號?,?來代替。例如:
當組合邏輯輸入變量很多時,那么編寫敏感列表會很繁瑣。此時,更為簡潔的寫法是?@*?或?@(*),表示對語句塊中的所有輸入變量的變化都是敏感的。例如:
參考內(nèi)容:
4.1 Verilog 過程結構?| 菜鳥教程:
https://www.runoob.com/w3cnote/verilog-process-structure.html
4.3 Verilog 時序控制 | 菜鳥教程:
https://www.runoob.com/w3cnote/verilog-timing-control.html