高级FPGA设计——第四章:跨时钟域问题
0赞在FPGA设计中,不太可能只用到一个时钟。因此跨时钟域的信号处理问题是我们需要经常面对的。
跨时钟域信号如果不处理的话会导致2个问题:
(1) 若高频率时钟区域输出一个脉冲信号给低频率时钟区域,则该脉冲很有可能无法被采样到,示意图如下,clk2根本采样不到pulse
(2) 亚稳态问题
在说明亚稳态之前,我们需要先了解什么是建立时间和保持时间
建立时间:在时钟沿到来前,被采样信号应该提前一段时间就进入稳定状态,这个时间称为建立时间
保持时间:在时钟沿到来后,被采样的信号应该保持稳定一段时间,这个时间称为保持时间
而亚稳态就是建立时间和保持时间不满足导致的。如下图所示,就是建立时间不满足,造成dout是个不确定值,即亚稳态。
亚稳态会造成严重的后果。就像将军发命令一样,若其发出的是一个亚稳态的命令,士兵A可能判定这个命令为进攻,士兵B可能判定这个命令为撤退,这将引起极大的混乱。
解决方案:
1,握手操作
针对问题1中所描述的情况,即快时钟域传递一个脉冲信号到慢时钟域,慢时钟域很有可能采样不到该脉冲。这时就需要采用握手操作来解决了。
首先,快时钟域应该将脉冲信号转换为一个持续信号,慢时钟域采样到该持续信号后,返回一个反馈信号,告知块时钟域将持续信号拉低。
2,相位控制:
考虑下面2种情况,
情况1:
情况2:
上面2种情况中,数据是随着慢时钟所变化的,现将该数据发送到快时钟模块。两种情况唯一的区别在于时钟相位的不同,但这就导致情况1满足建立与保持时间,但情况2不满足建立时间。
因此,跨时钟域的时钟相位控制是决定跨时钟域功能正常的关键因素。
这种情况一般出现在我们使用DCM模块时,这时候才能控制输入与输出的相位关系。建议无特殊要求下,相位选择0,从而避免因相位问题导致的跨时钟域问题。
3,双跳技术(打两拍)
在很多情况下,设计者是无法控制两个时钟间的相位关系的,因此方案1并不太适用。
若跨时钟信号为单比特信号,我们可以采用双跳技术来解决。
前面提到,将军的亚稳态命令会导致士兵做出不同的判断,而双跳技术就是先把亚稳态命令转化为确定命令,再传送给士兵。这样士兵接收到的都是统一命令,才能够统一行动。
代码如下,若sin跨时钟域信号,则sreg很有可能为亚稳态信号,但是sout却是确定信号,这个信号可能是确定的0,也可能是确定的1,但能够保证后续接收到这个信号的模块判定是统一的。
4,异步fifo
方案2,3只能用于单比特信号,对于多比特信号是不适用的。因为双跳技术只能保证输出一个确定值,但不能保证这个确定值是0还是1,比如4'b1111跨时钟域传输,若用双跳技术的话,可能变成4'b1010,这是不允许的。
这时候就可以采用异步fifo来进行数据的跨时钟域传输,关于异步fifo的使用,很简单,这里就不详细说明了。