1、跨时钟域方法的原因
异步时钟信号直接传输在信号跳变时违背本地时钟域的建立时间约束,保持时间约束,容易产生亚稳态。
2、跨时钟处理的两种思路
- 对代跨时钟的信息先缓存,然后由另一时钟域接口取出 ————异步FIFO
- 速度缓慢、可控的信号(配置信号,使能en、指示flag)我们对其进行一些处理。例如拉长持续时间,然后直接传输过去,亚稳态的问题通过同步器解决。适用于低速信号传输
3.单比特信号跨时钟
-
边沿检测常适用于慢时钟到快时钟。要实现边沿检测,最直接的想法是用两级寄存器,第二级寄存器锁存住某个时钟上升沿到来时的输入电平,第一级寄存器锁存住下一个时钟沿到来时的输入电平,如果这两个寄存器锁存住的电平信号不同,就说明检测到了边沿,具体是上升沿还是下降沿可以通过组合逻辑来实现。
-
对于快时钟域单电平脉冲信号跨时钟到慢时钟域常使用脉冲同步器电路,脉冲同步器在异步时钟域时钟频率彼此差距较大的场景下能节省触发器资源。 (脉冲电平检测+双触发器同步+边沿检测)
4.多比特信号跨时钟
1.采用格雷码
每两个相邻编码之间只有一位是不同的,并且对于N位格雷码,当从最高位编码(对应二进制2^N -1)跳转到最低位编码(对应0)时也只会发生1bit跳转。单bit跳转意味着格雷码在通过二级同步器跨时钟时,输出不会出现不可控的中间状态,只能是正确的更新状态或者保持原来的状态。
二进制转格雷码:从右边第一位开始依次将每一位与左边相邻的一位异或作为对应格雷码该位的值,最左边一位不变。
格雷码转二进制:从左边第二位起与起相邻的左边每一位异或作为该位值。
- 二进制转换成格雷码: assign gray = (bin >>1)^bin;
- 格雷码转换成二进制码:
bin[N-1] = gray[N-1];
for(i=0;i<(N-1);i+1)begin
bin[i] = ^(gray[N-1:0]>>i);
end
独热码:有多少个状态就有多少bit,而且只有1bit为1,其余为0.
2.握手协议
3.异步FIFO, 同步 FIFO 常用于同步时钟的数据缓存,异步 FIFO 常用于跨时钟域的数据信号的传递
4.DMUX
多bit为什么不能打两拍?
因为寄存器位于不同位置,布局布线后数据到下一个寄存器可能会发生延时不同造成可能采样到中间变化的任意值。
5.竞争与冒险
组合逻辑电路中,不同路径的输入信号到同一点门级电路时,在时间上有先后顺序,造成时间差,称为竞争。由于竞争存在,输出信号在一段在时间后才能达到期望状态,在过渡时间内可能会产生错误的输出,成为冒险。
解决方法:1、增加滤波电容,滤除窄波脉冲
2、增加冗余项
3、使用时钟同步电路,进行打拍延迟(3拍最好)
4、采用格雷码