利用WinDriver实现链式DMA

在计算机与外设的通讯过程中,DMA方式,即DirectMemory access(直接内存访问),由于无需计算机CPU的干预就可以在内存和外设之间传输数据,是一种高效的数据交换方式。因为对于高速的设备,如PCI Express接口的板卡设备,如果采用普通方式在存储器和外设之间传输大量的数据将占用太多的CPU时间,严重影响系统的性能。而使用DMA方式则使传输数据的操作中CPU的涉及减小到最少。
要实现DMA的传输功能,在底层需要硬件本身具有这样的功能模块,即外设硬件可以主动发起数据传输。在上层则需要驱动与应用接口的配合。
文中给出如下的一种DMA传输方式的实现。硬件外设是基于Altera公司PCI Express硬核的FPGA加密卡,其与主机的接口采用是PCI Expre ss接口。上层则采用了Jungo公司的WinDriver软件提供的驱动和API接口。

1 链式DMA
PCI Express是用来互联诸如计算机和通信平台应用中外围设备的第三代高性能I/O总线。与原有的PCI并行总线相比,它没有大量的数据和控制线,对于硬件电路设计者来说,省去了很多硬件设计工作。PCI Express的传输速度远远大于PCI总线,PCI Express 1.1版本单个链路的单向吞吐量能达到250 MB/s。对于需要与主机进行大容量传输的系统来说,该总线标准的优势是非常明显的。Altera公司的Arria IICX系列器件内建PCI Express硬核,无需PHY和IP核,有利于节约FPGA资源,简化了PCI Express的接口设计。同时在用Quartus II软件生成的基于PCI Express硬核的样本工程中,集成了对DMA的支持功能,为进一步的硬件产品开发提供了基础。
实际应用中,DMA的传输方式可分为两种:简单DMA和链式DMA。简单DMA只需要主机告诉设备要传输数据的主机地址、设备地址和传输数据的长度,然后启动DMA传输即可。但简单DMA每进行一次传输,都要进行上面的设置,效率较低。
在用Quartus II软件的MegaWizard。Plug-In Manager工具生成的基于PCI Express硬核的样本工程中,实现了一个32 KB的带有字节写使能控制的双端口RAM的端点存储器,其读写数据总线宽度均为128位;并且实现了链式DMA的传输功能。这是一种效率远远高于简单DMA的传输方式,它只需要1次启动操作,就可以完成多次DMA传输。具体实现的方法是:在主机端,需要开辟一块内存区域,用来存储描述符表。所谓描述符表,是用来描述