mif文件/coe文件的创建
在FPGA中使用ROM的应用是十分常见的,但数据较少时,可以直接使用Quartus II 或者Vivado工具直接产生mif文件或者coe文件。但当数据量很大的时,在EDA工具中,一个个输入这是非常繁琐的、不现实的,针对这种情况,一般是使用如matlab、C等高级语言产生mif文件/coe文件,然后添加到EDA工具中。
coe文件的创建
在Vivado中创建ROM时,需要利用coe文件初始化ROM。下面将创建一个含有正弦波的coe文件。
depth =256; % rom深度
width =8; % 数据宽度
sin_coe = sin(2*pi*(0:depth-1)/depth); % 将正弦波分为256份
sin_coe = sin_coe*(2^(width-1)-1); % 正弦波的幅值范围为-1~1,
%将其转为变为-127~127
%(看到博客是乘以128的,但是这样的话,8位的数据宽度好像不满足
sin_coe = round(sin_coe+(2^(width-1)-1)); % 将其转为非负数并取整。此时范围为0~254
fid =fopen('sine.coe','wt'); % 创建文件
fprintf(fid,'memory_initialization_radix=10;\n'); % memory_initialization_radix:定义存储器初始化值的基,可取值为2,10,16等
fprintf(fid,'memory_initialization_vector=\n'); % memory_initialization_vector 储存器内数据向量
for idnex =1:depth
if(idnex<depth)
fprintf(fid,'%d,\n',sin_coe(idnex));
else
fprintf(fid,'%d;\n',sin_coe(idnex)); % 最后的数据应以‘;’结尾
end
end
COE文件提供了一种设置内存初始化值的高层次方法,但实际上并不能直接使用。当生成IP核,Vivado会将COE文件转换为MIF文件。MIF文件保存了原始值,用于存储类IP核的初始化和仿真模型。
创建后如下:
mif文件的创建
depth =256; % rom深度
width =8; % 数据宽度
sin_mif = sin(2*pi*(0:depth-1)/depth);
sin_mif = sin_mif*(2^(width-1)-1);
sin_mif = round(sin_mif+(2^(width-1)-1)); % 将其转为非负数并取整。此时范围为0~254
fid =fopen('sine.sin','wt'); % 创建文件
fprintf(fid,'depth=%d;\n',depth);
fprintf(fid,'width=%d;\n',width);
fprintf(fid,'address_radix=UNS;\n'); % 地址的基 可取值为BIN(二进制),HEX(十六进制),OCT(八进制),DEC(有符号十进制),UNS(无符号十进制)
fprintf(fid,'data_radix=UNS;\n'); % 数据的基
fprintf(fid,'content begin\n'); % 地址:数据对包含在 从"content begin end 中
for idnex =1:depth
fprintf(fid ,'%d:%d;\n',idnex-1,sin_mif(idnex)); % 其表示的方法需要和上面申明的基相同
end
fprintf(fid ,'end');
fclose(fid);
创建如下: