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深度一定要大于等于图片包含像素点个数。