基于共享存储体的多处理器间数据交换的几种方法
扫描二维码
随时随地手机看文章
合成孔径雷达信号处理机系统的任务就是对雷达回波信号进行距离向和方位向的二维数据脉冲压缩,从而得到地面目标的高分辨率图像。该系统是一个实时信号处理系统,系统数据量大,运算复杂。该系统A/D转换模块的采样率为200Mbyte/s,雷达回波信号I/Q正交双通道,每通道采样2048点,脉冲重复频率为1.4kHz,则数据率为5.6Mbyte/s。系统在算法上主要完成距离向和方位向的脉冲压缩,还要完成距离徙动校正和运动补偿。根据合成孔径雷达成像算法,系统主要由A/D数据采集模块、预处理模块、标量处理模块、矢量处理模块、后处理模块、中心控制及数据显示模块组成。其中A/D数据采集模块的A/D转换器用MAXIM公司的SPT7750芯片,其采样率为200Mbyte/s,分辨率为8bit。预处理用TMS320C6201定点处理器,峰值运算速率为1600mips。标量处理模块用多片ADSP2106X来完成。矢量处理模块用LH9124/9320芯片组来完成。后处理用TMS320C31来完成。中心控制器用i386EX单片机来完成,图象显示及人机接口用具有ISA总线及PCI总线的ALL IN ONE 来完成。显而易见,这是一个多处理器系统。
作为一个系统,多个处理器必须交换数据,系统才能协同并行工作。处理器间交换数据可以有两种方法,一种是利用标准总线结构实现板间数据传输,如VME、Compact PCI总线等,利用这种方法传输数据要求本板有总线控制器接口电路,还要有0槽卡,系统复杂,成本高,这里不作讨论。另一种是利用共享存储体的方法,这是本文讨论的重点。两个处理器要交换数据则必须要有两个处理器都可以访问的共享存储体,一个处理器将数据写入存储体,而由另一处理器将数据时分读出,这种方法可以实现处理器总线的隔离,使两个处理器间可以有效地交换数据,实现数据共享。两个处理器要共同访问一个存储体有这样几种方法,其一是双口RAM法、其二是先进先出的FIFO法、其三是总线开关加存储器法。这三种方法所要注意的问题是处理器间信号的握手,即当一个处理器给存储体写入数据后产生旗标通知另一处理器将数据取走。另一个问题是两个处理器访问同一存储单元可能产生的冲突。下面就分别讨论这三种方法。
1 用双口RAM实现两个处理器间数据交换
双口RAM是一种双端口器件,允许两个处理器各访问一个端口,每一个处理器都可以将双口RAM看作自己的本地存储器。双口RAM的每个端口都有各自的数据、地址、控制总线,允许处理器对存储器的任何地址执行随机读写操作。当两个处理器同时对同一地址单元操作(如同时写、或一个写一个读),双口RAM会自动产生BUSY信号表示冲突。一般此BUSY信号接至处理器的READY端,使其读或写时序延长,最终读出或写入。
IDT公司的IDT7133是一种典型的双口RAM芯片,其管脚分布如图1所示。其中IO0~15表示数据总线、A0~10表示地址总线、R/W、CE、OE分别表示读/写、片选、读选通,BUSY是IDT7133的输出信号表示冲突,L、R分别表示左右端口,读写管脚中的L、U表示16Bit数据的低字节、高字节的区分,字母上方的—号表示该信号低电平有效。
作为雷达数字信号处理机的一个子系统的一部分,笔者设计了一个电路用于ISA总线和i386EX单片机交换数据,其示意性原理图如图1所示。
其中EXD0~15和i386EX单片机的数据总线相连,EXB1~11和i386EX的地址总线相连,EXOE#、EXWRL#、EXWRH#由i386EX状态信号、读写信号组合产生,EXCS#由i386EX高端地址译码产生。ISAD0~15和ISA数据总线相连,ISAB1~11和ISA的地址总线相连,ISAOER#、ISAWRL#、ISAWRH#、ISACS#是由ISA总线的地址、读写、状态组合产生,BUSY驱动i386EX的READY信号,结果表明i386EX和ISA总线间可以有效可靠地交换数据。[!--empirenews.page--]
2 用FIFO实现两个处理器间数据交换
实现两个处理器间数据交换的另一种方法是FIFO结构。FIFO是一种先进先出的结构,较之双口RAM,它有如下特点:第一它无地址线,布线简单;第二它不能像双口RAM一样可以对任意地址单元操作,实现随机存取,只能是顺序存取。FIFO只能实现块操作,其读出数据的顺序和写入的顺序是一样的。FIFO有单向双向之分和同步异步之分。单向FIFO只能向一个方向传输数据,双向FIFO可以向两个方向传输数据。目前FIFO的内部结构是由双口RAM加驱动双口RAM 地址的计数器构成。同步FIFO 是由专用时钟管脚信号来使计数器翻转,片选和读写是使能信号;异步FIFO是由读写信号使计数器翻转。IDT7205(CY7C460)是单向异步FIFO的典型芯片,其管脚分布如图2所示。
D0~8是数据输入总线,Q0~8是数据输出总线,R、W是读、写控制端,XI、XO是级联控制端,HF、FF是FIFO状态满标志,EF是FIFO状态空标志。根据HF、FF状态,写处理器就可以知道FIFO是否已满,根据EF状态读处理器就可以知道FIFO里是否有数据。
笔者设计了一个用于TMS320C30传输数据给i386EX的电路,和FIFO相关部分的示意性原理图如图2。如果要反向传输,FIFO的输入输出要交换位置,逻辑要作适当的修改。其中XD0~7和C30的副总线相连接,TMS_WRITE、TMS_RESET由C30副总线的触发、读写及地址译码组合产生,TMS_FULL信号驱动C30的XRDY信号,以使FIFO满时,写总线周期延长。EXD0~7和i386EX单片机的数据总线相连,EX_READ是由i386EX状态信号、读写信号及地址译码组合产生,EX_EMPTY供i386EX单片机的I/O口判读。
3 用总线开关加存储器实现两个处理器间数据交换
第三种方法是总线开关法。对于像图像处理等需要大量交换数据的应用场合,用双口RAM或FIFO方法就不太合适。双口RAM和FIFO一般容量较小,而且价格昂贵。比如说常用的双口RAM IDT7133 只有32Kbit(2K×16bit),而单向FIFO IDT7205也只有8K×9bit。用总线开关外加大容量存储器很适合这种大容量的数据传输。
IDT74FST163212是一种典型的总线开关芯片,其管脚分布如图3所示。
其中S0~2是总线开关控制端,A、B、C、D是四个总线端口,每个总线端口有12根线组成,由S0~2控制A、B和C、D总线端口的导通或不导通。例如当S2、S1、S0为000时,总线间不导通,呈高阻态;当为001时,A总线端口和B总线端口导通,即A1和B1导通、A2和B2导通……;由于总线开关是由栅极可控的场效应管组成,信号无方向性,导通电阻很小,只有几个或十几个欧姆。[!--empirenews.page--]
笔者设计了一个电路,由TMS320C30和一块FPGA作主控器共同访问一片存储器,由于线较多,这里仅给出其示意性原理图见图4。由TMS320C30将数据块写入存储器,再由FPGA将数据读走。
利用共享存储体实现处理器间的数据交换是一种简单易行的方法。用共享存储体实现处理器间数据交换的各种方法中,双口RAM、FIFO适用于小容量交换数据的场合,总线开关加存储器的结构适用于大容量数据交换的场合。