异步复位同步释放(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

相关文章

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意