如何避免亚稳态

如何避免亚稳态
1、简介

每当违背建立和保持时间时,亚稳态就会出现。在以下的情况下,可能违背时序要求:

  • 输入信号是异步信号
  • 时钟偏移超过容限值
  • 信号在两个不同频率或者同频不同相的时钟域下工作
  • 组合延时使触发器的输入信号在亚稳态窗口内发生变化

亚稳态会引起过多的传输延时和系统故障。虽然亚稳态不能根除,但是可以减小亚稳态发生的概率。避免亚稳态发生常见方法就是使用同步器。

2、使用多级同步器

最常见的方法就是在跨时钟域内的信号后加上同步触发器。该方法是用一个时间周期(不包括第二级触发器的建立时间)来解决第一级同步触发器亚稳态的问题。但是这种方法增加了观察同步逻辑输入的延时。
N级同步器

3、使用倍频时钟同步器

多级同步器的局限就是系统需要花费较长的时间去响应异步输入信号。解决办法就是使用倍频时钟作为两个同步触发器的输入时钟。
倍频时钟同步器

这两种方法都不能保证同步器阻止亚稳态传播下去,但是可以减小亚稳态发生的概率。


同步器有以下两种类型:
A
B


4、建议

在两个异步系统交界的地方亚稳态是不可避免的。但以下建议可以明显减小亚稳态发生的概率:

  1. 采用同步器
  2. 采样相应更快的触发器(亚稳态窗口小)
  3. 降低采样速率
  4. 避免使用dVdt 低的输入信号

参考资料
1 The Art of Hardware Architecture
2 Understanding Metastability in FPGAs





转载于:https://www.cnblogs.com/yfwblog/p/4788825.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Verilog中,可以使用一个叫做“打两拍”的技术来避免亚稳态。打两拍的基本思想是,在每个时钟周期的末尾,将寄存器的值复制到一个临时寄存器中,并在下一个时钟周期的开头将这个临时寄存器的值复制回原始寄存器中。 以下是一个简单的示例代码,使用打两拍的方式避免亚稳态: ```verilog module example(input clk, input reset, input data, output reg out); reg [1:0] temp; // 一个2位的临时寄存器 always @(posedge clk) begin if(reset) begin out <= 0; temp <= 2'b0; end else begin temp <= out; // 在时钟周期末尾,将输出寄存器的值复制到临时寄存器中 out <= temp; // 在下一个时钟周期的开头,将临时寄存器的值复制回输出寄存器中 end end always @(posedge clk) begin if(reset) begin temp <= 2'b0; end else begin temp <= {temp[0], data}; // 在时钟周期末尾,将输入数据和临时寄存器的低位复制到临时寄存器的高位中 end end endmodule ``` 在这个示例代码中,我们有一个输入数据和一个输出数据,它们都被存储在一个寄存器中。在每个时钟周期的末尾,我们将输出寄存器的值复制到一个临时寄存器中,并在下一个时钟周期的开头将临时寄存器的值复制回输出寄存器中。这样做可以确保输出寄存器的值始终是稳定的,并避免亚稳态的出现。 此外,我们还在第二个always块中使用了打两拍技术来处理输入数据。在时钟周期末尾,我们将输入数据和临时寄存器的低位复制到临时寄存器的高位中,以确保输入数据在下一个时钟周期的开头得到正确处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值