0%

复位电路

异步复位,同步释放从何而来?

复位电路


时序电路是双稳态电路,必须有复位信号。组合逻辑电路,没有存储功能,不需要复位信号。

复位电路实现两个方面的功能:

  • 仿真的时候使电路进入初始状态或者其他预知状态;
  • 对于综合实现的真实电路,通过复位使电路进入初始状态或者其他预知状态。

同步复位电路


当复位信号发生变化时,并不立即生效,只有当有效时钟沿采样到已变化的复位信号后,才对所有寄存器复位。

优点

  • 有利于仿真器的仿真;
  • 可以使所设计的系统成为100%的同步时序电路,利于时序分析,综合出来的频率一般比较高;
  • 只在时钟有效电平到来时才复位,可以滤除高于时钟频率的毛刺。

缺点

  • 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk_skew,组合逻辑延时,复位延时等因素;

Tsyn_rst > Period max + (clk2-clk1) + t1 + t2

  • 由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会浪费较多的逻辑资源。

复位电路1.png

异步复位


当复位信号到达时,无论时钟触发沿是否有效,都会立即对目标(如寄存器、RAM等)复位。

优点

  • 大多数目标器件库的dff都有异步复位端口,采用异步复位可以节省资源;
  • 设计相对简单;
  • 异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口(GSR,Global Set Reset)。

缺点

  • 在复位信号释放时容易出现问题。例如,复位释放时恰恰在时钟有效沿附近,就容易是寄存器输出出现亚稳态,从而导致亚稳态;
  • 复位信号容易受到毛刺的影响

复位电路2.png

异步复位,同步释放


异步复位:复位信号在任意时刻到达低电平及复位,不需要和时钟同步

同步释放:复位信号取消的时候,必须跟时钟信号同步

优点

  • 只要复位信号有效,电路就处于复位状态;
  • 短脉宽复位也不会丢失;
  • 复位的撤离是同步信号,有良好的的撤离时序和足够的恢复时间。

复位电路3.png

RTL


syn_rst

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
module syn_rst (clk, rst_, cnt1, cnt2);

input clk;
input rst_;
output [4:0] cnt1 , cnt2;
reg [4:0] cnt1 , cnt2;


always @ (posedge clk)
if (!rst_)
begin
cnt1 <= 4'b0;
cnt2 <= 4'b0;
end
else
begin
if (cnt1 < 2'b11)
cnt1 <= cnt1 + 1;
else
cnt1 <= cnt1;
cnt2 <= cnt1 - 1;
end


endmodule

asyn_rst

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
module asyn_rst (clk, rst_, cnt1, cnt2);

input clk;
input rst_;
output [4:0] cnt1 , cnt2;
reg [4:0] cnt1 , cnt2;


always @ (posedge clk or negedge rst_)
if (!rst_)
begin
cnt1 <= 4'b0;
cnt2 <= 4'b0;
end
else
begin
if (cnt1 < 2'b11)
cnt1 <= cnt1 + 1;
else
cnt1 <= cnt1;
cnt2 <= cnt1 - 1;
end


endmodule

asyn_rst,syn_release

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
module asyn_rst_syn_release(clk, rst_, cnt1, cnt2);

input clk;
input rst_;
output [4:0] cnt1 , cnt2;
reg [4:0] cnt1 , cnt2;

// reset release circuit
reg reset_reg;
always @ (posedge clk)
reset_reg <= rst_;
always @ (posedge clk or negedge reset_reg)
if (!rst_)
begin
cnt1 <= 4'b0;
cnt2 <= 4'b0;
end
else
begin
if (cnt1 < 2'b11)
cnt1 <= cnt1 + 1;
else
cnt1 <= cnt1;
cnt2 <= cnt1 - 1;
end


endmodule

Reference

1.轻松成为设计高手–Verilog HDL 实用精讲

2.芯动力—硬件加速设计方法

Thank you for your accept!
-------------本文结束感谢您的阅读-------------