Verilog編程規範——reset

Verilog編程規範——reset

有樣學樣,本篇內容從Verilog編程規範中的復位信號,講到FPGA中復位的場景。

內容實質來自《通信IC設計》一書,僅作整合用於學習。

Verilog 編程規範中的復位

規則1:禁止採用以下代碼實現同步復位。

正常情況下,任何一個模塊都可以同步復位和異步復位。但一般情況下,在同 一時鐘域內必須使用單一的全局同步復位電路,或者使用單一的全局異步復位電路。

而大多數ASIC設計通常還需要在FPGA上進行驗證,而FPGA對同步與異步復位的處理方式是不一致的。

爲保證代碼的通用性,針對ASIC項目,均強制使用異步復位方式,因此下述同步復位方式禁止使用;

always @ ( posedge clk ) begin
    if (syn_rst) begin
        ;
    end else begin
        ;
    end
end

規則2:建議使用同步化異步復位信號,實現電路如下圖:

異步復位同步化

上圖中,ext_asy_rst是來自外部的復位信號,雖然asy_rst_12p88的下降沿與時鐘同步,但它還是用作異步復位。

原則上每一個時鐘源都輸出一個異步復位信號。

上述電路的標準Verilog程序如下:

always @ ( posedge clk_122p88 or posedge ext_asy_rst ) begin
    if ( ext_asy_rst ) begin
        rst_shft[1:0] <= 2'b11; 
    end else begin
        rst_shft[1:0] <= {rst_shft[0], 1'b0};
    end
end

assign asy_rst_122p88 = rst_shft[1];

標準的異步復位語句規則如下:

always @ ( posedge clk_122p88 or posedge asy_rst_122p88 ) begin
    if ( asy_rst_122p88 ) begin
        ;
    end else begin
        ;
    end
end

規則3:除非第三方IP制定,否則所有的異步復位必須採用統一的有效電平;

FPGA中復位的應用場景

對於ASIC而言,任何一個同步寄存器單元都需要復位;對於FPGA而言,沒有確切的規定。

實際上,很多FPGA單元無需復位,因爲復位信號通常需要佔用FPGA內部的通道資源,而復位信號的負載通常很多,容易造成復位信號佈線困難,整體性能下降,編譯時間增加的問題。

因此在FPGA設計中能省略的復位儘量省略

此外FPGA通常在高級選項中會統一制定寄存器的復位信號電平,這樣能夠進一步節省復位資源開銷。

下面給出幾個能夠省略的復位例子,但不是絕對適用。

移位寄存器

通常情況下,只需要復位第一級移位寄存器,然後保持若干個週期,移位寄存器就被徹底復位了,而不用爲每個移位單元都添加復位。

如果每個單元都需要復位,必然會導致純粹的D觸發器實現,而FPGA廠商提供的是IP映射。

分頻用的計數器

分頻電路就是一個多位計數器,如果初始相位無需控制,就沒有必要對計數器進行初始復位,只需要每個時鐘加1即可。例如下面是一個2**N的計數分頻器。

reg [N-1:0] cnt;
always @ ( posedge clk ) begin
   cnt <= cnt + 1'b1; 
end

Moore型狀態機輸出

對於Moore型狀態機的輸出,只要復位了狀態機,下一週期就會被複位。對存儲狀態不復位可能會引起反震出現不定態(X)的問題。這個問題可以通過寄存器賦初值解決,例如:

reg[N-1:0] current_state = 0;

同步復位與異步復位

在復位設計中,一個常見的問題是電路採用同步復位還是異步復位。

Xilinx推薦電路採用同步復位,但筆者採用同步化的異步復位方式,下表闡述優缺點:

異步復位於同步復位的優缺點

下面是筆者推薦的異步復位同步化方法,如圖所示:

在這裏插入圖片描述

實現代碼如下:

module reset_sync(
	input clk,
 	input  rst_x_in, //
 	output reg rst_x_out //
 	);
reg rst_x1,rst_x2,rst_x3;
wire rst_x_pulse;
 
always @(posedge clk)begin
	rst_x1<=rst_x_in;
	rst_x2<=rst_x1;
	rst_x3<=rst_x2;
end
 
assign rst_x_pulse=rst_x2|rst_x3;
always @(posedge clk)
	rst_x_out<=rst_x_pulse;
endmodule

After

上述中的一些設計,無論時同步復位,還是異步復位,亦或者是異步復位同步化,之前都有遇到過;但是一直沒有成規則,搞不清楚,什麼時候該用什麼類型的復位。

以前做設計的時候,隨着自己的想法來,想怎麼弄,怎麼弄;

現在急需一套實用的Design rules,不止是節約時間,避免重複設計,更需要跟進行業內的標準;統一的標準會有很大的效率提升。

言而總之,復位的設計:

按照本人的理解,全部用最後推薦的異步時鐘同步化,就是最合適的方案。

這裏還能插廣告?

實用主義學Python(小白也容易上手的Python實用案例)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章