边沿检测技术
一、什么是邊沿檢測
所謂邊沿檢測,就是檢測輸入信號,或者FPGA內部邏輯信號的跳變,即上升沿或者下降沿的檢測。這在FPGA電路設計中相當的廣泛,幾乎我每一個稍微完善的工程都會應用到這個思想;后續章節的講解,也不少這個思維的應用。
以下是七哥當年用決定自己工作的一張圖,Bingo在Quartus II Block中用邏輯門畫了出來:
如上圖5個信號:
正常工作,沒有復位的情況下,工作流程如下:
(1)D觸發器經過時鐘clk的觸發,輸出trigger信號,保存了t0時刻的信號。
(2)同時由trigger通過非門輸出信號,保留了當前時刻t1的觸發信號
(3)經過與門輸出信號pos_edge,neg_edge
a) 只有t0時刻為高,且t1時候為低的時候,與門輸出高,此時為下降沿。
b) 只有to時候為低,且t1時候為高的時候,與門輸出高,此時為上升沿。
當然,在復位的時刻,DFF被復位,無法檢測觸發信號。
二、實現邊沿檢測的最優化
1. Block或Verilog實現
一般為了防止觸發信號的波動,加幾級觸發器,消除抖動,使得信號更穩定。
此例程中,相對于上圖多了觸發器。其用觸發器對信號打慢兩拍,使得觸發信號然后在進行相關的處理;再來檢測邊沿的上升沿,下降沿。
(1)用Block畫圖實現
(2)用verilog代碼實現
edge_tech_design.v代碼如下所示:
/*****************************************************
* Module Name : edge_tech_design.v
* Engineer : Crazy Bingo
* Target Device : EP2C8Q208C8
* Tool versions : Quartus II 11.0
* Create Date : 2011-6-25
* Revision : v1.0
* Description :??
*****************************************************/
module edge_tech_design
(
input clk,
input rst_n,
input trigger,
output pos_edge,
output neg_edge
);
//Capture the rising_endge & falling_edge
reg trigger_r0,trigger_r1,trigger_r2;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
trigger_r0 <= 1'b0;
trigger_r1 <= 1'b0;
trigger_r2 <= 1'b0;
end
else
begin
trigger_r0 <= trigger;
trigger_r1 <= trigger_r0;
trigger_r2 <= trigger_r1;
end
end
assign pos_edge = trigger_r1 & ~trigger_r2;
assign neg_edge = ~trigger_r1 & trigger_r2;
endmodule
編譯后,分析Quartus II RTL圖,如下所示,與Bingo在Block用邏輯門設計的一樣,說明了代碼的正確性。
(3)Modelsim-Altera仿真圖如下所示,在上升沿(下降沿)到來的時候,時序能夠及時準確的檢測到。
2. 邊沿檢測應用
邊沿檢測技術在項目應用中,非常低廣泛。如要有效捕獲信號跳變沿,邊沿檢測技術的應用是必不可少的。Bingo大致歸納了一下,有如下幾個方面
(1)將時鐘邊沿使能轉換為邊沿檢測使能,使時鐘同步化。
(2)捕獲信號的突變(UART,SPI等信號使能突變)
(3)邏輯分析儀中信號的邊沿檢測。
3. 實現指標及存在缺陷
沒有十全十美的東西,也沒有十全十美的電路、代碼;本章節中所介紹的邊沿檢測技術亦如此。有如下缺陷:
(1)增大CLK信號可以增強邊沿檢測的效率,但不能濾去跳變的雜波。
(2)減少CLK可以有效濾去跳變的雜波,但不能及時檢測到邊沿跳變。
(3)增加DFF能更好的濾除雜波,寄存信號,但同時檢測延時大。
總結
- 上一篇: FPGA工作原理
- 下一篇: 串口起始位检测