modelsim和matlab聯合使用
思想:兩個軟件的數據交互通過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 <= 8‘d0; 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聯合使用