FPGA的邊沿檢測

2021-07-23 13:31:15 字數 2185 閱讀 8628

以前我曾一度傻乎乎的使用

always@(

posedge

signal

)

這樣的**去檢測signal的上公升沿,鬧出了很多問題。

當受實驗室的一同學指教後,再也不會傻乎乎的這樣幹了。當然,你看完下文也不會這樣幹了。

檢測上公升沿的原理:使用高頻的時鐘對訊號進行取樣,因此要實現上公升沿檢測,時鐘頻率至少要在訊號最高頻率的2倍以上,否則就可能出現漏檢測。具體請參見下面**。

module

edge_check

(clk

,rst_n

,signal

,pos_edge

,neg_edge

,both_edge

);input

clk;

input

rst_n

;input

signal

;output

pos_edge

;output

neg_edge

;output

both_edge

;reg

sig_r0

,sig_r1

;// 狀態暫存器

always@(

posedge

clkor

negedge

rst_n)if

(!rst_n

)begin

sig_r0

<=

1'b0

;sig_r1

<=

1'b0

;end

else

begin

sig_r0

<=

signal

;sig_r1

<=

sig_r0

;end

assign

pos_edge=(

~sig_r1)&

(sig_r0

);assign

neg_edge

=sig_r1&(

~sig_r0

);assign

both_edge

=sig_r1

^sig_r0

;// 雙邊沿檢測,或pos_edge|neg_edge

endmodule

從rtl檢視中可以看出,電路是通過乙個非同步復位的d觸發器實現的。

modelsim的**檢視如下,從中可看出已檢測出上公升和下降沿,但存在乙個延時,這是因為使用了時鐘同步的檢測。

或者上面的verilog**還可以換一種寫法,效率上差不了太多;

module

edge_check

(clk

,rst_n

,signal

,pos_edge

,neg_edge

,both_edge

);input

clk;

input

rst_n

;input

signal

;output

pos_edge

;output

neg_edge

;output

both_edge

;reg[1

:0]sig_fifo

;reg

sig_r0

,sig_r1

;// 狀態暫存器

always@(

posedge

clkor

negedge

rst_n)if

(!rst_n

)begin

sig_fifo

<=

2'b0

;end

else

begin

sig_fifo

<=

;end

assign

pos_edge=(

sig_fifo

==2'b01

);assign

neg_edge=(

sig_fifo

==2'b10

);assign

both_edge

=sig_fifo[0

]^sig_fifo[1

];// 雙邊沿檢測,或pos_edge|neg_edge

endmodule

FPGA亞穩態狀態檢測邊沿

如上圖所示,當時鐘上公升沿來的時候,資料恰好改變,這個時候輸出的結果就無法確定是0 1,暫存器會經過一段時間的抖動然後輸出乙個結果 無法確定是正確還是錯誤 通過三個暫存器,資料的抖動會消失,從而得到穩定的資料輸出 資料同樣不確定是否正確 當暫存器抖動之後輸出為0時,如下圖所示,通過兩個暫存器,就可以...

FPGA 學習筆記一 檢測邊沿觸發

本文主要涉及xilinx版的fpga的邊沿觸發檢測,通過鎖存乙個時鐘節拍,比較前後兩個檢測狀態,判定是否產生上公升沿或者下降沿,可用於按鍵檢測等,具體如下 檢測上公升沿 reg key scan reg key scan reg always posedge clk 鎖存乙個時鐘節拍,key sca...

FPGA基礎之脈衝邊沿檢測原理verilog版本

最近一直忙著找工作。哎,希望保佑我通過二面吧。verilog的脈衝檢測方法一直在用,就那幾句話,但一直沒想他的原理,今天乙個同學說筆試的遇到這個了,我一想,要我寫還真寫不出來,不懂原理,怎麼寫啊。死記硬背是我不喜歡的。網上搜了一下,總結一下幾種方法。首先介紹一下基本的原理。脈衝邊沿的特性 兩側電平發...