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

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

关键字synchronized、volatile的比较

关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字的执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。多线程访问volatile不会发生阻塞,而synchronize

MySQL主从同步延迟原理及解决方案

概述 MySQL的主从同步是一个很成熟的架构,优点为: ①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力; ②在从主服务器进行备份,避免备份期间影响主服务器服务; ③当主服务器出现问题时,可以切换到从服务器。 相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢? MyS

AsyncTask 异步任务解析

1:构建AsyncTask 子类的回调方法: A:doInBackground:   必须重写,所有的耗时操作都在这个里面进行; B: onPreExecute:     用户操作数据前的调用; 例如:显示一个进度条 等 ; C: onPostExecute:    当doInBackground 执行完成后;会自动把数据传给onPostExecute方法;也就是说:这个方法是处理返回的数据的方法

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满

mysql创建新表,同步数据

import os import argparse import glob import cv2 import numpy as np import onnxruntime import tqdm import pymysql import time import json from datetime import datetime os.environ[“CUDA_VISIBLE_DEVICE

三.海量数据实时分析-FlinkCDC实现Mysql数据同步到Doris

FlinkCDC 同步Mysql到Doris 参考:https://nightlies.apache.org/flink/flink-cdc-docs-release-3.0/zh/docs/get-started/quickstart/mysql-to-doris/ 1.安装Flink 下载 Flink 1.18.0,下载后把压缩包上传到服务器,使用tar -zxvf flink-xxx-

Gerrit与Gitlab同步配置replication其他配置

一、Gerrit与Gitlab同步配置 当配置好gerrit环境后,还需要与现有gitlab库进行同步配置,否则会影响现有开发与打包流程。 1.安装gerrit replication插件 unzip gerrit.warcp WEB-INF/plugins/replication.jar ~/temp/ssh -p 29418 admin@172.19.16.64 gerrit plu