基于PC104(Plus)总线的数据接收存储显示系统设计
扫描二维码
随时随地手机看文章
摘要:提出了一种双通道大容量数据接收存储显示系统的实现方案。阐述了以PLX9054为核心、以异步FIFO为数据缓冲通道的PC104(Plus)接口电路的设计方法,同时给出了FPGA控制逻辑设计与Linux系统下基于Qt/Embedded和Framebuffer工控机存储显示程序的实现方法。
关键词:PC104(Plus);Qt/Embedded;Framebuffer;实时存储;同步显示;工控机
0 引言
在现代数字信号处理领域,对于大容量高速数据的存储和显示是进行后续相关处理的基础,也是信息处理系统的关键组成部分。随着数字视频视觉技术和视频采集技术的发展,很多应用场合都需要对接收到的模拟数据进行模数转换,然后再进行数据的实时存储和同步显示。为此,本文介绍了对模数转换后的数字信号所进行的处理,提出了一种基于PC104 (Plus)总线的双通道大容量高速数据的接收、存储和显示系统的设计方法。该系统通过FPGA-PC104(Plus)接口对数据进行接收和预处理,再通过FIFO数据传输通道来上传数据,最后由工控机的软件来实现数据的实时存储和同步显示。其中工控机软件采用Linux(2.6内核)下Qt/Embedded的GUI来设计,并用Framebuffer的显示技术来提供良好的人机界面交互和快速的存储显示操作。
1 系统结构
本系统由数据接收模块、FPGA控制模块和工控机显示存储模块组成,其系统结构如图1所示。图中的FPGA选用Xilinx Spartan3系列的XC3S2000F456,其最大用户IO为333个,系统门达到200万门,并内置576KB的RAM块;FIFO选用IDT公司的IDT72V36110,该芯片容量为512KB,可支持36位输入、输出数据,最高工作频率可达166MHz;另外,PLX9054是PLX公司的总线桥接芯片,它支持多种工作模式,本系统采用C模式。在该模式下的DMA传输时,PLX9054对PC104(Plus)总线和本地总线都是主控制器;工控机选用Senbo公司的LX-3072PC/104 CPU模块,该模块搭载的AMD Geode LX800 CPU,其工作频率高达500MHz,遵从PC/104+标准,并提供有PC104(Plus)总线,同时集成了PS/2、RT、IDE、USB2.0和10M/100M网口等接口,而且功耗低,可靠性高,可广泛适用于数据采集、通信等领域。为了保证系统的实时性和稳定性,本工控机上运行的是Linux操作系统。
数据接收模块的两路输入通道分别连向FPGA的IO端口,在FPGA模块的控制下,两路输入数据同时分别进入各自的FIFO进行缓存。为了避免PLX9054控制本地端时的总线竞争以及简化时序设计,可将两片FIFO的输出端复用,且经由FPGA的IO端口连向PLX9054的本地数据端,进而在FIFO产生相应状态响应的时候,由FPGA控制模块向PLX9054发出读取FIFO的中断请求,PLX9054在响应中断后,即将数据以DMA的方式经由PC104(Plus)总线上传至上位机,上位机通过PCI驱动读取DMA传输的数据,然后进行数据分析,再分别进行存储和显示。
2 系统设计
2.1 数据接收模块设计
本系统中的数据接收模块采用J18型37针视频通信接口,该接口协议可根据实际需求自行定义,但最大为32位。由于输入数据为高速数字信号,因此,为防止输入FPGA的信号产生过冲,可在视频通信接口的后端对32位数据分别进行RC端接,并串联33Ω的电阻和0.01μF的电容。
2.2 FPGA控制模块设计
本系统的数据传送采用DMA结合中断的方式。该方式不仅能保证数据传输的速率,而且能提高系统的工作效率。接收高速数据时,要使用缓冲区对数据进行缓存,但是,如果等缓冲区全部存满以后再进行DMA传输,那么,在数据流速率比较高的时候,就会造成数据的丢失。因此,在FIFO半满时就必须进行数据的DMA传输,这样可使工控机从FIFO读取数据和FPGA从外部接收数据能同时进行。
FPGA控制模块是本系统的硬件核心,其主要功能是完成系统复位,接收数据进行缓存,控制读取两个FIFO数据的逻辑顺序,并控制DMA传输。FPGA控制模块电路如图2所示。
在图2电路中,为了保证FPGA与FIFO同步工作,应将两片FIFO的各自读写时钟连接在一起,且分别由FPGA输入到时钟驱动芯片以后获得。
为了满足PLX9054上电启动速度的要求,其时钟应由晶振直接提供。
系统上电后,PLX9054NFPGA发出复位命令,同时由FPGA对FIFO进行复位,并完成对FIFO的初始化,以使其处于工作状态。在FP-GA接收数据时,存储数据通道和显示数据通道的数据同时进入FPGA,为了使工控机软件能够区分两路数据,可在FPGA内部根据数据同步信号分别对两路数据加上帧头,然后同时写入FIFO1的D1[0…31]和FIFO2的D2[0…31]。数据半满后,FPGA要根据两片FIFO的半满信号和对其进行读取控制。FIFO的读取控制主要由实现。在实际应用中,存储数据一般要求能够优先上传,且数据连续,而对同步显示的要求相对较低,显示数据的速率也较低,只要能够满足显示刷新率的要求即可,因此,本设计中存储数据缓冲区FIFO1的半满信号的优先级高于。具体实现方法是对进行逻辑运算,图3所示是其运算逻辑图。
运算后可得到化简结果,然后令;之后再在FPGA内部将、做与运算,可得到,然后判断,若为低,则FPGA向PLX9054发出中断。这样就能保证两片FIFO的数据根据优先级不断向上发送。
PLX9054响应中断后,即可通过LHOLD申请对本地总线进行控制,FPGA则通过LHOLDA作出应答,进而由PLX9054获得本地总线控制权并启动DMA传输周期。FPGA收到读信号和地址选通信号后,产生信号,并在最后一个数据传送信号有效之前一直保持有效。在此期间,FPGA将根据图3所示的运算逻辑结果,并按照优先级读取相应FIFO的数据进行上传。具体的控制及数据传输时序如图4所示。
由图4可见,当同时有效时,其FIFO1的优先级高于FIFO2,故可满足设计要求。
2.3 工控机显示存储模块设计
本系统利用PLX9054和Linux的DMA技术来实现大量数据的高速传输,同时使用Qt/Ernbedded进行人机界面设计和Framebuffer的帧缓冲显示,以对视频数据进行存储和显示控制。整个软件的功能图如图5所示。
PLX9054的PCI设备驱动是DMA传输的关键,驱动程序利用PLX9054芯片的DMA功能可将FPGA控制模块中的数据快速传输到Linux操作系统的内核内存中。要实现对PLX9054的DMA操作并设置DMA控制寄存器,设备驱动程序需要做两件事:一是检测PCI设备并初始化:二是建立DMA操作环境。在Linux2.6内核中,PCI设备检测和初始化可通过专门的注册函数pci_regis-ter-driver来实现。内核根据pci_device_id结构中的预设ID来对pci_devices链表进行搜索,一旦找到目标PCI设备,pci_register_driver函数将调用设备探测函数(probe)并向该函数传递该设备的pci_dev变量,然后由设备探测函数完成对设备的初始化。建立DMA操作环境的工作包括DMA缓冲区的分配和中断处理。本系统使用流式DMA映射(dma_map_single())来申请适当大小的DMA缓冲区。当一个缓冲区被流式映射后,只有将其unmap除掉以后,驱动程序才能安全地访问里面的数据内容,并通过request_irq函数实现中断处理程序的注册。这里有两个问题需要注意:一是PCI设备注册中断时,必须使用共享中断方式,并应在中断处理程序中增加对中断源的检查;二是PLX9054的中断信号一旦产生就一直有效,它必须通过代码清除中断。
本系统采用Qt/Embedded(4.5)进行GUI设计,以便为系统用户提供一个高性能、高可靠的GUl支持。Qt/Embedded是著名的Qt库开发商Trolltech公司开发的、面向嵌入式系统的Qt版本,许多基于Qt的X Window程序都可以非常方便地移植到Qt/Embedded上,而且与X11版本的Qt在最大程度上接口兼容,因而延续了在XWindow上的强大功能,并在底层彻底摒弃了X lib,而仅采用Framebuffer作为底层图形接口。同时,使用Qt的多线程设计则使人机交互、视频显示和数据存储能够同时进行。
本系统采用Framebuffer帧缓冲技术来实现视频数据的快速显示。Framebuffer机制模仿的是显卡的功能,它将显卡硬件结构抽象掉,可通过Framebuffer的读写直接对显存进行操作。内核编译时可选上对Framebuffer的支持。进入Framebuffer可以在系统启动时向内核传送vga= modenumber的参数来激活Framebuffer设备(如:vga=791)。Framebuffer的设备文件一般是/dev/fb0、/dev/fb1等。
在应用程序中,一般可将Framebuffer设备映射到进程地址空间的方式使用,比如利用下面的程序就可以打开/dev/fb0设备,并通过mmap系统调用进行地址映射,随后用memset将屏幕清空(这里假设显示模式是1024x768-32位色模式和线性内存模式):
在子函数initFb中,对映射过的内存地址(即显存)再进行分行映射,即把原来的一维线性地址转换为二维线性空间,这样,映射后的fbp[x][y]就可以在屏幕上表示水平位置为y、垂直位置为x的像素。
利用该映射能够对显示区域中的某一行进行操作,也可以对显示数据包的每一帧进行行分析,进而对每一行进行控制和显示。这样既可保证显示的灵活性,又具有良好的显示速度。
3 结束语
本文给出了一种基于FPGA控制逻辑的高速数据接收存储显示系统的硬件设计方案,同时详细介绍了Linux系统下基于Qt/Embedded和Fr-amebuffer的工控机存储显示程序的实现方法。