9.基于rom的vga图像显示¶

9.基于rom的vga图像显示¶

9.2.3.1. 图片预处理¶

我们先来说一下图片在存入ROM之前需要进行的预处理操作。在本次实验中,我们用来存储图片的ROM是通过调用IP核,利用FPGA片上资源生成的只读存储器,但FPGA片上资源有限,生成ROM的存储空间也会受限,存储于ROM的图片大小也受到限制。

FPGA开发板上使用的芯片为Altera公司的EP4CE10F17C8芯片,存储空间为414Kbit;本次实验显示图片分辨率为100*100,色彩格式为RGB565,存储于ROM所占空间为100*100*16=160000bit=156.25Kbit。通过比较发现,芯片可生成满足要求的ROM

用来存储图片。

ROM作为只读存储器,在进行IP核设置时需要指定初始化文件, 即写入存储器中的图片数据,图片要以规定的格式才能正确写入ROM,这种格式就是MIF文件。MIF是Quartus规定的一种文件格式,文件格式示意图,具体见图 38‑2。

图 38‑2 MIF文件格式示意图

若存储数据量较小,我们可以参照上图,手动写入数据。但如果存储量较大,手动输入不太现实。本次实验中要写入100*100个数据,不可能使用手动输入,在这里我们使用Matlab软件将图片转化为MIF文件,具体步骤如下。

1、调整图片大小

考虑到ROM存储空间大小的问题,本次实验显示图片大小为100*100,但并不一定读者想要显示的图片恰好满足这一要求。若图片大小不满足要求,我们可以使用系统自带的画图软件进行调整。

以本次要显示的图片为例,进行讲解。

首先查看图片属性,检验图片大小是否满足要求,具体见图 38‑3。

图 38‑3 图片属性

由图可知,图片分辨率为103*103,不满足要求,需要进行大小调整;若图片大小满足要求,跳过此步骤。图片中的位深度位24,表示图片像素点数据位宽。

然后,右键选中图片,使用系统自带的画图工具打开图片,点击“重新调整大小”,在“调整大小和扭曲”的窗口中,去掉“保持纵横比”勾选,以“像素”为依据调整图片大小为实验要求的100*100,点击“确定”,保存图片并退出,具体见图 38‑4、图 38‑5。

图 38‑4 使用画图打开图片

图 38‑5 重新调整图片大小

2、使用Matlab软件将图片转化为MIF文件

图片大小调整完毕后,使用使用Matlab软件将图片转化为MIF文件。

首先,在工程目录下新建一个matlab文件夹,将调整好大小的图片复制到文件夹下。打开Matlab软件,新建一个*.m的脚本文件,保存到matlab文件夹中,文件名自定义,具体见图 38‑6。

图 38‑6 创建新的脚本文件

然后,在新建的脚本文件中写入以下代码,参考代码具体见代码清单 38‑1。代码中注释较为详细,理解较为容易,不再逐句讲解。

代码清单 38‑1 MIF生成代码(mif_gen.m)

1 clear %清理命令行窗口

2 clc %清理工作区

3

4 % 使用imread函数读取图片,并转化为三维矩阵

5 image_array = imread(‘logo.bmp’);

6

7 % 使用size函数计算图片矩阵三个维度的大小

8 % 第一维为图片的高度,第二维为图片的宽度,第三维为图片维度

9 [height,width,z]=size(image_array); % 100*100*3

10 red = image_array(:,:,1); % 提取红色分量,数据类型为uint8

11 green = image_array(:,:,2); % 提取绿色分量,数据类型为uint8

12 blue = image_array(:,:,3); % 提取蓝色分量,数据类型为uint8

13

14 % 使用reshape函数将各个分量重组成一个一维矩阵

15 %为了避免溢出,将uint8类型的数据扩大为uint32类型

16 r = uint32(reshape(red’ , 1 ,height*width));

17 g = uint32(reshape(green’ , 1 ,height*width));

18 b = uint32(reshape(blue’ , 1 ,height*width));

19

20 % 初始化要写入.mif文件中的RGB颜色矩阵

21 rgb=zeros(1,height*width);

22

23 % 导入的图片为24bit真彩色图片,每个像素占用24bit,RGB888

24 % 将RGB888转换为RGB565

25 % 红色分量右移3位取出高5位,左移11位作为ROM中RGB数据的第15bit到第11bit

26 % 绿色分量右移2位取出高6位,左移5位作为ROM中RGB数据的第10bit到第5bit

27 % 蓝色分量右移3位取出高5位,左移0位作为ROM中RGB数据的第4bit到第0bit

28 for i = 1:height*width

29 rgb(i) = bitshift(bitshift(r(i),-3),11)

30 + bitshift(bitshift(g(i),-2),5)

31 + bitshift(bitshift(b(i),-3),0);

32 end

33

34 fid = fopen( ‘image.mif’, ‘w+’ );

35

36 % .mif文件字符串打印

37 fprintf( fid, ‘WIDTH=16;n’);

38 fprintf( fid, ‘DEPTH=%d;nn’,height*width);

39

40 fprintf( fid, ‘ADDRESS_RADIX=UNS;n’);

41 fprintf( fid, ‘DATA_RADIX=HEX;nn’);

42

43 fprintf(fid,’%snt’,’CONTENT’);

44 fprintf(fid,’%sn’,’BEGIN’);

45

46 % 写入图片数据

47 for i = 1:height*width

48 fprintf(fid,’tt%dt:%xt;n’,i-1,rgb(i));

49 end

50

51 % 打印结束字符串

52 fprintf(fid,’tEND;’);

53

54 fclose( fid ); % 关闭文件指针

代码编写完成并保存,运行脚本文件后,会在matlab文件夹下生成一个MIF文件,查看文件,图片数据已按格式要求写入。

在调用IP核生成ROM时,将生成的MIF文件导入即可,具体方法在前面章节有详细介绍,在此不再过多叙述。但读者要注意的是,ROM深度一定要大于等于图片包含像素点个数。

相关阅读