🎎Matlab生成FPGA端rom初始化文件.coe
本文主打言简意赅。
函数源码
function gencoeInitialROM(width, depth, signal, filepath)
% gencoeInitialROM - 生成 Xilinx ROM 初始化格式的 COE 文件
%
% 输入参数:
% width - ROM 数据位宽
% depth - ROM 数据深度
% signal - 待写入的信号
% filepath - 文件路径及文件名
%
% 输出参数:
% 无
% 检查输入信号长度,如果不够则报错
if length(signal) < depth
error('信号长度不够深度的需求');
end
% 取信号的前 depth 位
signal = signal(1:depth);
% 计算最大绝对值
max_val = max(abs(signal));
if max_val == 0
error('信号最大值为零,不能进行归一化处理。');
end
% 缩放因子
scale_factor = 2^(width-1)-1;
% 归一化信号并转换成对应位宽的整数
signal = signal / max_val;
signal = round(signal * scale_factor);
% 自动添加 .coe 文件尾缀
[~, ~, ext] = fileparts(filepath);
if isempty(ext)
filepath = [filepath, '.coe'];
elseif ~strcmp(ext, '.coe')
error('文件扩展名错误,应为 .coe');
end
% 创建 .coe 文件
fid = fopen(filepath, 'w');
if fid == -1
error('无法创建文件,路径有问题?');
end
% 写入 COE 文件头
fprintf(fid, 'memory_initialization_radix=10;\n');
fprintf(fid, 'memory_initialization_vector=\n');
% 向 .coe 文件中写入数据
for i = 1:length(signal)
if i < length(signal)
fprintf(fid, '%d,\n', signal(i));
else
fprintf(fid, '%d;\n', signal(i));
end
end
% 关闭 .coe 文件
fclose(fid);
end
使用示例
width = 8; % ROM 数据位宽
depth = 10; % ROM 数据深度
frequency = 1; % 正弦信号频率
sampling_rate = 10; % 采样率
filepath = 'sine_wave'; % 输出文件路径
% 生成时间轴
t = (0:depth-1) / sampling_rate;
% 生成正弦信号
signal = sin(2 * pi * frequency * t);
% 调用 gencoeInitialROM 函数生成 COE 文件
gencoeInitialROM(width, depth, signal, filepath);
disp('正弦信号 COE 文件已生成。');
得到的coe文件如下:
memory_initialization_radix=10;
memory_initialization_vector=
0,
78,
127,
127,
78,
0,
-78,
-127,
-127,
-78;