在开发FPGA的过程中,经常都会涉及到将数据写为mif、txt、coe文件,每次都去写相关代码,属实比较麻烦效率也很低,我就想着写一个函数,封装起来,要使用的时候直接调用。
.mif 和 .coe 是 FPGA 设计中常用的存储文件,用于 ROM、RAM 等存储器数据的加载,常见的还用在 DDS 信号发生器和 FIR 滤波器的设计中。
.txt 文件主要用于 Matlab 和 FPGA 的联合仿真,比如在之前的设计中,需要使用 Matlab 生成随机序列写入到 .txt 文件,然后 FPGA 仿真中在 Testbench 中读取该数据,处理后的数据再写入 .txt 文件,拿到 Matlab 里面读取后,可以很方面的进行对比和验证。
2. mif 文件
MIF(Memory Initialization File),内存初始化文件,用于 Altera / Intel 的 FPGA 器件的 RAM 或 ROM 配置。
Altera ROM添加mif文件
(1)图像处理中,使用 ROM 存储图片或字体信息,进行图像的处理或者VGA显示的字模、固定图片等;
(2)数字信号处理中,使用 ROM 存储 FIR 滤波器等所需的滤波系数;
(3)DDS 信号发生器中,部分实现方式采用 ROM 存储一个周期的采样波形,通过以不同间隔的读取方式输出不同频率的波形;
MIF文件是一个文本文件,由两个部分组成:第一部分是元信息,第二部分是内存初始化数据,MIF文件的格式如下:
DEPTH = 16;//存储器的深度,就是存多少个数据
WIDTH = 8;//存储器的数据位宽,就是每个数据多少位
ADDRESS_RADIX = HEX;//设置地址基值的进制表示,可以设为BIN(二进制),OCT(八进制),DEC(十进制),HEX(十六进制)
DATA_RADIX = HEX;//设置数据基值的进制表示, 同上
CONTENT BEGIN//数据区开始
0 : 00,
1 : 01,
2 : 02,
3 : 03,
4 : 04,
5 : 05,
6 : 06,
7 : 07,
8 : 08,
9 : 09,
A : 0A,
B : 0B,
C : 0C,
D : 0D,
E : 0E,
F : 0F;
3. txt 文件
txt 文件广泛应用于 matlab 与 FPGA 的联合仿真中,特别是在 TestBench中,经常需要先使用 Matlab 将待仿真的输入数据制作成 .txt 文件,然后在 TestBench 中读取该 txt 文件作为输入数据,并将模块的输出数据写入新的 txt 文件,可以使用 Matlab 读取输出数据并进行绘图、数据比对等性能分析等。
TestBench中读取txt文件:
$readmemh({PATH,"test_data.txt"},test_data,0,NUM-1);
4. coe文件
.coe 与 .mif 一样,是存储文件,不同点在于 Altera 的 FPGA 使用 .mif 格式,Xilinx 的 FPGA 使用 .coe 格式。
Vivado ROM添加coe
COE文件是一种常用的存储器初始化文件格式,常用于Xilinx Vivado软件中。COE文件可以包含对存储器内容的初始化值以及一些元数据信息。COE文件主要由两个部分组成:第一部分是头信息,第二部分是内存初始化数据。
.coe 的格式如下:
MEMORY_INITIALIZATION_RADIX:定义数据类型,有效值为2(2进制)、10(10进制)、16(16进制)。
MEMORY_INITIALIZATION_VECTOR:定义存储数据,可以用空格、逗号分隔,回车符分隔。
memory_initialization_radix = 16;
memory_initialization_vector =
00, 01, 02, 03, 04, 05, 06, 07,
08, 09, 0A, 0B, 0C, 0D, 0E, 0F;
5.可生成mif、txt、coe的Matlab函数
在开发FPGA的过程中,经常都会涉及到将数据写为mif、txt、coe文件,每次都去写相关代码,属实比较麻烦效率也很低,我就想着写一个函数,封装起来,要使用的时候直接调用。
function [result]=gen_coe_txt_mif(data_in,width,depth,path)
type = extractAfter(path,'.');
data_in = data_in * 2 ^ (width-1);
q = quantizer([width,0]);
hexStr = num2hex(q,data_in);
x = strings(depth,1);
for addr1 = 1:depth
x(addr1) = hexStr(addr1,:);
fid=fopen(path,'wt'); %打开或者新建文件,存放位置和文件名任意
switch(type)
case 'coe'
fprintf(fid,'memory_initialization_radix=16;\n');
fprintf(fid,'memory_initialization_vector=');
for addr2 = 1:depth-1
fprintf(fid,'\n %s,',x(addr2));%开始写数据了
fprintf(fid,'\n %s;',x(depth));
fclose(fid);
case 'txt'
for addr2 = 1:depth
fprintf(fid,'%s\n',x(addr2));%开始写数据了
fclose(fid);
case 'mif'
fprintf(fid,'DEPTH=%d;\n',depth);
fprintf(fid,'WIDTH=%d;\n',width);
fprintf(fid,'ADDRESS_RADIX = HEX;\n');
fprintf(fid,'DATA_RADIX = HEX;\n');
fprintf(fid,'CONTENT BEGIN');
for addr2 = 1:depth-1
fprintf(fid,'\n %x:%s,',addr2-1,x(addr2));%开始写数据了
fprintf(fid,'\n %x:%s;',depth-1,x(depth));
fprintf(fid,'\n END;');
fclose(fid);
otherwise
disp(type_error');
result = 1;
函数调用形式为:
result = gen_coe_txt_mif(data_in,width,depth,path)
result为返回值,成功返回1,实际调用时可以不写。然后data_in是数据;width是数据位宽;depth数据深度;path是文件存放的路径。下面来举例说明:
生成coe文件
N = 16;
t = linspace( 0, 2*pi,N);%选取采样点
y = sin(t);
gen_coe_txt_mif(y,16,N,'D:/FPGA/gen_coe_mif_txt/LFM.coe');
memory_initialization_radix=16;
memory_initialization_vector=
0000,
340f,
5f1f,
79bc,
7f4c,
6ed9,
4b3c,
1a9c,
e563,
b4c3,
9126,
80b3,
8643,
a0e0,
cbf0,
ffff;
生成txt文件 只需要修改文件路径中,存储文件的后缀名为txt即可。
N = 16;
t = linspace( 0, 2*pi,N);%选取采样点
y = sin(t);
gen_coe_txt_mif(y,16,N,'D:/FPGA/gen_coe_mif_txt/LFM.txt');
生成mif文件 只需要修改文件路径中,存储文件的后缀名为mif即可。
N = 16;
t = linspace( 0, 2*pi,N);%选取采样点
y = sin(t);
gen_coe_txt_mif(y,16,N,'D:/FPGA/gen_coe_mif_txt/LFM.txt');
DEPTH=16;
WIDTH=16;
ADDRESS_RADIX = HEX;
DATA_RADIX = HEX;
CONTENT BEGIN
0:0000,
1:340f,
2:5f1f,
3:79bc,
4:7f4c,
5:6ed9,
6:4b3c,
7:1a9c,
8:e563,
9:b4c3,
a:9126,
b:80b3,
c:8643,
d:a0e0,
e:cbf0,
f:ffff;
制作和写文章不易,觉得有用的话不妨赞赏一下,如果经济条件不允许可以点个免费的赞和在看呀!!!十分感谢!!!
赞(1) 打赏
上一篇
zzzz
下一篇
【linux】eda环境(3)vivadolinux安装
觉得文章有用就打赏一下文章作者
非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!
支付宝扫一扫

微信扫一扫
