數(shù)字ic手撕代碼-邊沿檢測(上升沿、下降沿、雙邊沿)
????????大家好我是酸菜魚,這個(gè)系列著重講解數(shù)字ic或FPGA實(shí)習(xí)面試及秋招面試的高頻手撕代碼題。
往期專欄:
數(shù)字IC手撕代碼-分頻器(任意偶數(shù)分頻) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-分頻器(任意奇數(shù)分頻) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-分頻器(任意小數(shù)分頻) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-序列檢測(狀態(tài)機(jī)寫法) - 嗶哩嗶哩 (bilibili.com)
數(shù)字IC手撕代碼-序列檢測(移位寄存器寫法) - 嗶哩嗶哩 (bilibili.com)
邊沿檢測
????????在使用FIFO進(jìn)行數(shù)據(jù)讀寫的時(shí)候,我們會(huì)用到邊沿檢測,比如當(dāng)FIFO內(nèi)的數(shù)據(jù)被讀空了,這樣 empty 信號(hào)就會(huì)從0→1,產(chǎn)生一個(gè)上升沿,當(dāng)這個(gè)上升沿到來的時(shí)候代表FIFO內(nèi)孔,我們就可以對(duì)FIFO進(jìn)行一個(gè)寫操作(把寫使能拉高,往FIFO寫數(shù)據(jù)),所以邊沿檢測是十分常用的東西,下面我們來講講邊沿檢測的原理、代碼以及對(duì)應(yīng)仿真。
原理:
??????? 比如我們要檢測信號(hào) signal 的上升沿,我們使用兩個(gè)寄存器,級(jí)聯(lián)記錄 signal 的值,這樣由于寄存器延遲一拍的特性,第二個(gè)寄存器永遠(yuǎn)會(huì)延遲第一個(gè)寄存器。
????????當(dāng) signal 上升沿到來時(shí),會(huì)有:第一個(gè)寄存器檢測為高,第二個(gè)寄存器檢測為低。

????????這樣,我們只要把第二個(gè)寄存器取反,然后和第一個(gè)寄存器做與運(yùn)算,這樣當(dāng)計(jì)算的數(shù)值為 1 時(shí),就檢測到了上升邊沿。
????代碼:

Testbench:

上升邊沿 邊沿檢測波形:

????????從圖中我們可以看到,跟我們預(yù)料的一樣,當(dāng)上升沿到來的時(shí)候,reg1和 reg2 信號(hào)錯(cuò)一拍,這樣利用這個(gè)特性,讓signal_edge = ~reg2 & reg1 就能檢測到上升邊沿。
????????檢測下降沿也是一個(gè)道理,代碼完全一致,就是把最后邊沿檢測信號(hào)改為:
????????assign signal_edge = ~reg1?&?reg2;
下降邊沿 邊沿檢測波形:

雙邊沿 邊沿檢測波形:
? ? ? ? 雙邊沿檢測,就是上升沿和下降沿,檢測信號(hào)都要輸出一次高電平。這我們可以用異或?qū)崿F(xiàn),同樣是只需要在上升沿檢測的代碼里改最后一條賦值語句即可,改為:
????????assign signal_edge = reg1 ^reg2 ;
?波形如下:

????結(jié)果和我們?cè)O(shè)計(jì)的一致。