A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在基于FPGA的图像处理算法中,对于算法实现的验证有两种方法:

使用显示器
使用matlab
Matlab图像处理平台搭建
这个小标题起的有点大,其实跟图像算法没有什么关系,不过是利用MATLAB生成图像数据、使用verilog读入数据提供源数据、再使用MATLAB读入modelsim中产生的输出数据,最后显示。

基本思路是:

把一副图片转换为320x256分辨率的灰度图片,然后利用fprintf函数把图像矩阵写入txt文件。

这个m文件涉及到的函数都很简单,写的时候一遍看help,一遍运行着看结果对不对。MATLAB源码如下:

% /*-----------------------------------------------------------------------
% CONFIDENTIAL IN CONFIDENCE
% This confidential and proprietary software may be only used as authorized
% by a licensing agreement from zjl ().
% In the event of publication, the following notice is applicable:
% Copyright (C) 2013-20xx zjl Corporation
% The entire notice above must be reproduced on all authorized copies.
% Author                                :                zjl
% Technology blogs         :      
% Email Address                 :                 i540113104@gmail.com
% Filename                        :                .m
% Data                                :                2018-12-30
% Description                        :                1.可以输入任意尺寸的图片,输出图片分辨率为320x256
%                               2.输出rgb、灰度图像
%                               3.生成txt文件,在modelsim仿真时使用
%                               4.生成mif文件,在例化IP核时使用
% Modification History        :
% Data                        By                        Version                        Change Description
% =========================================================================
% 30/12/18                zjl                          1.0                                Original
% -----------------------------------------------------------------------*/

clc
clear all
close all

img_ori = imread('lena.jpg');%加载图像
img_320x256 = imresize(img_ori,[256,320]);% 把图片转换为320x256分辨率
img_320x256_gray = rgb2gray(img_320x256);%图像转换为灰度图像

imwrite(img_320x256_gray,'lena_gray_320x256.jpg');

% ---------------------------------------------------------------------------
figure(1)
subplot(1,3,1),imshow(img_ori);
subplot(1,3,2),imshow(img_320x256);
subplot(1,3,3),imshow(img_320x256_gray);
% ---------------------------------------------------------------------------
%320*256大小的灰度图像生成TXT文档
fid = fopen('./lena.txt','wt');%打开空文件
for i = 1 : size(img_320x256_gray, 1)%行循环
    for j = 1 : size(img_320x256_gray, 2)%列循环
        fprintf(fid, '%d ', img_320x256_gray(i, j));%每个数据之间用空格分开%
    end
    fprintf(fid, '\n');%文件末尾加一个换行
end
fid = fclose(fid);%关闭文件
I_data = load('./lena.txt');%加载txt文件到matlab工作区-可不要

% ---------------------------------------------------------------------------
%生成mif文件
[m,n] = size( img_320x256_gray );% m行 n列
N = m*n;                               %%数据的长度,即存储器深度。
word_len = 8;                          %%每个单元的占据的位数,需自己设定
data = reshape(img_320x256_gray', 1, N);% 把矩阵转换为1行N列

fid=fopen('gray_image.mif', 'w');       %打开文件
fprintf(fid, 'DEPTH=%d;\n', N);         %存储器深度
fprintf(fid, 'WIDTH=%d;\n', word_len);  %存储器位宽
fprintf(fid, 'ADDRESS_RADIX = UNS;\n'); %% 指定address为十进制
fprintf(fid, 'DATA_RADIX = HEX;\n');    %% 指定data为十六进制
fprintf(fid, 'CONTENT\t');
fprintf(fid, 'BEGIN\n');
for i = 0 : N-1
    fprintf(fid, '\t%d\t:\t%x;\n',i, data(i+1));
end
fprintf(fid, 'END;\n');                 %%输出结尾
fclose(fid);                            %%关闭文件

实现verilog读入文本数据也很简单,一个$readmemh即可,然后在行同步信号的有效期内在时钟边沿读入寄存器。

//*任务:读取文件到内存
task load_data2mem;
begin
        $readmemh("lena.txt",reg_mem);
end
endtask

always @ (posedge clk)begin
        if(!rst_n) begin
                addr <= 0;
        end
        else if( sync_x )begin
                addr <= addr +1;
        end
end
assign data_tmp = reg_mem[addr];//从内存中读出数据


1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马