modelsim和matlab聯合使用

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

一、verilog讀取matlab產生的數據spa

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()函數是不進行四捨五入,只取整數部分。code

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

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

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

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

2)verilog語法:變量

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

 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 <= 8'd0;
       i <= 'd0;
   end 
   else begin 
       o_data <= data_mem[i];
       i <= i + 1'b1;
    end 

二、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);

相關文章
相關標籤/搜索