文章目录
本节主要来完成Modelsim联合Matlab进行FPGA图像仿真。
参考咸鱼FPGA的方法进行学习,很便捷。
我这里主要根据之前介绍的独立采用Modelsim仿真的方法,以及运用Matlab实现图像和文本之间转换的方法进行彩色图像转灰度的仿真测试。
在学习本节之前,需要掌握如何独立采用Modelsim进行仿真,能更便利的进行图像的仿真验证,不用担心quartus代码不可综合情况的出现。还需要掌握Matlab实现图像与txt文本之间的转换。这些之前博文中已经写过,这里不再赘述。
一、Modelsim联合Matlab进行FPGA图像仿真的步骤
如下是咸鱼FPGA给出的联合仿真原理图,清晰明了。

对步骤的分析如下:
1、先采用Matlab来对原图进行处理,来生成txt文档(post_img.txt)。——img_data_gen.m。
2、通过Modelsim建立工程,为测试项目top_tb。——top_tb.v。其中待测试模块为top.v(内部包含图像处理模块、图像产生模块(相当于VGA模块))。
3、对于测试模块中top_tb,我们可以进行仿真波形的查看。另外通过测试文件中的代码,我们能将VGA数据逐像素的写入到post_img.txt文档中。
4、基于post_img.txt文档,用Matlab处理,将txt文档转换成图片的形式。——— img_data_show.m
5、此时,就完成了matlab和modelsim的联合FPGA图像处理仿真。
二、具体实现方法
2.1 新建一个Modelsim项目并编写测试代码
首先新建一个project,将项目名设为top_tb,语言为verilog。——该top_tb为tb测试文件。
测试文件中主要包括:
- 信号的定义以及图像尺寸的声明
- 模块的例化
- 产生时钟激励和复位激励
- 将图像数据转变为txt文本
- 将最终的VGA数据逐像素的写入到txt文档中
2.2 新建v文件来编写待测试代码
在project的基础上,新建source v文件进行待测试代码的编写。
这里的待测试代码是一个彩色图像进行灰度转换的项目。包含三个模块:顶层模块,图像产生模块(相当于VGA模块),灰度转换图像处理模块

2.3 建成项目后,我们采用matlab生成txt文本文件
% 彩色图片转为txt文本,格式为24bit的hex数据
clc;
clear all;
%--------------------------------------------------------------------------
pre_img = imread('pre_img.jpg'); %读取原图图片文件
[ROW,COL,N] = size(pre_img); %获得图片尺寸[宽度,长度,维度]
RGB_ij = uint64(zeros(ROW,COL)); %定义32位宽的RGB变量
%--------------------------------------------------------------------------
fid = fopen('pre_img.txt','w'); %打开txt文档,使得后续数据的写入该文档
for i = 1:ROW
for j = 1:COL
R = double(pre_img(i,j,1));
G = double(pre_img(i,j,2));
B = double(pre_img(i,j,3));
%-------------------------------------
RGB = R*(2^16) + G*(2^8) + B;
RGB_ij(i,j) = RGB;
RGB_hex = dec2hex(RGB);
%-------------------------------------
fprintf(fid,'%s\n',RGB_hex); %将字符打印到txt文件
end
end
fclose(fid);
将生成的txt文本文件放入到与测试项目同一文件夹中。

2.4 编译仿真并进行波形分析
此时我们有了待测试的文件以及测试文件,和图像数据txt文档。即可Cmopile,成功后进行Simulate,选中我们的top_tb工程即可。

添加波形并进行查看:
我们放大前面部分进行验证。img_data表示原图转换成txt文档的数据,我们可以将其与pre_img.txt文档中的数据进行比对。可看到第一个是e4915f,第二个数据de8b59,以此类推……
VGA_data是我们经过灰度处理后的数据,在VGA_de有效的时候,将其逐像素的写入到了post_img_txt中。


2.5 通过Matlab将txt文档转换成图像
将生成的post_img_txt放到img_data_show.m同一文件夹下,进行txt文档与图像之间的转换。
% txt文本中24bit的数据还原为彩色图片
clear all;
clc;
%--------------------------------------------------------------------------
ROW = 480; %宽度
COL = 640; %长度
N = 3; %维度
post_img = uint8(zeros(ROW,COL,N));
%--------------------------------------------------------------------------
fid = fopen('post_img.txt','r'); %打开post_img.txt文档,并向里面写数据
for i = 1:ROW
for j = 1:COL
value = fscanf(fid,'%s',1);
%------------------------------------------
post_img(i,j,1) = uint8(hex2dec(value(1:2)));
post_img(i,j,2) = uint8(hex2dec(value(3:4)));
post_img(i,j,3) = uint8(hex2dec(value(5:6)));
end
end
fclose(fid);
%--------------------------------------------------------------------------
pre_img = imread('pre_img.jpg'); %处理前面的图像进行展示比对
subplot(121);imshow(pre_img), title('处理前');
subplot(122);imshow(post_img),title('处理后');
%--------------------------------------------------------------------------
imwrite(post_img,'处理后的图片.jpg'); %保存处理后的图片输出为jpg格式

至此,经过咸鱼FPGA大佬的资料学习,成功完成了Modelsim和Matlab的联合仿真。本例程的灰度化是采用RGB分量转灰度的方式进行的,根据上面步骤可尝试进行Ycbcr转灰度或者图像翻转多种图像处理操作等操作。
三、matlab出错点
matlab 出现 “文件标识符无效。使用 fopen 生成有效的文件标识符。”主要有以下两个原因:
1、可能是路径或者文件名错了(我这里是路径错误,路径修改后可正常运行)
2、可能是在c盘下的目录,因为没有管理员权限所以报错。
四、采用该方法实现Ycbcr的灰度转换
我这里根据上面的学习,对Ycbcr灰度转换进行仿真验证,在此之前需要掌握RGB到Ycbcr灰度转换的流水线技术。
4.1 搭建FPGA图像处理工程
该部分我们首先搭建FPGA进行灰度转换处理的工程。
框图如下:

根据上面的学习,逐模块的进行代码编写即可。
4.2 图像生成模块代码
`timescale 1 ns/1 ns
//该模块用来生成图像数据,根据此数据进行后续的图像算法处理
module img_gen
//========================< 参数 >==========================================
// 640x480 @60Hz 25Mhz
#(
parameter H_ADDR = 640 , //行有效数据
parameter H_SYNC = 96 , //行同步
parameter H_BACK = 48 , //行显示后沿
parameter H_TOTAL = H_ADDR+H_SYNC+H_BACK , //行扫描周期784
parameter V_ADDR = 480 , //场有效数据
parameter V_SYNC = 2 , //场同步
parameter V_BACK = 33 , //场显示后沿
parameter V_TOTAL = V_ADDR+V_SYNC+V_BACK //场扫描周期515
)
//========================< 端口 >=

本文详细介绍了如何利用Modelsim和Matlab合作进行FPGA图像仿真,涉及彩色图像转灰度的步骤,包括新建项目、编写测试代码、数据转换与分析,以及Ycbcr灰度转换的具体实现。通过实例演示了从图像处理到结果展示的全过程,适合FPGA入门者学习和调试图像处理算法。
&spm=1001.2101.3001.5002&articleId=124799121&d=1&t=3&u=70101f44648a47aaa0b45d1d32b7fba6)
3085

被折叠的 条评论
为什么被折叠?



