【深入浅出 FPGA】同步复位、异步复位以及异步复位同步释放

一、FPGA复位

  1. 复位的目的是什么?
    通俗的讲复位的目的就是让寄存器、电路以及系统处于一个已知的初始状态。
  2. 未曾触碰复位按键,为何程序也能复位?
    FPGA内部存在有上电复位功能的上电复位电路POR(Power On Reset)。FPGA有上电检测模块,一旦检测到电压超过检测门限后,即会产生上电复位脉冲传输至所有寄存器。

二、同步复位

同步复位只有在时钟触发沿来到时,复位信号才有效。
Verilog代码如下:

module Sync_rst(
	input 	sys_clk		,
	input 	sys_rst_n	,
	input   data_in		,
	
	output reg  data_out
);

always @(posedge sys_clk)begin
	if(!sys_rst_n)
		data_out <= 1'b0;
	else 
		data_out <= data_in;
end 

endmodule 

同步复位RTL视图:
在这里插入图片描述
同步复位仿真代码:

`timescale 1ns / 1ps  //时钟单位/时钟精度

module tb_test(
    );
	
reg sys_clk		;
reg sys_rst_n	;
reg data_in		;

wire data_out	;

//初始化测试条件
initial begin
	sys_clk    = 1'b0;
	sys_rst_n <= 1'b1;
	data_in   <= 1'b1;
	#20
	sys_rst_n <= 1'b0;
	#14
	sys_rst_n <= 1'b1;
	#57
	sys_rst_n <= 1'b0;
	#17
	sys_rst_n <= 1'b1;
end 

always #10 sys_clk = ~sys_clk; //时钟周期为20ns

//实例化同步复位模块
Sync_rst u_Sync_rst(
	.sys_clk(sys_clk)		,
	.sys_rst_n(sys_rst_n)	,
	.data_in(data_in)		,
	
	.data_out(data_out)
);

endmodule

同步复位仿真结果:

在这里插入图片描述
红色方框内,因复位信号少于一个时钟周期且未在时钟上升沿有效,导致系统未检测到复位,故复位次复位信号无效。

同步复位优点:

  1. 电路稳定性强:能保证电路同步,复位只发生在有效沿。
  2. 益于去除毛刺:可剔除复位信号中短于时钟周期的毛刺。

同步复位缺点:

  1. 复位信号大于时钟周期:由于复位信号只发生在有效沿,则复位信号长度必须大于时钟周期才能保证复位成功。
  2. 逻辑资源消耗较多:大多数场商目标库内的触发器都只有异步复位端口,采用同步复位需消耗较多逻辑资源。

三、异步复位

只要复位信号有效则系统立即复位。
Verilog代码如下:

module Async_rst(
	input 	sys_clk		,
	input 	sys_rst_n	,
	input   data_in		,
	
	output reg  data_out
);

always @(posedge sys_clk or negedge sys_rst_n)begin
	if(!sys_rst_n)
		data_out <= 1'b0;
	else 
		data_out <= data_in;
end 

endmodule 

异步复位RTL视图:
在这里插入图片描述
异步复位仿真初始化条件与同步复位相同。
异步复位仿真结果:
在这里插入图片描述
虽复位条件未超过一个时钟周期,但复位成功。
红色方框处易产生亚稳态。

同步复位优点:

  1. 消耗逻辑资源少:由于大多数的厂商目标库内的触发器都有异步复位端口(CLR),可以节约逻辑资源。
  2. 复位信号触发率高:由于采用复位信号下降沿触发,复位信号都可被触发。

同步复位缺点:

  1. 易受外界毛刺干扰:由于复位较为灵敏,无法滤除毛刺。
  2. 易产生亚稳态:由于复位信号释放是随机的,若释放处在时钟触发沿(不满足最小建立时间和最小保持时间),会产生亚稳态(不确定是0还是1)导致输出数据错误。

四、异步复位同步释放

该复位方式在复位信号到来时不受时钟信号的同步,而复位信号释放时受时钟信号的同步。为消除亚稳态,在复位信号释放时,利用两个统一时钟沿的层叠寄存器(打两拍),将复位信号同步化。
在这里插入图片描述

Verilog代码如下:

module rst(
	input 	sys_clk		,
	input 	sys_rst_n	,
	input   data_in		,
	
	output reg  data_out
);

reg sys_rst_n_reg0;
reg sys_rst_n_reg1;

//对复位信号打两拍
always @(posedge sys_clk or negedge sys_rst_n)begin
	if(!sys_rst_n)begin
		sys_rst_n_reg0 <= 1'b0;
		sys_rst_n_reg1 <= 1'b0;
	end 
	else begin
		sys_rst_n_reg0 <= sys_rst_n;
		sys_rst_n_reg1 <= sys_rst_n_reg0;
	end 
end 

//使用同步后的复位信号对数据进行复位
always @(posedge sys_clk or negedge sys_rst_n_reg1)begin
	if(!sys_rst_n_reg1)
		data_out <= 1'b0;
	else 
		data_out <= data_in;
end 

endmodule 

异步复位同步释放RTL视图:
在这里插入图片描述

异步复位同步释放仿真初始化条件与上述两种复位方式相同。
异步复位同步释放仿真结果:
在这里插入图片描述
异步复位同步释放优点:

  1. 电路稳定性强: 对复位信号进行同步后,该信号释放时,满足时钟的最小建立时间和最小保持时间,有效的去除了亚稳态。
  2. 响应速度快:有效捕获复位信号,复位信号短于一个时钟周期也能复位。

异步复位同步释放缺点:

  1. 相较于前面两种复位方式,该复位方式实现较为复杂。

五、小结

异步复位同步释放效果最为理想,但实际开发中一般采用异步复位

<think>好的,用户想了解异步复位同步释放的实现方式原理,特别是在FPGA数字电路中的应用。我需要先回顾一下之前学过的相关知识,然后结合提供的引用内容来组织回答。 首先,异步复位同步复位的区别是什么?异步复位是指复位信号不受时钟控制,只要复位信号有效,立即复位电路。而同步复位则需要等待时钟边沿到来时才生效。根据引用[1],同步复位可能需要综合器插入组合逻辑,消耗更多资源,而异步复位直接利用DFF的异步复位端口,但撤离时可能会有亚稳态问题。 接下来,异步复位同步释放(Asynchronous Reset Synchronous Release)的目标应该是结合两者的优点,既使用异步复位来快速响应,又通过同步释放避免亚稳态。根据引用[2],这种方法在撤离复位信号时进行同步处理,满足时序要求,避免亚稳态。 实现方式方面,用户可能想知道具体的电路结构。根据引用[3],可能需要使用两级触发器来同步复位信号的释放。第一级触发器用异步复位,输出连接到第二级触发器的输入,第二级的输出作为实际的系统复位信号。这样,复位信号的撤离会被时钟同步,确保释放时不会在时钟边沿附近变化,减少亚稳态风险。 在代码示例部分,可能需要给出Verilog HDL的例子,如引用[3]中的实例。但用户提供的引用中并没有具体代码,可能需要根据常规实现来编写。例如,使用两个触发器级联,异步复位信号先被第一个触发器捕获,然后传递给第二个触发器,确保同步释放。 还需要解释亚稳态是如何产生的,以及同步释放如何避免这个问题。引用[2]提到,同步释放处理使得复位信号撤离时满足恢复去除时间,避免亚稳态。因此,在解释原理时,需要说明复位信号在释放时与时钟同步,确保稳定的信号传递。 最后,生成相关问题可能需要围绕实现步骤、优势、亚稳态的原因,以及不同复位方式的比较展开。确保问题能够帮助用户深入理解该技术。 总结回答结构:先介绍异步复位同步释放的概念解决的问题,然后详细说明实现步骤电路结构,结合代码示例,最后分析其优点,如避免亚稳态节省资源。同时,引用提供的参考文献来支持关键点。</think>### 异步复位同步释放的实现原理 异步复位同步释放(Asynchronous Reset Synchronous Release)是一种结合异步复位的高效性同步复位的稳定性的设计方法,主要用于解决复位信号撤离时可能引发的亚稳态问题[^2]。 #### 实现方式 1. **异步复位**:复位信号(如 `rst_n`)直接连接到触发器的异步复位端,无需等待时钟信号即可立即生效。例如: ```verilog always @(posedge clk or negedge rst_n) begin if (!rst_n) begin q1 <= 0; // 异步复位 end else begin q1 <= d; end end ``` 2. **同步释放**:通过两级触发器对复位信号的撤离进行同步处理: ```verilog reg sync_rst1, sync_rst2; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin sync_rst1 <= 1'b0; // 异步复位 sync_rst2 <= 1'b0; end else begin sync_rst1 <= 1'b1; // 同步释放 sync_rst2 <= sync_rst1; end end assign sys_rst = sync_rst2; ``` 上述代码中,`sys_rst` 是最终的复位信号,其撤离过程被时钟同步,确保在稳定状态后释放[^3]。 #### 原理分析 - **亚稳态风险**:若复位信号在时钟边沿附近撤离(违反恢复时间/去除时间),可能导致触发器输出振荡。 - **同步释放作用**:通过两级触发器延迟复位信号的撤离,使其仅在时钟边沿后生效,满足时序要求,避免亚稳态。 - **资源优化**:直接利用FPGA中触发器的异步复位端口,无需插入额外组合逻辑,节省资源[^1]。 #### 电路结构 1. **异步复位模块**:复位信号直接控制第一级触发器的异步复位端。 2. **同步释放模块**:两级触发器串联,将异步复位信号的撤离与时钟同步。 - 最终复位信号 `sys_rst` 的撤销会延迟至少一个时钟周期,确保系统稳定。 ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值