異步復位同步釋放


一、同步復位(by Crazybingo)

1.代碼

module system_ctrl
//==================<端口>==================================================
(
//globel clock ----------------------------------
input  wire                 clk                 , //時鍾,50Mhz
input  wire                 rst_n               , //復位,低電平有效
//user interface --------------------------------
input  wire                 a                   , //輸入信號
output reg                  b                     //輸出信號
);

//==========================================================================
//==    同步復位,rst_n作為外部信號輸入,clk全局時鍾稱為“同步時鍾”
//==========================================================================
always @(posedge clk) begin
    if(!rst_n)
        b <= 0;
    else
        b <= a;
end



endmodule

2.RTL視圖

3.優點

  ①降低了亞穩態的出現概率;

  ②可以使所設計的系統成為100%的同步時序電路,這將大大有利於時序分析,並且綜合出來的fmax一般較高;

  ③因為它只有在時鍾有效沿到來時才有效,所以可以濾除高於時鍾頻率的毛刺。

4.缺點

  ①復位信號的有效時長必須大於時鍾周期,才能真正被系統識別並完成復位任務,同時還要考慮clk skew、組合邏輯路徑延時、復位延時等因素;

  ②由於大多數的邏輯器件的目標庫內的DFF都只有異步復位端口,所以倘若采用同步復位,綜合器就會在寄存器的數據輸入端口插入組合邏輯,這樣會耗費較多的邏輯資源。

 

二、異步復位(by Crazybingo)

1.代碼

 1 module system_ctrl
 2 //==================<端口>==================================================
 3 (
 4 //globel clock ----------------------------------
 5 input  wire                 clk                 , //時鍾,50Mhz
 6 input  wire                 rst_n               , //復位,低電平有效
 7 //user interface --------------------------------
 8 input  wire                 a                   , //輸入信號
 9 output reg                  b                     //輸出信號
10 );
11 
12 //==========================================================================
13 //==    異步復位,rst_n信號和clk全局時鍾信號共同稱為“異步時鍾”
14 //==========================================================================
15 always @(posedge clk or negedge rst_n) begin
16     if(!rst_n)
17         b <= 0;
18     else
19         b <= a;
20 end
21 
22 
23 
24 endmodule

2.RTL視圖

3.優點

①大多數目標器件的DFF都有異步復位端口,因此采用異步復位可以節省資源;

②設計相對簡單;

③異步復位信號識別方便,並且可以很方便地使用FPGA的全局復位端口。

4.缺點

①在復位信號釋放(Release)時容易出現問題。具體來說,倘若復位釋放時恰好在時鍾有效沿附近,就很容易使寄存器輸出出現亞穩態,從而導致不穩定;

②復位信號容易受到毛刺的影響。這是由於時鍾抖動或按鍵觸發時的硬件原因造成的。

 

三、異步復位的同步化設計(by Crazybingo)

1.代碼

 1 module system_ctrl
 2 //==================<端口>==================================================
 3 (
 4 //globel clock ----------------------------------
 5 input  wire                 clk                 , //時鍾,50Mhz
 6 input  wire                 rst_n               , //復位,低電平有效
 7 //user interface --------------------------------
 8 input  wire                 a                   , //輸入信號
 9 output reg                  b                     //輸出信號
10 );
11 
12 //==========================================================================
13 //==    異步復位的同步化設計
14 //==========================================================================
15 reg        sys_rst_n;
16 
17 always @(posedge clk) begin
18     if(!rst_n)
19         sys_rst_n <= 0;
20     else
21         sys_rst_n <= rst_n;
22 end
23 
24 always @(posedge clk or negedge sys_rst_n) begin
25     if(!sys_rst_n)
26         b <= 0;
27     else
28         b <= a;
29 end
30 
31 
32 
33 endmodule

2.RTL視圖

3.理解

①所謂“異步復位”是針對D觸發器的復位端口,它是異步的,但是設計中已經同步了異步復位信號,所以筆者(Crazybingo)認為這只是某種意義上的“異步復位”。

②所謂“同步釋放”,實際上是由於我們設計了同步邏輯電路,外部復位信號不會在出現釋放時與clk信號競爭,整個系統將與全局時鍾clk信號同步。

 

四、異步復位同步釋放(by特權同學)

 1 module system_ctrl
 2 //==================<端口>==================================================
 3 (
 4 //globel clock ----------------------------------
 5 input  wire                 clk                 , //時鍾,50Mhz
 6 input  wire                 rst_n               , //復位,低電平有效
 7 //user interface --------------------------------
 8 input  wire                 a                   , //輸入信號
 9 output reg                  b                     //輸出信號
10 );
11 
12 //==========================================================================
13 //==    異步復位的同步化設計
14 //==========================================================================
15 reg        sys_rst_n_r;
16 reg        sys_rst_n;
17 
18 always @(posedge clk or negedge rst_n) begin
19     if(!rst_n) begin
20         sys_rst_n_r <= 0;
21         sys_rst_n   <= 0;
22     end
23     else begin
24         sys_rst_n_r <= 1;
25         sys_rst_n   <= sys_rst_n_r;
26     end
27 end
28 
29 always @(posedge clk or negedge sys_rst_n) begin
30     if(!sys_rst_n)
31         b <= 0;
32     else
33         b <= a;
34 end
35 
36 
37 
38 endmodule

 

  那我就奇怪了,Crazybingo和特權的,哪一個才是真正的“異步復位同步釋放”呢?網上比較多的是特權同學這種,但Crazybingo的好像也沒有什么錯誤。

 

參考資料:

[1]韓彬, 於瀟宇, 張雷鳴. FPGA設計技巧與案例開發詳解[M]. 電子工業出版社, 2014.

[2]吳厚航. 深入淺出玩轉FPGA[M]. 北京航空航天大學出版社, 2013.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM