赞
踩
1.对于1bit信号
一般用两级寄存器打两拍即可,因为一级寄存器取进来有可能clk上升沿刚好数据变化时,不满足取样的建立时间及保持时间,所以为非零非一的不确定状态,其后稳定为0或者1不能确定,影响后级。所以打两拍延时,避开这里,当然如果时钟频率特别高,可以打三拍,一般打两拍即可。
图1 亚稳态
图2 打两拍
2.对于多比特信号
对于多比特总线数据的跨时钟域处理,能否也使用“打两拍”的方法呢?
答案见下图,虽然REG B2的输出是稳定的,稳定在哪一个电平是不确定的,不
过会在当前时钟或者下一个时钟输出正确电平,即偏差在一个时钟周期,也就是
说不能保证所有比特位的状态一致,也是这个原因,导致传输多比特总线数据时
各比特位不同步,常用的解决方法是加入FIFO 隔离。
图3,如果采样时钟频率较高,1个周期时间较短,还是会错开1个时钟周期。
图3
图4
个人理解:
1.1bit跨时钟域打两拍,多bit采用握手或者fifo,或者如单fifo,1个节拍整体赋值。
2.clk取样是要输入寄存器的信号满足建立时间和保持时间,寄存器的输出相比较clk有效采样的沿有个可以忽略的延时,所以一般仿真时候看到的clk上升沿同步输出变化,同样也因为有一个可忽略的延时,所以pos a变化 pos b<=a b比a又延时1拍
3.建立时间、保持时间、组合逻辑延时等与后面的静态时序分析时会用。
4.下面的一些例子情况有的是时钟频率较信号频率并不高,所以看起来严重,个人感觉时钟频率至少是信号频率4倍以上,虽然奈奎斯特要求2倍及以上即可,但4倍以上要更稳妥。
5.若a为打1拍输出,b为打两拍输出,那么理解a&非b,非a&b,a或b取边沿情况;
6。模块划分推荐,将整体的多时钟设计分割成多个单个独立时钟的功能模块和负责模块间同步的同步模块,这样非常利于后端的时序分析,程序结构也更加清晰。
1.快时钟域到慢时钟域的同步
常见问题:快时钟域的信号持续时间太短,慢时钟域采不到
个人:这种一般都是时钟频率和数据频率差不都或者时钟频率低,觉得应该设计时提高时钟频率即可采集到。无论延长信号还是提高时钟,都是为了其至少大于奈奎斯特定律2倍关系,或者至少满足4倍关系。
解决方法1:将快时钟域传递的信号持续时间延长,使其大于慢时钟域的一个时钟周期
解决方法2:使用握手信号(反馈信号)
2.跨时钟域传递多个相关信号
传递两个同时需要的信号(b_load 和b_en)
改为只传递1个信号,传递过去后在后者时钟域再做操作。
3.慢时钟域到快时钟域的同步及上升(下降)沿检测电路
代码实现为:先将发送时钟域过来的信号用寄存器打两拍,然后将输出信号
A 和再打一拍的反向信号B 相与(如果是下降沿检测,则将输出信号A 反向和
再打一拍的同向信号B 相与)。
拓展:如果将先将发送时钟域过来的信号用寄存器打两拍,然后将输出信号
A 和再打一拍的信号B 相一或,就得到的是上升沿和下降沿都检测的逻辑。
综述:
1bit打拍,多bit,fifo
快到慢考虑延长信号或者提高时钟频率
跨时钟域传两个控制信号考虑传1个
慢到快没什么问题,掌握取沿方法
参考文档:”FPGA-跨时钟域“
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。