COE文件是一种ASCII文本文件,文件头部定义数据基数(Radix),可以时2、10或16。数据以向量的形式给出,每个向量以分号结尾。Vivado会解析COE文件格式,并在生成IP核时导出相关的MIF格式文件,用于行为级仿真。
最好将COE文件放在与使用此文件的IP核同目录下(即与XCI文件同目录),这样在使用Core Cotainer打包IP核时也会将COE文件打包到XCIX文件中。当替换COE文件时,必须要删掉旧的COE文件,否则也会传递到工程的综合过程中;需要注意,如果只是在磁盘上删掉了文件,而不是在工程中移除,会导致报告一个error。
COE文件的通用语法格式如下:
Keyword =Value ; 注释
<Radix_Keyword> =Value ; 注释
<Data_Keyword> =Data_Value1, Data_Value2, Data_Value3;
COE语法不区分关键词的大小写;分号后为注释。下面是与定义数据值的基数相关的关键词:
RADIX: 用于非存储类型IP核的基数定义(比如FIR滤波器);
MEMORY_INITIALIZATION_RADIX: 定义存储器初始化值的基数。
下面是与数据值相关的关键词:
COEFDATA: 定义滤波器的系数;
MEMORY_INITIALIZATION_VECTOR: 定义块存储器与分布式存储器的数据;
PATTERN: 用于位相关器(Bit Correlator)COE文件;
BRANCH_LENGTH_VECTOR: 用于Interleaver COE文件。
COE文件最后定义的关键词必须是COEFDATA或MEMORY_INITIALIZATION_VECTOR,之后的关键词定义都会被忽略。下面给出几个COE文件的示例。
(1).Block Memory COE File
; This .COE file specifies the contents for a block memory of depth=16, and width=4.
memory_initialization_radix=2;
memory_initialization_vector=
1111,
1111,
1111,
1111,
1111,
0000,
0101,
0011,
0000,
1111,
1111,
1111,
1111,
1111,
1111,
1111;
(2).FIR COE File
; Example of a Distributed Arithmetic (DA) FIR Filter .COE file
; with hex coefficients, 8 symmetrical taps, and 12-bit coefficients.
Radix = 16;
CoefData= 346, EDA, 0D6, F91, F91, 0D6, EDA, 346;
深度为4096,位宽为8
%% sin-cos wave data write in coe file
clear all ;
clc ;
N = 4096 ;
y = zeros(N , 1) ;
for i = 1:1:N
x = i ;
%y(i,1) = ceil( 127*sin(x*2*pi/N) ) + 127 ;
y(i,1) = ceil( 127*cos(x*2*pi/N) ) + 127 ;
end
plot(y);
hold on;
fid = fopen('cos_4096.coe','wt');
%- standard format
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 10;\n');
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%- write data in coe file
for i = 1:1:N
fprintf(fid,'%d,\n',y(i,1));
end
fclose(fid);
%% triangle wave data write in coe file
clear all ;
clc ;
N = 4096 ;
y = zeros(N , 1) ;
for i = 1:1:N
if(i < 2049)
y(i,1) = fix( (i/8) - 1 ) ;
else
y(i,1) = fix( ((4096 - i )/8) ) ;
end
end
plot(y);
hold on;
fid = fopen('triangle_4096.coe','wt');
%- standard format
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 10;\n');
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%- write data in coe file
for i = 1:1:N
fprintf(fid,'%d,\n',y(i,1));
end
fclose(fid);
%% rectangle wave data write in coe file
clear all ;
clc ;
N = 4096 ;
y = zeros(N , 1) ;
for i = 1:1:N
if(i < 2049)
y(i,1) = 255 ;
else
y(i,1) = 0 ;
end
end
plot(y);
hold on;
fid = fopen('rectangle_4096.coe','wt');
%- standard format
fprintf( fid, 'MEMORY_INITIALIZATION_RADIX = 10;\n');
fprintf( fid, 'MEMORY_INITIALIZATION_VECTOR =\n');
%- write data in coe file
for i = 1:1:N
fprintf(fid,'%d,\n',y(i,1));
end
fclose(fid);