随着红外探测技术的发展及其在军事、工业等领域的广泛使用,红外图像处理算法获得了广泛研究。在实际嵌入式红外图像处理系统中,为了方便硬件调试和观察图像处理的效果,需要在系统中加入图像显示模块。通常视频数据流需要处理的数据量大,实时性要求高,所以需要高速大容量的存储器作为图像数据的缓存。用于图像数据缓存的存储器有3种:①同步动态随机存取存储器SDRAM(Synchronous DynamIC RAM),其容量大、速度快、体积小、价格低,但SDRAM的控制逻辑比较复杂,对时序要求也十分严格,需要设计专门的SDRAM控制器以完成与SDRAM芯片的接口;②双口RAM,它可以同时对数据进行读写,时序简单,操作非常方便,但是容量相对较小,而且价格高;③静态随机存取存储器SRAM(Static RAM),它不仅容量大、速度快、体积小、价格低,而且时序控制简单,但是数据不能同时读写,工程中多采用2片SRAM做乒乓操作来简化读写控制。针对实际工程中的体积小、成本低、开发周期短等要求,本文提出一种基于单片SRAM和FPGA的图像处理及显示方案,并在实际工程中得到了应用。
本文的初始设计是面向帧频为50帧/s、16 bit灰度、图像为320×256像素的红外图像输出显示,但其设计方案可以应用于不同帧频、灰度级及图像大小的图像显示。
1 系统硬件结构和工作原理
系统硬件结构图如图1所示。本系统中,高速串行LVDS视频信号经Camera Link接收芯片DS90CR285接收转化为并行TTL电平后送给FPGA,同时,其他系统的高速串行LVDS格式数据也可以直接送至FPGA。这些视频数据经FPGA进行直方图统计,并存储在SRAM中。然后,FPGA在存储间隙读出SRAM内的有效像素数据,并采用直方图统计的参数对图像灰度拉伸,然后送至视频转换芯片ADV7123进行D/A转换显示。
2 各功能模块设计
2.1 Camera Link接口
本方案选用DS90CR285将Camera Link格式的4对串行LVDS图像信号转换成28 bit并行TTL/CMOS的数据。根据Camera Link基本协议,28 bit数据信号中包括3个数据端口:A口(8 bit)、B口(8 bit)、C口(8 bit),和4个视频控制信号FVAL(帧有效)、DVAL(数据有效)、LVAL(行有效)、SPARE(空,暂时未用)。经过Camera Link芯片转换后的时钟信号是整个相机的同步驱动信号,所有的数据和视频控制信号都和该时钟信号同步。数据转换后送入FPGA的时序如图2。
2.2 FPGA核心功能模块实现
本设计中视频数据的处理都在FPGA内实现,其内部功能框图见图3。
PAL制式视频显示分为奇场和偶场,因此在奇场时,SRAM的读地址应该满足:第n行地址范围为320×(n-1)~319+320×(n-1)(n=1,2……128);偶场时,RAM的读地址应该满足:第n行地址范围320×n~319+320×n(n=1,2……128),其读使能及读地址的FPGA主要代码如下:
//////// sram的读标志位有2种状态:(1)奇场数据有效时////用写sram的下降沿‘与’fifo半行标志位。(2)奇场数据无效时用 fifo半行标志位产生上升沿
always @(posedge SRAM_CLK)
if (!rst_n)
ui_sram_read_flag <= 0;
else begin
if ((FVAL_d | ui_sram_write_5d)& Hsync_odd )
ui_sram_read_flag <= ui_sram_write_fallage &
fifo_sram_adv7123_prom_empty_d;
else
ui_sram_read_flag<=fifo_sram_adv7123_prom_empty_riseage;
end
//// SRAM读地址切换
always @(posedge SRAM_CLK)
if (!rst_n | Hsync_odd_riseage)
ui_sram_read_add <= 0;//奇场起始地址
else if (Hsync_odd_fallage)
ui_sram_read_add <= 320;//偶场起始地址
else if (ui_sram_read_fallage)
ui_sram_read_add <= ui_sram_read_add+320;
else if (ui_sram_read)
ui_sram_read_add <= ui_sram_read_add+1;
最后通过下面的赋值给出了SRAM芯片的读写、片选及地址信号:
assign SRAM_read_write_en=~(ui_sram_write & Hsync_odd);
//SRAM读写使能
assign SRAM_CE=~(ui_sram_read | ui_sram_write);
//SSRAM片选
assign SRAM_ADD=(ui_sram_write)?ui_sram_write_add:
ui_sram_read_add;//SSRAM地址
2.2.4 灰度拉伸
将SRAM的读使能和读数据送入灰度拉伸模块作为数据使能和输入数据。本方案中,图像灰度线性拉伸算法表达式为:
式(1)中:Y是拉伸后输出图像灰度值;X是SRAM中读出的数据,为原始图像16 bit二进制数灰度值;Xmin是输入图像数据直方图统计最小灰度值;Xmax是输入图像数据直方图统计最大灰度值。为保证精度,实际应用中将上述公式进行简单变换,可以记为:
Q值在上帧结束前直方图统计模块已经得到,这样拉伸运算只需1次减法和乘法运算,得到积左移14 bit后,截取低10 bit就得到拉伸后的灰度值。需要注意的是,截取前要判定乘法是否溢出,如果溢出,结果置为最大灰度值210。本方案中主要通过调用乘法器IP核来完成乘法运算,不同硬件的乘法器延迟时间不同,所以必须要将输入数据使能信号作相应延迟后,成为输出使能与乘法器输出数据同步[3]。经过灰度拉伸后的图像数据送入FIFO_OUT模块用于图像显示,其中,灰度拉伸模块的输出使能及输出数据作为FIFO_OUT模块的输入使能和输入数据。
本文关键字:单片 DSP/FPGA技术,单片机-工控设备 - DSP/FPGA技术