Verilog同步复位,异步复位

本文探讨了FPGA设计中的同步复位与异步复位两种常见复位方式,并通过具体例子对比分析了它们的优缺点及潜在问题,最后提出了结合两者的改进方案——异步复位同步释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转自http://bbs.ednchina.com/BLOG_ARTICLE_201656.HTM?source=sina

        FPGA设计中常见的复位方式即同步复位和异步复位。在深入探讨亚稳态这个概念之前,特权同学也并没有对所谓的同步复位和异步复位有太多的注意,而在实践中充分感受了亚稳态的危害之后,回过头来细细品味《Verilog HDL设计与验证》一书中关于复位的章节,可谓受益匪浅。

 

       在特权同学以前的代码里大多使用的是异步复位。


       一个简单的异步复位的例子


always @ (posedge clk or negedge rst_n)


         if(!rst_n) b <= 1'b0;


         else b <= a;


         我们可以看到FPGA的寄存器都有一个异步的清零端(CLR),在异步复位的设计中这个端口一般就是接低电平有效的复位信号rst_n。即使说你的设计中是高电平复位,那么实际综合后会把你的复位信号反向后接这个CLR端。

  一个简单的同步复位的例子


always @ (posedge clk)


         if(!rst_n) b <= 1'b0;


         else b <= a;


 




         和异步复位相比,同步复位没有用上寄存器的CLR端口,综合出来的实际电路只是把复位信号rst_n作为了输入逻辑的使能信号。那么,这样的同步复位势必会额外增加FPGA内部的资源消耗。

          另外需要注意的是,同步复位信号RST必须至少长于一个时钟周期CLK,否则,这个复位信号引起的变化是不会被检测到的!!从verilog语句看,always@(posedge clk)中去检测RST信号的。

       那么同步复位和异步复位到底孰优孰劣呢?

       只能说,各有优缺点。同步复位的好在于它只在时钟信号clk的上升沿触发进行系统是否复位的判断,这降低了亚稳态出现的概率;它的不好上面也说了,在于它需要消耗更多的器件资源,这是我们不希望看到的。FPGA的寄存器有支持异步复位专用的端口,采用异步复位的端口无需额外增加器件资源的消耗,但是异步复位也存在着隐患,特权同学过去从没有意识到也没有见识过。异步时钟域的亚稳态问题同样的存在与异步复位信号和系统时钟信号之间。

 

       再看下面一个两级寄存器异步复位的例子

always @ (posedge clk or negedge rst_n)


         if(!rst_n) b <= 1'b0;


         else b <= a;

always @ (posedge clk or negedge rst_n)


         if(!rst_n) c <= 1'b0;


         else c <= b;      


 


         正常情况下,clk的上升沿c更新为bb更新为a。一旦进入复位,b,c都清零;但是我们不能确定复位信号rst_n会在什么时候结束。如果结束于b_reg0c_reg0{launch edge –stup,launch edge+hold}时间只外,那么一切都会正常。但如果恰恰相反,会出现什么情况呢? rst_n的上升变化出现在了clk上升的建立保持时间上,此时clk检测到的rst_n的状态就会是一个亚稳态(是01不确定)。从代码里我们看到如果此时b_reg0c_reg0认为rst_n0,那么依然保持复位清零,而如果认为rst_n1,那么就跳出复位。因为此时的rst_n的不确定性,就可能出现4种情况,即b_reg0c_reg0都复位或者都跳出复位,再或者一个复位一个跳出复位。那么后者就会造成了系统工作不同步的问题,在这个简单的两级异步复位实例中这种危害表现的并不明显,但是我们试想一个大的工程项目里众多的寄存器出现如此情况又会是如何一番景象呢?


       上面的分析似乎都让人意识到同步复位和异步复位都不可靠,那么如何将两者结合,取长补短呢。

       异步复位、同步释放

always @ (posedge clk)


         rst_nr <= rst_n;                 //现将异步复位信号用同步时钟打一拍

 

always @ (posedge clk or negedge rst_nr)


         if(!rst_nr) b <= 1'b0;


         else b <= a;

always @ (posedge clk or negedge rst_nr)


         if(!rst_nr) c <= 1'b0;


         else c <= b;      

         如此一来,既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。


 

       另外特权同学请教过IC设计部一位资深专家,他们在设计中常用的复位方式和上面的方法类似,大体如下:

 

        另外博主偶然看到这么二句话

     “同步复位和异步复位的区别就在于 前者的复何信号不能出现在always语句的敏感信号表中,无论是同步复位还是异步
复,always语句的结构都是if(Reset)...else... ,否则,综合工具将不能正确的综合”

       “所有always语句中的赋值最好采用非阻塞赋值语 ,否则,可能会导致仿真与综合的不一致”


 

<think>嗯,用户这次的问题很明确,是关于Verilog同步复位异步复位的区别。从引用内容来看,用户已经查阅了一些资料,但可能还需要更系统的对比解释。 用户提供的四个引用很有价值。引用1和引用3分别给出了同步复位异步复位的代码示例,这是很好的切入点。引用2提到了实际工程中复位策略的选择考量,引用4则详细解释了异步复位同步释放的机制。这些材料足以支撑一个全面的回答。 用户可能正在学习数字电路设计或FPGA开发,需要理解这两种复位方式的核心差异。考虑到复位电路对系统稳定性的重要性,用户可能还隐含了“如何选择”的深层需求。 在回答结构上,我决定先明确定义两种复位方式: 1. 同步复位:引用1的代码很典型,复位信号只在时钟边沿生效 2. 异步复位:引用3的代码展示了敏感列表包含复位信号的特点 然后需要对比关键差异点: - 响应速度(异步立即生效 vs 同步需等待时钟) - 抗干扰能力(同步避免毛刺) - 时序分析难度 - 资源消耗(引用提到同步复位可能消耗更多逻辑资源) 特别要强调引用4的异步复位同步释放技术,这是工程中常用的折中方案。最后补充选择建议时,可以结合引用2提到的实际工程考量。 用户可能还会关心测试覆盖率的问题,所以补充了DFT相关内容。在相关问题设计上,覆盖了机制理解(Q1)、设计实践(Q2)、工程问题(Q3)和高级应用(Q4),形成完整的学习路径。 注意到所有代码示例都保持了Verilog语法正确性,且严格使用$...$标记行内信号名如$rst_n$,符合系统指令要求。</think>在Verilog中,**同步复位**和**异步复位**是两种不同的复位策略,核心区别在于**复位信号生效的时序条件**和**对时钟信号的依赖关系**。以下是详细对比: --- ### **1. 同步复位 (Synchronous Reset)** - **原理**:复位信号仅在时钟有效边沿(如上升沿)时生效。 - **代码特点**: ```verilog always @(posedge clk) begin if (!rst_n) begin // 复位信号检测 q <= 0; end else begin q <= d; // 正常逻辑 end end ``` - **关键特性**: - **复位延迟**:复位操作需等待下一个时钟边沿,响应延迟至少一个周期[^1]。 - **抗毛刺**:因受时钟同步约束,可避免复位信号毛刺导致的误触发[^1][^2]。 - **资源消耗**:复位逻辑需合并到数据路径中,可能增加组合逻辑资源[^2]。 - **时序分析**:更易满足时序约束,复位信号与数据信号路径一致。 --- ### **2. 异步复位 (Asynchronous Reset)** - **原理**:复位信号立即生效,无需等待时钟边沿。 - **代码特点**: ```verilog always @(posedge clk or posedge rst_async) begin if (rst_async) begin // 复位信号独立于时钟 q <= 0; end else begin q <= d; end end ``` - **关键特性**: - **即时响应**:复位信号变化立即触发复位操作(如`rst_async`上升沿)[^3]。 - **毛刺敏感**:复位信号毛刺可能导致意外复位,需硬件滤波或同步处理[^2][^4]。 - **资源优化**:FPGA中触发器通常内置异步复位端,节省逻辑资源[^2]。 - **时序挑战**:复位撤离时需满足**恢复时间**(Recovery Time)和**移除时间**(Removal Time),否则可能引发亚稳态[^4]。 --- ### **3. 核心对比总结** | **特性** | **同步复位** | **异步复位** | |-------------------|-------------------------------|-------------------------------| | **复位生效条件** | 需时钟边沿 | 立即生效 | | **响应速度** | 延迟至少一个周期 | 即时响应 | | **抗毛刺能力** | 强(时钟同步过滤) | 弱(需额外滤波) | | **资源占用** | 可能增加组合逻辑 | 通常更省资源(用专用复位端) | | **时序风险** | 低(复位与数据路径同步) | 高(复位撤离易引发亚稳态) | --- ### **4. 工程实践:异步复位同步释放** 为兼顾异步复位的即时性和同步复位的稳定性,常用**异步复位同步释放**技术[^4]: ```verilog module async_reset_sync_release ( input clk, input rst_async_n, // 异步复位(低有效) output reg q ); reg rst_meta, rst_sync_n; always @(posedge clk or negedge rst_async_n) begin if (!rst_async_n) begin // 异步复位 rst_meta <= 1'b0; rst_sync_n <= 1'b0; end else begin // 同步释放 rst_meta <= 1'b1; rst_sync_n <= rst_meta; end end always @(posedge clk) begin if (!rst_sync_n) q <= 0; // 同步化后的复位 else q <= ...; // 正常逻辑 end endmodule ``` - **原理**: 异步复位信号`rst_async_n`先被两级触发器同步化,确保复位释放时不会因亚稳态导致系统状态错误[^4]。 --- ### **5. 选择建议** - **同步复位**:适用于对复位延迟不敏感、需避免毛刺的场景(如数据通路)[^1][^2]。 - **异步复位**:适用于上电初始化、对复位响应速度要求高的场景(如全局复位)[^3]。 - **混合方案**:优先使用**异步复位同步释放**,兼顾速度与可靠性[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值