FPGA仿真必备(1)——Matlab生成.mif文件——JPG图片转.mif文件——Matlab生成.txt文件——Matlab生成.coe文件

6 篇文章 6 订阅
1. mif 文件

MIF(Memory Initialization File),内存初始化文件,用于 Altera / Intel 的 FPGA 器件的 RAM 或 ROM 配置。
例如:
(1)图像处理中,使用 ROM 存储图片或字体信息,进行图像的先关处理或者VGA显示的字模、固定图片等;
(2)数字信号处理中,使用 ROM 存储 FIR 滤波器等所需的滤波系数;
(3)DDS 信号发生器中,部分实现方式采用 ROM 存储一个周期的采样波形,通过以不同间隔的读取方式输出不同频率的波形;

mif 文件

WIDTH=8;				%指定位宽为8位
DEPTH=4;				%指定数据深度为4,即有4个数据

ADDRESS_RADIX=UNS;		%指定描述地址的数据类型为无符号数
DATA_RADIX=UNS;			%指定描述存储数据的数据类型为无符号数	

CONTENT BEGIN			
0:245;					%地址0存储245
1:245;
2:0;
3:6;
END;
2. matlab 制作 mif 文件

以 . jpg 图片为例,转成 .mif 文件。
首先是读取 .jpg 图片并进行灰度化(sobel算法处理需要),此时 image_1 数组中保存的是 0~255 之间的数据,可以用无符号的 8 位二进制数据表示,此后按照格式写入数据。

对于其他的数据,也是按照这种方法,只是将 image_1 中的数据换成你要写入的数据。

clear all
close all

image_1 = imread('T2.jpg');         % 读取图片
image_1 = rgb2gray(image_1);        % 转成灰度图(Sobel算子是针对灰度图像提取边缘)
figure;
imshow(image_1);                    % 显示图片

fid=fopen('T2.mif','W' );           % 打开T1.mif文件向里面写数据,如果还没有建立这个文件,会自动建立之后打开
fprintf(fid,'WIDTH=8;\n');          % 数据宽度为8位(灰度值是0-255,8位的数据)
fprintf(fid,'DEPTH=32400;\n\n');     % 数据的深度(180*180的图片,32400个数据)
fprintf(fid,'ADDRESS_RADIX=UNS;\n');% 地址数据为无符号数(unsignedfprintf(fid,'DATA_RADIX=UNS;\n\n'); % 像素数据也是无符号数
fprintf(fid,'CONTENT BEGIN\n');     
for x = 1:32400                      % 32400个数据
    fprintf(fid,'%d:%d;\n',x-1,image_1(x)); % 写入数据
end
fprintf(fid,'END;');                % 文件结束    
fclose(fid);                        % 关闭文件

3. matlab 制作 txt 文件

txt文件广泛应用于matlab与FPGA联合仿真中,特别是在 TestBench中,经常需要先使用 Matlab 将待仿真的输入数据制作成 .txt 文件,然后在 TestBench 中读取该 txt 文件作为输入数据,并将模块的输出数据写入新的 txt 文件,可以使用 Matlab 读取输出数据并进行绘图、数据比对等性能分析等。

%将数据以十进制格式写入txt文件 
data = ...;					%数据数组
fid =fopen('s1.txt','w'); 
fprintf(fid,'%8d\r\n',data); 
fprintf(fid,';'); 
fclose(fid);

4. matlab 读取 txt 文件

%从文本文件中读取数据
%读取的数据放在 data 变量中
fid=fopen('E:\FPGA\s2.txt','r');
[data, count] = fscanf(fid,'%lg',inf);
fclose(fid);

5. matlab 生成 coe 文件

.coe 文件与 .mif 文件类似,都是供 RAM 或 ROM 使用的存储文件,有自己的文件格式。Quartus(即Intel的FPGA工具)使用 .mif 文件,Vivado使用 .coe 文件。

Matlab与FPGA数字信号处理系列——DDS信号发生器——Vivado利用 ROM 存储波形实现DDS(1)

Fs_N = 256;                     % 抽样点数
Bit_Width = 2^8;               % 量化位宽
 
t=0:2*pi/Fs_N:2*pi;
y=0.5*sin(t)+0.5; % (-0.5~0.5)+0.5 ->(0~1),转成无符号数
% r=ceil(y*(Bit_Width-1));      % 量化,向上取整
% r=floor(y*(Bit_Width-1));     % 量化,向下取整
r=round(y*(Bit_Width-1));       % 量化,四舍五入
 
fid = fopen('sin.coe','w');  % 写入 'sin.coe' 文件
fprintf(fid,'MEMORY_INITIALIZATION_RADIX=10;\n');   % 固定写法,表示写入的数据是 10进制 表示
fprintf(fid,'MEMORY_INITIALIZATION_VECTOR=\n');     % 固定写法,下面开始写入数据
for i = 1:1:Fs_N
    fprintf(fid,'%d',r(i));
    if i==Fs_N
        fprintf(fid,';\n');   % 最后一个数据用 ;
    else
        fprintf(fid,',\n');    % 其他数据用 ,
    end
end
fclose(fid);                     % 写完了,关闭文件

写入后,文件内容如下图所示,第三行开始是波形量化后的数据,在第62-72行全部被量化为255(8-bit量化的最大值),可以想象,输出的波形在顶峰时会有一个较平的地方,是量化精度不够造成的。
在这里插入图片描述

下图中Matlab的绘图也证明了这一点,最大值处量化成了同样的数据,波形略有失真,原因在于Matlab使用的是 ceil() 函数向上取整,改成 floor() 向下取整,最小值量化成了同样的数据,波形略有失真。
向上取整

向上取整

向下取整

向下取整

四舍五入量化

四舍五入量化

MATLAB与FPGA数字信号处理(数字滤波器设计)、无线通信、图像处理、信道编码系列

欢迎关注:FPGA探索者
在这里插入图片描述

  • 9
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值