贾 亮 ,王 浩 ,叶青林
(1.沈阳航空航天大学 电子信息工程学院,辽宁 沈阳 110136;2.北京方天长文科技有限公司,北京 100084)
在工业和嵌入式领域实际工程应用中,模块化的设计思想已深入人心。针对不同使用场合的具体应用以及为方便后续的维护和升级,将其中具有通用性和可持续利用的部分单独设计成载板,载板配合不同的应用模块就可以组合成具有不同功能的专业I/O模块。
Compact PCI (Compact Peripheral Component Interconnect)简称CPCI,中文又称紧凑型PCI,是国际工业计算机制造者联合会 PICMG(PCI Industrial Computer Manufacturer′s Group)于1994提出来的一种总线接口标准,是以PCI电气规范为标准的高性能工业用总线[1]。CPCI规范改进自PCI电气规范2.1,应用于工业和嵌入式领域。当前最新的CPCI规范是PICMG 3.0。PICMG 3.0主要将应用在高带宽电信传输上,以适应未来电信的发展,PICMG 2.x则仍是目前CPCI的主流,并将在很长时间内主宰CPCI的应用。
PCI夹层卡 PMC(PCI Mezzanine Cards)是 IEEE P1386.1的标准,作为一个IEEE标准,PMC确保了任何符合该标准的主板或者模块能够与其他按照该标准设计的主板或者模块兼容[2]。这样就为用户提供了很大的柔性,用户可以任意组合和搭配不同的主卡和模块。PMC是个开放标准,它为 Multibus II、VME和 Compact PCI带来了前所未有的大量I/O产品和高性能。
本文结合实际的工程项目,设计实现一个基于CPCI总线并符合 PICMG 2.0规范的 6U(233.35 mm×160 mm)通用型PMC载板FTC-C920并开发其在VxWorks 5.5下的驱动软件。
本着简洁和通用的前提,此载板主要由电源模块(Power)、PMC 接口模块 (J11~J14)、CPCI总线接口模块(J1、J4、J5)和 FPGA组成,总体结构如图 1所示。
图1 FTC-C920总体结构示意图
电源模块主要用于给FPGA和用户PMC子卡供电(提供+5 V、+3.3 V、+12 V和-12 V 电源),载板功耗控制在3 W以内 (包括 3 W);CPCI总线接口模块主要用于插入对应的CPCI插槽(背板)与CPCI主控板(系统板)进行通信;PMC接口模块主要用于PMC子卡和载板的连接与通信;FPGA芯片主要用于支持32 bit/33 MHz PCI Slave接口,支持 8K×16 bit双口 RAM,支持双口RAM R端口环回自检(图2中虚线所示),其功能框图如图2所示;JTAG主要用于调试FPGA程序。
PMC 接口的特性为:前两个(“P11”和“P12”)用于32位 PCI信号,第 3个(“P13”)是 64位 PCI信号需要。一个额外的总线连接器(“P14”),可用于非指定的 I/O信号[2]。 本设计中,PMC接口模块采用 4个(J11~J14)PMC(PCI Mezzanine Cards)8 mm高标准连接器,支持用户子卡PMC后出线到CPCI总线接口J4和J5。图1给出了板卡的 CPCI连接器情况,J1用作 32位 PCI,J4和 J5用作后面板I/O,可自定义[1]。
图2 FPGA内部功能框图
从图2中可以清楚地看到,FPGA主要被设计集成了PCI接口模块(PCI Slave IP CORE)和 DPRAM模块。
3.1.1 几种PCI接口设计方案及选择
常见的设计方案有:(1)专用的PCI接口芯片+CPLD;(2)ASIC+CORE;(3)专用的 FPGA+PCI IP CORE(硬核);(4)专用的 FPGA+PCI IP CORE(软核);(5)带PCI接口的 DSP[3]。
几种方案各有利弊,本文结合项目的实际应用需求选择了第4种方案,这个方案满足了系统集成的需求,并可自由添加接口逻辑,降低了成本,减小了设计风险。
3.1.2 具体设计
此模块主要实现33 MHz工作时钟、32 bit总线宽度的PCI接口功能,支持内存空间及配置空间的读写和PCI中断功能。
PCI配置空间分配[4]:Vendor ID(厂商号)1206,Device ID(设备号)0920,BAR0(基地址)映射为 1 MB 内存空间,其中 0x0000~0x3FFF 为 DPRAM 空间,0x4000~0x7FFF为DPRAM环回测试空间,0x8000以后为控制寄存器。
正常情况下 (配合用户 PMC子卡使用时),CPCI通过DPRAM左(L)端口对DPRAM空间进行读写,用户子卡则通过DPRAM右(R)端口对DPRAM空间进行读写;环回测试情况下 (即没有用户PMC子卡的情况下),CPCI可以通过环回测试空间对DPRAM进行读写,即模拟用户子卡对DPRAM空间进行读写。
需要注意的是,0x0000~0x3FFF为 DPRAM 16 KB空间,对应 DPRAM空间大小为 8K×16 bit,而 0x4000~0x7FFF为DPRAM环回测试空间,不是FPGA另外开辟的RAM空间,只是软件通过这个空间地址在环回测试下读写 DPRAM空间(8K×16 bit)。示意图如图 3所示。
PCI控制寄存器的分配如表1所示。
双口RAM模块是FPGA调用内部的IP核实现的,其为数据处理提供缓存功能,总线宽度为16 bit,容量为8 K×16 bit。在没有用户 PMC子卡的情况下,为了验证对数据处理的可用性及准确性,通过FPGA逻辑设计支持双口RAM R端口环回自检,如图 3(b)中虚线所示,即模拟用户子卡对双口RAM进行读写数据的操作。
图3 读写DPRAM
表1 PCI控制寄存器的分配
CPCI和用户PMC子卡通信采用双口RAM方式,双口RAM用户PMC子卡侧总线定义如表2所示。
表2 子卡双口RAM接口信号定义(均为LVTTL电平)
开发此PMC载板Vxworks 5.5下的驱动,硬件选用了Motorola公司的实时主控单板机MCP-750、工控机箱CPX2000 series和此PMC载板 FTC-C920,操作系统则选择了美国风河公司的VxWorks嵌入式实时操作系统,使用普通的PC,在Tornado IDE(集成开发环境)下进行驱动的开发。以良好的可靠性和卓越的实时性著称的VxWorks可以满足系统对于高实时性和高可靠性的要求[5]。
驱动开发软硬件环境简图如图4所示。
图4 驱动开发软硬件环境简图
对驱动程序的设计主要有3个部分:载板自检测试模块、FTC-C920和系统控制器互通测试模块以及CPCI中断测试模块。
载板自检测试主要是载板检测自身器件是否正常工作,功能是否可以实现。
对于Vxworks下PCI设备调试来说,其有专门的函数可供调用,查找FTC-C920载板可以通过调用函数pciFindDevice()来实现,它包含在 pciConfigShow库函数中,此库函数专门用来帮助显示一些PCI设备的信息。此函数可以根据PCI设备给定的供应商标识(VENDOR ID)和设备标识(DEVICE ID)找到相应的设备,并以此返回设备的总线号(busNO)、设备号(deviceNO)和功能号(funcNO)。
根 据 获 得 的 设 备 的 总 线 号 (busNO)、 设 备 号(deviceNO)和功能号(funcNO),通过调用操作系统库函数pciConfigLib中的函数pciConfigInLong和pciConfigInByte访问C920的配置空间,获得设备映射的内存基地址(memBase)和 I/O 基地址(ioBase)以及中断号 irq,分辨对基地址空间是I/O操作还是内存操作,获得的基地址要分别与存储器屏蔽位PCI_MEMBASE_MASK和I/O屏蔽位 PCI_IOBASE_MASK相“与”,才能得到真正板卡的内存基地址和I/O基地址。
互通测试主要是:
(1)系统控制器(MCP-750)读取用户 PMC子卡数据:用户PMC子卡向双口RAM中写入数据,系统控制器(MCP0750)从双口 RAM中读取数据,并验证数据是否正确。
(2)用户 PMC子卡读取系统控制器 (MCP-750)数据:系统控制器(MCP-750)向双口RAM中写入数据;用户PMC子卡从双口RAM中读取数据,并验证数据是否正确。
由于FTC-C920是通用型PMC载板,为了在没有用户PMC子卡的情况下验证互通测试,在FPGA的设计上进行了支持DPRAM R端口环回自检的设计,如图2中虚线所示。
正常情况下 (配合用户PMC子卡使用时),环回测试空间不可使用,此时FPGA内部环回自检控制寄存器的相应位为默认值0。如进行环回自检(没有用户PMC子卡时),需往环回自检控制寄存器的相应位写1,此时,系统控制器可对环回测试空间进行读写。
图5 中断测试程序流程图
CPCI中断测试主要是用户PMC子卡通过写寄存器的方式产生CPCI中断;系统控制器响应中断,读取数据并验证数据是否正确。
在没有用户PMC子卡的情况下,可以通过产生内部中断的方式进行测试,具体的方法是在FPGA中设置中断使能寄存器,中断测试寄存器,中断状态寄存器和清中断寄存器。程序流程图如图5所示。
本文详细描述了某项目中PMC载板FTC-C920的设计方法及其在VxWorks操作系统下驱动程序的开发流程。在没有用户PMC子卡的情况下,通过环回测试空间的设计,解决了互通测试的要求,通过中断测试寄存器的设计,解决了中断测试的要求。调试结果表明,此PMC载板在VxWorks 5.5下可以稳定地运行。本文的设计方法具有一定的通用性,可为相关工程技术人员提供可以参考的设计经验。
[1]PICMG.PICMG2.0 Rev.3.0.PICMG2.0 D3.0 Compact PCI Specification[S].
[2]IEEE.IEEE P1386.1.Draft Standard Physical and Environmental Layers for PCI Mezzanine Cards:PMC[S].
[3]郑毅.基于 PMC(PCI背卡)接口的实时数据采集卡[D].成都:电子科技大学,2003.
[4]李贵山,陈金鹏.PCI局部总线及其应用[M].西安:西安电子科技大学出版社,2003.
[5]唐晓平,何峰,梁甸农.基于 VxWorks的 PCI总线驱动设计[J].嵌入式操作系统应用,2008,11(2):79-81.