1. 程式人生 > >modelsim和matlab聯合使用

modelsim和matlab聯合使用

命令 mon 就會 自動 tla lena fclose 8bit strong

思想:兩個軟件的數據交互通過txt文本,可以通過verilog將Modelsim產生的數據寫入txt文本,再在matlab下使用m語言進行讀取。

1、verilog讀取matlab產生的數據

1)matlab語法:(首先matlab產生了一個256點的正弦波)

 N = 256;
 n = 1:N;
 data = fix(128 + (2^7-1)*sin(2*pi*n/N));
 fid = fopen(sin.txt,w);
 fprintf(fid,%x\n,data);
 fclose(fid);

fix()函數是取整函數,與int()函數的區別是int()函數取整采用四舍五入;fix()函數是不進行四舍五入,只取整數部分。

fopen(‘filename‘,‘permission‘)函數是打開文件函數,若打開成功,返回值fid是+N,N是該文件的文件名代號,打開不成功則返回值是-1。

permission:r,w,r+(Read & Write)...

fclose(fid):close one open files,如果關閉成功return0,如果關閉失敗return-1;

fclose(all):close all open files,如果關閉成功return0,如果關閉失敗return-1;

2)verilog語法:

在verilog中定義一個256X8bit的存儲器,通過$readmemh命令將文件中的數據讀取出來到存儲器中。

 reg[7:0] data_mem[255:0];
 intial begin
      $readmemh(‘sin.txt’,data_mem); 
      end  
 //將數據寫到存儲器之後就可以根據設計一次送到數據端口
 always @ (posedge sclk,negedge rst_n)
    if (!rst_n) begin 
       o_data <= 8d0;
       i <= d0;
   end 
   else begin 
       o_data <= data_mem[i];
       i <= i + 1
b1; end

2、matlab讀取verilog仿真產生的數據

3)verilog語法

將仿真過程中的數據通過HDL語言描述寫入txt文件

integer w_file;
initial w_file = $fopen(“data_out.txt”);
always @ (i)
begin
$fdisplay(w_file,”%h”,data_out);//自帶換行符
if (i == 8’d255)
$stop;
end

4)matlab語法:

fid = fopen(‘data_out.txt’,’r’);
for i = 1:256
num(i) = fscanf(fid,’%x’);//讀取16進制數
end
flose(fid);

這樣就將txt中的數據讀取到了num變量中,註意data_out文件中的數據必須要與i的值相同,不然就可能會出錯。

5)$fdisplay、$fwrite、$fmonitor區別

$fdisplay:這個命令需要觸發條件,才會把數據寫入文件,就如上例的always@(i),當i變化時數據才會被寫入,該函數每寫完一次數據就會自動添加一個換行符,所以在最後一個數據寫完之後還會添加一個換行符,最後就需要我們自己刪掉,否則matlab會讀取錯誤。

$fwrite:只有觸發條件有變化才可以將數據寫進文件,但是與$fdisplay區別就是每次寫入數據不會自動添加換行符,需要我們自己添加。eg:always @ (i) $fwrite(w_file,”%h\n”,data_out);

$fmonitor: 這個命令基本與$fdisplay相同,只有觸發條件發生變化才可以將數據寫入文件,eg:initial $fmonitor(w_file,”%h”,data_out);

modelsim和matlab聯合使用