打印

PCI9054的DMA由本地总线挂载CPU启动的疑惑。

[复制链接]
4779|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ysdx|  楼主 | 2010-3-15 17:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我设计的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做板上缓存都可以做到很高速度了。不清楚这种方式是否理解正确。期待高人指点。

相关帖子

沙发
ysdx|  楼主 | 2010-4-2 10:01 | 只看该作者
这几天琢磨了。其实用initiator方式就好。现在感觉9054实在是好啊。昨天调试通通过邮箱互相通讯了。今天调试数据通讯看看。

使用特权

评论回复
板凳
xuelang1987| | 2010-5-12 07:53 | 只看该作者
使用DMA突发传输方式可以减少中断次数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:新手死于追涨,老手死于抄底,高手死于杠杆,价值投资死于满仓死杠!

338

主题

1055

帖子

21

粉丝