对FPGA跨时钟域处理的自己理解

    xiaoxiao2021-04-15  334

    为什么要做跨时钟域的处理?

    打一个不太恰当的例子,时钟相当于我们人体的“心脏”,伴随时钟产生的数据流就是相当于血液。假设人体中有多个小心脏,当心脏A的血液进入心脏B支撑的系统时就会产生混乱。为了防止这种情况的产生,需要对“跨心脏”的数据做处理。这个处理就是跨时钟域处理。


    跨时钟域处理的两种方式

    1. 两级触发器级联(打两拍)

    对于单bit数据,常用的处理跨时钟域方式为两级触发器级联方式。

    Clock1的输出直接连接Clock2第一级寄存器的输入,不用经过任何组合逻辑电路,一级寄存器与二级寄存器级联,得到Clock2时钟域的OUTPUT。

    参考代码:

                                                

    应用场景:1. 注意全局复位信号在各个模块中的处理,是否存在跨时钟域情况。

                      2. 对于外接电平信号,例如:九芯通信信号。检测上升沿或者下降沿。

    疑问:为什么采用两级寄存器?而不是一级或者三级

    需要注意的是两级寄存器并不能完全消除亚稳态危害,但是会大大提高可靠性,减少发生的概率。一级寄存器的亚稳态发生的概率太大,三级寄存器消除亚稳态的概率比二级提升不多。

    单bit处理分为两个情况:

    1、快时钟域到慢时钟域

    快时钟域的脉冲信号容易被慢时钟域的捕获沿漏掉,一般操作是扩宽脉冲信号。代码很常见,不再贴。

    2、慢时钟域到快时钟域

    正常捕获就可以。

    2. 异步双口RAM/异步FIFO

    处理多bit数据的跨时钟域问题,一般采用异步双口RAM处理,即将数据先存再读。

    举例:ADC以120M的时钟进行采样,但是我们的FPGA系统时钟是200M进行处理。所以需要将ADC的采样数据先以120时钟存入FIFO然后再以200M时钟读取进行想做的处理。

    在能使用双口RAM的场景中,异步FIFO同样可以进行跨时钟域处理。


    最新回复(0)