原创
matlab和modesim的一种读写交互方式(通过txt文件)
在进行modesim仿真时,由于matlab强大的数据处理能力,时常需要比较复杂的激励或者需要把仿真结果保存下来用matlab来处理。利用matlab工具来辅助modesim仿真显得十分重要。。
第一步:matlab产生数据源
close all;clc;clear all
N = 256;
n = 1:N;
x = fix(128 + (2^7 - 1) * sin(2*pi*n/N));%把波形抬高,有符号转为无符号不是这么转的
plot(x)
fid = fopen('sin.txt','wt');
fprintf(fid,'%x\n',x);
fclose(fid);
数据波形如下:
第二步:简单的modesim仿真代码,modeism读取matlab产生的数据:
part1:
module test(
input clk,
input rst,
input [7:0] data_in,
output reg [7:0] data_out
);
always @(posedge clk or negedge rst)
begin
if(!rst)
data_out <= 8'd0;
else
data_out <= data_in;
end
endmodule
part2:
module test_tb();
reg clk;
reg rst;
reg [7:0] data_in;
wire [7:0] data_out;
test test_d1(
.clk(clk),
.rst(rst),
.data_in(data_in),
.data_out(data_out)
);
initial
begin
clk =0;
rst = 0;
#10 rst = 1;
end
reg [7:0] data_mem[0:255]; //定义一个8bit X 256的数组
integer i;
initial
begin
$readmemh("sin.txt",data_mem); //将sin.txt中的数据读入存储器data_mem
end
always @(posedge clk)
begin
if(!rst)
begin
data_in <= 8'd0;
i <= 9'd0;
end
else
begin
data_in <= data_mem; //将存储器中的数据输出
i <= i + 9'd1;
end
end
always #4 clk <= ~clk;
integer w_file;
initial
begin
w_file = $fopen("data_out.txt");
end
always @(i)
begin
$fwrite(w_file,"%h\n",data_out);
if(i == 9'd258) //共写入256个数据
$stop;
end
endmodule
第三步:matlab读取modesim 产生的数据:
close all;clc;clear all;
fid = fopen('data_out.txt','r');
for i = 1 : 259;
data(i) = fscanf(fid, '%x', 1); %这句话的意思是从fid所指的文件以16进制方式读出一个数据。
end
fclose(fid);
plot(data(4:259));
下面总结下modesim几个读写函数的用法:(以下内容转载自网络)
$fdisplay
这个命令需要有触发条件,才会把数据写入文件,例如,上例的触发条件就是always(i),当i变化的时候才写入。每写入一次数据会自动增加一个换行符。
$fmonitor
这个命令不需要触发条件,只要有变化就可以将数据写入文件。例如可以通过以下语句:
initial $fmonitor(w_file,"%h",data_out);
这样可以将整个仿真过程产生的data_out数据都写入文件中。
$fwrite
这个命令和$fdisplay基本相同,也是需要触发条件才会写入,不同的是每写入一个数据不会自动添加换行符。例如可以通过以下语句:
always @(posedge clk)
begin
$fwrite(w_file,"%h\n",data_out);
end
关于这几个命令的详细介绍,大家可以参考Verilog的相关数据。
简单总结一下上面用到的几个函数:
关于Matlab的函数有:fopen, fscanf,fclose。
关于Modelsim的函数有:$fopen, $fclose,$readmemh,$readmemb,$fmonitor,$fdisplay,$fwrite。
用户1715035 2015-4-19 00:43
用户1833837 2015-4-16 14:04
用户1377758 2015-4-16 08:58
用户1816999 2015-4-14 00:17