FPGA中的邊沿檢測(cè)
項(xiàng)目名稱:邊沿檢測(cè)
具體要求:檢測(cè)輸入信號(hào),或者?FPGA?內(nèi)部邏輯信號(hào)的跳變,即上升沿或者下降沿的檢測(cè),當(dāng)檢測(cè)到邊沿后,發(fā)出高脈沖。
通過(guò)分析上述的“項(xiàng)目名稱”和“具體要求”,我們可以設(shè)計(jì)出如下的電路:

由于寄存器可以使信號(hào)延時(shí)一個(gè)時(shí)鐘周期,我們可以利用這點(diǎn),來(lái)完成信號(hào)的邊沿檢測(cè)。假設(shè) signal 一直為高電平,則 buffer1 和 buffer2 的輸出都是高電平,當(dāng) signal 變成低電平時(shí),buffer1 的輸出先變成低電平,我們將 buffer1 的輸出值取反(高電平)和 buffer2 的輸出(高電平)相與得到 neg_flag(高電平),下一個(gè)周期時(shí),buffer2的輸出也變成了低電平,buffer1 的輸出值取反(高電平)和 buffer2 的輸出(低電平)相與得到低電平。故而 neg_flag 只是輸出了一個(gè)時(shí)鐘周期的高脈沖。pos_flag 可以同理分析。
架構(gòu)圖如下:

signal:被檢測(cè)信號(hào)
pos_flag:檢測(cè)出上升沿后發(fā)出的高脈沖
neg_flag:檢測(cè)出下降沿后發(fā)出的高脈沖
系統(tǒng)設(shè)計(jì):
1.?工程的名稱:ckeck_edge。
設(shè)計(jì)代碼如下:
/*
模塊名稱:ckeck_edge
模塊功能:檢測(cè)上升沿或者下降沿,檢測(cè)到邊沿后,發(fā)出高脈沖。編寫時(shí)間:2020-08-16
*/
module check_edge (clk, rst_n, signal, neg_flag, pos_flag);
????input clk;
????input rst_n;
????input signal;
????output neg_flag;
????output pos_flag;
????reg buffer1;
????reg buffer2;
????always @ (posedge clk or negedge rst_n)
????????begin
????????????if (!rst_n)
????????????????begin
????????????????????buffer1 <= signal;
????????????????????buffer2 <= signal;
????????????????end
????????????else
????????????????begin
????????????????????buffer1 <= signal;
????????????????????buffer2 <= buffer1;
????????????????end
????????end
????assign neg_flag = buffer2&&(~buffer1);?
????assign pos_flag = (~buffer2)&&buffer1;
endmodule
解析:
在模塊復(fù)位時(shí),筆者將 buffer1 和 buffer2 的輸出設(shè)置成和輸入信號(hào)相同的電平值,原因如下:如果設(shè)置成高電平,而輸入信號(hào)在復(fù)位器件為低電平,那么在復(fù)位結(jié)束后就會(huì)產(chǎn)生一個(gè)我們不想要的 neg_flag(分析方法同設(shè)計(jì)方法)。另一種情況讀者可以自己分析,方法是相同的。
激勵(lì)代碼如下:
`timescale 1ns/1ps
module check_edge_tb;
????reg clk;
????reg rst_n;
????reg signal;
????wire neg_flag;
????wire pos_flag;
????initial begin
????????clk = 1'b1;
????????rst_n = 1'b0;
????????signal = 1'b1;
????????# 200.1
????????rst_n = 1'b1;
????????# 200
????????signal = 1'b0;//下降沿
????????# 200
????????signal = 1'b1;//上升沿
????????# 200
????????$stop;
????end
always # 10 clk = ~clk;
check_edge check_edge_dut(
????????.clk(clk),
????????.rst_n(rst_n),
????????.signal(signal),
????????.neg_flag(neg_flag),
????????.pos_flag(pos_flag)
????????);
endmodule
仿真波形如下:

當(dāng)輸入信號(hào)有下降沿時(shí),neg_flag輸出了高脈沖,輸入信號(hào)有上升沿時(shí),pos_flag輸出了高脈沖。
檢測(cè)邊沿是用寄存器來(lái)完成的,所以脈沖的輸出會(huì)晚一個(gè)時(shí)鐘輸出,在高頻率時(shí)鐘對(duì)低頻率信號(hào)檢測(cè)中,沒(méi)有影響。設(shè)計(jì)正確。