Verilog 復(fù)位簡介

2022-05-20 14:35 更新

關(guān)鍵詞: 同步復(fù)位, 異步復(fù)位

為確保系統(tǒng)上電后有一個明確、穩(wěn)定的初始狀態(tài),或系統(tǒng)運行狀態(tài)紊亂時可以恢復(fù)到正常的初始狀態(tài),數(shù)字系統(tǒng)設(shè)計中一定要有復(fù)位電路模塊。復(fù)位電路異??赡軙?dǎo)致整個系統(tǒng)的功能異常,所以在一定程度上,復(fù)位電路的重要性也不亞于時鐘電路。

復(fù)位電路可分類為同步復(fù)位和異步復(fù)位。

同步復(fù)位

同步復(fù)位是指復(fù)位信號在時鐘有效邊沿到來時有效。如果沒有時鐘,無論復(fù)位信號怎樣變化,電路也不執(zhí)行復(fù)位操作。

同步復(fù)位的典型代碼描述如下:

module sync_reset(
    input       rstn,  //同步復(fù)位信號
    input       clk,   //時鐘
    input       din,   //輸入數(shù)據(jù)
    output reg  dout   //輸出數(shù)據(jù)
    );
   
    always @(posedge clk) begin   //復(fù)位信號不要加入到敏感列表中
        if(!rstn)  dout <= 1'b0 ; //rstn 信號與時鐘 clk 同步
        else       dout <= din ;
    end
   
endmodule

該描述代碼常常會被綜合成如下電路:


同步復(fù)位的優(yōu)點:信號間是同步的,能濾除復(fù)位信號中的毛刺,有利于時序分析。

同步復(fù)位的缺點:大多數(shù)觸發(fā)器單元是沒有同步復(fù)位端的,采用同步復(fù)位會多消耗部分邏輯資源。且復(fù)位信號的寬度必須大于一個時鐘周期,否則可能會漏掉復(fù)位信號。

異步復(fù)位

異步復(fù)位是指無論時鐘到來與否,只要復(fù)位信號有效,電路就會執(zhí)行復(fù)位操作。

異步復(fù)位的典型代碼描述如下:

module async_reset(
    input       rstn,  //異步復(fù)位信號
    input       clk,   //時鐘
    input       din,   //輸入數(shù)據(jù)
    output reg  dout   //輸出數(shù)據(jù)
    );
   
    //復(fù)位信號要加到敏感列表中
    always @(posedge clk or negedge rstn) begin
        if(!rstn)  dout <= 1'b0 ; //rstn 信號與時鐘 clk 異步
        else       dout <= din ;
    end
   
endmodule

該代碼常常會被綜合成如下電路:


異步復(fù)位的優(yōu)點:大多數(shù)觸發(fā)器單元有異步復(fù)位端,不會占用額外的邏輯資源。且異步復(fù)位信號不經(jīng)過處理直接引用,設(shè)計相對簡單,信號識別快速方便。

異步復(fù)位的缺點:復(fù)位信號與時鐘信號無確定的時序關(guān)系,異步復(fù)位很容易引起時序上 removal 和 recovery 的不滿足。且異步復(fù)位容易受到毛刺的干擾,產(chǎn)生意外的復(fù)位操作。

異步復(fù)位同步釋放

綜合設(shè)計與資源等方面的考慮,一般數(shù)字系統(tǒng)設(shè)計時都會使用異步復(fù)位。

為消除異步復(fù)位的缺陷,復(fù)位電路往往會采用"異步復(fù)位、同步釋放"的設(shè)計方法。即復(fù)位信號到來時不受時鐘信號的同步,復(fù)位信號釋放時需要進(jìn)行時鐘信號的同步。

異步復(fù)位、同步釋放的典型代碼描述如下:

module areset_srelease(
    input       rstn,  //異步復(fù)位信號
    input       clk,   //時鐘
    input       din,   //輸入數(shù)據(jù)
    output reg  dout   //輸出數(shù)據(jù)
    );
     
    reg   rstn_r1, rstn_r2;
    always @ (posedge clk or negedge rstn) begin
        if (!rstn) begin
            rstn_r1 <= 1'b0;     //異步復(fù)位
            rstn_r2 <= 1'b0;  
        end
        else begin
            rstn_r1 <= 1'b1;     //同步釋放
            rstn_r2 <= rstn_r1;  //同步打拍,時序差可以多延遲幾拍
        end
    end
     
    //使用 rstn_r2 做同步復(fù)位,復(fù)位信號可以加到敏感列表中
    always @ (posedge clk or negedge rstn_r2) begin
        if (!rstn_r2) dout <= 1'b0; //同步復(fù)位
        else          dout <= din;
    end

endmodule

該代碼描述常常會被綜合成如下電路:


需要說明的是,復(fù)位電路會消耗更多的硬件邏輯和面積資源,增加系統(tǒng)設(shè)計的復(fù)雜性。不帶復(fù)位端的觸發(fā)器也具有相對較高的性能。所以在一些初始值不影響邏輯正確性的數(shù)字設(shè)計中,例如數(shù)據(jù)通路中一些數(shù)據(jù)處理的部分,高速流水線中的一些寄存器,可以考慮去掉復(fù)位以達(dá)到最佳性能。

為方便、快速的仿真非復(fù)位邏輯的其他功能,教程所有數(shù)字設(shè)計中的復(fù)位都是從 testbench 中引入異步復(fù)位,沒有考慮復(fù)位電路的時序問題。實際設(shè)計數(shù)字系統(tǒng)時,一定要對復(fù)位電路進(jìn)行單獨、仔細(xì)、慎重的設(shè)計。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號