新手入门
- 积分
- 13
- 金钱
- 13
- 注册时间
- 2026-1-30
- 在线时间
- 3 小时
|
首先说明两个前置知识点(可能有误,仅个人理解):
只要是在sys_clk指导下进行的always语句,它内部的检测,这里的检测是指if case等,都是检测历史时间段的电平,而如果所有的赋值动作都遵循sys_clk上升沿来临之后变化这个逻辑,那么对应的组合逻辑wire应该也是会检测到前一时刻的输出而不会检测到跳变时刻。这是fpga始终有序的原因。
而只有对异步信号进行同步采样时才会出现亚稳态,亚稳态就是clk来的时候,输入信号刚好位于一个模棱两可的状态,这个时候由于没有足够的能量,d触发器比在输入直接是0或直接是1的情况下需要更长的时间来达到稳定,导致此时的寄存器输出不可靠。
我看到很多网上的说法以及课上解释都会将消除亚稳态和打两拍的意义结合起来,但鄙人在此持有不同的观点:(也是仅个人理解)
我认为,理论上来说打两拍的真实目的应该叫做获得仅存在一个周期的可采样的脉冲,而非消除亚稳态(这里仅存在一个周期的目的是为了不让一个上升沿引起连续触发,而它的采样时刻就是在组合逻辑Q1 and !Q2末尾进行的),因为真正有效的采样时刻,一定会发生在寄存器1跳变周期的结尾,如果认为打两拍(一个周期)能消除亚稳态,那么FPGA采样的运行逻辑本身就决定了它会延后一个周期采样,这个时候已经没有了亚稳态(已经过了一个周期了,如果你认为Q1还在亚稳态,那么显然你采样的判断上升沿的依据 Q1 and !Q2也是亚稳态,你打两拍消除亚稳态的意义就不存在了),也就是说你的自然采样和你的打两拍采样本质上是一个采样,不存在消除亚稳态的问题,真正能谈得上消除亚稳态,那得是寄存器3存在,Q2 and !Q3才能叫作用是消除亚稳态。
最后欢迎大家讨论,如果我的观点有误欢迎指出,以上也仅仅只是初学者的一点疑惑和见解。
|
|