我设计的PCI9054板卡外接一个FPGA。FPGA里面设计一个NIOS ,通过FPGA内部FIFO与9054的相连。现在有一个问题:我的FIFO大小是4K字节。如果NIOS要上传的数据大约是20M字节/秒的话,如何设计DMA传输?如果采用DMA和中断结合的话,假设由PC设置9054DMA寄存器,然后启动DMA。DMA大小设置成1k。DMA传输结束后在DMA结束中断中继续设置下一次的中断,进行了N次后报告一次给应用程序。这样的话PC的中断过于频繁。要5000次/秒。而且中断函数中启动DMA的时候,可能下面FIFO中数据还没有填充满,不到4K呢。如果这时候读取,可能会出错。因此这个时候必须采用在中断函数中查询下面FIFO是否满,如果不满,还必须等待。这么做的话,感觉系统估计很难稳定。
因此我想到一个办法:假设应用程序需要读取1M字节,这时候按照启动DMA的方式申请内存1M,然后写9054DMA参数,也就是假设下面的FIFO大小是1M的方式做。只是这个参数写入到9054的邮箱地址中,实际并不启动DMA。下面的NIOS通过本地总线读取这个信息。无非是源地址目标地址数据长度信息。之后,每次当FIFO满后,NIOS就写9054的DMA寄存器,启动DMA来传。只是每次的长度是4K。这样传250次,满1M后给9054一个中断信号,PC机接收到信号后,直接去刚才申请的1M内存中取数据就好。
这样做的好处是下面只需要很小的缓冲区就能够做到高速数据接收和发送。也就是说直接把PC的内存当板上的缓存了(当然结合了一个小FIFO来实现)。这样的话就不用SRAM或者SDRAM做板上缓存都可以做到很高速度了。不清楚这种方式是否理解正确。期待高人指点。 |