找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

[嵌入式/ARM] 基于PCI总线的高速CCD图像存储系统设计

[复制链接]
admin 发表于 2013-3-25 08:26:22 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
1 引言
   侦察与监视在军事斗争中的地位举足轻重。在各种侦察/监视技术中,航空侦察占有重要的地位,可见光侦察是一种重要的侦察形式,无人侦察机显示出了广阔的发展前景,现代科学技术的发展为现代航空侦察与监视技术带来了新的发展契机。
   航空侦察一个主要的途径就是利用高性能高速摄像机进行航空拍照,采集各种图像信息。然而,数字化的侦察图像分辨率高、信息量大,使后续的处理、传输、存储等过程的实现变得极为困难,从而给机载图像/视频系统的设计与实现带来了巨大的挑战。为了解决这些问题,本文基于某型高速相机,利用低成本FPGA,构建了一个高性能的图像采集存储系统,完成对高分辨率、高帧率侦察图像的采集和存储。
   2 某型高速相机简介[1]
   系统选择的高速相机是一款高分辨率、高速度线扫数字相机,其图像传感器采用先进的CCD(Charge-Coupled Device)图像传感器,采用了世界尖端水平的高灵敏度扫描成像技术--高速率的TDI(Time Delay and Integration)技术、多重曝光技术并加强蓝色响应,从而使该型相机可提供比单输出线扫相机更好的灵敏度特性,总的数据传输率可高达200MB/s。
   相机接口主要包括后面板上的六个接口:其中四个为数据输出接口,每个接口包括16位数据信号,1位数据同步信号,1位同步时钟信号,信号的电平输出格式为LVDS电平格式;另外两个接口分别为控制信号接口和电源接口。在控制信号的作用下,相机同步输出包含同步时钟信号(STROBE)和水平同步信号(LVAL)在内的 8×8bit标准的灰度图像数据,图像分辨率可选择为4096×30'72(本系统采用分辨率)和2048×3072。
   相机控制接口信号中,行触发信号(EXSYNC)至关重要。它负责图像数据的触发输出,行触发信号的上升沿触发数据并指示数据有效。相机触发要求此信号存在下降沿,最小触发频率为300HZ。
   3  系统硬件设计及工作原理
   本设计硬件系统主要包括电平转换,数据接收预处理和数据采集存储三个部分。图1为系统硬件原理框图。在总线结构上,系统采用了满足高速数据传输的PCI总线结构,PCI9054是PLX公司推出的一种32位33MHz的PCI总线主控I/O加速器,它采用多种先进技术,使复杂的PCI接口应用设计变得相对简单。
   从资源和成本方面考虑,FPGA选用Altera公司的低成本Cyclone系列芯片-EP1C6Q240C8。存储介质则选用SCSI磁盘阵列,它能满足高速、大数据量的存储。
20121107050245464322491.jpg
   图1 系统原理框图
  
系统工作原理:
   系统上电,首先完成一系列初始化工作:PC通过底层驱动配置PCI9054的寄存器,使之处于正常工作模式(C模式)[2]; FPGA上电,配置用户电路(此时,FPGA内部逻辑和PCI9054都处于等待状态)。
   PC应用程序启动后,向PCI9054发送数据传输指令,PCI9054收到数据传输指令,通过LOCAL BUS通知FPGA开始工作:FPGA产生行触发信号(EXSYNC),触发相机进行拍照、传输数据。然后,PCI9054进入工作状态,开始采集数据,并将数据存储到磁盘阵列。FPGA内部逻辑和PC应用程序通过行计数判断一帧图像传输完毕,相继进入等待状态。但是,PC应用程序在接收完一帧图像,进入等待状态后,延续一定时间,会自动触发下一个数据传输指令通知FPGA开始下一帧图像传输。
   3.1电平格式转换
   PCI9054芯片电平格式为3.3V LVTTL格式,相机输出信号的电平格式为LVDS格式,基于系统总体需要,有必要在进行图像预处理前将LVDS相机输出信号转换成LVTTL格式电平。
   3.2数据接收预处理
   FPGA完成图像预处理功能。FPGA是以并行运算为主导的芯片,处理速度更快。数据预处理过程包括:数据缓冲、位并转换。
   数据缓冲[3]:相机利用4个通道输出图像数据,每个端口的数据传输以本端口时钟为参考,传输过程中由于各种差异如传输电缆的长度不同,使得各个端口的时钟信号产生相对的相位漂移,从而使四个端口数据输出不完全同步,这不利于图像数据的同步采集。为消除数据异步,FPGA内部设计了由4个FIFO组成的数据缓冲器组。每个端口的有效数据宽度为16bit,传送一行4096个数据需用512个时钟周期,因此FIFO深度设为512个字。相机送来的4个LVAL信号为各对应通道写使能信号, 4个STROBE信号作为对应通道写时钟。FIFO输出端采用系统时钟(15MHz)作为统一的数据同步时钟,并设计一个读请求信号,当FIFO半满时读取数据,经过缓存的数据以与系统时钟同步的64bit宽度格式输出。
   位并转换:PCI9054芯片LOCAL端的有效数据位数有两种选择:8bit和32bit(可更改9054寄存器设置,为了保证数据采集速度,本系统设置为32bit)。但是相机的输出数据通过缓冲之后仍然为64bit,为了满足PCI9054数据采集位数要求,必须将64bit数据进行位并转换,变成32bit传输。本系
   统设计在FPGA内部将数据的高32bit和低32bit分别送入二选一BUSMUX的输入端,系统时钟的电平选
   择数据输出。64bit数据转化成32bit数据传输,但数据率变成原来的两倍(30M/s)。
   3.3 数据采集存储
   对于整个系统来说,存储系统的持续存储速度是个至关重要的参数。数据的采集存储采用微机为主体,在其PCI总线上挂载一块SCSI的接口卡和9054接口卡,9054接口卡用于数据采集,SCSI接口卡上挂载两个SCSI硬盘,组成RAID-0的硬盘阵列,这样可以大大提高硬盘的持续存储速度。利用PCI9054进行数据采集时,数据的传输路径为:PCI总线-内存-硬盘阵列。现有两种传输方案可供选择:第一种为单线采集存储,显然,这种方案会降低数据的的采集速度。本系统选用第二种方案:流水线存储,如图2所示。理论上,流水线方式的数据采集速度应该是单线采集的两倍。
20121107050245495572492.jpg
   图2 流水线存储时序示意图
  
4 部分软硬件程序设计
   3.4   PCI9054 Local Bus 硬件驱动
   PCI9054局部总线是外设(FPGA)和9054之间通信的桥梁。9054图像数据的采集需要使9054局部总线信号满足一定的时序要求,保证数据传输的同步,即需要FPGA端硬件驱动。驱动是用Verilog HDL代码编写的一个状态机,代码如下[2][4]:
   always @ (posedge CLK)
   begin
     casex (CurrentState)
      1'b0: begin
                         if (!LLADS_)
                         begin       LLREADY <= 1;    CurrentState <= 1;         end
                         else begin       LLREADY <= 0;    end
               end
      1'b1: begin
                         if (LLBLAST_)      //突发循环重复
                         begin       LLREADY <= 1;    CurrentState <= 1;         end
                         else                //最后一个循环
                         begin       LLREADY <= 0;    CurrentState <= 0;         end
                 end
           default:
                  CurrentState <= 0;
           Endcase         end
   assign LLREADY_ = (LLREADY) ? 1'b0 : 1'b1;
   4.2  PCI9054驱动层和应用层设计
   系统所用PCI采集卡非windows标准硬件,驱动程序需要自行开发,这里使用WDM编程。为了提高速度采用双线程操作。由于写磁盘比较慢,如果等写完磁盘再读local bus显然效率太低,所以启动双线程双buffer读写数据[5]。
   部分程序代码:
   BOOL GetData()
   { ……
   //创建等待驱动中断线程以及写文件线程
   hEvent_Disk=GreateEvent(NULL,TRUE,TRUE,NULL);  hEvent_Mem = CreateEvent(NULL,TRUE,FALSE,NULL);
   _beginthread(WaitForDataThread,0,NULL);                   _beginthread(WriteDiskThread,0,NULL);
   //启动DMA传输
   SetDma();   BlockDmaLocalToPci(dmabuffer, BLOCK_ONE_DMA);
   }
   void WaitForDataThread(void * pParam)
   {}
   void WriteDiskThread(void * pParam)
   {}
   4.3 数据传输指令生成
   PC应用程序产生数据传输指令,触发数据传输。指令的产生是通过9054在PC端的底层驱动,设置9054 LOCAL端USERO管脚电平,使FPGA进入工作状态,并产生相机行触发信号(EXSYNC),触发相机拍照传输数据。USERO信号为高电平时,FPGA和9054都处于等待状态;USERO下降沿触发数据传输,使FPGA和9054进入工作状态;数据传输完毕,USERO拉高。时序如图3。
20121107050245526822493.jpg
   5系统测试及工程考虑
   本系统测试微机环境为:CPU,Pentium(R) 4. 2.40GHz;内存,333MHz,512MB/s;北桥芯片,845PE;操作系统,Windows Server 2003;SCSI硬盘空间,120G。
   系统测试结果:图像单线稳定存储速率为37.2 MB/s ,流水线稳定存储速率为71.2MB/s;持续记录时间为25分钟。
   工程考虑:系统速度主要限制于两个瓶颈,一是硬盘本身,二是PCI总线。本系统虽然采用了高速硬盘,但还有一个操作效率的问题。数据从FPGA到PCI9054的传输介质采用一般硬盘线,此类硬盘线的上限频率为33M,限制数据采集速度;同时由于系统需要通过PCI总线转移数据,而计算机的PCI总线多为32位、33MHz的总线,这个总线的理论数据为132MB/s,当总线上仅仅有一个设备时,实测实际总线持续传输速率在100MB/s以下,当总线上再挂载磁盘适配器时,总线的数据传输速率会更低。系统稳定性主要取决于FPGA内部逻辑的容错性和微机的稳定性。在高速存储的环境下,微机系统容易死机,因此微机选择具有高稳定性的Windows Server 2003操作系统作为图像采集的存储环境。
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-27 01:47 , Processed in 0.056903 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表