亞穩態的概念與消除方法

Yamada_Ryo發表於2024-03-27

1、亞穩態的概念

​ 非同步訊號:該訊號的產生與時鐘上升沿無關(例如按鍵按下)。

​ 同步訊號:每次時鐘上升沿到來都會產生該訊號。

​ 非同步訊號在輸入系統的時候存在兩種情況,如圖 4 所示:

image-20240326105348608

圖4——非同步訊號在輸入系統時存在的兩種情況

​ 上圖中,系統時鐘上升沿採集到非同步訊號 2 ,此時非同步訊號 2 處於不定態,對應該訊號的D觸發器產生了亞穩態的情況,D觸發器的輸出q產生震盪,震盪一段時間後變為穩定,可能為 1 ,也可能為 0 ,如圖 5 所示。

image-20240326111115208

圖5——D觸發器處於亞穩態時的輸出結果

2、亞穩態的消除方法(同步處理、資料寄存、邊沿檢測)

(1)同步處理

​ 如果此時,該D觸發器又加了一級D1,如圖 6 所示,若第一級D觸發器到第二個時鐘上升沿到來時還沒穩定,則第二級D觸發器也會處於亞穩態,如圖 7 所示,

image-20240326111449617

圖6——兩級D觸發器

image-20240326112405439

圖7——兩級D觸發器處於亞穩態時的輸出結果

​ 雖然兩級D觸發器無法保證最終的輸出結果是否正確,但至少不會讓訊號處於不定態,能保證第二級D觸發器輸出結果是穩定的,所以在處理非同步訊號時,經常對輸入訊號加入兩級D觸發器進行同步

​ 對於非同步訊號Rs232_Rx而言,加入兩個同步暫存器 s0_Rs232_Rx,s1_Rs232_Rx,進行亞穩態的消除,如下列程式碼所示:

//對非同步訊號進行同步處理(加入一個兩級D觸發器,對非同步訊號Rs232_Rx消除其亞穩態)
reg s0_Rs232_Rx,s1_Rs232_Rx;    //兩個同步暫存器(消除亞穩態)
reg tmp0_Rs232_Rx,tmp1_Rs232_Rx;    //兩個暫存暫存器(資料寄存)

//對非同步訊號進行同步處理(加入一個兩級D觸發器,對非同步訊號Rs232_Rx消除其亞穩態)
always@(posedge Clk or negedge Rst_n)
    if(!Rst_n)begin
        s0_Rs232_Rx <= 1'b0;
        s1_Rs232_Rx <= 1'b0;
    end
else begin	//兩級D觸發器
    s0_Rs232_Rx <= Rs232_Rx;
    s1_Rs232_Rx <= s0_Rs232_Rx;
end

(2)資料寄存

​ 同時,使用兩級D觸發器儲存兩個相鄰時鐘上升沿時Rs232_Rx訊號(已同步到系統時鐘域中)的電平狀態,如下列程式碼所示:

//資料寄存(使用D觸發器儲存兩個相鄰時鐘上升沿時外部輸入訊號(已同步到系統時鐘域中)的電平狀態)
always@(posedge Clk or negedge Rst_n)
    if(!Rst_n)begin
        tmp0_Rs232_Rx <= 1'b0;
        tmp1_Rs232_Rx <= 1'b0;
    end
else begin  //兩級D觸發器
    tmp0_Rs232_Rx <= s1_Rs232_Rx;
    tmp1_Rs232_Rx <= tmp0_Rs232_Rx;
end

(3)邊沿檢測

​ 透過檢測同步後的Rs232_Rx訊號是否產生了下降沿,來檢測起始位。

​ 注意 temp0_Rs232_Rx 訊號、temp1_Rs232_Rx 訊號的先後順序:temp0_Rs232_Rx後、temp1_Rs232_Rx先

//邊沿檢測(透過檢測檢測同步後的Rs232_Rx訊號是否產生了下降沿,來檢測起始位)
//temp0_Rs232_Rx後、temp1_Rs232_Rx先
wire neg;
assign neg = !temp0_Rs232_Rx & temp1_Rs232_Rx;

相關文章