一、同步復位(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.
