特权同学

两片FPGA之间的数据传输

0
阅读(5773)

两片FPGA之间的数据传输

在工程实践中,常常需要涉及多个主芯片间的数据传输。尤其在多个FPGA级联的系统中,不同吞吐量的数据传输可以采取不同的接口方式来实现。但是,采取什 么样的方式能够让他们相互间的数据传输可靠、稳定,并且满足吞吐量的需求呢?通信方式有很多,慢点可以用UART、IIC,快的可以用SPI、LVDS、 并行总线等方式,这里要介绍的是并行总线方式。它的优点是接口简单,常见的3.3V LVTTL电平即可,无需额外的辅助电压,并且只要FPGA分别给出一组IO口连接即可。缺点也很显而易见,耗费的IO管脚数较多。

先来看看示意图,图1中的两个FPGA,数据传输是单向的。TX FPGA有一个专用的FIFO用于缓存待发送的数据,RX FPGA也有一个专用的FIFO用于缓存接收到的数据。而他们接口的信号为时钟信号tx_clk、发送数据有效信号tx_en、发送数据总线tx_db、 请求数据发送信号rx_req和复位信号clr。


图1

这种接口的工作方式是有请求才有数据,通常rx_req置位后,TX FPGA发出一组(固定数据流,需要在TX FPGA的逻辑中设置)数据,这组数据以时钟周期(tx_clk)为单位进行发送。在接收端(RX_FPGA)通过tx_clk的上升沿锁存数据,有效数 据对应的数据有效信号tx_en是使能的。RX FPGA的复位输出clr用于复位TX FPGA的缓存FIFO。

在硬件连接上,有讲究,由于tx_clk是PLL输出的,因此最好能够分配到TX FPGA的专用PLL输出时钟管脚上;此外,在RX FPGA端也一样,tx_clk要分配到专用全局时钟输入管脚上。其它的信号根据实际布局进行优化布线即可。

不是连接好FPGA或是写好逻辑就完事了,两片FPGA间的时序约定、约束以及收敛也是非常关键的。

下面通过特权同学模拟一个工程的情况来探讨这种两片FPGA通信的时序分析与约束。如图2对两片FPGA的接口与时序参数进行定义。两片FPGA间 的接口也是寄存器到寄存器的时序路径,通常可以分为三部分时序路径:TX FPGA内、PCB板上和RX FPGA内。图2中给出的PCB走线长度参数是确定的,TX FPGA和RX FPGA内的路径延时值是假设的。


图2

RX FPGA发出的rx_req和clr信号时序要求均不高,可以简单的约束或者直接作为false路径。

主要关注的时序是tx_clk/tx_en/tx_db,他们必须满足如图3所示的关系。即希望能用tx_clk的上升沿采样到稳定的tx_en/tx_db信号。也就是说,tx_clk的上升沿最好能够对准tx_en/tx_db的有效信号窗口中央。

图3

从寄存器级来看tx_clk与tx_en/tx_db之间的关系,大体可以如图4所示。其实这也是一个比较典型的源同步接口。无论对于时钟信号还是数据信 号,他们的源节点到宿节点之间所经过的延时都分为三部分,即在TX FPGA内部的路径延时、在PCB板上走线的延时、在RX FPGA内部的路径延时(当然确切的说,可能应该再加上一些不确定时间)。而在PCB板上的延时是固定的,分别在两片FPGA器件内部的路径延时则是需要 进行约束和分析的,并且通过他们的实际情况来调整作为RX FPGA输入时钟的相位,以确保尽可能的符合图3所示的时序要求。


图4

图2其实已经大体标注出了实际的一个大致延时范围。其实我们的这个范围圈定以及实际情况的不断校准,最终是希望能够计算出一个比较合适的tx_clk相位偏移。

按图5的方式来定义clk和data总线的路径延时,那么 clk总的路径延时为Tc1+Tc2+Tc3(每一个值可能都有一个取值范围,不是固定的),data总的路径延时为Td1+Td2+Td3。如图我们取 Tc1+Tc2+Tc3的最大值为Tcmax,最小值为Tcmin,并且取Td1+Td2+Td3的最大值为Tdmax,最小值为Tdmin。


图5

再来看图6所示的波形,其中sysclk是图4的TX FPGA内部时钟,也是源寄存器时钟;data即输出到TX FPGA的数据总线tx_db(包括tx_en信号);outclk是从PLL输出的时钟波形,inclk则是最终到达目的寄存器的时钟波形。


图6

从图6所示的一些时间关系中,不难理出一个Tshift取值的公式。如下:

1.       令Data总线的有效数据窗口为(Tdv1,Tdv2),则:

Tdv1 = Tdmax,Tdv2 = Tclk + Tdmin,中间值为Tdv = (Tdmax + Tclk + Tdmin)/2

2.       令clk信号的上升沿有效窗口为(Tcv1,Tcv2),则:

Tcv1 = Tshift + Tcmin,Tcv2 = Tshift + Tcmax,中间值为Tcv = Tshift+(Tcmin+Tcmax)/2

3.       若要得到最佳的采样结果,则:Tdv = Tcv,即(Tdmax + Tclk + Tdmin)/2 = Tshift+(Tcmin+Tcmax)/2,也就是要满足:Tshift = (Tclk + Tdmax + Tdmin – Tcmin - Tcmax)/2

图2通过约束得到了一些参数值,即Tclk = 20ns,Tdmin = 10ns,Tdmax = 15.5ns,Tcmin = 1ns,Tcmax = 3.5ns。所以可以算得Tshift = 20.5ns,因为Tclk = 20ns,所以去Tshift = 0.5ns。