邊沿檢測電路小結

邊沿檢測電路小結

    所謂邊沿檢測(又叫沿提取),就是檢測輸入信號的上升沿下降沿。在設計數字系統時,邊沿檢測是一種很重要的思想,實際編程時用的最多的時序電路應該就是邊沿檢測電路和分頻電路了。

    那麼,邊沿檢測電路該如何實現呢?

    我們知道,在always塊的敏感信號列表中可以直接用posedgenegedge來提取上升沿和下降沿,但是如果要在always程序塊的內部檢測上升沿或者下降沿呢?還是用poesedge和negedge嗎?顯然是不可以的,因爲這樣的語句不可綜合,我在Quartus II中嘗試了,編譯時提示 ”multiple event control statements not supported for synthesis !“,意思就是不可綜合。實際上,posedge和negedge只能用在always塊的敏感信號列表中或者testbench中,所以我們還是通過其他的辦法來實現吧。

    要實現邊沿檢測,最直接的想法是用兩級寄存器,第二級寄存器鎖存住某個時鐘上升沿到來時的輸入電平,第一級寄存器鎖存住下一個時鐘沿到來時的輸入電平,如果這兩個寄存器鎖存住的電平信號不同,就說明檢測到了邊沿,具體是上升沿還是下降沿可以通過組合邏輯來實現。如下圖所示:
在這裏插入圖片描述

//邊沿檢測電路
//2014/12/10
module edge_cap
(
    input clk, rst_n,
    input pulse,
    
    output pos_edge,
    output neg_edge
    
);
reg pulse_r1, pulse_r2;

always @ (posedge clk or negedge rst_n)
if(!rst_n) 
    begin
    pulse_r1 <= 1'b0;
    pulse_r2 <= 1'b0;
    end
else 
    begin
    pulse_r1 <= pulse;
    pulse_r2 <= pulse_r1;
    end
    
assign pos_edge = (pulse_r1 && ~pulse_r2) ?1:0;
assign neg_edge = (~pulse_r1 && pulse_r2) ?1:0; 

endmodule

    當檢測到上升沿時, pos_edge信號輸出一個時鐘週期的高電平; 檢測到下降沿時,neg_edge輸出一個時鐘週期的高電平。
乍一看,這個電路似乎很簡單地實現了邊沿檢測的功能,但是仔細分析就可以發現這種方法存在一個潛在的風險:當待測信號pulse是一個異步信號時,輸出可能是亞穩態如果pulse信號的變化剛好發生在clk時鐘的建立時間和保持時間之內,那麼第一級寄存器的輸出 pulse_r1 就會進入亞穩態,而pulse_r1的亞穩態會立即傳遞給pos_edge和neg_edge信號,從而使得整個電路的輸出進入亞穩態,進而影響下一級電路的正常工作,甚至導致整個系統崩潰!

    因此,在進行異步信號邊沿提取時,不能直接使用上面的這種電路,而應該先將異步信號同步化,一般採用多加一級寄存器的方法來減小亞穩態的發生概率,如下圖所示:

在這裏插入圖片描述

//異步信號邊沿檢測電路,三級寄存器實現
//2014/12/08

module edge_cap
(
    input clk, rst_n,
    input pulse,
    
    output pos_edge,
    output neg_edge
    
);
reg pulse_r1, pulse_r2, pulse_r3;

always @ (posedge clk or negedge rst_n)
if(!rst_n) 
    begin
    pulse_r1 <= 1'b0;
    pulse_r2 <= 1'b0;
    pulse_r3 <= 1'b0;
    end
else 
    begin
    pulse_r1 <= pulse;
    pulse_r2 <= pulse_r1;
    pulse_r3 <= pulse_r2;
    end
    
assign pos_edge = (pulse_r2 && ~pulse_r3) ?1:0;
assign neg_edge = (~pulse_r2 && pulse_r3) ?1:0; 


endmodule

    經過這樣的同步處理後, 可以大大減小電路進入亞穩態的概率,如果第一級寄存器進入了亞穩態,一般也會在一個clk週期內穩定下來(可能穩定爲0也可能穩定爲1),如下圖所示:

在這裏插入圖片描述
    圖中pulse信號的改變剛好發生在 clk 的建立時間和保持時間之內,因而第一級寄存器的輸出pulse_r1可能會進入亞穩態,圖中Tco爲第一級寄存器pulse_r1的狀態建立時間(即clock to output),一般情況下,亞穩態的決斷時間(即從進入亞穩態到穩定下來的時間)不會超過一個時鐘週期,因此在下一個clk上升沿到來之前,pulse_r1已經穩定下來(可能穩定到0也可能穩定到1),這樣第二級寄存器就會採集到一個穩定的狀態,從而把亞穩態限制在第二級寄存器之前,保證了整個電路輸出的穩定性。

    綜上所述,在異步信號邊沿檢測電路中,至少需要採用三級寄存器來實現,在對系統穩定性要求較高的數字系統中,可以採用更多級的寄存器來減小亞穩態發生概率,提高系統穩定性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章