一种基于MPC8260和FPGA的DMA接口设计与实现

时间:2011-07-11

  摘要 以MPC8260通信处理器为硬件平台,结合中断处理和IDMA传输机制设计一种传输速率可达500 Mbps的数据传输接口。本文详细介绍了接口的硬件电路和软件流程,以及MPC8260的DMA控制器、DMA通道初始化和中断处理过程。

  引言

  在基于软件无线电的某无线通信信号侦收平台的设计中,天线接收到的信号经过变频器处理和A/D变换之后,经过高速通道把采集的信号送入主控板进行数据分发处理。系统的结构框图如图1所示。

  图1 主控板的系统结构框图

  主控板的硬件是嵌入式微处理器MPC8260,负责系统软件的加载、数据的分发以及与外界命令控制的交互。软件上,采用高性能的VxWorks嵌入式实时操作系统。从天线接收到的射频信号经过变频和A/D变换之后作为数据源连接到FPGA,FPGA对接收到的数据进行中频变换和信道估计等预处理后,在CPU的控制下将数据传输到本地内存,CPU对数据打包后进行快速分发。

  嵌入式微控制器的典型代表是单片机(Microcontroller Unit),这种8位(8根数据线,8位指令)的电子器件目前在嵌入式设备中仍然有着极其广泛的应用。微控制器的特点是单片化,体积大大减小,从而使功耗和成本下降、可靠性提高。

  嵌入式微处理器(Microprocessor Unit,MPU)由通用计算机中的CPU演变而来。与通用计算机中的CPU不同的是,在嵌入式应用中,将微处理器装配在专门设计的电路板上,只保留和嵌入式应用紧密相关的功能硬件,去除其他的冗余功能部分,这样就以的功耗和资源实现嵌入式应用的特殊要求。此外,为了满足嵌入式应用的特殊要求,嵌入式微处理器在工作温度、抗电磁干扰、可靠性等方面相对通过通用计算机中的CPU都做了各种增强。

  如果每传递一个字节的数据都需要CPU的介入,那么不论是采用中断驱动还是采用程序查询的方式,数据传输速率都会很低,无法满足系统需求。MPC8260支持多种DMA实现方式,分别适用于不同数据传输源/目的设备、不同传输数据块大小和存储模式的需要,因此需要根据主控板的系统特点设计出合适的DMA传输接口。

  1 MPC8260的 DMA系统结构

  图2 CPM原理框图

  MPC8260是Freescale公司主要针对数据通信领域而设计的一种嵌入式PowerPC微处理器,具有双核结构:1个高性能的MPC603e 64位RISC微处理器内核和1个专为通信设计的32位RISC通信处理模块(Communication Processor Module,CPM)。CPM的原理框图如图2所示。除了PowerPC内核和CPM之外,MPC8260还包含一个灵活的系统接口单元(System Interface Unit,SIU)主要用于控制与外部总线的接口。

  图2中, CPM内除了SDMA模块以外,还包括通信控制器(Communications Processor,CP)、双口RAM和一些串行外围设备的控制接口等。SDMA和60x总线、本地总线相连,并且可以直接访问CPM内部的双口RAM。同时,CPM还用这2个物理的SDMA通道模拟4个可编程控制的、独立的DMA (Independent DMA,IDMA)通道,用于存储器—存储器及外设—存储器之间的数据传输。

  主控板上的FPGA和SDRAM都是挂接在MPC8260的60x总线上的,所以只能利用IDMA来实现二者之间的DMA传输。根据传输启动的触发方式不同,IDMA可分为握手信号控制的IDMA传输和CP命令控制的IDMA传输两种。下面分别介绍两种方式的特点。

  1.1 握手信号控制的IDMA传输

  握手信号控制的IDMA传输主要用于外设和内存之间的数据传输。每个IDMA通道都有3个握手信号用于传输握手控制:DMA请求信号DREQ[1~4]、DMA应答信号DACK[1~4]和DMA结束信号DONE[1~4]。

  在这种方式下,PowerPC内核只需要参与IDMA通道初始化,之后的传输过程全部由CP按照通道参数设置和握手信号控制数据的收发,在上释放内核。握手信号控制的缺点在于:① SDRAM中的数据和MPC8260的数据同步比较复杂。② 每次发出请求信号后都要进行总线仲裁,并且在得到总线使用权之后只能够传输外设端口大小或者32位的数据,总线利用率低。③ 握手控制逻辑和时序比较复杂,加重了FPGA内部控制逻辑设计的负担。

  虽然这种传输方式基本上不占用内核资源,但是由于总线带宽有限且利用率较低,所以在连续高速的通信条件下会造成内核长时间得不到总线使用权而一直处于等待状态。因此,握手信号控制的IDMA一般只适用于由外设发起的、数据不是太频繁的传输使用。

  1.2 CP命令控制的IDMA传输

  MPC8260的IDMA还可以通过向CP命令寄存器中写入START_IDMA命令进行内部触发。每次启动传输以后PowerPC内核就被释放,传输的源地址、目的地址和传输数据长度等参数由CP按照在IDMA通道初始化的信息控制执行。每次传输的长度为4 GB。

  相比握手信号控制的IDMA传输,在这种方式下,PowerPC内核除了需要初始化IDMA通道以外还要以命令的形式启动每的传输,所以要占用多一些的内核资源。不过,在传输启动之后多可以传输4 GB的数据,所以只要每次传输的数据长度比较长,内核写一个寄存器的额外开销就完全可以忽略不计。同时,由于内部命令触发方式不需要握手信号,不需要频繁地每几个字节就竞争总线控制权,所以这种方式的传输效率更高、传输速度更快。内部命令触发方式是以空间换时间——用前端大的缓冲区来换取传输速度的提升。

  考虑到主控板上软硬件系统的瓶颈都在于总线带宽,而存储资源相对比较丰富,所以选择CP命令控制的IDMA传输作为数据流从FPGA到SDRAM的传输方式。

  2 DMA传输方案设计

  FPGA和MPC8260间的数据传输接口设计如图3所示。图中左侧FPGA,通过16位数据线、10位地址线、2根中断请求线和一些读写控制信号线连接到右侧的MPC8260。MPC8260通过64位数据线与本地内存SDRAM相连。

  图3 IDMA传输设计框图

  FPGA内部分配有两个大的存储空间,用于轮流缓冲从数据源接收到的数据。任何一个缓冲区收满后,继续接收的数据保存到下一个缓冲区,同时以中断的方式触发MPC8260启动相应的IDMA通道把数据传到SDRAM中。IDMA控制、数据同步和错误处理都由MPC8260完成,FPGA只负责收发数据和触发中断。下面分别介绍二者的程序设计。

  2.1 MPC8260程序设计

  MPC8260内部的程序处理流程如图4所示。MPC8260预先初始化两个IDMA通道:通道的源地址和传输数据长度等信息与FPGA中的缓冲区一一对应。当收到FPGA的中断信号之后,如果此时对应的IDMA通道空闲,则在中断处理程序中发出CP命令开始接收数据,同时将对应的IDMA通道置忙状态;否则,在FPGA中可能发生了未读取的数据被覆盖的情况,MPC8260进入错误处理程序。在数据传输结束时由DMA控制器发送CPM内部中断到内核,在中断处理程序中一方面要恢复IDMA通道的参数设置,另一方面要把该IDMA通道置闲状态等待下传输的开始。

  MPC8260程序的部分是IDMA通道设置和中断处理。

  图4 MPC8260传输处理流程

  2.1.1 IDMA通道设置

  与一般的DMA通道设置一样,IDMA通道设置的主要参数包括:源地址、目的地址和传输数据长度。除此之外,MPC8260的 IDMA通道设置还包括通道模式、缓冲区和中断配置等,所涉及的寄存器比较多,配置比较复杂。IDMA通道设置的逻辑结构如图5所示。

  图5 IDMA通道设置的逻辑结构框图

  BD(Buffer Descriptors)表是用于指定传输方式、源/目的地址和数据长度等基本信息的数据结构。BD表的基地址由参数RAM中IBASE寄存器的值指定。IDMAx_BASE寄存器的地址是固定的,如IDMA1_BASE在偏移RAM基地址0x87FE的位置。CP就是通过IDMAx_BASE寄存器找到IDMA参数RAM,再通过IBASE找到BD表的顺序初始化IDMA通道的。具体的寄存器配置可以参考文献[1]第19章的IDMA编程示例。

  为了提高通道的传输速率,系统中IDMA通道初始化应该注意以下几点:

  ① 需要在SIU中为FPGA配置UPM模式控制MPC8260和FPGA之间的突发读写。不要使用通用目的片选机(GeneralPurpose Chipselect Machine,GPCM)模式。因为MPC8260内存控制的GPCM模式不支持突发传输,IDMA工作在GPCM模式下一方不论传输数据的长度是否满足突发的要求,都只能以普通的单次读写进行。

  ② 把FPGA当作存储器操作,IDMA工作在内存到内存的双地址模式下,缓冲区设为的2 KB。

  ③ BD表的配置应该与FPGA中的缓冲区一一对应。BD表结构中的CM(Continuous Mode)位应该设置为缓冲链模式,在每一个BD表传输完之后,清BD表的有效位;同时,CP根据下一个BD表的值自动装载IDMA寄存器进行后面的传输。

  IDMA通道初始化以后等待CP发出START_IDMA命令开始传输。在一个BD表传输结束时触发中断信号通知PowerPC内核本次传输过程的完成。传输过程中会发生改变的通道设置寄存器包括IDMA BD表指针、源地址、目的地址和BD表有效位等,所以在BD表传输结束的中断处理程序中需要恢复这些寄存器为下传输作准备。

  2.1.2 中断处理

  中断处理是与计算机有关的术语。引起中断的事件称为中断源。中断源向CPU提出处理的请求称为中断请求。发生中断时被打断程序的暂停点成为断点。CPU暂停现行程序而转为响应中断请求的过程称为中断响应。处理中断源的程序称为中断处理程序。CPU执行有关的中断处理程序称为中断处理。

  与一般中断处理过程的区别在于:MPC8260中断处理控制器采用分级结构来扩展中断信号总数。CPM内的中断就是二级中断,需要通过CPM中断控制器和SIU中断控制器两级中断控制。本设计中用来通知内核本次传输过程结束的中断是CPM内一个BD表传送结束的信号BC(BD Completed)。BC信号和命令结束等几个信号一起通过SIU中断挂起寄存器中的IDMA位向内核发出中断信号。所以在中断初始化时要同时有效IDMA屏蔽寄存器和SIU中断屏蔽寄存器对应的比特位。具体的中断初始化实例如下:

  void IDMAint(void) {

  *(long*)(IDMR1)=0x0F000000;/*使能IDMA1所有的二级中断*/

  *(long*)(IDMR2)=0x0F000000;/*使能IDMA2所有的二级中断*/

  *(long*)(SIMR_L)|=0x00000600;/*使能IDMA1和IDMA2在SIU中的中断*/

  *(long*)(SIMR_H)|=0x00006000;/*使能外部中断IRQ1和IRQ2*/

  *(long*)(SIEXR)|=0x00006000; /*设置IRQ1和IRQ2为下降沿触发*/

  *(long*)(SIUMCR)=0x81210000;/*配置SIU模式配置寄存器*/

  /*连接中断服务程序和中断向量号*/

  if((intConnect(INUM_TO_IVEC(INUM_IRQ1),(VOIDFUNCPTR)IRQ1Handler,0))==ERROR)

  logMsg("intConnectIRQ1failedn",0,0,0,0,0,0);

  if((intConnect(INUM_TO_IVEC(INUM_IRQ2),(VOIDFUNCPTR)IRQ2Handler,0))==ERROR)

  logMsg("intConnectIRQ2failedn",0,0,0,0,0,0);

  if((intConnect(INUM_TO_IVEC(INUM_IDMA1),(VOIDFUNCPTR)IDMA11Handler,0))==ERROR)

  logMsg("intConnectIDMA1failedn",0,0,0,0,0,0);

  if((intConnect(INUM_TO_IVEC(INUM_IDMA2),(VOIDFUNCPTR)IDMA2Handler,0))==ERROR)

  logMsg("intConnectIDMA2failedn",0,0,0,0,0,0);

  }

  尤其要注意的是,中断处理程序结束之前的清SIU中断挂起寄存器,不能直接在SIU中断挂起寄存器的IDMA位写1,而是要通过在IDMA事件寄存器的BC位写1来间接地清SIU中断挂起寄存器。

  2.2 FPGA部分程序

  FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点

  系统中的FPGA芯片选用Xilinx公司的VirtexII 3000。利用VirtexII内嵌的大容量BlockRAM配置为单口RAM来做缓冲区,在程序中可以用Xilinx的集成开发环境ISE 7.1i内部自带的IP核生成。系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。

  FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD(复杂可编程逻辑器件备)。

  FPGA设计的关键部分是和MPC8260的总线接口设计。通过适当选择缓冲区的起始地址和长度,可以使MPC8260读FPGA都以突发的方式进行。设计中,MPC8260对FPGA的突发读写遵循自己配置的UPM模式,所以要综合考虑UPM模式设计和FPGA读写逻辑设计。在设计UPM模式时,可以在每次MPC8260锁定数据总线数据之前由通用功能信号线(General Purpose Line,GPL)产生一个下降沿通知FPGA往数据总线上写新数据;或者通过GPL把总线时钟送到FPGA达到收发同步来完成MPC8260与FPGA之间的读写。

  3 总结

  结合MPC8260的中断处理和IDMA传输机制,设计了一种MPC8260和FPGA之间的高速数据传输接口。测试结果显示:采用循环读的方式把FPGA中的数据复制到SDRAM中,数据传输速率只有11 Mbps左右;而采用本文介绍的IDMA方式,速率能够达到500 Mbps,并且内核占用率较低,实验结果完够满足系统设计需求。本研究对于PowerPC系列CPU的接口设计有一定的参考价值。


  

参考文献:

[1]. MPC8260 datasheet https://www.dzsc.com/datasheet/MPC8260_2428150.html.
[2]. RISC datasheet https://www.dzsc.com/datasheet/RISC_1189725.html.
[3]. CPLD datasheet https://www.dzsc.com/datasheet/CPLD_1136600.html.


上一篇:一种智能家居视频监控系统的设计和实现
下一篇:嵌入式网络视频监控系统设计与实现

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料