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實用案例)