学习记录(持续学习中):异步清零和同步清零区别和各自优缺点。 异步复位和同步释放实现方法。

本文详细介绍了异步和同步复位的概念,包括它们的工作原理、优缺点。异步复位在任何时刻都能触发复位,但可能导致亚稳态和静态定时分析困难;同步复位则在时钟边沿生效,能滤除高频率毛刺,但要求复位信号持续时间。此外,还讨论了异步复位和同步释放的实现方式,通过示例代码展示了如何在Verilog中实现。

学习记录(持续改进):异步和同步的区别,以及各自的优缺点,以及异步复位和同步释放的实现方法

一.异步
独立于时钟控制的复位控制端。(就是 rst, res_n,这些在always@的敏感信号表里) 这样在任何时刻只要复位信号一来,输出直接清0。

异步清零D触发器Verilog描述
代码
异步复位优缺点:
优点:
a、大多数目标器件库的 DFF 都有异步复位端口,那么该触发器的复位端口就不需要额外的组合逻辑,这样就可以节省资源;
b、设计相对简单;
c、异步复位信号识别方便(电路在任何情况下都能复位而不管是否有时钟出现)。
缺点:
a、最大的问题在于它属于异步逻辑,问题出现在复位释放时,而不是有效时,如果复位释放接近时钟有效沿,则触发器的输出可能进入亚稳态(此时 clk 检测到的 rst_n 的状态就会是一个亚稳态,即是0是1是不确定的),从而导致复位失败。
b、可能因为噪声或者毛刺造成虚假复位信号(比如以前的游戏机玩到一半突然复位)(注意:时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题);
c、静态定时分析比较困难。
d、对于 DFT (Design For Test可测性设计)设计,如果复位信号不是直接来自于 I/O 引脚,在 DFT 扫描和测试时,复位信号必须被禁止,因此需要额外的同步电路。
二.同步
控制信号只有在时钟边沿到来时才起作用。(控制信号不在always 敏感信号表中) 控制信号来了,不会马上清0,要等到下一个时钟信号到来,才会清零。
同步清零D触发器Verilog描述
在这里插入图片描述
同步电路优缺点:
优点:
a、有利于仿真器的仿真;
b、可以使所设计的系统成为 100% 的同步时序电路,有利于时序分析,而且可综合出较高的 Fmax;
c、由于只在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的复位毛刺。
缺点:
a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑诸如 clk skew 、组合逻辑路径延时 、复位延时等因素(所以复位信号有时需要脉冲展宽,用以保证时钟有效期间有足够的复位宽度);
b、由于大多数的逻辑器件的目标库内的 DFF 都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会一方面额外增加FPGA内部的逻辑资源,另一方面也增加了相应的组合逻辑门时延。
3.异步复位和同步释放实现方法(努力弄懂中!)
代码实现:(Altera 官方资料)

module reset_best(clk,asyn_reset,syn_reset);
input clk;
input asyn_reset;
output syn_reset;


reg rst_s1;
reg rst_s2;


always @( posedge clk ,posedge  asyn_reset)
begin
if(asyn_reset)
 begin
 rst_s1<=1'b0;
 rst_s2<=1'b0;
 end
else 
begin
rst_s1<=1'b1;
rst_s2<=rst_s1;
end
end


assign syn_reset=rst_s2;


endmodule
<think>我们被要求编写FPGA计数器的异步清零同步清零的Verilog代码,并比较两者的优缺点。 根据引用[1]引用[2]中的代码,我们可以提取异步清零同步清零实现方式。 异步清零清零信号(通常为低电平有效)不受时钟信号控制,只要清零信号有效,立即清零同步清零清零信号需要在时钟信号的有效边沿(如上升沿)到来时才会执行清零操作。 我们将分别设计一个异步清零计数器一个同步清零计数器,然后比较它们的优缺点。 设计一个4位计数器,计数范围0-15(二进制),具有使能信号(en)清零信号(rst_n,低电平有效)。同时,我们设计两个版本:异步清零同步清零异步清零计数器代码示例(参考引用[1]): 注意:引用[1]中的代码是异步清零,因为其always块敏感列表包含negedge RST(下降沿触发清零),同时还有时钟上升沿。 同步清零计数器代码示例(参考引用[2]): 引用[2]中的代码是同步清零,因为清零操作在时钟上升沿触发时执行。 下面分别给出两个计数器的代码: 1. 异步清零计数器(asynchronous_reset_counter.v): 清零信号(rst_n)在下降沿(或低电平)立即触发清零,不受时钟控制。 注意:在FPGA设计中,异步清零通常要求清零信号在敏感列表中,并且使用非阻塞赋值。 2. 同步清零计数器(synchronous_reset_counter.v): 清零信号(rst_n)只在时钟上升沿到来时检查,如果清零信号有效,则清零。 同时,我们还可以添加一个使能信号(en)来控制计数是否进行。 代码实现异步清零计数器: */ module asynchronous_reset_counter ( input clk, // 时钟信号 input rst_n, // 异步清零,低电平有效 input en, // 使能信号,高电平有效 output reg [3:0] count // 计数输出 ); // 异步复位:当rst_n为0时,立即清零,不受时钟控制 always @(posedge clk or negedge rst_n) begin if (!rst_n) // 异步清零,低电平有效 count <= 4'b0000; else if (en) count <= count + 1'b1; // 否则保持 end endmodule /* 同步清零计数器: */ module synchronous_reset_counter ( input clk, // 时钟信号 input rst_n, // 同步清零,低电平有效 input en, // 使能信号,高电平有效 output reg [3:0] count // 计数输出 ); // 同步复位:只在时钟上升沿触发时判断复位信号 always @(posedge clk) begin if (!rst_n) // 同步清零,低电平有效 count <= 4'b0000; else if (en) count <= count + 1'b1; // 否则保持 end endmodule /* 比较异步清零同步清零优缺点: 1. 异步清零: 优点: - 清零操作立即生效,不需要等待时钟沿,响应速度快。 - 设计简单,在复位信号有效时立即将计数器置零,不受时钟影响,因此在系统上电或需要紧急复位时非常有效。 缺点: - 由于异步复位信号与时钟无关,复位信号的释放(从有效变为无效)如果发生在时钟边沿附近,可能会导致触发器的输出出现亚稳态(metastability)问题。 - 异步复位信号容易受到毛刺(glitch)的影响,导致意外的复位操作。 - 在同步电路设计中,异步复位可能带来时序分析上的困难,因为复位信号的路径不是由时钟控制的。 2. 同步清零: 优点: - 清零操作与时钟同步,避免了亚稳态问题,因为复位信号只在时钟边沿采样。 - 复位信号不会受到毛刺的太大影响,因为只有在时钟边沿才会判断复位信号。 - 时序分析简单,所有的操作都在时钟控制下,有利于静态时序分析(STA)。 缺点: - 清零操作需要等待下一个时钟上升沿才能生效,因此响应速度相对较慢。 - 如果系统需要在任何时间点立即复位,同步清零可能无法满足要求。 应用场景: - 异步清零:适用于需要立即复位的情况,例如上电复位、外部紧急复位等。 - 同步清零:适用于对复位时间要求不高,且需要避免亚稳态毛刺干扰的同步系统设计。 在实际设计中,通常推荐使用同步复位,因为它更有利于时序收敛避免亚稳态。但是,在顶层复位信号引入时,常常使用异步复位,然后通过同步释放的方式(即异步复位同步释放)来避免亚稳态问题。这是一种折中的方案。 异步复位同步释放的计数器示例: 这种设计结合了异步复位的即时性同步复位的稳定性。 */ module async_reset_sync_release_counter ( input clk, input rst_n_async, // 异步复位,低电平有效 input en, output reg [3:0] count ); reg rst_n_sync1, rst_n_sync2; wire rst_n; // 同步释放后的复位信号 // 异步复位同步释放:两级触发器同步 always @(posedge clk or negedge rst_n_async) begin if (!rst_n_async) begin rst_n_sync1 <= 1'b0; rst_n_sync2 <= 1'b0; end else begin rst_n_sync1 <= 1'b1; rst_n_sync2 <= rst_n_sync1; end end assign rst_n = rst_n_sync2; // 同步后的复位信号,高电平有效(这里我们假设内部使用高电平复位,但原设计是低电平,所以需要调整?) // 注意:上面同步释放电路输出的rst_n实际上是高电平有效的同步复位信号(因为当rst_n_async为0时,rst_n为0;当rst_n_async释放后,经过两个时钟周期,rst_n变为1)。 // 但是,我们原来的复位是低电平有效,所以这里我们调整一下:将同步后的复位信号取反作为内部低电平复位?或者改变复位逻辑。 // 实际上,我们可以这样:我们同步释放后的复位信号是低电平有效的,因为当rst_n_async为0时,rst_n_sync2为0;当rst_n_async释放后,rst_n_sync2会在两个周期后变为1。 // 所以,我们可以直接使用rst_n_sync2作为同步释放后的低电平复位信号(即rst_n_sync2为0表示复位,为1表示无效)。 // 然后,我们使用这个同步释放后的复位信号(rst_n_sync2)作为计数器的复位,但是注意,我们希望复位是异步的还是同步的?实际上,这个复位信号已经是同步后的,所以我们可以用同步清零。 // 但是,这里我们设计的是异步复位同步释放,所以复位信号在释放时是同步的,但复位还是异步的(因为rst_n_async是异步的,会立即复位两个同步触发器,所以整个系统的复位还是异步的,但释放同步的)。 // 因此,我们可以在计数器的always块中使用异步复位(使用rst_n_sync2作为复位信号,它是经过同步释放的): always @(posedge clk or negedge rst_n_sync2) begin if (!rst_n_sync2) count <= 4'b0000; else if (en) count <= count + 1'b1; end // 这样,复位信号rst_n_async有效(低电平)时,立即复位计数器(因为rst_n_sync2立即变为0,触发异步复位),而复位释放时,rst_n_sync2会在两个时钟周期后释放,避免了亚稳态。 endmodule /* 总结: 异步清零同步清零各有优缺点,选择哪种方式取决于具体应用需求。在要求高可靠性的系统中,推荐使用异步复位同步释放的方式。 引用说明: 引用[1]提供了异步清零计数器的代码示例。 引用[2]提供了同步清零计数器的代码示例。 引用[3]介绍了计数器的基本概念。 根据以上内容,我们完成了异步清零同步清零计数器的Verilog代码,并分析了它们的优缺点。 生成的相关问题: */ §§相关问题§§ 1. 异步复位同步释放的原理是什么? 2. 在FPGA设计中,如何避免复位信号的亚稳态问题? 3. 除了清零方式,计数器设计还有哪些常见的功能(如置数、加减控制等)? 4. 如何设计一个可预置数的加减计数器? 5. 计数器的最大计数范围如何扩展?</think>### FPGA计数器异步清零同步清零的Verilog实现及比较 #### 1. **异步清零计数器实现** 异步清零清零信号**不受时钟控制**,立即生效(通常低电平有效)。 ```verilog module async_counter( input clk, // 时钟信号 input rst_n, // 异步清零(低电平有效) input en, // 计数使能 output reg [3:0] count // 4位计数器 ); always @(posedge clk or negedge rst_n) begin if (!rst_n) // 异步清零优先 count <= 4'b0000; else if (en) // 使能时计数 count <= count + 1; end endmodule ``` **关键点**: - 敏感列表包含 `posedge clk` `negedge rst_n` - 清零操作独立于时钟(立即执行)[^1] --- #### 2. **同步清零计数器实现** 同步清零清零信号**依赖时钟边沿**生效(通常低电平有效)。 ```verilog module sync_counter( input clk, // 时钟信号 input rst_n, // 同步清零(低电平有效) input en, // 计数使能 output reg [3:0] count // 4位计数器 ); always @(posedge clk) begin if (!rst_n) // 同步清零(需时钟触发) count <= 4'b0000; else if (en) // 使能时计数 count <= count + 1; end endmodule ``` **关键点**: - 敏感列表仅含 `posedge clk` - 清零操作在时钟上升沿检测[^2] --- ### 3. **异步清零 vs 同步清零优缺点分析** | **特性** | **异步清零** | **同步清零** | |----------------|--------------------------------------|--------------------------------------| | **响应速度** | ⭐️ 立即生效(无需等待时钟) | ⚡️ 需等待下一个时钟边沿 | | **抗干扰能力** | ❌ 易受毛刺影响(可能意外复位) | ✅ 毛刺不影响(仅在时钟边沿采样) | | **时序分析** | ❌ 复杂(复位路径独立于时钟) | ✅ 简单(完全同步化) | | **可靠性** | ❌ 复位释放可能引发亚稳态 | ✅ 避免亚稳态风险 | | **适用场景** | 上电复位、紧急复位 | 常规逻辑控制、高可靠性系统 | **关键结论**: 1. **异步清零**:复位响应快,但需额外处理亚稳态(推荐异步复位同步释放技术)[^3] 2. **同步清零**:更符合同步设计规范,降低时序收敛难度 3. **混合方案**:对可靠性要求高的系统,建议采用**异步复位同步释放**(见下方代码): ```verilog // 异步复位同步释放示例 always @(posedge clk) begin sync_rst <= rst_n; // 两级同步化 end always @(posedge clk or negedge sync_rst) begin if (!sync_rst) count <= 0; // 同步化后的异步清零 end ``` --- ### 4. **设计建议** - **高速系统**:优先选择同步清零(避免时序违例) - **复位毛刺敏感场景**:使用同步清零 + 滤波电路 - **FPGA资源利用**:同步清零更节省触发器(无需额外复位树优化) > 异步清零的即时性以牺牲时序确定性为代价,而同步清零通过时钟域约束提供可预测的行为[^2][^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值