Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vhdl 用双寄存器法求解亚稳态问题_Vhdl_Verilog_Fpga_Clock - Fatal编程技术网

Vhdl 用双寄存器法求解亚稳态问题

Vhdl 用双寄存器法求解亚稳态问题,vhdl,verilog,fpga,clock,Vhdl,Verilog,Fpga,Clock,为了解决Verilog中不同时钟域引起的亚稳态问题,采用了双寄存器方法 但据我所知,亚稳态的最终输出是未知的。输出独立于输入 所以,我的问题是如何使用双寄存器方法保证输出的正确性 谢谢。你不能完全肯定你避免了亚稳态。 正如您所提到的,亚稳触发器的输出是不可预测的,因此即使使用“双寄存器”方法,当您具有亚稳性时,也可能传播错误的值 然而,该方法从未打算解决亚稳态问题,而是试图降低亚稳态值进入电路的概率。所谓MTBF(平均无故障时间)。为了减少MTBF,您甚至可以链接2个以上的寄存器 即使这不能解决

为了解决Verilog中不同时钟域引起的亚稳态问题,采用了双寄存器方法

但据我所知,亚稳态的最终输出是未知的。输出独立于输入

所以,我的问题是如何使用双寄存器方法保证输出的正确性


谢谢。

你不能完全肯定你避免了亚稳态。 正如您所提到的,亚稳触发器的输出是不可预测的,因此即使使用“双寄存器”方法,当您具有亚稳性时,也可能传播错误的值

然而,该方法从未打算解决亚稳态问题,而是试图降低亚稳态值进入电路的概率。所谓MTBF(平均无故障时间)。为了减少MTBF,您甚至可以链接2个以上的寄存器

即使这不能解决值的不可预测性,使用这些双寄存器也很有趣,因为当值是亚稳态时,它将振荡直到稳定到0或1

这种振荡会使电路切换,然后在每次转换都会消耗能量的情况下白白消耗大量能量。因此,使用双寄存器进行时钟域交叉非常重要

不过,为了确保数据有效,可以在两个时钟域之间使用请求确认机制

快速示例:

  • 将数据设置到总线(双寄存器的输入)
  • 等待1个(或更多)时钟周期,以确保数据在另一侧建立良好
  • 发送请求信号(双寄存器输入)
  • 最坏情况:请求信号是亚稳态的,一旦稳定,就保持在0。下一个时钟周期,它将是1,因为它已经被设置为1至少1个时钟周期。最佳情况:下一个周期目标将接受数据
  • 数据是稳定的,请求是稳定的,在1->时数据可以被消耗。向来源发送确认
  • 确认到达(在亚稳态情况下,在双寄存器上)。如果是亚稳态,则需要更长的时钟周期才能到达
  • 请求失败
  • 另一个数据可以通过总线发送
  • 该协议称为4阶段协议。您可以在web上找到很多关于它的文档,因为它是异步设计的经典协议

    它很容易理解和实现。但请记住,这将在相当重要的领域产生开销


    希望有帮助。

    这个问题可能更适合于Okay,谢谢。我可以再发一次问题吗?谢谢Krouitch,但我还是有些困惑。所以,在第4步之后,我只能保证请求信号是稳定的,并且为1,但是如何保证数据也是稳定的?谢谢。如果您在发送请求之前至少发送了一个时钟周期的数据,那么数据必须稳定。如果不是,这意味着路径对于您选择的时钟周期来说太长。这里有一篇文章说明了我的意思: