在视频图像处理领域,涉及到各种类型的运算处理,如图形变换(裁剪,缩放,旋转,扭曲),伽马校正,暗场增强,图像去噪,图像去雾,图像压缩等等。因此有一个好的图像仿真运算平台对于开发人员是有极大帮助的。
在硬件描述语言仿真平台中如果能简单地载入图像文件和输出图像文件,那么对图像类处理的仿真将会带来极大的方便。
一、BMP位图解析
图像文件中.bmp格式的文件较为简单,BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,因此在Windows环境下运行的所有图像处理软件都支持这种格式。
BMP文件由4部分组成:
(1) 位图文件头(bitmap-file header)
(2) 位图信息头(bitmap-informationheader)
(3) 颜色表(color table)
(4) 颜色点阵数据(bits data)
24位真彩色位图没有颜色表,所以只有1、2、4这三部分。这里我们只使用24位真彩色位图。
用UltraEdit打开lena.bmp文件,可以看到这个文件的数据如下图所示。
(1) 位图文件头分4部分,共14字节。
注:Windows的数据是倒着的,因此,如果bfSize的数据为36 00 0C 00,实际上是0x000C0036。
(2) 位图信息头共40字节。 24位真彩色位图没有颜色表。为了简化,只讨论24位真彩色位图。
(3) 24位真彩色位图没有颜色表。
(4) 颜色点阵数据
位图全部的像素,是按照自下向上,自左向右的顺序排列的。即先存储最后一行,而每一行内则是按顺序存储。RGB数据是按B、G、R的顺序排列的。
二、BMP位图Modelsim仿真
2.1 位图文件导入
在Verilog硬件描述语言中也是有文件操作的命令,如fopen,fclose,fread,fwrite等,只是这些命令只能用于仿真,不能用于综合。
因此通过给出的文件名信息,分辨率信息,我们就可以利用文件操作的命令载入bmp位图文件。具体操作步骤:
(1)创建R,G,B三个分量数组,大小为分辨率乘积;
(2)打开文件,读取文件头;
(3)读取像素数据;
(4)将图像数据上下倒序;
(5)关闭文件;
至此,图像文件的数据已经导入到仿真工程中,并存储在三个分量数组中。
注:bmp位图水平宽度会按4的整数倍填充,如图像分辨率非4的整数倍需注意。
2.2 VESA同步时序产生
当图像数据已经导入到仿真工程中了,那接下来就是让这些数据按照VESA的视频数据格式传输起来,这样就可以模拟视频信号输入了。
VESA的视频数据格式还包括CLOCK,VS,HS,DE信号。这些信号可以通过时序产生模块生成。VESA标准规定了如图所示的一些时序参数。
根据VESA标准确定了时钟,和如下一些时序参数就可以产生视频信号了。
例如1024x768@60Hz:
Pixel Clock = 65MHz
Hor Total Time = 1344 Pixels
Hor Addr Time = 1024 Pixels
Hor Sync Time = 136 Pixels
H Back Porch = 160 Pixels
Ver Total Time = 806 lines
Ver Addr Time = 768 lines
Ver Sync Time = 6 lines
V Back Porch = 29 lines
注:
(1)Right Border,Left Border在数字视频中基本都是0。
(2)Sync Ploarity极性正负有时可以调反,对图像没有影响。但有些显示器对极性也严格要求,则不可调反。
具体实现方法。
(1) 时序参数产生模块根据你设定的视频格式,选择对应的时序参数。
在仿真时会使用一些自定义的小分辨率图加快仿真,所以设定了一个“WxH_xHz”格式,可自定义水平,垂直分辨率。
因为有些大分辨率图像会使用双像素模式,所以增加了一个是否双像素选择选择,可以通过BMP_LINK参数进行选择。在双像素时,垂直时序参数不变,水平时序参数减半。
(2) 同步时序产生模块根据时序参数生成VS,HS,DE信号。
通过设定Vs_cnt, Hs_cnt两计时器,根据Hor Total Time,Ver Total Time参数循环计数,可以近似看成一个直角坐标,再根据Sync宽度,DE有效区间即可产生同步信号。
(3) 数据产生模块中已利用文件操作命令将图像文件载入到R,G,B数组中,在VS,HS,DE信号驱动下,用DE做使能信号将数组中数据读取输出。
最终将VS,HS,DE,DATA输出即可产生模拟视频信号。
2.3 位图文件导出
仿真后的图像数据同样也可以导出到位图文件中。具体操作步骤:
(1)打开文件,写入文件头;
(2)将R,G,B三个分量数组的像素数据按倒序写入;
(3)关闭文件;
三、仿真实例
仿真工程可以从此路径下载https://download.csdn.net/download/cjie221/11010293
此实例是一个图片输入输出的仿真示例,未加入其它功能模块。如下图是文件夹结构。
pic中是.bmp图片文件;
rtl中放功能模块的.v文件,此例子中无相关文件;
sim中是Modelsim仿真命令脚本,其中.bat文件可以直接运行启动Modelsim, tb_top.do 文件是编译,仿真运行命令脚本, tb_top_wave.do 是添加待观察信号命令脚本;
testbench中是testbench顶层文件,driver中.v文件就是完成图片输入功能,monitor中.v文件就是完成图片输出。
运行Modelsim仿真有两种方式。
第一种,如果你的PATH路径中已包含Modelsim的执行路径,可以直接去sim文件夹下,双击tb_top.bat文件,即可打开Modelsim并执行命令脚本。
第二种,先打开Modelsim软件,然后点击File->Change Directory ,选择仿真工程的sim文件夹后点击确定。
这时你的当前路径就在sim文件夹下,输入命令“do tb_top.do” 后回车就可以运行进行仿真了。
仿真波形如下图。
此仿真工程会读入img320.bmp图片,然后连续输出4个相同的图片。
如果要仿真其他图片,可以在tb_top.v文件中修改输入图片名称和输入输出分辨率大小。