单比特和多比特的信号处理
信号跨时钟域传输时,两个时钟的上升沿相位差没有固定关系,所以采样时钟很容易出现建立保持时间违例而采到亚稳态。
使用两级同步器处理:
两级同步器能降低亚稳态发生的概率,只是使信号变为稳态再往下传输,保证安全但并不保证正确。
如上图,A信号建立保持时间,导致B为亚稳态,但是由于有F3的存在,使其有足够的时间恢复稳态,所以C信号为稳态,对下游是安全的。
单比特数据CDC处理方法:
1、单比特CDC -- 慢到快
跨时钟信号的宽度 > 采样时钟的两个周期 -> 两级同步
【直接使用两级同步即可】
跨时钟信号的宽度 < 采样时钟的两个周期 -> 先脉冲扩展,再两级同步
【先脉冲扩展,把脉冲信号的宽度扩展为 大于 采样时钟的两个周期,再使用两级同步】
2、单比特CDC -- 快到慢
这种情况下,跨时钟信号的宽度(最小为快时钟的一个周期)肯定 小于 采样时钟(慢)的两个周期
跨时钟信号的宽度 < 采样时钟的两个周期 -> 先脉冲扩展,再两级同步
3、快慢不确定
握手处理:
A时钟域向B时钟域发送req信号,保持为高
B时钟域对req打两拍采样到1,再返回ack信号
A时钟域对ack打两拍采样到1,拉低req
多比特跨时钟域
多比特跨时钟域打两拍存在的问题:两个信号同时变化有延迟,导致采样时钟采样错误,本来应该是同时拉高,但是跨过来之后错开了
多比特数据CDC处理方法:
1、多比特信号合并为单比特信号
如果需要跨时钟域的信号存在逻辑关系,可以合并为单比特信号再跨时钟域传输
2、格雷码
把多比特信号转为格雷码再进行跨时钟域传输。保证同一时刻只有1bit变化
二进制码转为格雷码:二进制码右移一位,和原值异或
assign gray = (bin << 1) ^ bin
格雷码转为二进制码:bin[i] = 格雷码右移i位做 位异或
bin[i] = ^(gray >> i)
3、使用单比特握手信号
使用握手信号req和ack
A时钟域和B时钟域握手,握手期间保证传输的多bit数据稳定不变(稳定的数据可以随便跨时钟域)
4、使用异步FIFO
数据通过FIFO传输
读写指针(格雷码)跨时钟域传输
参考自:https://blog.csdn.net/m0_49597336/article/details/120095977