【原创】VGA显示640*480真彩色图像时FPGA存储资源不够用怎么办?
2赞本次试验采用的器件是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文件。
图1 图像分辨率设置
此时,需要FPGA存储资源为160*120*24=460800比特,刚好够用。于是乎,生成mif文件,如图2所示。
图2 生成mif文件
接着,在工程中调用ROM并加载刚刚生成的mif文件,如图3和图4所示。
图3 设置ROM的数据位宽和深度
图4 加载mif文件
当工程全部搭建好后,编译综合,结果出现错误,如图5所示。根据错误提示,本工程占用的存储资源过多,需要60块M9K,而该系列FPGA只有56块M9K,从而不够用。
图5 编译综合报错
那怎么办呢?继续缩小图片?NO,再缩小,显示出来的图像还能看吗?我们应该从其他方面着手,让24位图像变为16位图像,16位图像数据可以显示65536中颜色,人眼是很难分辨出来的,故该方案可以真彩色图像的效果。mif文件生成如图6所示,选择RGB565(其实该软件生成的是BGR565的图像数据)。
图6 生成RGB565mif文件
重新将mif文件加载到ROM中,如图7和图8所示。
图7 设置ROM数据位宽和深度
图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所示。
图9 工程消耗的资源情况
最后,将生成的sof文件下载到FPGA中,可在显示器中看到如图10所示的效果。
图10 效果图1
再给出另一张效果图,如图11所示。
图11 效果图2