0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

亚稳态的分析与处理

CHANBAEK 来源:新芯设计 作者:新芯设计 2023-06-21 14:38 次阅读

引言

  本文主要介绍了亚稳态的分析与处理。

一、亚稳态的相关概念

  亚稳态(Metastability)是指 D 触发器无法在某个规定的时间段内(决断时间)达到一个可确认的状态(0 或 1),进而处于一个振荡的不确定状态。

  亚稳态的具体表现是当一个 D 触发器进入亚稳态时,既无法预测该单元的输出电平(不确定是 0 还是 1),也无法预测何时输出才能够稳定下来(通常情况下,一个时钟、或者两个时钟的时间之内可以返回稳态)。在这个达到稳定之前的时间内,D 触发器输出一些中间级电平,或者可能处于振荡状态,或者可能会沿着信号通道上的各个 D 触发器级联式传播下去,最终导致系统的崩溃。

  亚稳态的产生原因是 D 触发器的建立时间和保持时间在时钟上升沿左右定义了一个时间窗口(亚稳态窗口)(较新的逻辑器件会有较小的亚稳态窗口),在这段时间内,输入信号和时钟都应该保持不变。如果 D 触发器的输入数据在这个时间窗口内发生变化(数据更新),那么就违反了建立时间和保持时间的要求,从而产生了时序违规(Timing Violation)。此时 D 触发器内部的一个节点(一个内部节点或者要输出到外部节点)可能会在一个电压范围内浮动(徘徊在一个中间电平状态),无法确定最终是稳定在逻辑 0 或者是逻辑 1 的状态,而在这段时间里,数据输出端 Q 为毛刺、振荡状态,而不是等于数据输入端 D 的值。

  亚稳态的随机输出表现为 D 触发器输出端 Q 在时钟上升沿之后,比较长的一段时间处于不确定的状态,在这段时间里 Q 端在 0 和 1 之间处于振荡状态,而不是等于数据输入端 D 的值,这段时间称为决断时间。经过决断时间之后 Q 端将稳定为 0 或 1 ,但是具体是 0 或 1 却是随机的,与输入没有必然关联。亚稳态无法根除,但是可以减小亚稳态发生的概率。

二、亚稳态的解决方法

  • 降低系统时钟频率;
  • 提高时钟信号边沿变化速度(这个取决于晶振、器件、工艺等等);
  • 用反应更快的 DFF;
  • 引入同步机制,防止亚稳态的传播;
  • 相位控制技术,PLL 控制分频与相位。

三、亚稳态的解决案例

  对于以上的第 4 点,有多级 D 触发器级联处理方式(节拍),可对异步信号进行同步处理。可以看出,前面基于时钟域 Clk_a 的信号发送过来,在基于时钟域 Clk_b 的时钟下进行采样,可能会出现采样时钟上升沿刚好出现在数据变化的那一刻,于是,就会产生亚稳态。

  当第一个寄存器发生亚稳态后,经过 Tmet 的振荡稳定后,第二级、或者第三级寄存器就能采集到一个稳定的值,避免了亚稳态跟随着电路一直传递下去,从而最终导致的系统的崩溃。

图片

打两拍电路图

图片

打两拍时序图

图片

打两拍时序图

四、亚稳态的 Verilog 代码(打两拍、慢到快)

reg [1:0] signal_r; // 两级缓冲器、两级寄存器,打完两拍之后,才可以进行组合逻辑的操作

always @(posedge clkb or negedge rst_n)begin
    if(!rst_n)
        signal_r <= 2'b00;
    else begin
        signal_r <= {signal_r[0], signal_in};//signal_in 是基于 clka 的
    end
end

assign  signal_out = signal_r[1];

五、亚稳态的 Verilog 代码(打两拍、快到慢)

module Sync_Pulse(  // clka 下生成展宽信号,展宽信号同步到 clkb,再同步回 clka
 input  clka,
 input  clkb,
 input  rst_n,
 input  pulse_ina, // clka下的脉冲;
 output pulse_outb,// 上升沿检测
 output signal_outb// clkb下的脉冲;
);

reg signal_a;
reg [2:0] signal_b_r;
reg [1:0] signal_a_r;

//-------------------------------------------------------
// 在 clka 下,生成展宽信号 signal_a
always @(posedge clka or negedge rst_n)begin
    if(!rst_n)
        signal_a <= 1'b0;
    else if(pulse_ina)     // 检测到输入信号 pulse_ina 被拉高,则拉高 signal_a
        signal_a <= 1'b1;
    else if(signal_a_r[1]) // 检测到反馈信号 signal_a_r[1] 被拉高,则拉低 signal_a
        signal_a <= 1'b0;
    else
        signal_a <= signal_a;
end
//-------------------------------------------------------
// 在 clkb 下打三拍,前两个用于同步 signal_a,后一个用于生成脉冲信号、// 输出信号
always @(posedge clkb or negedge rst_n)begin
    if(!rst_n)
        signal_b_r <= 3'b000;
    else
        signal_b_r <= {signal_b_r[1:0], signal_a};
end
assign pulse_outb = ~signal_b_r[2] & signal_b_r[1];// 判断上升沿;
assign signal_outb = signal_b_r[2];
// 不需要用到跳变沿的来自同一时钟域的输入,没有必要对信号进行寄存;
// 需要用到跳变沿的来自同一时钟域的输入,寄存一次即可;
// 需要用到跳变沿的来自不同时钟域的输入,需要用到 3 个触发器,前两个用// 于同步,第 3 个触发器的输出和第 2 个的输出经过逻辑门来判断跳变沿。
//-------------------------------------------------------
// 在 clka 下打两拍,采集 signal_b_r[2],生成 signal_a_r[1] 用于反馈拉// 低 signal_a
always @(posedge clka or negedge rst_n)begin
    if(!rst_n)begin
        signal_a_r <= 2'b00;
    end
    else begin
        signal_a_r <= {signal_a_r[0], signal_b_r[2]};
    end
end

endmodule
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5343

    浏览量

    120345
  • 时钟
    +关注

    关注

    10

    文章

    1733

    浏览量

    131477
  • 触发器
    +关注

    关注

    14

    文章

    2000

    浏览量

    61152
  • 亚稳态
    +关注

    关注

    0

    文章

    46

    浏览量

    13276
收藏 人收藏

    评论

    相关推荐

    利用IDDR简化亚稳态方案

    如果在具有多个时钟的非同步系统中使用FPGA,或者系统中的时钟频率或相位与FPGA所使用时钟频率或相位不同,那么设计就会遇到亚稳态问题。不幸的是,如果设计遇到上述情况,是没有办法完全解决亚稳态
    发表于 12-29 15:17

    FPGA中亚稳态——让你无处可逃

    注意事项。2. 理论分析2.1信号传输中的亚稳态在同步系统中,输入信号总是系统时钟同步,能够达到寄存器的时序要求,所以亚稳态不会发生。亚稳态问题通常发生在一些跨时钟域信号传输以及异步信
    发表于 01-11 11:49

    xilinx资料:利用IDDR简化亚稳态

    亚稳态事件,结合实例讲解,语言通俗易懂,由浅入深,特别举了多个实例以及解决方案,非常具有针对性,让人受益匪浅,非常适合对亚稳态方面掌握不好的中国工程师和中国的学生朋友,是关于亚稳态方面不可多得的好资料,强烈推荐哦!!![hid
    发表于 03-05 14:11

    FPGA中亚稳态——让你无处可逃

    导致复位失败。怎么降低亚稳态发生的概率成了FPGA设计需要重视的一个注意事项。2. 理论分析2.1信号传输中的亚稳态在同步系统中,输入信号总是系统时钟同步,能够达到寄存器的时序要求,所以亚稳态
    发表于 04-25 15:29

    FPGA触发器的亚稳态认识

    可能会出现非法状态---亚稳态亚稳态是一种不稳定状态,在一定时间后, 最终返回到两个稳定状态之一。亚稳态输出的信号是什么样子的? 对于系统有什么危害? 如果降低亚稳态带来的危害? 这
    发表于 12-04 13:51

    fpga亚稳态实例分析

    时,引起亚稳态事件,CNT才会出错,当然这种故障的概率会低的多。 图5.“cnt”触发器的后仿真时序违反演示 解决措施通过以上的分析,问题是由于信号跨异步时钟域而产生了模糊的时序关系,布局布线工具无法也不可能
    发表于 12-04 13:55

    亚稳态问题解析

    亚稳态是数字电路设计中最为基础和核心的理论。同步系统设计中的多项技术,如synthesis,CTS,STA等都是为了避免同步系统产生亚稳态。异步系统中,更容易产生亚稳态,因此需要对异步系统进行特殊的设计
    发表于 11-01 17:45

    FPGA的亚稳态现象是什么?

    说起亚稳态,首先我们先来了解一下什么叫做亚稳态亚稳态现象:信号在无关信号或者异步时钟域之间传输时导致数字器件失效的一种现象。
    发表于 09-11 11:52

    在FPGA复位电路中产生亚稳态的原因

    。怎么降低亚稳态发生的概率成了 FPGA 设计需要重视的一个注意事项。理论分析01 信号传输中的亚稳态在同步系统中,输入信号总是系统时钟同步,能够达到寄存器的时序要求,所以亚稳态不会发
    发表于 10-19 10:03

    FPGA--中复位电路产生亚稳态的原因

    FPGA 设计需要重视的一个注意事项。理论分析01 信号传输中的亚稳态在同步系统中,输入信号总是系统时钟同步,能够达到寄存器的时序要求,所以亚稳态不会发生。亚稳态问题通常发生在一些跨
    发表于 10-22 11:42

    关于FPGA设计的同步信号和亚稳态分析

    的时钟域时,我们就需要仔细考虑设计,以确保我们不会违反建立和保持时间并导致亚稳态。当然,无论哪种情况,我们都无法阻止亚稳态事件的发生,但我们可以确保我们的设计不会因为亚稳态事件的发生而出现不正确的数据
    发表于 10-18 14:29

    今日说“法”:让FPGA设计中的亚稳态“无处可逃”

    的稳定性。减少亚稳态的产生。 通过上述对亚稳态分析以及各种模式的处理,相信各位大侠应该有所收获,今日说\"法\"到此结束,下篇再见,欢迎各位大侠投稿,交流学习,共同进步,祝一切安好
    发表于 04-27 17:31

    亚稳态产生原因、危害及消除方法

    亚稳态问题是数字电路中很重要的问题,因为现实世界是一个异步的世界,所以亚稳态是无法避免的,并且亚稳态应该也是面试常考的考点。
    的头像 发表于 09-07 14:28 9549次阅读

    什么是亚稳态?如何克服亚稳态

    亚稳态在电路设计中是常见的属性现象,是指系统处于一种不稳定的状态,虽然不是平衡状态,但可在短时间内保持相对稳定的状态。对工程师来说,亚稳态的存在可以带来独特的性质和应用,如非晶态材料、晶体缺陷等
    的头像 发表于 05-18 11:03 4807次阅读

    FPGA设计中的亚稳态解析

    说起亚稳态,首先我们先来了解一下什么叫做亚稳态亚稳态现象:信号在无关信号或者异步时钟域之间传输时导致数字器件失效的一种现象。
    的头像 发表于 09-19 15:18 1870次阅读
    FPGA设计中的<b class='flag-5'>亚稳态</b>解析