crazybird

【原创】VGA显示640*480真彩色图像时FPGA存储资源不够用怎么办?

2
阅读(4874)

    本次试验采用的器件是Cyclone IV E EP4CE15F17C8,其存储资源有516096个比特。一般情况下,如果我们要用纯逻辑在VGA显示器上显示一幅640*480真彩色图像时需要存储资源为640*480*24=7372800比特,是本次试验所用器件的存储资源的14多倍。很明显,存储资源远远不够用,怎么办?很多人想到的用FPGA显示图像的解决办法一般要么显示640*480二值图像(307200比特,刚好够用),要么搭建一个嵌入式系统,然后由嵌入式软件传送图像数据给FPGA进行VGA显示。而本次试验将给出FPGA纯逻辑显示640*480彩色图像,存储资源不够用,怎么办?当然是先缩小图像存放于只读存储器ROM中,再放大显示。虽然这样做显示出来的图像有点粗糙,但达到在存储资源不够的情况显示640*480彩色图像的目的。那么,图像该缩小到多大?嗯。。。为了避免显示畸形,应该在横向和纵向缩放相同的比率。经过计算,横向和纵向各缩小4倍,即由分辨率640*480到160*120。这可以用画图实现,如图1所示。然后将图片另存为bmp文件。

QQ截图20151027063852.bmp

图1  图像分辨率设置

    此时,需要FPGA存储资源为160*120*24=460800比特,刚好够用。于是乎,生成mif文件,如图2所示。

QQ截图20151027065055.bmp

图2  生成mif文件

    接着,在工程中调用ROM并加载刚刚生成的mif文件,如图3和图4所示。

2.bmp

图3  设置ROM的数据位宽和深度

3.bmp

图4  加载mif文件

    当工程全部搭建好后,编译综合,结果出现错误,如图5所示。根据错误提示,本工程占用的存储资源过多,需要60块M9K,而该系列FPGA只有56块M9K,从而不够用。

4.bmp

图5  编译综合报错

    那怎么办呢?继续缩小图片?NO,再缩小,显示出来的图像还能看吗?我们应该从其他方面着手,让24位图像变为16位图像,16位图像数据可以显示65536中颜色,人眼是很难分辨出来的,故该方案可以真彩色图像的效果。mif文件生成如图6所示,选择RGB565(其实该软件生成的是BGR565的图像数据)。

5.bmp

图6  生成RGB565mif文件

    重新将mif文件加载到ROM中,如图7和图8所示。

6.bmp

图7  设置ROM数据位宽和深度

7.bmp

图8  加载mif文件

    其中在代码实现图像放大的方法是:由于图像横向和纵向都缩小了4倍,640*480与160*120的图像数据映射关系为640*480的每行四个像素点对应160*120的一个像素点,640*480的每四行对应160*120的一行。代码如程序清单1所示。

程序清单1

//---------------------------------------------
//  lcd xpos & ypos   
wire [10:0] rom_xpos = lcd_request ? lcd_xpos : 11'd0;  
wire [10:0] rom_ypos = lcd_request ? lcd_ypos : 11'd0;  
//---------------------------------------------
//  address of ROM
wire    [14:0]      addr;
assign  addr = rom_xpos[10:2] + rom_ypos[10:2] * 11'd160;

    还要将RGB565转换成RGB888进行显示,可对RGB565的地位补零,如程序清单2所示。

程序清单2

//---------------------------------------------
//  lcd data output
assign  lcd_rgb = (lcd_en == 1'b1) ? {lcd_data[4:0],3'b0,lcd_data[10:5],2'b0,lcd_data[15:11],3'b0} : 24'h000000;

    工程搭建完成后,综合编译,所消耗资源如图9所示。

8.bmp

图9  工程消耗的资源情况

    最后,将生成的sof文件下载到FPGA中,可在显示器中看到如图10所示的效果。

love.jpg

图10  效果图1

    再给出另一张效果图,如图11所示。

QQ图片20151027004639.jpg

图11 效果图2