用FIFO完成时钟域转换的一个例子
问题描述
在做项目过程中,遇到一个问题需要进行时钟域转换。该问题具体为,信号处理部分采用的时钟为100MHz,而在JESD204b接口部分,其核时钟为250MHz。在将数据给到接口时,需要进行时钟域转换。本实现方案采用FIFO IP核,来设计时钟域转换模块。
在本设计中,发射信号的基带采样率为500M,基带处理时钟为100M,所以基带调制得到的波形为5路并行,它们的初始相位不相同。接口部分的处理时钟为jesd204b核时钟,为250M。为了保证500M采样率,需要两路信号并行。所以时钟域转换模块需要将5路100M时钟下的信号转换成2路250M时钟下的信号。选择采用5个异步FIFO来完成该操作。
解决方法
FIFO(First Input First Output),即先入先出队列。在vivado中,FIFO IP核分为同步和异步。同步FIFO可以作为数据缓冲器使用,而异步FIFO可以对信号进行时钟域的转换。异步FIFO需要输入读写两个时钟。其读和写操作分别在两个时钟下进行。
五个异步FIFO的写时钟为100M时钟,读时钟为250M时钟。五个FIFO的输入为5路并行的100M时钟下的输入信号,输出为相应的5路250M时钟下的FIFO输出信号。我们要得到的转换后的信号为两路250M时钟下的信号,这样才能保证采样率为500M。
转换的方法如下。在每一个读时钟,五个FIFO同时进行写操作,将五路的输入数据写入五个FIFO。而在每一个写时钟,只有两个FIFO进行读操作。具体选择依据是一个计数器的值。计数器从1至5循环计数。当计数器为1时,FIFO1和FIFO2的读使能打开,其输出信号分别赋值给两路输出数据;当计数器为2时,FIFO3和FIFO4的读使能打开;当计数器为3时,FIFO5和FIFO1的读使能打开;当计数器为4时,FIFO2和FIFO3的读使能打开;当计数器为5时,FIFO4和FIFO5的读使能打开。这样,在250M时钟下,就得到了两路并行的输出信号。即完成了信号从100M时钟到250M时钟的时钟域转换过程。
需要注意的是,在以上方案中需要保证五路输入信号写入五个FIFO的时序一致,从而保证从FIFO中读取数据时不会错位。所以对于五个FIFO,使用同一个写使能信号,来保证五路输入数据同时被写入五个FIFO。另一方面,为了保证稳定,在五个FIFO的可读数据都大于十个时,计数器再开始计数,之后再按照计数器的值进行读操作。
类似地,在接收端同样需要时钟域转换模块,将两路250M时钟下的Jesd204b接口输出数据,转换成五路100M时钟下的信号。与发射端不同,在接收端,读时钟为250M,写时钟为100M。另一方面,接收端需要用计数信号来控制五个FIFO的写使能信号,而读使能信号一直打开。
具体工作流程如下:在每一个读时钟,只有两个FIFO进行写操作。选择依据是根据计数器的值。当计数器为1时,FIFO1和FIFO2的写使能打开,两路输入信号写入两个FIFO;当计数器为2时,FIFO3和FIFO4的写使能打开;当计数器为3时,FIFO5和FIFO1的写使能打开;当计数器为4时,FIFO2和FIFO3的写使能打开;当计数器为5时,FIFO4和FIFO5的写使能打开。
而在每一个读时钟,五个FIFO读使能信号同时打开,将输出数据赋给整个模块的输出,即得到了转换后的100M时钟下的五路信号。
结果
如上图所示为时钟域转换模块的仿真结果。从上至下为五路输入信号,后两路信号为输出信号。输入信号为在100M时钟下采样,五路信号并行,对于每一路信号来说为100M采样率。而输出信号为250M时钟下采样,两路并行,对于每一路信号来说采样率为250M。可以明显的观察到,输出信号的一路相比于输入信号的一路,正弦波形更加清晰,这是因为输出信号的每一路采样率相当于250M,而输入信号的每一路采样率相当于100M。
需要注意的是,FIFO模块在复位之后,需要延时几个周期,才能正常工作。所以设置一个起始信号,在复位信号来到时,起始信号拉低。在复位信号过去十个周期之后,起始信号拉高。在起始信号拉低时,计数信号不计数,始终为0。在起始信号拉高之后,计数信号再从1到5开始计数,电路的后续工作才开始进行。这样做保证了信号写入FIFO的顺序是正确的。