在實際的工程中選擇復位策略以前必須考慮許多設計方面的問題,如使用同步復位或者異步復位或者異步復位同步釋放(Asynchronous Reset Synchronous Release或者Synchronized Asynchronous Reset),以及是否每個觸發器都須要進行復位。復位的基本目的是使器件進入到能夠穩定工做的肯定狀態,這避免了器件在上電後進入到隨機狀態致使跑飛了。在實際設計過程當中,設計者必須選擇最適合於設計自己的復位方式。web
使用異步復位同步釋放就能夠消除上述缺點。所謂異步復位,同步釋放就是在復位信號到來的時候不受時鐘信號的同步,而是在復位信號釋放的時候受到時鐘信號的同步。異步復位同步釋放的原理圖和代碼以下:
get
1 //Synchronized Asynchronous Reset
2 module sync_async_reset (
3 input clock,
4 input reset_n,
5 input data_a,
6 input data_b,
7 output out_a,
8 output out_b);
9
10 reg reg1, reg2;
11 reg reg3, reg4;
12 assign out_a = reg1;
13 assign out_b = reg2;
14 assign rst_n = reg4;
15 always @ (posedge clock, negedge reset_n) begin
16 if (!reset_n) begin
17 reg3 <= 1'b0;
18 reg4 <= 1'b0;
19 end
20 else begin
21 reg3 <= 1'b1;
22 reg4 <= reg3;
23 end
24 end
25
26 always @ (posedge clock, negedge rst_n) begin
27 if (!rst_n) begin
28 reg1 <= 1'b0;
29 reg2 <= 1'b0;
30 end
31 else begin
32 reg1 <= data_a;
33 reg2 <= data_b;
34 end
35 end
36 endmodule // sync_async_reset