跨时钟域处理
什么是亚稳态
我:亚稳态指在时钟上升沿进行数据采样时,数据并没有在稳定状态,从而产生了不可预知的采样结果,需要一个决断时间才能稳定下来。
标准答案:触发器无法再某个规定的时间内达到一个可确认的状态。
转载自水印地址博主
亚稳态产生的情形
- 只有在异步电路中才能产生亚稳态
- 同步电路时钟与数据的关系确定,可以保证采样的时机。
- 异步复位时
- 时钟质量不好,时钟偏移,时钟质量不好
建立时间与保持时间
- 建立时间:时钟上升沿来之前,数据保持稳定的最小时间 规定了期间组合逻辑的最大延时
- 公式:Tcq+Tld < Tperid-Tsu+Tclkdelay
- Tsu < Tperid-(Tcq+Tld)+Tclkdelay
- 解决建立时间违例的方法:
- 降低时钟频率、增大时钟周期
- 在时钟路径加延时(buffer)、让始终晚点到
- 更换具有更小器件延时的触发器Tcq更小的
- 优化组合逻辑,或插入流水线,缩短关键路径
- 保持时间:时钟上升沿来之后,数据保持稳定的最小时间
- 规定了期间组合逻辑的最大延时
- 公式:Tcq+Tld>Th+Tdelay
- 解决建立时间违例的方法:
- 在数据路径上加buffer
- 更换具有更大器件延时的触发器
- 优化时钟路径、让始终更早到来
同时发生建立时间与保持时间违例先保证保持时间,建立时间有更多的方法解决
为什么需要
建立时间:因为时钟沿也是需要一定的采样窗口,如果在窗口中数据发生变化电压,不足以使得触发器内部门发生正确的反转,会产生竞争冒险现象,导致输出不稳定。 保持时间:上升沿到达时刻不等于不等于门完全关闭,数据变化还是会影响输出结果。
如何降低亚稳态的影响
- 降低时钟频率
- 用反应更快的FF(触发器)
- 引入同步机制,防止亚稳态的传播
- 异步信号同步化
- 采用FIFO对跨时钟域数据通信进行缓冲
- 对复位电路采用异步复位、同步释放
- 采用握手机制
- 改善时钟质量,用边沿变化快速的时钟信号
同步方法
单bit慢->快时钟
- 打两拍,过两级寄存器
多bits慢->快时钟
- 异步双端口RAM
- FIFO
- FIFO的深度
- 与写时钟频率
- 读时钟频率有关
- 最差的情况为背靠背传输
- 读时钟 > 写时钟 深度1即可
- 写时钟 > 读时钟
- 明确burst的传输长度
- 读写效率
- burst-burst*(CLK_rd * 读效率/CLK_wr*写效率)
- zhuanlan.zhihu.com/p/166177480
- 同步FIFO
- 空满条件判断
- 多一个地址bit用作空满判断
- 空:读写地址相同
- 满:读写地址第一位相反,其他位相同
- 异步FIFO
- 读写地址都需同步
- 多两位进行空满判断
- 假满假空
- ctrl模块,产生读写地址,并将地址转换为格雷码
- 同步模块,将格雷码地址打两拍,传到另一时钟域
- RAM模块将格雷码地址转换为二进制地址,与自己时钟域地址比较,判断空满
- 空:读写地址相同
- 满:第一位相同,第二位相反,其他相同
- FIFO的深度
- 格雷码转换
- 格雷码转二进制
- 二进制码右移一位异或
- 二进制转格雷码
- 第一位不变,其他位为格雷码与高位异或
- 格雷码转二进制
单bit快->慢时钟
- 握手,将快时钟域脉冲信号拉长
- 慢时钟域打两拍,再R0&(~R1),找到脉冲
- 在快时钟域再打两拍,采到后,反转
多bits快->慢时钟
- FIFO(异步FIFO)
- RAM(异步双口)