当前位置: 首页 > news >正文

ZYNQ学习记录FPGA(五)高频信号中的亚稳态问题

一、亚稳态概述:

1.1 触发器

        在讲解亚稳态前,先介绍一下亚稳态的源头 —— 触发器。

        1.1.1 基本概念

         在数字电路里,触发器(Flip - Flop)是一种存储元件,常用于同步电路中存储二进制数据。 它是由逻辑门(如与门、或门、非门)构成的时序电路,能够根据时钟信号的变化来存储和改变其输出状态。

        触发器分为D 触发器(Data Flip-Flop)、T 触发器(Toggle Flip-Flop)、JK 触发器和SR 触发器(Set-Reset Flip-Flop)。触发器特点有:① 双稳态(如0和1);② 时钟控制;③存储作用。最后,触发器还有建立时间(Setup Time)保持时间(Hold Time)是两个关键时序参数,它们对于触发器正确采样输入信号至关重要,亚稳态的产生和这两个参数密切相关。

        1.1.2  建立时间(Setup Time)和 保持时间(Hold Time)

       建立时间指的是在时钟信号有效沿(如上升沿或下降沿)到来之前,输入信号必须保持稳定不变的最小时间间隔。通俗来讲,触发器收到时钟有效沿之前需要采集信号,采集信号需要一定的时间,在这段时间内必须保证输入信号稳定不变,这个时间就是建立时间。比如:假设一个触发器的建立时间是 2ns,时钟信号上升沿触发。那么在时钟上升沿到来前的 2ns 内,输入信号就不能发生变化,必须保持稳定,否则触发器可能无法正确采样到输入信号的值。

        保持时间是指在时钟信号有效沿到来之后,输入信号必须继续保持稳定不变的最小时间间隔。通俗来讲,触发器收到时钟有效沿后需要锁存信号,锁存信号也需要一定的时间,在这段时间内同样要保证输入信号稳定不变,这个时间就是保持时间。比如:若触发器的保持时间为 1ns,当时钟上升沿到来后,输入信号在接下来的 1ns 内要保持不变,这样触发器才能正确存储输入信号的值。

图示如下:

        建立时间在时钟有效沿之前(图中上升沿有效),保持时间在时钟有效沿之后,建立时间和保持时间内都必须保证输入信号稳定不变。

1.2 亚稳态

        亚稳态是数字电路中一种特殊的状态,当触发器的输入信号在其建立时间( setup time )和保持时间( hold time )窗口内发生变化时触发器的输出就可能进入亚稳态。在亚稳态期间,触发器的输出电压会在高低电平之间震荡,无法稳定在逻辑 0 或者逻辑 1 上,且这种状态可能会持续一段时间,直到触发器受内部噪声等因素影响,最终稳定到逻辑 0 或 1。这容易造成整体信号的严重失真。

 二、亚稳态产生的原因

        2.1 时域交叉

        在数字系统中,不同的模块可能工作在不同的时钟域下。当一个信号从一个时钟域传递到另一个时钟域时,如果接收时钟域的触发器采样该信号的时刻正好处于信号发生变化的时间段内,就可能违反触发器在建立时间和保持时间内输入信号必须稳定要求,从而导致亚稳态。

        比如在脉冲计数器的应用中,待计数的脉冲信号(输入信号)可能来自外部设备,其变化时间与系统内部的时钟没有同步,当使用内部时钟对这个输入信号进行采样时就容易出现亚稳态问题,在这个应用中就会导致计数值偏离理论值、计数值波动大等问题。

        2.2 高频时钟影响

        时钟频率越高,时钟周期就越短。这意味着相同的周期中触发器的采样窗口越来越多,那么窗口时间内输入信号发生变化的概率就变高了,即输入信号在时钟信号上升沿附近变化时 更有可能进入触发器的建立和保持时间窗口,进而引发亚稳态。

三、亚稳态的危害

        亚稳态的危害主要体现在它可能导致系统误判信号状态。由于亚稳态输出会在高低电平之间震荡,后续电路可能会将这种不稳定的输出当作有效信号进行处理,从而引发逻辑错误。

四、解决亚稳态的常用方法

        1)构建多级同步器:将多个D触发器级联构成同步器,当异步信号进入同步器后,会依次通过多个触发器,每经过一个触发器,亚稳态的恢复概率就会增加。通常使用两级同步器就能在很大程度上降低亚稳态带来的影响。

        2)异步FIFO:异步 FIFO 主要由写时钟域、读时钟域、双端口 RAM 以及读写指针组成。写时钟域负责将数据写入 FIFO,读时钟域负责从 FIFO 中读取数据。为了避免读写冲突,需要使用格雷码来表示读写指针,并且通过同步器将指针信号跨时钟域传递,以此判断 FIFO 的空满状态。

        3)格雷码编码:普通二进制码在计数过程中,可能会有多位同时发生变化,这在跨时钟域传输时容易导致错误。而格雷码每次计数变化只有一位改变,在跨时钟域传输时更加稳定,因此可以将普通二进制转化为格雷码进行传输。

下面展示在用verilog语言编写同步器解决亚稳态的代码:

reg photon_signal_sync1;
reg photon_signal_sync2;always @(posedge clk_400m or negedge rst_n) beginif (!rst_n) beginphoton_signal_sync1 <= 1'b0;photon_signal_sync2 <= 1'b0;end else beginphoton_signal_sync1 <= photon_signal;photon_signal_sync2 <= photon_signal_sync1;end
end

用reg定义寄存器变量并在内部时钟的触发下进行赋值传递来模拟D触发器的级联,以此构成同步器。

http://www.lryc.cn/news/571646.html

相关文章:

  • VMware vSphere Foundation 9.0 技术手册 —— Ⅰ 安装 ESXi 9.0 (虚拟机)
  • 数据库char字段做trim之后查询很慢的解决方式
  • 需要做一款小程序,用来发券,后端如何进行设计能够保证足够安全?
  • 微信原生小程序转uniapp过程及错误总结
  • 环卫车辆定位与监管:安心联车辆监控管理平台--科技赋能城市环境卫生管理
  • 【力扣 中等 C】2. 两数相加
  • chili3d笔记18 出三视图调整
  • 数据结构——选择题—查漏补缺
  • Could not locate zlibwapi.dll. Please make sure it is in your library path!
  • 功耗高?加密弱?爱普特APT32F1023H8S6单片机 2μA待机+AES硬件加密破局
  • Vue3 + TypeScript 本地存储 localStorage 的用法
  • 【时时三省】(C语言基础)内部函数和外部函数
  • Cornerstone3D 2.x升级调研
  • EPLAN P8 2.9 如何使用.step格式3D文件绘制3D安装布局图
  • 用idea操作git缓存区回退、本地库回退、远程库回退
  • Oracle client 静默安装
  • 【八股消消乐】构建微服务架构体系—一致性抽象
  • react 自定义状态管理库
  • sql_mode(二)宽松模式和严格模式的区别
  • CHASE、CoSQL、SPARC概念介绍
  • 以list为输入条件,查询数据库表,java中的mapper层和mybatis层应该怎么写?
  • 裸金属服务器深度评测:云计算时代的性能与安全担当​​​​
  • centos 7单机安装ceph并创建rbd块设备
  • 博世X阿里云:智能座舱接入通义大模型!
  • MYSQL进阶超详细总结2.0
  • CppCon 2017 学习:CNL: A Compositional Numeric Library
  • Zephyr 高阶实践:彻底讲透 west 构建系统、模块管理与跨平台 CI/CD 配置
  • 微信小程序-数据加密
  • 数据结构 栈与队列 6.18
  • Vue3 × DataV:三步上手炫酷数据可视化组件库