在实际的工程中选择复位策略以前必须考虑许多设计方面的问题,如使用同步复位或者异步复位或者异步复位同步释放(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