(中国西南电子技术研究所,成都 610036)
在传统的嵌入式系统中,受处理器速度和性能的限制,系统对数据传输的速率要求不高。然而,随着CPU、DSP、FPGA和ADC技术的迅速发展,传统的分层共享总线已经无法满足现在高性能嵌入式系统的IO性能需求和信号处理高速数据传输需求。系统互联,即板间各种信号高速实时交互,成了制约嵌入式系统性能提升的一个主要瓶颈。
RapidIO作为解决各系统板间数据高速互连的国际通用协议,得到了越来越多主流芯片厂商的支持,有广阔的应用发展空间。串行RapidIO的互连架构是一种高性能、低引脚数、基于包交换的交叉开关互连技术。本文提出了基于PowerPC的RapidIO高速通信协议来解决这一瓶颈的软硬件实现方式。
PowerPC作为高端的嵌入式系统处理器,在航空、航天、雷达终端等电子设备领域有着广泛的应用。RapidIO协议有多种实现方式:可以通过FPGA加入IPCORE的方式,但这种方式受限于IPCORE对器件的限制和对协议实现的不完全,很难运用于嵌入式系统实时的主控操作;还可以通过一些DSP提供的RapidIO硬件接口实现,通过操作DSP提供的RapidIO专用寄存器能轻松进行RapidIO设备间的读写,但是DSP是单线程操作,很难加入实时操作系统对任务进行管理和调度。因此,本次设计最终选择了通过PowerPC提供的RapidIO硬核实现。本次方案设计选用Freescale公司针对Serial RapidIO推出的最新PowerPC——MPC8548E。
由于串行RapidIO采用的是点对点技术, 在需要2个以上RapidIO接口处理或桥接部分的系统中都需要采用一台交换机。因此,本次设计选用了Tundar公司针对串行RapidIO推出的专用交换机Tsi745。Tsi745交换机可实现与串行RapidIO 兼容的微处理器、DSP、FPGA 及其它外围设备互联, 支持40 Gbit/s的整合带宽。
作为终端显控的嵌入式系统,本次设计还加入了2个千兆以太网口以及4个串口控制器,作为与外部板卡连接的必要工具,RapidIO信号通过VPX插座传输。整个硬件框图如图1所示。
图1 MPC8548E硬件连接框图Fig.1 Block diagram of MPC8548E hardware
在硬件设计方面,首先要注意电源。在上电时,采用单5 V供电,MPC8548E的瞬时电流最高能到8 A,稳定时为2.5 A左右,因此 MPC8548E对于电源负载能力要求很高。MPC8548E核心电压为1.1 V,为了能在1.5 GHz的频率下正常运行,需要一个独立无干扰的电源层,本文采用TI公司的直流开关电源转换芯片TPS54010,最高能提供10 A稳定电流。DDR2芯片和MPC8548E自带的控制器的参考电压为1.8 V,两者也需要独立回路的电源层。其它大多数器件都只需要3.3 V的单电源供电,其回路需要的电流也很大,采用的也是TI公司的开关电源转换芯片TPS 54810 PWP,也能提供最大10 A的稳定电流。由于整个系统对电源的稳定性要求极高,本文采用了MAXSIM公司的MAX16006电源监控芯片,对各个电源实时监控,如果超出输入参考值的1%,它会自动产生全局复位信号,从而保护整个电路。其次是时钟信号,本次设计需要多个不同时钟源满足各个器件的工作需求,MPC8548E需要一个范围为20~80 MHz的系统时钟,作为内核PLL以及外围DDR控制器等的时钟参考。Tsi745交换机需要两个独立的时钟,其中一路156.25 MHz差分时钟输入用来控制RapidIO信号的传输速率,一路100 MHz共模时钟信号用以控制Tsi745内部寄存器的访问,千兆以太网也需要一个25 MHz的时钟信号,PCB布线时,要注意它们不要相互干扰,以致传输数据错误。然后在印制板绘制时,需要注意一些差分等长线设计。由于DDR2运行的频率在533 MHz以上,其信号线、地址线和差分时钟线都要按照自身手册要求严格等长,RapidIO接收端需要端接一个0.1 μF的电容,在高速传输中隔离直流信号。4x的RapidIO信号接收和发送端也必须分别等长,并满足50 Ω的阻抗匹配。
在进行RapidIO读写前,先要在上电时对MPC8548和Tsi574进行必要的硬件配置。本文设置为RapidIO Host模式,通信速率为1.25 Gbit/s。Tsi574端需要通过SP{n}-MODESEL、SP-IO-SPEED[1:0]、SP{n}-PWRDN引脚配置各个端口的模式、速率以及是否使能,本文设置为1x模式,速率是1.25 Gbit/s,每个端口都使能。硬件配置完成后,需要对RapidIO内部寄存器进行初始化配置,并完成对内部Rapid IO和外部 Agent地址空间映射,最终就能像访问外部存储器一样直接对这些地址空间操作,实现各个RapidIO器件的读写。由此可见,软件上的关键就是对RapidIO寄存器的初始化配置和地址映射,简单的流程如图2所示。
图2 RapidIO初始化软件流程Fig.2 RapidIO software initialization flow
在启动RapidIO操作之前,首先要配置一些MPC8548E内部寄存器。上电后,第一个要配置的就是TLB(Translation Lookaside Buffers)入口寄存器,为RapidIO读写操作设置内存空间。TLB入口设置通过配置MAS0(MMU Assist Register0)、MAS1、MAS2、MAS7来实现。由于MAS寄存器是内部特殊寄存器,只能通过汇编指令来访问。
然后设置内部区域寄存器(Local Area Window)来重新映射可以访问的RapidIO读写内存空间,需要设置两个寄存器:LAWBAR(Local Access Window Base Address Register)设置RapidIO内存空间的基地址,如0xC0000000; LAWAR (Local Access Window Attribute Register)设置本窗口的类型和大小,必须设置成RapidIO类型,大小根据实际需要确定,如0x80C0001B,C表示RapidIO,1B表示256M。
第三步检查和同步RapidIO外围链路。在任何RapidIO操作前,都要查看有没有正确链接其它RapidIO器件。通过读寄存器ESCSR(Error and Status Command and Status Register)来获得链路的各种信息,ESCSR[PO]表示输入输出口已经初始化完成,可以进行下一步操作,如果有错,就检查ESCSR其它位,找出错误地方,以便进行下一步修改。
第四步就是设置Maintenance窗口,为配置外部交换机和其它RapidIO从设备作准备。需要配置RapidIO Outbound窗口的3个寄存器为:ROWBAR(RapidIO Outbound Window Base Address Register)设置Outbound窗口的32位基地址,如0x000C0000;ROWAR(RapidIO Outbound Window Attributes Register)设置Outbound窗口使能、读写和大小等属性,设置为Maintenance read和write,如0x8007070013;ROWTAR(RapidIO Outbound Window Translation Address Register)设置Outbound窗口外部器件ID、跳数和Maintenance操作高位地址,如0x3FC00000。
执行的第一条RapidIO操作指令就是通过Maintenance read获取外部第一个RapidIO设备的设备ID,对外部RapidIO从设备的寄存器空间读写都需要通过Maintenance read 或 write指令操作。本次设计使用的是交换机Tsi574,读出的ID为0x05740002。然后对交换机进行配置,需要读出端口个数(RIO-SW-PORT Register),锁定ID(HBDIDLCSR Register),然后更新路由查找表,通过设置RIO-ROUTE-CFG-DESTID 和 RIO-ROUTE-CFG-PORT确定发给主机的数据都在交换机内,且都通过正确的端口发送。
交换机配置好后,需要通过交换机查找下一级的RapidIO从设备,检查到正确的链路后,也需要读出其设备ID,从而判断是哪一类器件。一般从器件的Device ID都是0xFF,需要把它修改为不同的ID,可以依次设置为1、2、3、4。最后还要更新路由查找表,使每个端口能正确收发数据。
为了正确读写外部RapidIO器件的配置空间,首先要配置各个从器件的LCSBA1CSR(Local Configuration Space Base Address 1 Command and Status Register),设置RapidIO在这个从器件内的起始地址。然后配置主机Outbound窗口3个寄存器:ROWBAR、ROWAR、ROWTAR,这个在设置Maintenance窗口步骤中已经配置过,但是要进行一些修改,ROWBAR 起始空间应从0x000C1100开始,ROWAR窗口属性要设置为NREAD和NWRITE, ROWBAR需要设置Target ID和Outbound传输地址,如0x00401000。使能外部Rapid配置空间,还能在上电时通过主机启动RapidIO从设备。
为了使能内存读写,在主机端配置好ROWBAR、ROWAR、ROWTAR寄存器后,还需要对各个从设备的Inbound窗口寄存器进行设置:RIWBAR(RapidIO Inbound Window Base Address Register),设置好从设备端的RapidIO Inbound Window基地址;RIWAR(RapidIO Inbound Window Attributes Register)设置Inbound窗口属性,包括窗口大小、读写模式和内存映射等;RIWTAR(RapidIO Inbound Window Translation Address Register),设置从设备数据输出起始地址。正常配置好这些寄存器后,就能像访问内存空间一样对RapidIO设备进行读写了。
本次设计用于某项目中信号处理板与显控板实时数据传输通信中,要求每隔十几微秒就传输3~4 kbyte数据。在Linux操作系统中,采用RapidIO 1x模式,在1.25 Gbit/s速率下进行数据传递检验,实验框图如图3所示。
图3 RapidIO 实验连接图Fig.3 RapidIO experimental connection block diagram
首先在上电后,PowerPC先配置好交换机Tsi574,通过交换机找到3个RapidIO从设备,然后对这3个设备进行初始化,包括修改Device ID、RapidIO Inbound、Outbound寄存器和配置读写的映射空间,根据通过串口打印在控制台上的信息,一步步判断初始化程度。RapidIO正确配置后,待Linux系统正常启动后,通过上位机电脑网络发送数据到PowerPC,然后PowePC把收到的数据直接通过内存读写分发给3个RapidIO从设备,从设备收到数据后,发送接收完成中断,PowerPC再分别读出3个从设备接收到的数据进行比较。实验结果表明,在1.25 Gbit/s速率下使用Serial RapidIO协议通信,4 kbyte数据能在1 μs内正确实时地传送。
参考文献:
[1] Freescale Semiconductor. MPC8548E PowerQUICCTMIII Integrated Processor Family Reference Manual[M]//MPC8548ERM Datasheet.East Kilbride,USA:Freescale Semiconductor Inc,2007: 1035-1222.
[2] Lorraine McLuckie, Colin Cureton. Serial RapidIO Bring-Up Procedure on PowerQUICCTMIII[M].East Kilbride,USA:Freescale Semiconductor Inc,2005:3-38.
[3] 韦东山.嵌入式Linux 应用开发完全手册[M].北京:人民邮电出版社,2009:384-389.
WEI Dong-shan. Application of embedded Linux system[M].Beijing: People′s Posts and Telecommunications Press,2009:384-389.(in Chinese)
[4] 朱坚,徐光辉,朱利利.基于Serial RapidIO 的高速实时数据采集处理系统[J].电子质量,2008(10):6-7.
ZHU Jian,XU Guang-hui,ZHU Li-li. High Speed Data Acquisition and Processing System Based on Serial RapidIO[J]. Electronics Quality, 2008(10):6-7.(in Chinese)
[5] 邓豹,赵小冬.基于串行RapidIO的嵌入式互连研究[J]. 航空计算技术, 2008,38(3):123-126.
DENG Bao,ZHAO Xiao-dong. Research of the Embedded Interconnection Frame Based on Serial RapidIO Technology[J]. Aeronautical Computing Technique,2008,38(3):123-126.(in Chinese)
[6] 王学宝,郑波祥,朱勇.基于TSI568的RapidIO交换模块设计[J].微计算机信息,2009, 25(6):104-106.
WANG Xue-bao, ZHENG Bo-xiang ,ZHU Yong. Design of RapidIO Switch Board Base on TSI568[J]. Micro Computer Information,2009,25(6):104-106. (in Chinese)