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


題目

答案

輸出波形


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