- 09/06
- 2006
-
QQ扫一扫
-
Vision小助手
(CMVU)
摘要:本文介绍了基于 CompactPCI总线采集卡的系统设计原理,对总线接口的硬件设计进行了讨论,提出并介绍了热插拔技术在图像采集卡上的软、硬件应用。
关键词:CompactPCI总线;PLX9030;热插拔;图像采集
引言
舰载导弹武器系统的作战是一套复杂的程序,这个程序一旦被中止,导弹便无法作战。具有图像跟踪的制导系统要求作战过程中不间断地工作,采集到连续可靠的图像,以完成对导弹的制导。
ompactPCI总线是基于PCI总线规程的一个高性能总线标准,它的欧规卡结构和对热插拔的支持特别适用于对稳定性、可靠性要求很高的系统。本文作者在进行图像跟踪制导系统的热维修研究时,提出了基于CompactPCI总线的图像采集卡设计思路,应用CompactPCI 总线技术并且很好地解决了对热插拔的软硬件支持,使系统具有带电更换故障插板的能力。
1 系统设计原理
系统由PCI接口芯片PLX9030 、CPLD、SRAM存储器、热插拔电源控制芯片LTC1646、图像传感器和图像预处理电路组成,结构如图一所示。
外界图像经过图像传感器,图像预处理电路,然后将处理过的模拟图像信号经过A/D模数转换器转换成数字信号,即帧同步信号FSYNC,行同步信号LSYNC,12b数据信号D[11..0]。由于本文重点介绍图像采集卡功能部分(即图像采集和总线接口),图像传感器到A/D部分不做详细介绍。
CPLD选择LATTICE公司的可编程逻辑器件ISP2128,它和两片CPRESS公司的256k*16bit的SRAMCY7C1041B组成双缓冲单元。尽管PLX9030接口芯片提供了FIFO机制,但其深度只有几十个字节,无法满足大量数据流高速缓冲这样的要求,为此,在采集卡上添加了专门的存储器。为了满足数据的不间断高速缓冲和采集,通常采用交叉存储的双缓冲技术,以避免单缓冲情况下,数据来不及取走而造成图像丢失。因为PCI总线可以映射不同的多个存储空间,所以这种双缓冲结构可以使用相同的地址,也可以单独编址。
两片SARM的地址信号由BSYNC位同步信号通过一个计数器产生,计数器通过多路开关在选择信号控制下产生SRAM A和SRAM B的地址SA[17..0]。两片SRAM的数据信号与CPLD中的两组双向三态缓冲器相连,三态缓冲器的另一输出端通过一个MUX12多路开关与PLX9030的数据总线相连。选择信号是由FSYNC帧同步信号通过一个二分频器产生的等脉冲信号,是三态缓冲器的使能端。由于整个系统是先将图像数据存储到2片SRAM中,然后在将2片SRAM中的数据信号通过PLX9030传到PCI总线,所以SRAM的写信号由BSYNC位同步信号产生,读信号由RD产生,见图二。
2 CompactPCI总线接口模块
综合考虑板卡的设计功能和设计成本我们选择了PLX9030芯片作为设计CompactPCI的接口芯片,选择LTC1646作为CompactPCI热插拔电源管理器。
2.1 CompactPCI总线接口设计
接口设计主要由三分组成:一是PLX9030与CompactPCI总线的接口控制逻辑;二是与串行EEPROM配置存储器的接口控制逻辑;三热插拔控制功能设计。
PLX9030接口控制芯片把CompactPCI总线和局部总线连接起来,所有接口信号做在芯片内部,控制由CPLD完成原理比较简单。
CompactPCI总线的热插拔控制功能设计和串行EEPROM配置存储器的接口控制逻辑是设计的重点。
CompactPCI总线接口芯片PLX9030是业界首个支持热交换的PCI接口芯片。它采用SMARTarget技术,可以支持具有热插拔功能的PICMG2.1目标设备,PCIv2.2电源管理,PCIv2.2VPD支持,兼容3.3V和5V 的PCI总线信号。另外,PLX9030内含预充电BIOS、早期电源支持、热交换控制/状态寄存器HS_CSR和附加引脚资源,可利用这些资源以及ENUM#输出信号、微型弹出开关和表示用户插入/取出状态的LED灯实现板卡的带电热插拔的软硬件控制。
LINEAR公司的CompatPCI总线热插拔电源控制芯片LTC1646允许系统运行过程中插拔 CompactPCI 卡。LTC1646为不使用系统提供的12V 供电的应用,直接控制3.3V和5V的供电。它还提供I/O引脚的加电前偏置电压,并且将PCI_RST信号与HEALTHY信号逻辑地组合,生成LOCAL_PCI_RST信号。
PLX9030芯片有BD_SEL输入信号引脚、ENUM# 输出信号引脚、CPCISW输入信号引脚和LEDON#输出信号引脚,均用作为CompactPCI接口热插拔控制信号。其功能如下:
PLX9030的BD_SEL#输入信号引脚在采集卡插入背板后与背板的引脚BD_SEL#相连,背板上BD_SEL#是最短的引脚,BD_SEL#信号为高电平时,指示采集卡在插入或拔出过程中,使PLX9030输出引脚成高阻态,保护芯片。PCI卡上有一个微型开关,它的状态由操作者改变,为了消抖,开关的状态在1ms的时间间隔内采样6次,此开关的状态触发PLX9030的CICPSW信号,并改变ENUM#输出信号。PLX9030的ENUM#信号是送到背板的带上拉的集电极开路信号,它通知背板主机CPU板卡是刚刚插入,还是即将拔出。并通知CPU系统配置改变,使CPU同时执行相关必要的软件操作。板卡的插入/拔出状态是由CPCISW信号送到PLX9030完成的,这时,PLX9030通过ENUM#信号通知背板主机硬件配置改变情况,同时主机CPU执行相关必要的软件操作。当操作结束时,主机CPU通过PLX9030将CPCISW信号写入HS _CSR寄存器的相应位中,使LEDON#信号变化,点亮或熄灭蓝灯,通知板卡可安全取出或已安全插入。另外,PLX9030将板卡插入/拔出的状态(CPCISW信号)写入HS_CSR寄存器的相应位中,软件可以通过这些位来查询板卡插入/拔出状态,使软件可采取各种切换措施,也可以通过向寄存器的相应位写1来清除该位。
热插拔电源电路采用了芯片LTC1646作为 CompactPCI 热插拔电源管理器。它能够使线路板在运行中的CompactPCI总线插槽内安全地插入和拔出。两个外部N沟道通路晶体管 IRF7413控制3.3V和5V电压,具有电源过流保护功能。插件板插入正在工作CompactPCI总线上时,电源稳定电容将从CompactPCI总线吸引强大的瞬间电流充电,这个瞬间电流可以危害连接器的引出端,导致系统总线上的其它插件板复位或系统工作出现瞬间异常状态。LTC1646芯片具有电源延时开关能力,保证插件在系统中的安全插入或拔出,同时这种芯片也保护系统电源,保证系统的正常工作。
2.2 配置寄存器
PCI规范中规定PCI设备必须实现一定数目的配置寄存器,以提供必要的配置信息,控制读写FIFO,协调PCI总线和局部总线。PLX9030提供了两个配置空间的配置寄存器:(1)PCI配置空间:PCI标准规定的配置空间。 (2)局部配置空间:PLX9030芯片提供的扩展配置空间,通过PCI存储访问或IO访问进行配置。在驱动程序中,将此配置空间映射为PCI的存储访问空间。在配置板卡时,要首先设置PCI配置空间中的相应寄存器,然后才能设置局部配置空间寄存器,因为在PCI配置空间寄存器设置好之前,无法将PCI的存储访问空间正确地映射到PLX9030的局部配置空间。PLX9030提供了与串行EEPROM管脚一一对应配置板卡时,主要配置了以下一些寄存器(详见参考文献1):
•PCIBAR0(PCI配置空间 0x10,32位):PCI的基地址0,PLX9030定义为用于访问局部配置空间的存储访问空间基地址。
•PCICR(PCI配置空间 0x4,16位):PCI命令,需要把bit1置1,以允许存储空间访问。
•HS_CSR(PCI配置空间0x4A,16位):热切换控制/状态寄存器。用于读取板卡插入/拔出状态,以及控制蓝色LED。
•LAS0RR(局部配置空间 0x0,32位):指定局部内存空间0的范围,设置为0x0fff0000(64KB)。PLX9030的局部内存空间0即驱动程序的局部内存空间,硬件设计为访问双口RAM。
•LAS0BRD(局部配置空间 0x28,32位):设定局部内存空间0的总线特性,如burst、总线宽度等。
•CNTRL(局部配置空间 0x50,32位):控制。设置为0x00780000(缺省)。
•GPIOC(局部配置空间 0x54,32位):通用输入输出端口控制。
配置数据预先烧入EEPROM中,PLX9030的配置寄存器由PCI总线的RST#信号复位,并给出响应信号RETRY,输出局部复位信号LREST#,检查串行EEPROM是否存在。如安装了EEPROM,PLX9030开始读串行EEPROM,若读出的第一个字不是FFFFH,则将EEPROM中的数据装入PLX9030的配置寄存器,否则使用缺省值。PLX9030对应的串行EEPROM容量要大于2K bit,并且需要有地址自增功能,本设计中选用了93LC66。
3 驱动程序设计
根据本卡的应用环境,我们开发了Linux操作系统下的驱动程序(具体的图像识别跟踪处理的方法本文不讨论)。驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。Linux的驱动程序大致可以分为如下几个部分:驱动程序的注册与注销;公共内存缓冲区的分配;设备的打开与释放;设备的控制操作;设备的中断处理,详见参考文献3。针对CompactPCI总线的特点,我们进行了如下设计。
Linux下PCI驱动程序可以向内核注册一个 pci_driver对象,该对象记录了驱动的名字、设备ID列表、以及设备插入或拔出后驱动程序的处理函数等,其定义如下:
struct pci_driver{
struct list_head node;
char *name; /*驱动的名字*/
const struct pci_device_id *id_table;
int(*probe) (struct pci_dev dev, const struct pci_device_id *id); /*一个探测函数的指针,用来探测与ID表中匹配的设备*/
void(*remove) (struct pci_dev *dev); /*设备卸掉时调用*/
int(*save_state) (struct pci_dev *dev, u32 state); /*在挂起前存储设备状态*/
int(*suspend) (struct pci_dev *dev, u32 state); /*把设备置于挂起状态*/
int(* resume) (struct pci_dev *dev); /*唤醒设备*/
int(*enable_wake) (struct pci_dev *dev, u32 state, int enable); /*产生唤醒事件*/
};
其中变量id_table指向驱动程序感兴趣的设备的ID列表,如果设为NULL则感兴趣的设备是系统识别的所有设备。probe指向的函数对插入的设备进行检查,并创建一个设备对象加入到驱动的设备链表中。remove指向的函数在拔出设备的时候被调用,它释放为设备分配的所有内存、端口、中断等资源,并将驱动设备链表中的相应节点删除。系统首先根据device_id查找所有槽位,若发现该位有采集卡,则对其进行初始化配置,打开时钟中断,注册设备号。当上述工作完成后,板卡就进入正常工作状态。读图像信息由应用程序完成,板上空间已经映射到内存空间,只要对内存空间的相应地址读写即可完成对板卡的读写操作。
在热插拔系统中,插入或拔出设备时,相应的设备节点会在/dev下出现或消失。传统方式下注册设备使用的函数是register_blkdev和register_chrdev,热插拔系统使用设备文件系统devfs,相应的函数是devfs_register_chrdev和devfs_register_blkdev。它们实际上是对前两者的封装,返回的是主设备号。devfs_register主要用来为每个设备在指定的目录下创建设备节点,由于热插拔需要在每次插入一个设备的时候创建一个设备节点,因此应该在probe函数中调用此函数。反之,应在remove函数中调用devfs_unregister注销设备节点。
4 结论
此图像采集卡采集速度快,性能好,并且支持热插拔。热插拔技术早已引起了人们的注意,国内外的一些部门和行业,都在大力研究它,并取得了不少成果,得到了大量成功应用,甚至在某些部门,热插拔成了产品一种强制性指标。电视跟踪制导系统的热维修技术能保证导弹制导程序不中断,对导弹作战有着极其重要意义。基于CompactPCI总线的图像采集卡设计对舰载武器系统的随动坐标采集系统也有参考价值。
参考文献
[1] PCI9030 Data Book . PLX INC,2000.
[2] [美]Tom Shanley Don Anderson F. PCI系统结构(第四版)[M]. 刘晖 译. 北京:电子工业出版社,2000.
[3] 刘峥嵘,张智超等. 嵌入式Linux应用开发详解[M]. 北京:机械工业出版社,2004.
[4] 李坡等. 一种基于CPCI总线的红外图像采集卡[J]. 现代电子技术,2004,23.
基金项目:军队研究项目,海军[2004]装计字119号 (如果需要可提供相关证明)