摘 要:利用FPGA芯片设计PCI总线接口的多通道DMA控制器的基本原理及实现方法。
关键词:FPGA PCI DMA BD
在现代测控系统和通信领域,对数据传输速率要求越来越高。对于一般的多通道通信应用,为了减轻CPU负担实现数据的高速传输,采用多路DMA控制器进行DMA方式传输尤其重要。此外,总线性能也是制约通信能力的重要因素,ISA、EISA和MCA等扩展总线已无法适应高速数据传输的要求,而PCI局部总线以其优异的性价比和适应性已成为大多数系统的主流总线。多通道DMA控制器提供PCI和Local 2种总线接口,实现了CPU和通信控制器之间数据的DMA方式传输控制;支持burst传输和BD操作,完成二总线上多通道之间的总线仲裁和状态转换。因此,利用FPGA芯片设计实现PCI界面的多通道DMA控制器成为多通道高速通信的首选解决方案。
1 芯片选择和设计应用
本设计选用Quicklogic公司的QL5232-208 FPGA芯片来满足设计要求。QL5232-208可提供32位/33MHz PCI Master/Target ESP(硬核),支持3.3V/5V PCI接口应用环境,符合PCI2.2规范。QL5232 有12万门、1 302个逻辑单元,25 344位的RAM可用于构建FIFO。目前的设计可实现4通道双向DMA控制器。内部控制器和接口逻辑用VHDL语言实现,移植方便,可以加快开发进程。
本多通道DMA控制器设计已经应用于路由器中多通道高速同步串行接口模块,其硬件框图如图1所示。它与CPU接口采用标准的32位PCI总线,可以接多至5个高速串口模块,每个模块可提供8个同/异步串行接口(V35/V28接口),同步串口速率可达2Mbps。最大传输速率可达132MBps,与后端控制器采用Local Bus接口。CPU采用Motorola 公司的MPC8240,串口通信控制器采用SIEMENS公司的SAB82538(8串口同/异步串口通信控制器)。
2 多通道DMA控制器功能模块
多通道DMA控制器与CPU接口采用32位/33MHz PCI2.2局部总线,接口线包括CLK、FRAME#、TRDY#、IRDY#、STOP#、DEVSEL#、IDSEL、AD[31:0]、C/BE[3:0]、PERR#、SERR#、REQ#、GNT#、RST#。与串口通信控制器采用Local Bus,接口信号线包括LCLK、LHOLD、LHOLDA、ADS#、LW/R#、BLAST#、LA[31:2]、LD[31:0]。
FPGA芯片包括ESP(PCI内核)和可编程逻辑。ESP与CPU接口提供标准的PCI总线,与内部逻辑提供主/从控制器接口线;可编程逻辑部分包括内部寄存器、配置空间、Slave直接写模式、DMA读、DMA写等功能模块。其内部结构框图如图2所示。
ESP是FPGA芯片内含的硬核PCI 控制器,符合32位/33MHz PCI 2.2规范的主/从(Master/Target)控制器。ESP作为Master时,支持0插入等待周期的PCI burst传输;作为Target时,读操作插入3个等待周期,写操作自动插入2个等待周期。PCI Master接口提供Mst_Burst_Req(Input)信号,由用户控制请求使用PCI总线。PCI Target接口提供Usr_Select、Usr_Rdy(Input)信号由用户控制设备地址是否译码选中及Target设备是否准备好,可用于插入等待周期;提供Usr_Adr_Valid(Output)信号则通知设备地址期开始,地址和命令信息有效;提供Usr_Adr_Inc(Output)信号则指示前一个数据传输结束,地址应该增加。此外,与用户可编程的接口还提供读写信号、地址数据线、命令/字节使能线、系统出错报告等信号线。
内部寄存器包括DMA命令状态寄存器、中断结果寄存器、BD list首址寄存器、PCI通道访问地址寄存器、Local Bus通道访问地址寄存器、DMA长度计数器(包括PCI总线DWORD计数器和Local Bus字节计数器)。为节省资源,用RAM实现这些寄存器功能。配置空间实现标准的256字节寄存器空间配置。基址寄存器用低10位要求210字节的PCI空间。配置空间模块还实现地址和读写译码功能。
多通道DMA控制器模块是设计的核心,主要完成对内部寄存器Target的读写及对后端接口芯片直接存取模式和DMA传输功能。DMA传输时,DMA控制器在PCI总线和Local总线上都作为Master。配置空间操作结束后,通过Target操作读写内部寄存器和后端芯片片内寄存器。DMA读写使能后,控制器自动完成传输全过程:包括二总线上请求、总线仲裁、读写传输。
FIFO用于实现总线速率匹配。PCI总线为32位/33MHz,而Local总线仅为16位/10MHz。因而为提高总线利用率,每个DMA通道需要一个32位的FIFO用于数据暂存,以实现PCI总线和Local 总线间的速率匹配,支持多通道同时通信传输。
3 功能实现
DMA控制器内部访问操作可分为Direct Slave mode 模式和DMA mode模式。
3.1 Direct Slave mode模式直接访问操作
CPU访问DMA控制器内部寄存器、后端通信控制器SAB82538内部寄存器或SAB82538 I/O口(中断方式)的操作都属于Direct Slave mode模式。CPU对配置空间寄存器访问操作完全遵循标准的PCI总线配置读写操作时序,对DMA控制器内其他寄存器的读写操作符合PCI Target访问时序。完整的访问周期包括:地址期Usr_Adr_Valid信号有效时,配置空间实现地址和读写命令译码,若设备选中则Usr_Select信号有效并通知内核响应DEVSEL#、TRDY#信号有效;IRDY#信号有效时则完成一次数据传输,同时Usr_Adr_Inc信号有效地址自动增加。
CPU对后端通信控制器进行访问时,包括PCI总线和Local总线上的读写操作。PCI总线仍需符合PCI Target访问时序。由于数据要通过FIFO实现二总线速率匹配,且FIFO仅暂存数据而不保留地址等其他信息,故要求CPU连续发起对后端的访问时,必须确定前次的Local总线访问已经结束,才能响应新的数据传输。尤其是写操作时会出现Local总线滞后于PCI总线操作的情况,故必须在PCI访问时序中插入等待周期,否则会造成数据丢失错误。此问题可以通过判断上次Local访问是否结束来决定Usr-Rdy状态,控制TRDY#信号是否响应来解决。
3.2 DMA mode模式DMA访问操作
DMA传输时需要CPU初始化DMA控制器内部相关寄存器,之后,DMA作为PCI master和Local master自动完成多通道总线仲裁和数据传输。Direct Slave mode比DMA mode优先级高,即Local总线DMA数据传输可能被CPU访问后端控制器操作而中止。
完整的DMA操作过程可分为PCI总线和Local总线操作。发送时数据通过PCI总线从系统Memory到DMA内部发送FIFO,再从DMA FIFO通过Local总线到SAB82538 XFIFO。接收时数据通过Local总线将数据从SAB82538 RFIFO传到DMA内部接收FIFO,然后再通过PCI总线操作将数据写入系统Memory。DMA 控制器在2种总线上均为Master,其内部FIFO起二总线速率匹配作用。数据在二总线上的操作并没有直接的关系,仅通过DMA内部FIFO状态实现控制。
(1)Local Bus DMA访问操作。该访问操作即是后端通信控制器SAB82538和DMA控制器之间的数据传输。SAB82538工作在Demand mode和非Demand mode模式。非Demand mode时,Local总线传输仅由DMA决定是否结束控制,不考虑后端通信控制器状态。在Demand mode时,Local总线传输过程由SAB82538控制DRT/DRR信号是否有效来决定请求或撤消读写控制。SAB82538内部有DRT0~7、DRR0~7共16个信号分别用于8个通道的DMA读、写请求。
设计中Local总线的发送采用Demand mode模式。CPU写SAB82538内部发送长度计数器并使能相关通道发送后,SAB82538发DRT请求,经仲裁获得Local总线且DMA对应通道的发送FIFO非空,则数据从16位Local总线发送到SAB82538 XFIFO;若DRT撤消或DMA FIFO空,则Local传输暂停;如果DMA未完成,则等下一次DRT请求时仍按上述操作进行,直到传输结束。一次发送DMA过程可能会有多次暂停,因为SAB82538 XFIFO限制每次DRT请求最多可接收32字节,需要多次DRT请求才能完成一个帧发送。若Local总线发送采用非Demand mode模式,则不管DRT的状态如何,只要DMA内部发送FIFO非空,即请求Local总线传输,不适于与SAB82538接口。
设计中Local总线接收操作采用非Demand mode模式。SAB82538驱动DRR信号请求接收,通过DMA控制器产生中断通知CPU,CPU读相应中断结果寄存器并初始化DMA相应通道接收寄存器,启动一次DMA传输。初始化后通道请求Local总线传输,获得总线后数据从SAB82538 RFIFO传送到DMA对应通道接收FIFO,直到DMA 接收FIFO满或DMA传输完成,Local总线操作即停止。采用Demand mode模式时不需要初始化接收长度寄存器。当DRR请求并获得Local总线后即开始数据传输,直到DRR撤消请求,但在与SAB82538接口时不适用。
Local总线共有4个双向通道,在总线空闲时根据4个通道请求按轮流优先级原则实现总线仲裁。在每个通道内部,发送和接收操作按固定优先级仲裁,二者结合最终决定获得总线权的通道操作。在总线有效的通道DMA操作过程中,可以被更高优先级的直接存取模式操作中止,但不能被其他通道DMA操作中断,必须在DMA自动撤消请求从而使总线进入空闲状态时才能进行新的总线仲裁,进入下一次通道操作。
(2)PCI总线DMA访问操作。该操作共有27种状态:总线空闲、最后周期读/写操作、DMA发送/接收操作时读BD、DMA读/写传输、发送或接收结束回写BD标志,如图3所示。idle代表总线空闲状态;rd_wt/wr_wt分别代表总线进入最后读写周期状态;Rdn/Wrn分别代表DMA读/写传输状态;rd_rd_bdn/rd_wr_bdn分别代表DMA发送/接收时读BD状态, wb_rd_bdn/wb_wr_bdn分别代表DMA发送/接收结束时回写BD标志状态(n=0~3,表示通道号)。
发送/接收时请求读BD的条件为DMA读/写使能、DMA长度计数器为0、不是最后一个BD,请求有效后总线为进入rd_rd_bdn/rd_wr_bdn状态;请求DMA读写传输的条件为DMA长度计数器非0,读时FIFO空,写时FIFO非空,请求有效后总线为进入Rdn/ Wrn状态;回写发送/接收BD标志的请求条件为DMA长度计数器为0,此请求在通道内部具有最高优先级。
在图3中,左半边为DMA写操作,右半边为DMA读操作。总线空闲时根据各通道请求进行总线仲裁,进入读/写BD或DMA发送/接收状态。在读/写传输结束前请求进入最后读/写周期状态。总线在完成最后数据的传输后回到空闲状态,才能开始再次的总线仲裁进入新的工作状态。在各个工作状态数据传输过程中出现系统错误或校验错误时,总线也会返回空闲状态。
每个通道有多个状态请求,但只有1个总线请求信号。整个仲裁过程分为通道请求仲裁和通道内部状态请求仲裁2个过程,占用2个时钟周期完成。系统空闲状态时,先按轮流优先级原则对4个通道请求仲裁,判断下一个总线占用的通道状态,并在紧接的下个周期内,对已获得总线的通道6种状态(读、写、读BD、写BD、最后读周期、最后写周期)请求按固定优先级原则仲裁,最终确定获得总线的通道及其操作。整个DMA传输过程是:初始化DMA寄存器(BD首址、DMA使能、状态命令初始化)——读BD状态——DMA传输——回写BD标志位。
BD既能有效用来对数据进行封包用于收发通信,又要能够控制DMA的传输,其基本结构包括帧状态、SIZE、NEXT BD POINTER、DATA BUFFER POINTER等。这些信息由CPU来填写,而DMA控制器读取这些信息来控制DMA的传输。CPU只需写BD链首址到DMA控制器内部寄存器,而DMA控制器使能后可以自动读取BD的信息,并以这些信息来控制DMA的自动传输。DMA传输完了BD 所指BUFFER后,需要回写结束标志给BD。读BD状态操作共读取3DWORD,包括DMA地址、DMA长度及下一个BD地址,且数据暂存在寄存器中,只有整个burst传输正确完成后,各暂存值才会更新相应寄存器,否则,仍要重新请求等待仲裁后再去读BD状态。
多通道DMA支持burst传输操作,每次burst长度最大设为8DWORD。当DMA长度大于最大burst长度时,DMA传输要分多次完成,要求在仲裁的第2个周期更新burst长度计数器和DMA地址计数器。在DMA传输过程中,地址和长度计数器随数据传输而改变。但总线的这2个寄存器只表示正在传输的通道状态,因此每个通道的各个状态还需要有各自的地址寄存器和长度计数器,以保存在没有获得总线权时的信息。在PCI总线仲裁后,要根据获得总线的通道寄存器状态更新总线的地址寄存器和burst长度计数器,并要在DMA传输过程中保持总线寄存器与正在进行操作的通道相应寄存器结果一致。
本文介绍了利用FPGA芯片设计PCI界面的多通道DMA控制器的实现方法,经过功能仿真和时序仿真,可完全实现多通道的DMA控制功能,在实际应用中取得了良好效果。
参考文献
1 侯伯亨.VHDL硬件描述语音与数字逻辑电路设计.西安:西安电子科技大学出版社,1999
2 李贵山.PCI局部总线.西安:西安电子科技大学出版社,1997
3 裘宗燕译.程序设计实践.北京:机械工业出版社,2000
4 吴靖译.IP交换技术协议与体系结构.北京:机械工业出版社,1999