最近一个月在使用fifo做一个数据的缓存和不同数据域的同步,用FPGA驱动AD的spi接口,系统中有8片AD,每片AD由两个独立的并行AD通道组成,采样率1Msps,量化位数16bit,每次采集的数据为256bit,xilinx fifo的输入输出最大数据宽度比例为1:8或者8:1,意思就是256bit输入时,输出要大于等于32bit。采集的数据经由fifo缓存以后,通过usb发送给电脑。选用的usb芯片是FTDI公司的ft232h (具体介绍在另外日志上说明)的USB接口芯片,它的数据接口是8位宽度的双向数据总线。由于fifo的32bit输出和usb接口芯片的8bit数据总线之间存在差异,为了解决这个差异,笔者最先考虑到的是通过逻辑来控制对fifo的读,将读取的数据分4次传入usb接口芯片,这种方案尝试了近两周的时间,总是会出现不同程度数据的遗漏,基本上隔几个周期会漏掉一个字节或者两个字节的数据,这里最容易想到的就是逻辑控制上有问题,debug了近一周的时间,没有取得成功。
最后在fifo的32bit数据输出和8bit usb接口芯片之间再次加入了一个fifo,相当于这个fifo是用于将32bit数据转换成8bit数据输出的。最后的数据传送方式是: 256bit->fifo1->32bit->fifo2->8bit->usb;通过这种方式,数据可以稳定无误的传输。
本文提及到了两个fifo,所以说说在使用fifo的过程中遇到的那些问题,不过这些问题都是由于没有仔细看ug(user guaid)导致的。