对于一个如图1所示的某视频芯片产生的源同步信号,当FPGA对其进行采集同步到另一个时钟域时,通常的做法有两种:脉冲边沿检测采集法和异步FIFO采集法。下面简单的对这两种方法做一些讨论和说明。

图1
脉冲边沿检测采集法
脉冲边沿检测采集法,顾名思义,一定是应用了经典的脉冲边沿检测法来帮助或者直接采集信号。这里尤其需要提醒大家注意的是,著名的奈奎斯特采样定理告诉我们:要从采样信号中无失真的恢复原信号,采样频率应大于两倍信号最高频率。而特权同学通过实践得出的结论与此相仿:若想稳定有效的采集到脉冲(数字信号)变化的边沿,采样频率应大于被采样脉冲最大频率的3倍。注意是要大于3倍,甚至若是可能尽量采用4倍以上的采样频率才能够达到稳定的状态。
而具体的做法也很简单,把图1理想化就如图2所示。其中,待采集信号时钟Tx Clock,待采集数据使能信号Enable Signal,待采集数据总线Data Bus。FPGA内部信号采集时钟为Rx Clock,该时钟为待采集时钟的4倍。

图2
采用脉冲边沿检测法,使用Rx Clock去采集Tx Clock,Rx Clock reg1和Rx Clock reg2分别为第一级和第二级Tx Clock锁存信号。Tx Clock上升沿对应的一个有效指示信号Tx Clock pos每个Tx Clock时钟周期产生一个Rx Clock脉宽的有效高电平使能信号。从图3中可以看到,此时若用Tx Clock pos作为FPGA内部采样使能信号,虽然Tx Clock pos处于第7个Tx Clock,但是真正采集Data Bus其实已经是第8个Tx Clock上升沿了。很明显,第8个Tx Clock上升沿对准的不是Data Bus的稳定信号中央,数据很可能采集到错误值。

图3
因此,通过上面的分析,还是可以采取一些变通的方式来保证第8个Tx Clock上升沿采集到Data Bus的中央值。如图4所示,采用同样的方式对Data Bus做两级信号锁存,那么第8个Tx Clock上升沿就能够在Data Bus reg2的中央采集数据了。这样做只有一点小问题,相应的需要多付出2组寄存器来锁存Data Bus。

图4
异步FIFO采集法
再说异步FIFO采集法,其实这种方法没什么新奇,只不过充分利用异步FIFO的同步特性来完成跨时钟域的数据交互。但是其中还是有几个非常关键的要点需要提醒设计者注意,无论如何FIFO的输入端数据和时钟信号(包括控制信号,如有效使能信号等)必须符合FIFO的数据锁存有效建立和保持时间,这个最重要的条件除了需要靠数据源端来保证外,还需要靠数据锁存端(FPGA内部)设计者做好时序上的约束和分析,否则到源端再nice的波形恐怕都无法保证能够可靠的被FIFO锁存。
异步FIFO的基本通讯时序波形如图5所示。我们关心的是FIFO的写入。由图中不难发现,写入时钟wrclk的每个上升沿会判断写入请求信号wrreq是否有效,若是有效则FIFO会相应的锁存当前的写入数据data。简单来看,从基本时序上分析,wrclk的上升沿需要对准wrreq和data的中央,这是外部传输过来的源信号必须满足的基本关系。无论如何,即便是绞尽脑汁,也要想办法让这个基本关系得到保证,否则,后面的rdclk、rdreq配合的再默契恐怕都不能得到稳定的q输出。

图5
原型开发的前期,设计者必须首先验证写入信号的关系,哪怕是不惜动用示波器,源端给到FPGA输入端口的信号很多时候不是那么尽善尽美的,实践出真知,测试结果说了算。当然了,实在没有先进武器又想打胜仗的朋友恐怕只有不停的用代码测试采集到最稳定的数据了,这有点碰运气的成分在里面,不是非常推荐。
实际信号采集如图6所示,把写入时钟Tx Clock和写入请求信号Enable Signal都先用同步时钟Rx Clock打了一拍,然后再输入FIFO中,而数据总线Data Bus则直接送往FIFO。这样从最终检测来看,能够保证时钟的上升沿对准数据和控制信号的中央,相对稳定和安全的把数据送往FIFO中。

图6
工程实践中往往不是一招一式的生搬硬套理论,一定要抓住最关键的设计要点,并采取各种有效的手段保证设计的实现。