
在FPGA設計中,復位電路是非常重要的一部分,它能夠確保系統從初始狀態開始啟動并保證正確運行。 本文將分別介紹FPGA中三種常用復位電路:同步復位、異步復位和異步復位同步釋放,以及相應的Verilog代碼示例。
異步復位 or 同步復位 or 異步復位同步釋放,真的是“異步復位同步釋放”更好嗎?
(資料圖片僅供參考)
同步復位是一種在時鐘信號的下降沿或上升沿觸發的復位方式,復位信號與時鐘信號同步。 由于在同步復位中,復位信號和時鐘信號是同步的,因此可以確保復位操作的穩定和可預測性。 同步復位通常由一個或多個寄存器實現,如下面的實例:
module sync_reset( input clk, input rstn, input data_in, output reg data_out);always @(posedge clk) begin if(!rstn) begin data_out <= "b0; end else begin data_out <= data_in; endendendmodule
在上述代碼中,rst是同步復位信號,當時鐘上升沿到來時,檢測到復位信號為低電平時,計數器將被初始化。
綜合后電路圖如下:
從圖中可看出,綜合后,調用的(D Flip-Flop with Clock Enable and Synchronous Reset帶使能功能的同步清除D觸發器) FDRE型D觸發器。
異步復位是一種在時鐘信號之外觸發的復位方式,不管時鐘邊沿信號有沒有到來,只要復位有效信號到來,即執行復位操作。 以下是異步復位的基本代碼示例:
module async_reset( input clk, input rstn, input data_in, output reg data_out);always @(posedge clk or negedge rstn) begin if(!rstn) begin data_out <= "b0; end else begin data_out <= data_in; endendendmodule
在異步復位中,rst信號不需要和時鐘信號同步,并且可以在任何時候生效。在上述代碼中,rst信號被用來異步地清零計數器的值,并且不需要等待時鐘信號。
綜合后電路如下:
從圖中可看出,綜合后,調用的(D Flip-Flop with Clock Enable and AsynchronousReset帶使能功能的異步清除D觸發器) FDCE型D觸發器。
異步復位同步釋放通常是這種說法,一種結合了異步與同步復位優點的復位方式,它使用一個同步器來將異步復位信號轉換為同步的復位信號,從而確保復位操作的可控性和穩定性。以下是異步復位同步釋放的基本代碼示例:
module test_reset( input clk, input rstn, input data_in, output reg data_out);reg arstn_r, arstn_s_r;always @(posedge clk or negedge rstn) begin if(!rstn) begin arstn_r <= "b0; arstn_s_r <= "b0; end else begin arstn_r <= "b1; arstn_s_r <= arstn_r; endendalways @(posedge clk or negedge arstn_s_r ) begin if(!arstn_s_r ) begin data_out<= "b0; end else begin data_out<= data_in; endendendmodule
在上述代碼中,rstn是異步復位信號,在異步復位條件下,計數器會被清零并重置其他必要的信號。rstn信號經過異步和同步兩級的處理后,生成了一個同步釋放的復位信號arstn_s_r ,它與時鐘信號同步并在時鐘邊緣上生效。然后,同步復位電路將控制信號傳遞給其他電路,使其從復位狀態轉換到正常操作狀態。
綜合后電路如下:
從圖中可看出,即使復位信號通過兩級同步處理,也是用的兩個異步復位D觸發器FDCE實現的,所以實際上無需做這種異步復位同步釋放的處理。
在實際應用中,選擇合適的復位方式取決于具體的設計要求和運行環境,但實際上我們寫verilog代碼常用的是異步復位的方式,當然關于復位設計,真的需要每一個寄存器都復位嗎,下一個文章,我們再來嘮嘮。
標簽: