文献标识码: A
DOI:10.16157/j.issn.0258-7998.2016.06.017
中文引用格式: 周敬东,沈飘海,王雷. 基于FPGA的线阵CCD图像采集与显示系统设计[J].电子技术应用,2016,42(6):63-66.
英文引用格式: Zhou Jingdong,Shen Piaohai,Wang Lei. Design of linear CCD image acquisition and display system based on FPGA[J].Application of Electronic Technique,2016,42(6):63-66.
0 引言
伴随着半导体制造工艺的进步,现场可编程门阵列(Field Programmable Gate Array,FPGA)器件的设计技术也取得飞跃性的发展[1]。凭借日益丰富的片内资源以及固有的并行处理能力,FPGA的应用范围已经超出通信行业,逐渐扩大到数字信号处理、硬件加速[2-4]、汽车电子等领域。色选机通过对被测物体的图像进行处理,判断被测物体是否符合要求,实现筛选[5],其电子系统涉及图像采集、信号处理、图像显示、串口通信等。FPGA可实现上述功能。与常见的FPGA+ARM/DSP+PC方案相比,在FPGA内实现图像采集、处理与显示可简化色选机系统结构,提高经济性。本设计搭建了实现图像采集、图像处理与图像显示的完整的硬件平台,完成了图像采集与图像显示的逻辑设计,并预留了充裕的FPGA片内资源,留作图像处理模块使用,具有较高的实用性。
1 系统设计
如图1所示,本系统由图像采集子系统与图像显示子系统组成。图1中大虚线框内的各模块均为FPGA内部逻辑设计模块,细箭头表示控制信号流向,空心粗箭头表示图像信号流向。采集子系统包括RS232通信芯片、总线缓冲器、线阵电荷耦合器件(Charge Coupled Device,CCD)传感器、CCD缓冲放大器、CCD模数转换器、双口随机存取存储器(Random-Access Memory,RAM)模块和图像采集模块。显示子系统包括同步动态随机存储器(Synchronous Dynamic Random Access Memory,SDRAM)、视频解码芯片、视频图形阵列(Video Graphics Array,VGA)监视器、图像缓存模块和图像显示模块。顶层控制模块统一控制图像信号的采集、缓存与显示。下文分别就两个子系统进行阐述。
1.1 图像采集子系统设计
图1中,CCD采用东芝公司生产的TCD2566BFG彩色线阵图像传感器。该型传感器灵敏度高,暗电流小,采用两相5 V时钟脉冲驱动,含有3行彩色光电二极管阵列与1行黑白光电二极管阵列,每行阵列中光电二极管数量为5 340个[6]。FPGA采用Altera公司生产的Cyclone III型EP3C5E144C8芯片。该芯片内含5 136个LE、46个M9K Block、23个乘法器,以及414K片内RAM[7]。串口通信芯片为MAXIM公司生产的MAX3232。
图像采集模块完成采集子系统的核心功能——驱动CCD传感器。该模块接收外界指令,配置CCD行频及每英寸点数(Dots Per Inch,DPI),产生CCD时钟脉冲与控制信号。模块由驱动子模块、单口RAM子模块以及RS232子模块构成。驱动CCD传感器前,应先在驱动子模块内设置好CCD的行频与DPI。设置过程如下:单口RAM加载.mif文件进行初始化,在不同的地址预存不同的配置信息。用户根据实际需要,通过RS232子模块,向单口RAM子模块发送不同的读取地址。读取出的不同配置信息传输至驱动子模块,驱动子模块据此向CCD传感器发送不同频率的时钟脉冲,达到改变行频与DPI的目的。参照CCD技术手册,驱动子模块还产生CCD传感器所需的控制信号,经过总线缓冲器传输给CCD传感器,实现驱动。驱动TCD2566BFG需要10路信号,如图2所示。
图2中,SW1为彩色模式与黑白模式选择信号;SW2为时间延迟积分(Time Delay Integration,TDI)功能选择信号;SCG为存储清除栅(Storage Clear Gate)脉冲信号;SH为转移栅(Shift Gate)脉冲信号,其为高电平时,转移栅下势阱允许MOS电容中的信号电荷包转移到模拟移位寄存器中,为低电平时,二极管进入光积分状态[8]。时钟Φ1A与Φ2A为三行彩色光电二极管阵列的驱动时钟,频率均为35 MHz,相位差为180°。时钟Φ1B与Φ2B为一行黑白光电二极管阵列的驱动时钟,CCD工作在彩色模式时维持低电平。Φ1A、SCG、SH、RS、CP可利用计数器产生其波形。对Φ1A取反可得Φ2A。复位信号RS与电平钳制信号CP的占空比为1:8。关键源代码如下(pixel_counter为140 MHz时钟下的18位计数器):
always @ ( posedge clk_140m)
begin if (pixel_counter == 18’d0) scg <= 1'b1;
else if (pixel_counter == 18’d424) scg <= 1'b0;//scg高电平维持约3020ns(典型值)
if (pixel_counter == 18’d571) sh <= 1'b1;
else if (pixel_counter == 18’d1000) sh <= 1'b0;
end //sh高电平维持约3 020 ns,落后scg 1 050 ns
always @ ( posedge clk_140m)
begin if (pixel_counter[2:0] == 3'b111) rs <= 1'b1;
else rs <= 1'b0; //rs信号占空比1:8
if (pixel_counter[2:0]==3'b000) cp <= 1'b1;
else cp <=1'b0;
end //cp信号占空比1:8,落后rs约8 ns
assign fai1A = !pixel_counter[1];//Φ1A时钟频率35 MHz
assign fai2A = pixel_counter[1];//与Φ1A时钟反相
assign fai1B = 1’b0; assign fai2B = 1’b0;//在彩色模式下,Φ1B、Φ2B维持低电平
assign sw1=1’b0; assign sw2=1’b0;//关闭TDI,打开彩色模式
CCD被正常驱动后,产生的模拟图像信号,经过缓冲放大器传输至CCD专用模数转换器AD9945。AD9945完成图像信号的模数转换,并将采集到的一行数字图像信号写入片内双口RAM中。至此,采集子系统完成CCD图像信号的采集。
1.2 图像显示子系统设计
显示子系统中,图像缓存模块与图像显示模块完成显示子系统的核心功能,即缓存图像与显示图像。图1中,SDRAM采用Hynix公司生产的HY57V64820HG芯片,位宽8 bit,内含4 个Bank,总存储空间为64 MB,用于缓存双口RAM输出的图像信号[9]。视频解码芯片采用Analog Devices公司生产的ADV7123KSTZ140,最高数据吞吐率为330 MS/s[10],可将数字图像信号转换为VGA标准时序的模拟图像信号。
1.2.1 图像缓存模块逻辑设计
当CCD传感器工作在300DPI模式下且行频为3 500 Hz时,其每秒钟产生的数据量为9.345 MB,小于VGA(1366×768@60Hz)每秒钟显示的数据量73.764 MB,因此有必要对CCD图像数据进行缓存,当缓存的图像数据达到VGA一帧的数据量时,再将数据发送至视频解码芯片进行显示。显然,FPGA片内RAM无法提供足够的存储空间,使用片外SDRAM很有必要。
图像缓存模块内含图像裁剪、片内FIFO以及SDRAM控制器3个子模块。
在缓存图像之前,需要对图像信号进行裁剪,使其符合VGA标准时序。TCD2566BFG传感器工作在300DPI模式下,输出图像一行像素点数量为2 670,工作在600DPI模式下,一行像素点数量则为5 340。对于1 366×768分辨率的监视器,每行能够显示的最大像素点数量为1 366点。为此,对双口RAM输出的图像数据进行了裁剪:即300DPI模式下,每读取双口RAM数据一次,读取地址递增2;600DPI模式下,每读取一次数据,读取地址递增4。经过裁剪后,实际显示的图像每行为1 335像素,在首尾各添加15点空白像素后,图像信号符合VGA显示标准时序。采用多监视器或高分辨率监视器显示,也可以解决CCD图像与监视器每行像素点数量不同的问题。
图像信号从双口RAM输出的时钟频率是40 MHz,而SDRAM读写数据的时钟频率为100 MHz。因此,在SDRAM控制器两端各例化一片异步先进先出(First In First Out,FIFO)存储器,实现图像数据的异步读写。SDRAM工作在页读写模式,突发长度512 B。读写FIFO位宽8 bit,深度1 024 word,利用其先入先出与可同时读写的特性,可实现一帧图像的持续写入与读出。图像缓存模块的工作流程如图3所示。
图像经过裁剪后,即可传输进SDRAM内。SDRAM正常读写数据前必须进行初始化,以设置突发长度、列地址控制器(Column Address Strobe,CAS)潜伏期和操作模式。SDRAM初始化完毕后,即拉高wrfifo的写使能。图像数据以40 MHz的频率从双口RAM向wrfifo写入,直到写完一帧VGA图像后才拉低wrfifo写使能。当wrfifo内部数据大于512 word(半满)时,则拉高wrfifo的读使能,读出图像数据,以100 MHz的频率写入SDRAM。SDRAM完成一页(512 B)数据的写入后,暂时关闭wrfifo的读使能以及SDRAM的写使能,当wrfifo内部数据量再次大于512 word时,则再一次读取数据,写入SDRAM。重复该过程,持续向SDRAM写入图像数据。SDRAM内部写满一帧图像后,开始读SDRAM过程。检测rdfifo内部数据量,小于512 word时,拉高SDRAM读使能,以100 MHz频率向rdfifo写入图像数据。读完SDRAM内一页数据时,暂时关闭SDRAM读使能以及rdfifo写使能,等待VGA显示请求。收到VGA模块的显示请求后,拉高rdfifo的读使能,数据以85.5 MHz的频率传输至显示模块。凭借FPGA的并行特性,缓存模块在每一个时钟上升沿都可检测rdfifo的内部数据量。在rdfifo读出数据到VGA过程中,一旦检测到rdfifo内部数据量小于512 word,即拉高rdfifo的写使能,在读取数据的同时,写入数据。上述过程可实现一帧图像数据的连续写入和读出。由于系统采用的SDRAM无法同时进行写和读两种操作,因此本文采用了两片HY57V64820HG进行乒乓操作:SDRAM1进行读出操作,向ADV7123KSTZ140输出信号时,SDRAM2则从双口RAM写入数据;反之亦然。通过乒乓操作,实现了图像帧与帧之间的连续传输。
1.2.2 图像显示模块逻辑设计
VGA是IBM公司于1987年提出的一个使用模拟信号的显示标准。在1 366×768@60 Hz模式下,扫描一帧图像需要16.7 ms,其中实际显示图像的时间为12.3 ms。图像扫描过程从左往右,从上往下。设置一个计数器记录扫描的位置。当扫描至一行图像的左端点时,则开始将一行图像信号传输至视频解码芯片,扫描至右端点时,则停止图像信号的传输。纵向扫描的原理与此相似。图像显示模块还生成视频解码芯片需要的时钟脉冲、行场同步信号以及消隐信号。图像显示模块关键源代码如下:
always @ (posedge clk )//时钟频率为88.5 MHz
begin if (hcnt < H_TOTAL - 1'b1) hcnt <= hcnt + 1'b1;
else hcnt <= 11'd0;
end//H_TOTAL = 1792,hcnt循环计数0~1791
assign lcd_hs = (hcnt <= H_SYNC - 1'b1) ? 1'b1 : 1'b0;//H_SYNC =143,lcd_hs为行同步信号
always @ (posedge clk )
begin if(hcnt == H_TOTAL - 1'b1)
begin if(vcnt < V_TOTAL - 1'b1) vcnt <= vcnt + 1'b1;
else vcnt <= 11'd0; end
end// V_TOTAL = 798,vcnt循环计数0~797
assign lcd_vs = (vcnt <= V_SYNC - 1'b1) ? 1'b1 : 1'b0;//V_SYNC=3,lcd_vs为场同步号维持3 行像素时间的高电平
assign lcd_blank = lcd_hs & lcd_vs;//lcd_blank为消隐信号
assign lcd_en = (hcnt >= H_SYNC + H_BACK
&& hcnt < H_SYNC + H_BACK + 11’d1366)
&& (vcnt >= V_SYNC + V_BACK&& vcnt < V_SYNC + V_BACK +11’d768 ) ? 1'b1 : 1'b0;//扫描至实际显示区域
assign lcd_rgb = lcd_en ? lcd_data : 8'h00;//扫描至实际显示区域将图像数据送出
2 软硬件综合调试
利用FPGA集成开发环境QuartusII 11.0软件自带的Signal Tap工具,可以检测FPGA内部信号的真实值。将逻辑设计的顶层模块文件在QuartusII 11.0软件中全编译,生成.sof文件,利用JTAG接口将文件烧录进FPGA在线调试。驱动模块输出的驱动信号以及双口RAM输入的数字图像信号如图4所示。对比技术手册时序图,Signal Tap抓取的信号表明,驱动线阵CCD所需的10路信号被正确地产生了。结果如图4中的DATA_R、DATA_G、DATA_B信号所示,FPGA成功接收到了由线阵CCD产生的数字图像信号。图像采集子系统完成了设计目标。图像在监视器上显示结果如图5所示。线阵CCD传感器需以特定速度扫描被测物体才能得到二维图像。测试中,被测物体油茶果匀速通过CCD传感器下方,CCD传感器保持固定。显示设备为通用即插即用监视器,分辨率1 366×768。显示画面稳定,无失帧,无噪点。
3 结论
Signal Tap抓取的信号波形和监视器显示的画面表明系统基本上实现了设计目标,即使用FPGA芯片完成CCD图像信号的采集和显示,证明了系统软硬件设计的正确性。全编译结果显示,FPGA内部LE只使用了44%。利用剩余的资源,可以对图像信号进行图像处理,处理结果通过串口传输至筛选执行机构,执行筛选动作。配合不同的CCD传感器,该系统可广泛应用于安检、医疗影像、遥感测绘等领域,具有较高的实用价值。
参考文献
[1] 杨海钢,孙嘉斌,王慰.FPGA器件设计技术发展综述[J].电子与信息学报,2010,32(3):714-727.
[2] RUBIN G,OMIELJANOWICZ M,PETROVSKY A.Reconfigurable FPGA-based hardware accelerator for embedded DSP[C].14th International Conference on Mixed Design of Integrated Circuits and Systems,2007:147-151.
[3] POSSA P,SCHAILLIE D,VALDERRAMA C.FPGA-based hardware acceleration:A CPU/accelerator interface exploration[C].Electronics Circuits and Systems(ICECS),2011 18th IEEE International Conference on.IEEE,2011:374-377.
[4] ZARIFI T,MALEK M.FPGA implementation of image processing technique for blood samples characterization[J].Computers & Electrical Engineering,2014,40(5):1750-1757.
[5] 温强,胡明明,桑楠.基于彩色线阵CDD的大米色选算法[J].农业机械学报,2008,39(10):105-108.
[6] TOSHIBA.TCD2566BFG[Z].2012.
[7] ALTERA.Cyclone III Device Handbook[Z].2011.
[8] 王庆有.CCD应用技术[M].天津:天津大学出版社,2000.
[9] HYNIX. HY57V64820HG[Z].2002.
[10] ANALOG DEVICES. ADV7123[Z].2010.