以前我曾一度傻乎乎的使用
always@(posedge
signal
)
這樣的**去檢測signal的上公升沿,鬧出了很多問題。
當受實驗室的一同學指教後,再也不會傻乎乎的這樣幹了。當然,你看完下文也不會這樣幹了。
檢測上公升沿的原理:使用高頻的時鐘對訊號進行取樣,因此要實現上公升沿檢測,時鐘頻率至少要在訊號最高頻率的2倍以上,否則就可能出現漏檢測。具體請參見下面**。
moduleedge_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**還可以換一種寫法,效率上差不了太多;
moduleedge_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的脈衝檢測方法一直在用,就那幾句話,但一直沒想他的原理,今天乙個同學說筆試的遇到這個了,我一想,要我寫還真寫不出來,不懂原理,怎麼寫啊。死記硬背是我不喜歡的。網上搜了一下,總結一下幾種方法。首先介紹一下基本的原理。脈衝邊沿的特性 兩側電平發...