Matlab生成Xilinx Rom IP CORE的初始化內容coe檔案

長弓的堅持發表於2016-10-16
在進行FPGA設計時,經常要對rom模組進行初始化。ISE或Quartus II軟體本身具備的初始化功能對於較小的rom是行之有效的,但面對大容量的rom時就顯得捉襟見肘了。而matlab作為一神器,在這時就有了用武之地。使用它生成.coe或.mif檔案,可以起到事半功倍的效果。

生成.coe檔案
一、瞭解.coe檔案的格式
在ISE中,對rom進行初始化的檔案是.coe檔案。它的格式如下:
  memory_initialization_radix=10; -->檔案儲存資料的進位制,10即為10進位制
  memory_initialization_vector = -->資料向量
  65534,65533,……,65532,65528; -->所儲存的10進位制資料,每個資料使用逗號隔開,最後分號結束

**.coe檔案的前兩行的開頭格式是固定的,不能改變的。
**--|第一行:memory_initialization_radix=<進位制>;
**--|第二回:memory_initialization_vector=   

**所儲存的資料數量與大小,是與設計rom的位寬和深度相對應的。

二、使用matlab生成.coe檔案

2.1 以下程式用於為位寬為16bit,深度為1024的rom生成初始化檔案
  width=16;   %rom的位寬
  depth=1024; %rom的深度
  x=linspace(0,2*pi,depth);  %在一個週期內產生1024個取樣點
  y_cos=cos(x);   %生成餘弦資料
  y_cos=round(y_cos*(2^(width-1)-1))+2^(width-1)-1;  %將餘弦資料全部轉換為整數

  fid=fopen('C:\Users\Administrator\Desktop\cos_coe.coe','w');  %建立.coe檔案
  fprintf(fid,'%d,\n',y_cos);  %向.coe檔案中寫入資料
  fclose(fid);  %關閉.coe檔案

2.2 編輯.coe檔案(最好使用UltraEdit開啟)
--在前兩行新增
  memory_initialization_radix=10;
  memory_initialization_vector =
--將最後的逗號改為分號
--最後檔案格式:
  memory_initialization_radix=10;
  memory_initialization_vector =
  65534,
  65533,
  .....
  65334,
  65287;

生成.mif檔案
一、瞭解.mif檔案的格式
%.mif檔案的結構
%--WIDTH=16;    -->位寬
%--DEPTH=1024;  -->深度

%--ADDRESS_RADIX=UNS;   -->地址的進位制,此處為無符號型別
%--DATA_RADIX=UNS;      -->資料的進位制,此處為無符號型別

%--CONTENT BEGIN        -->儲存內容的開頭
%--0:0;
%--……;
%--1023:43;
%--END;                 -->儲存內容的結束

二、使用matlab生成.mif檔案
width=16;   %rom的位寬
depth=1024; %rom的深度
x=linspace(0,2*pi,depth);  %在一個週期內產生1024個取樣點
y_cos=cos(x);   %生成餘弦資料
y_cos=y_cos+1;  %將生成的資料全部轉換為整數
y_cos=round(y_cos*(2^(width-1)-1));    %將幅值放大,並轉換為整數
y_sin=sin(x);   %生成正弦資料
y_sin=y_sin+1;
y_sin=round(y_sin*(2^(width-1)-1));    %將幅值放大,並轉換為整數
fid=fopen('C:\Users\Administrator\Desktop\cos_mif.mif','w');
for num=0:depth-1;
    fprintf(fid,'%d:%d;\n',num,y_cos(num+1));
end
fclose(fid);

fid=fopen('C:\Users\Administrator\Desktop\sin_mif.mif','w');
for num=0:depth-1;
   fprintf(fid,'%d:%d;\n',num,y_sin(num+1)); 
end
fclose(fid);
%用於測試生成的資料
%plot(x,y_cos)
%plot(x,y_sin)

相關文章