异步复位同步释放(Synchronized Asynchronous Reset)

2023-11-07 07:59

本文主要是介绍异步复位同步释放(Synchronized Asynchronous Reset),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 同步复位

        示例:

always@(posedge clk)    //没有“or negedge reset”if(!reset) beginout2 <= 0  ;elseout2 <= in2;

        1.1 优点

                ①一般能够确保电路是百分之百同步的。

                ②确保复位只发生在有效时钟沿,可以作为过滤掉毛刺的手段。

        1.2 缺点

                ①复位信号属于数据路径的一部分

                ②复位信号的有效时长必须大于时钟周期,且在时钟的有效边沿才能真正被系统识别并完成复位。同时还要考虑如:时钟偏移、组合逻辑路径延时、复位延时等因素。 

                ③由于大多数的厂商目标库内的触发器都只有异步复位端口,采用同步复位的话,就会耗费较多的逻辑资源。

2 异步复位

        示例:

always@(posedge clk or negedge reset)  //异步复位if(!reset) beginout1 <= 0   ;elseout1 <= in1 ;

        2.1 recovery time和removal time

                在同步电路中,输入数据需要与时钟满足setup time和hold time才能进行数据的正常传输,防止亚稳态。同样的道理,对于一个异步复位寄存器来说,同样异步复位信号同样需要和时钟满足recovery time和removal time 才能有效进行复位操作和复位释放操作,防止输出亚稳态。

                recovery time(恢复时间):

                  撤销复位时,恢复到非复位状态的电平必须在时钟有效沿来临之前的一段时间到来,才能保证时钟能有效恢复到非复位状态,此段时间为recovery time,类似于同步时钟的setup time。

                removal time (去除时间):

                   复位时,在时钟有效沿来临之后复位信号还需要保持复位状态的一段时间为去除时间removal time(去除时间)。类似同步时钟hold time。

                总结:复位信号的操作(无论是复位还是释放)如果在时钟的recovery time和removal time之间的时间窗口内,都会产生亚稳态。

                异步复位信号一般会持续相对较长的时间,保证寄存器能复位完成。但是由于复位信号是异步的,我们不知道它会在什么时刻被释放。如果异步复位信号撤销时,不满足recovery time和removal time时,可能会造成亚稳态。

                很显然,并不是复位信号撤销时才可能出现亚稳态,复位信号一开始出现时,同样可能会存在亚稳态,只不过异步复位信号持续时间长,即使第一个周期出现了亚稳态(即第一个周期复位未成功),下一个时钟周期也不会再出现亚稳态了。

                如果复位信号的变化只持续刚刚一个时钟周期,那么复位信号开始和撤销时都可能会出现亚稳态。

        2.2 优点

                ①复位信号不是数据路径的一部分,不是触发器D输入的一部分

                ②异步复位信号识别方便,而且可以很方便的使用全局复位。

                ③由于大多数的厂商目标库内的触发器都有异步复位端口,可以节约逻辑资源。

        2.3 缺点

                ①复位信号容易受到毛刺的影响。

                ②复位结束时刻恰在亚稳态窗口内时,无法决定现在的复位状态是1还是0,会导致亚稳态。 

3 异步复位同步释放

        所谓异步复位同步释放(Synchronized Asynchronous Reset),就是在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。

        电路目的:防止复位信号撤除时产生亚稳态事件。

        异步复位:显而易见,reset_n异步复位后,rst_n将拉低,即实现异步复位。

        同步释放:这个是关键,看如何实现同步释放,即当复位信号reset_n撤除时,由于双缓冲电路(双寄存器)的作用,rst_n复位信号不会随着reset_n的撤除而撤除。

        异步复位同步释放的原理图和代码如下:

//Synchronized Asynchronous Reset
//异步复位、同步释放:只适用于没有PLL的系统复位信号的设置
module sync_async_reset(clock,reset_n,rst_n);input clock, reset_n;output rst_n;reg rst_nr1, rst_nr2;always @(posedge clock or negedge reset_n) beginif(!reset_n) beginrst_nr1 <= 1'b0;rst_nr2 <= 1'b0;		//异步复位endelse beginrst_nr1 <= 1'b1;rst_nr2 <= rst_nr1;		//同步释放endendassign rst_n = rst_nr2;			//新的系统复位信号rst_n//信号rst_n作为新的系统复位信号,后续可以用来直接“异步复位”endmodule							// sync_async_reset

在这里插入图片描述

                当异步复位信号撤销时,用来同步的第二个寄存器输入的数据仍然是0,因此第二个寄存器是不会出现亚稳态的。第一个寄存器虽然可能出现亚稳态,即使其出现了亚稳态,这个亚稳态还需要通过第二个寄存器,这时第二个寄存器就起到了打拍的作用。也就是说,第二级的亚稳态只可能是上一级寄存器传播过来的,但是这个亚稳态经过第二级寄存器后,其大概率已经稳定下来了,就算稳定下来不为1,也就相当与复位信号多持续了一个周期而已。因此我们可以看出,使用异步复位同步释放时,异步复位撤销后是需要额外等待一个时钟周期的,否则会激励可能会被复位信号覆盖掉。 

  • 注意

        既解决了同步复位的资源消耗问题,又解决了异步复位的亚稳态问题,其根本思想是异步信号同步化

        新的系统复位信号可以直接用来“异步复位”;

        只适用于不带PLL的系统。 

4 PLL配置后的复位设计

         很多FPGA设计中都会涉及到多个时钟,使用器件内部的PLL或者DLL会使得多个时钟的管理变得更加容易。当多个时钟都是用PLL/DLL产生时,它们的系统复位信号采用如下设计:

        ①先用FPGA的外部输入时钟clk将FPGA的输入复位信号rst_n做异步复位、同步释放处理(注意采用反逻辑),然后这个复位信号输入PLL,同时将clk也输入PLL。设计的初衷是在PLL输出有效时钟之前,系统的其他部分都保持复位状态。

        ②PLL的输出locked信号在PLL有效输出前一直时低电平,PLL输出稳定有效之后才会拉高该信号,所以这里就把前面提到的FPGA外部输入复位信号rst_n和这个locked信号相作为整个系统的复位信号。

        ③这个复位信号也需要让合适的PLL输出时钟异步复位、同步释放处理一下。也就是说,为了达到可靠稳定的复位信号,该设计中对复位信号进行了两次处理,分别是在PLL输出前和PLL输出后。

源代码和RTL图如下所示:

module sys_ctrl(clk,rst_n,sys_rst_n,clk_25m,clk_100m);input clk;			//FPGA输入时钟信号input rst_n;		//系统硬件复位信号output sys_rst_n;	//系统复位信号,低有效	 output clk_25m, clk_100m;reg rst_r1, rst_r2;reg sysrst_nr1, sysrst_nr2;wire pll_rst;wire locked;		//输出信号有效标志,高表示PLL输出有效wire sysrst_nr0;wire sys_rst_n;		//系统复位信号,低有效//第一个异步复位同步释放always @(posedge clk or negedge rst_n)if(!rst_n) beginrst_r1 <= 1'b1;rst_r2 <= 1'b1;		//注意这里是“反”逻辑endelse beginrst_r1 <= 1'b0;rst_r2 <= rst_r1;endassign pll_rst = rst_r2;	//PLL的复位信号PLL_ctrl uut_PLL_ctrl(.areset(pll_rst),.inclk0(clk),.c0(clk_25m),.c1(clk_100m),.locked(locked));assign sysrst_nr0 = rst_n & locked;		//"与"逻辑,下图中“非或”=“与非”//第二个异步复位同步释放//注意这里的同步时钟为合适的PLL输出时钟always @(posedge clk_100m or negedge sysrst_nr0)if(!sysrst_nr0) beginsysrst_nr1 <= 1'b0;sysrst_nr2 <= 1'b0;endelse beginsysrst_nr1 <= 1'b1;sysrst_nr2 <= sysrst_nr1;end//信号sys_rst_n作为新的系统复位信号,后续可用作异步复位assign sys_rst_n = sysrst_nr2;endmodule


 

这篇关于异步复位同步释放(Synchronized Asynchronous Reset)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/362290

相关文章

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Java 中实现异步的多种方式

《Java中实现异步的多种方式》文章介绍了Java中实现异步处理的几种常见方式,每种方式都有其特点和适用场景,通过选择合适的异步处理方式,可以提高程序的性能和可维护性,感兴趣的朋友一起看看吧... 目录1. 线程池(ExecutorService)2. CompletableFuture3. ForkJoi

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll