基于PCI 总线的多通道DMA传输


摘  要:

研究了基于PCI/cPCI总线的多通道DMA传输系统,分析了实现多个DMA传输通道的方法;以 PCI9054为PCI主桥、个人计算机为开发环境,详细分析了多通道数据采集卡中不同通道的访问策略,给出了接口电路的实现结构,讨论了不同DMA传输 方式的性能和应用环境。 

    关键词: PCI总线  DMA控制器  突发传输  数据采集

 

    PCI/cPCI总线是一种独立于CPU的局部总线,由于支持突发传输操作,其总线传输吞吐量为132MB/s(33bit,33MHz),已经被广泛应 用于个人计算机。但是,在x86结构CPU的个人计算机下,由主CPU发起读操作访问PCI目标设备时,不能进行突发读操作。这是由于个人计算机启动时 BIOS将PCI设备映射到非Cache存储器中,会出现读操作阻塞。对于突发写操作,也存在同样的问题。也就是说在PC环境下开发基于PCI的产 品,PC机不支持突发传输。为了获得高的数据传输量,就必须使用PCI主桥设计PC卡,并在DMA模式下操作。高传输性能的PCI总线主设备有很多,如 PLX公司的PCI9054。本文以多通道高速数据系统的设计为例,说明PCI9054实现多通道DMA传输的应用。 

1 PCI总线控制器的DMA传输 

    PCI9054集成了两个互相独立的DMA通道,每个通道都支持Block DMA和Scatter/Gather DMA。其中通道0还支持请求(Demand)DMA传输方式。由于PCI9054的两个DMA通道都是由DMA控制器和专用的双向FIFO组成,当每个 通道进行DMA传输时,它对于PCI总线和本地总线都是主设备。即DMA控制器将发起对本地总线和PCI总线操作,其过程如图1所示。 

 

windows samba 多通道 多tcp 多通道总线_数据采集

 

    如果要求从本地空间传输数据到PCI空间,PCI9054首先对本地总线执行读操作。在本地总线上可能有其它设备访问本地总线,因此PCI9054需申请 获得本地总线访问权。当PCI9054获得访问权后,将本地数据读入PCI9054的FIFO中。与此同时,PCI9054将向PCI总线仲裁器申请 PCI总线访问权,将数据从FIFO写到PCI总线空间。一旦DMA传输完成,PCI9054设定DMA“传输结束位”结束传输。如果设置中断允 许,PCI9054将根据设置向PCI总线或本地输出中断。同样可将数据从PCI传输到本地总线空间。 

    虽然PCI9054的双独立DMA通道提供了灵活的优先方案,支持多种传输模式,但在很多实际应用中需多个DMA传输通道,必须根据不同应用采用不同的策略。 

2 基于块传输模式的多通道数据采集系统设计 

    块传输是一种相对简单的DMA传输模式。其操作是将本地总线存储器中的数据传输到HOST内存中,或将HOST内存中的数据传输到本地总线上的存储空间。 在传输之前,HOST处理器设置DMA寄存器中本地和PCI空间起始地址、传输字节数、传输方向,然后HOST处理器设置DMA开始位,启动DMA并按配 置的信息传输。

    四通道数据采集系统如图2所示。系统由4个输入通道、4个FIFO以及实现接口控制逻辑的CPLD组成。由于系统有4个输入通道,而PCI9054只有二 个DMA通道,不能满足输入通道数的需要,为此必须进行处理。设计的关键是建立一个所有输入共用的DMA传输通道。然而,一个DMA通道只有一个本地空间 和一个PCI空间,因此必须将不同通道的地址空间映射到DMA传输通道的地址空间中,从而识别每次传输数据的输入通道。图3给出了不同通道地址空间的映射 关系。当数据从本地地址空间传输到PCI地址空间时,首先将输入通道的地址空间映射到本地的DMA访问空间,DMA控制器将数据传输到DMA访问的PCI 空间,然后将PCI空间中的数据转移到每个通道所对应的内存空间。

 

windows samba 多通道 多tcp 多通道总线_数据采集_02

 

windows samba 多通道 多tcp 多通道总线_数据传输_03

 

    输入通道的存储空间映射到DMA本地访问空间是基于DMA访问的。当DMA控制器访问本地空间时,访问的地址对4个通道而言是一样的,必须给出对不同本地 空间的访问策略。访问策略可有多种选择,如优先访问、排队访问、循环访问等。图4给出循环访问策略,并在CPLD中实现。其状态变化为: 

    …→STATE0→STATE1→STATE2→STATE3→STATE0…→ 

 

windows samba 多通道 多tcp 多通道总线_数据传输_04

 

    STATEx表示对本地空间x的操作状态。当输入通道FIFOx的请求传输信号FLAGx有效,状态机将停留在STATEx状态,等待DMA控制器的访 问。当计算机启动DMA通道时,产生通道选择信号CSx,访问本地空间FIFOx。当DMA传输结束后,信号CSx无效,状态转为下一个状态。如果在下一 个状态没有检测到请求信号,状态将转移到该状态的下一个状态,直到检测到请求信号FLAGx有效时,状态机才停留在STATEx状态,等待DMA控制器访 问。 

    DMA控制器访问依赖于数据采集通道的请求传输信号FLAGx。如果数据采集通道启动,将向相应通道的FIFO中输入数据,一旦FIFO中的数据达到某种 程度,设置请求传输信号。该信号将从本地中断信号LINT#输入并路由到PCI总线上,计算机将接收并响应中断。其中断响应程序流程如图5所示。计算机读 PCI9054内部中断状态寄存器,检测为本地中断,从CPLD中设置的状态寄存器读取通道状态。然后启动DMA控制器。当数据传输结束 后,PCI9054同样产生PCI中断,读PCI9054内部中断状态寄存器,检测为DMA传输结束,这时查询通道状态寄存器的值,决定传输数据的通道, 并对数据作相应的处理,其处理方式依赖于不同的应用需要。 

 

windows samba 多通道 多tcp 多通道总线_数据_05

 

    如果应用中需要有选择性地传输输入通道数据,假设选择通道0、1、3,这时只须对CPLD中设置的屏蔽寄存器写数据初始化,即可屏蔽输入通道2。 

    在该设计中存在一个问题:对于一次DMA传输,计算机需要响应两次中断,这将增加计算机的处理事务。为此,可以采用PCI9054的DMA通道的请求传输 方式。利用输入通道的请求传输标示信号产生DMA请求信号DREQ0#,从而启动DMA传输,并产生DACK0#响应信号。当数据传输结束后,计算机响应 中断,读输入通道状态寄存器,判断传输到计算机中数据的输入通道。 

3 基于Scatter/Gather传输模式的多通道数据采集系统设计

    Scatter/Gather(或S/G)DMA传输模式是PCI9054的另外一种传输模式。其基本方法是将本地总线上或PCI总线上分散的数据块一次 性地通过DMA传输方式传输到PCI存储空间或本地存储空间,不需要多次启动DMA控制器。数据采集系统结构如图2所示,空间映射如图3。PCI9054 的S/G传输模式其实是利用PCI9054内部的DMA传输通道,建立了一个虚拟的DMA传输,并使用描述模块建立一个传输链,将不同位置上的数据块传输 连接起来。该描述模块包括PCI和Local的起始地址、传输字节数、传输方向和下一个描述模块的地址。该模块由HOST处理器在HOST存储器中建立。 然后HOST或本地处理器设置S/G模式;在PCI9054描述指针寄存器中建立开始描述块地址。 

    当本地总线请求传输信号有效时,产生PCI中断INTA#,PC响应中断,设置DMA控制器控制位启动传输,其传输过程如图6所示。PCI9054根据开 始描述块地址装载第一个描述块并传输该空间的数据。当第一块数据传输结束后,检测描述链结束位。如果没有设置,表明不是最后的块传输,指定下一个描述模块 的位置,并继续装载描述块和传输数据,如此重复直至检测到描述链结束位被设置。当检测到链结束状态位时,表明PCI9054没有下一个数据块传输,设置 DMA传输结束状态位,表明数据传输结束。 

 

windows samba 多通道 多tcp 多通道总线_磁盘_06

 

    对于多通道数据采集应用,假设每个输入通道数据采集的速率一样,那么输入到每个通道中FIFO的数据是一样的速率。当 FIFO中的数据达到一定程度时,产生中断请求传输,计算机响应中断,进行上述操作。由此可见每次启动DMA传输,将4个数据采集通道的数据一次传输到计 算机内存的不同空间中。当然,如果只需传输4个通道中的几个,如只传输通道1、2、4的数据,那么只用修改块传输描述块中的参数,重新建立块传输链,只传 输输入通道1、2、4的数据,从而屏蔽了输入通道3。 

    该传输方式相对块传输模式而言,不用进行4次DMA启动,减少访问的开销,同时不需要设计复杂的接口电路。由于S/G模式对多块数据传输是统一进行的,要 求输入通道的数据输入速率一致,或有相对稳定的关系,使每个块传输的大小相对稳定。当然每个通道的采样速率可能不一致,并随时需要调整,这样就需要相应地 修改描述块的参数,使S/G模式操作变得较复杂。块传输模式可以根据每个通道各自请求的传输状态进行传输,表现出应用的灵活性。 

    该设计虽然只是针对多通道数据采集应用,但可以在其它的开发应用中采用,如图像传输可传输多个经过压缩或没有压缩的图像数据到计算机中存储或显示。另外,该设计中的数据传输模式不仅限于个人计算机环境,还可广泛应用于嵌入式系统中,如多路接入通信系统等。