在Vivado中,ROM的IP核生成需要初始化文件,这个初始化的文件就是.coe文件(在Altera产品中这个初始化文件好像是.mif)。当coe文件中的数值少时可以手动编写,当需要的数据量大时,可以借助Matlab生成。下面介绍利用Matlab产生.coe文件格式和在vivado环境中建立ROM的IP核的步骤。
1.MATLAB代码:
width=8; %rom中数据的宽度
depth=256; %rom的深度
y=0:255;
y=fliplr(y); %从左到右翻转阵列,数据顺序为255,254,253,...... ,2,1,0
fid = fopen('test_data.coe', 'w'); % 打开一个.coe文件
% 存放在ROM中的.coe文件第一行必须是这个字符串,16表示16进制,可以改成其他进制
fprintf(fid,'memory_initialization_radix=16;\n');
% 存放在ROM中的.coe文件第二行必须是这个字符串
fprintf(fid,'memory_initialization_vector=\n');
% 把前255个数据写入.coe文件中,并用逗号隔开,为了方便知道数据的个数,每行只写一个数据
fprintf(fid,'%x,\n',y(1:end-1));
% 把最后一个数据写入.coe文件中,并用分号结尾
fprintf(fid,'%x;\n',y(end));
fclose(fid); % 关闭文件指针
2.生成的coe文件
memory_initialization_radix=16; %进制格式
memory_initialization_vector= %初始化后的数值
ff,
fe,
fd,
fc,
fb,
fa,
f9,
f8,
f7,
f6,
f5,
f4,
f3,
f2,
f1,
f0,
ef,
ee,
ed,
ec,
eb,
ea,
e9,
...
4,
3,
2,
1,
0;
因为coe文件最后会被转化为mif文件,即最后都是二进制表示,所以需要考虑好数值范围的问题,否则可能出错
3.产生.coe文件步骤:
1)新建文件
2)保存文件
3)编写代码并运行(RUN)
4)运行之后,就产生了.coe文件,在Matlab左边界面可以看到,打开前面保存文件的路径也可以找到.coe文件
3.在vivado环境中建立ROM的IP核
1)在basic中memory type改为single port rom
2)在port a options更改宽度、深度,enable port type 为always enabled
3)设置other options,选择本地初始化文件,添加前面存放.coe文件路径,再OK即可
4)生成IP核,再将该IP核例化到上层文件中