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语言编写同步器解决亚稳态的代码:

bash 复制代码
reg photon_signal_sync1;
reg photon_signal_sync2;

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

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

相关推荐
今天又得骑车了23 分钟前
一、MySQL 8.0 之《EXPLAIN ANALYZE 执行计划》
数据库·mysql·database
野犬寒鸦1 小时前
MyBatis-Plus 中使用 Wrapper 自定义 SQL
java·数据库·后端·sql·mybatis
我爱一条柴ya2 小时前
【AI大模型】RAG系统组件:向量数据库(ChromaDB)
数据库·人工智能·pytorch·python·ai·ai编程
北北~Simple2 小时前
第一次搭建数据库
服务器·前端·javascript·数据库
鸢想睡觉2 小时前
【数据库基础 1】MySQL环境部署及基本操作
数据库·mysql
没有口袋啦2 小时前
《数据库》MySQL备份回复
数据库
c7_ln2 小时前
MYSQL C_API使用全解
c语言·数据库·mysql
karry01302 小时前
高并发导致重复key问题--org.springframework.dao.DuplicateKeyException
java·数据库·ide
经典19923 小时前
mysql 锁介绍
数据库·mysql
不太可爱的大白3 小时前
Mysql分片:一致性哈希算法
数据库·mysql·算法·哈希算法