COE是一种ASCII文件,可以用于给FPGA内部RAM IP核赋予初始值。其文件格式为:
memory_initialization_radix=10;
memory_initialization_vector=
0,
1,
2,
3,
4;
其含义为,数值为10进制,地址0数据值为0,····地址4数据值为4.
memory_initialization_radix=2;时,代表数据为二进制。
memory_initialization_radix=16;时,代表数据为十六进制。
生成COE文件,可以根据格式手动输入文本文件生成,将.txt改成.coe即可。或者使用matlab编码生成。
N = 100 ;
y = zeros(N , 1) ;%生成100行*1列的矩阵
y_integer = zeros(N , 1) ;%生成100行*1列的矩阵
y_hex = zeros(N , 1) ;%生成100行*1列的矩阵,十六进制
for i = 1:1:N %循环1~100,累加1
x = i ;
%y(i,1) = ceil( 127*sin(x*2*pi/N) ) ;%ceil为四舍五入函数,输出范围为-127~127的正弦波数据
y(i,1) = ceil( 127*cos(x*2*pi/N) ) ;%ceil为四舍五入函数,输出范围为-127~127的余弦波数据
end
plot(y);%画图预览
fid = fopen('cos_100point.coe','wt'); %创建一个名为cos_100point.coe的文件
%- COE 文件前置格式
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 16;\n');
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%- 写数据
for i = 1:1:N
if (y(i,1)<0)
y_integer(i,1)=y(i,1)+256;%负数用补码表示
else
y_integer(i,1)=y(i,1);%正数的补码为原码
end
y_hex= dec2hex(y_integer);%因为dec2hex只能转换正数,因此先将y取补码
if(i == N)
%最后一个点时,标点为分号,其余时候为逗号
fprintf(fid,'%c%c;',y_hex(i,1),y_hex(i,2)); %输出16进制数据
% fprintf(fid,'%d,\n',y(i,1)); %输出10进制数据
else
fprintf(fid,'%c%c,\n',y_hex(i,1),y_hex(i,2)); %输出16进制数据
% fprintf(fid,'%d,\n',y(i,1)); %输出10进制数据
end
end
fclose(fid);%关闭文件
上述matlab代需要重点关注的是:
1、按照需求,模拟生成正弦波数据,利用率sin函数和cos函数。
2、将负数通过转换,变为正数,操作方式为加上256(2的N次方,N为数据位宽)
3、使用DEC2HEX将补码数据转换为十六进制字符
4、使用fprintf函数,利用两个%c,将十六进制字符写入文件中。实现了十六进制数据的转换。
评论区朋友们说,上述代码进制转换部分需要修改,听取其建议修改,速度确实会增加。修改如下:
N = 100 ;
y = zeros(N , 1) ;%生成100行*1列的矩阵
y_integer = zeros(N , 1) ;%生成100行*1列的矩阵
y_hex = zeros(N , 1) ;%生成100行*1列的矩阵,十六进制
for i = 1:1:N %循环1~100,累加1
x = i ;
%y(i,1) = ceil( 127*sin(x*2*pi/N) ) ;%ceil为四舍五入函数,输出范围为-127~127的正弦波数据
y(i,1) = ceil( 127*cos(x*2*pi/N) ) ;%ceil为四舍五入函数,输出范围为-127~127的余弦波数据
end
plot(y);%画图预览
fid = fopen('cos_100point_new.coe','wt'); %创建一个名为cos_100point.coe的文件
%- COE 文件前置格式
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 16;\n');
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%- 写数据
for i = 1:1:N
if (y(i,1)<0)
y_integer(i,1)=y(i,1)+256;%负数用补码表示
else
y_integer(i,1)=y(i,1);%正数的补码为原码
end
end
y_hex= dec2hex(y_integer);%因为dec2hex只能转换正数,因此先将y取补码
for i = 1:1:N
if(i == N)
%最后一个点时,标点为分号,其余时候为逗号
fprintf(fid,'%c%c;',y_hex(i,1),y_hex(i,2)); %输出16进制数据
% fprintf(fid,'%d,\n',y(i,1)); %输出10进制数据
else
fprintf(fid,'%c%c,\n',y_hex(i,1),y_hex(i,2)); %输出16进制数据
% fprintf(fid,'%d,\n',y(i,1)); %输出10进制数据
end
end
fclose(fid);%关闭文件
依据正弦波的matlab代码编写方法,照葫芦画瓢,可以得到三角波数据和方波数据。
%% triangle wave data write in coe file
N = 100 ;
y = zeros(N , 1) ;%生成100行1列的矩阵
for i = 1:1:N
if(i <= 50) %从0递增到49
y(i,1) = i-1 ;
else %从49递减到0
y(i,1) = 100 - i;
end
end
plot(y);%绘图预览
fid = fopen('triangle_100point.coe','wt');
%COE文件格式
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 10;\n');
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%输出十进制数据,保存至文件
for i = 1:1:N
if(i == N)
fprintf(fid,'%d;',y(i,1)); %最后一个点时,标点为分号,其余时候为逗号
else
fprintf(fid,'%d,\n',y(i,1));
end
end
fclose(fid);%关闭文件
N = 100 ;%100个点的数据
y = zeros(N , 1) ;%生成100行1列的矩阵
for i = 1:1:N
if(i <= 50) %输出50个点的高电平,50个点的低电平
y(i,1) = 255 ;
else
y(i,1) = 0 ;
end
end
plot(y);
fid = fopen('rectangle_100point.coe','wt'); %创建文件rectangle_100point.coe
%COE文件格式
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 10;\n');
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%保存文件数据至COE文件中
for i = 1:1:N
if(i == N)
fprintf(fid,'%d;',y(i,1)); %最后一个点时,标点为分号,其余时候为逗号
else
fprintf(fid,'%d,\n',y(i,1));
end
end
fclose(fid);%关闭文件