在fpga中使用rom的應用是十分常見的,但資料較少時,可以直接使用quartus ii 或者vivado工具直接產生mif檔案或者coe檔案。但當資料量很大的時,在eda工具中,乙個個輸入這是非常繁瑣的、不現實的,針對這種情況,一般是使用如matlab、c等高階語言產生mif檔案/coe檔案,然後新增到eda工具中。
在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 coe檔案提供了一種設定記憶體初始化值的高層次方法,但實際上並不能直接使用。當生成ip核,vivado會將coe檔案轉換為mif檔案。mif檔案儲存了原始值,用於儲存類ip核的初始化和**模型。
建立後如下:
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'); % 資料的基
for idnex =1:depth
fprintf(fid ,'%d:%d;\n',idnex-1,sin_mif(idnex)); % 其表示的方法需要和上面申明的基相同
end
fprintf(fid ,'end');
fclose(fid);
建立如下:
COE檔案格式
在ise中,rom的ip核生成需要初始化檔案。這個初始化的檔案字尾是 coe 實際上把 txt 換成 coe 就可以了,軟體讀取的格式是一樣的。這個 coe 檔案有一定的格式,格式如下 memory initialization radix 10 memory initialization vect...
COE檔案是什麼
coe檔案 在某些ip核的配置中,需要使用coe coefficient 檔案來傳遞引數,例如matlab自動生成fir濾波器所需的濾波係數檔案以及ram中的初始化資料檔案等。coe檔案是一種ascii文字檔案,檔案頭部定義資料基數 radix 可以時2 10或16。資料以向量的形式給出,向量以分號...
mif檔案生成方法
mif檔案就是儲存器初始化檔案,即memory initialization file,用來配置ram或rom中的資料。常見生成方法 quartus自帶的mif編輯器生成 mif軟體生成 高階程式語言生成 前兩種方法都有一定的缺陷,主要介紹第三中方法,按照mif檔案格式,使用高階程式語言 matla...