如何将modelsim仿真数据存成文件

该博客介绍了如何在ModelSim中仿真Verilog代码并将数据存储为文件,以便于使用MATLAB进行后续分析。通过示例代码展示了如何在ModelSim中生成数据并在每个时钟边沿写入文件,然后在MATLAB中加载数据并进行FFT分析,以实现信号的频域观察。

目的

如何将modelsim仿真的数据存储成文件供matlab分析,在实际工程应用中很多时候我们需要分析仿真过程中新产生的数据,在用肉眼不能直接观察时就需要将数据存成文件使用第三方软件进行更直观的分析。下面分别使用matlab和modelsim联合仿真,将modelsim的仿真数据存成文件使用matlab对数据进行分析。

verilog代码

`timescale 1ns/1ps

module testbench();

localparam					LEN	=	8192			;

reg		[15:0]				adc_dat[8191:0]			;
reg							clk						;
reg							rst						;
reg		[12:0]				cnt						;
reg		[15:0]				sim_dat					;
reg		[15:0]				wr_cnt					;

initial	begin
	$readmemh("./adc_dat.bin", adc_dat, 0, LEN-1);
end

initial	begin
	clk		= 0;
	rst		= 1;
	cnt		= 0;
	sim_dat	= 0;
	#1000;
	rst		= 0;
end

always	#2.00	clk	=	~clk						;

always@(posedge clk)
begin
	if(rst)	begin
		cnt <= 0;
	end
	else	begin
		cnt		<= cnt + 1;
		sim_dat	<= adc_dat[cnt];
	end
end

integer	fp;
initial	begin
	fp =$fopen("adc_export_dat.bin", "w");
end
always@(posedge clk)
begin
	if(rst)	begin
		wr_cnt <=0;
	end
	else	begin
		if(wr_cnt < 8192)	begin
			wr_cnt <=wr_cnt + 1;
		end
		
		if(wr_cnt < 8192)	begin
			$fwrite(fp, "%d\n", $signed(adc_dat[wr_cnt]));
		end
	end
end
endmodule

从代码中可以看出我们是将文件读进来的数据直接存成文件(文件的读取过程见上一篇文章如何将matlab生成数据导入modelsim进行仿真

matlab分析数据代码

clc;
clear all;
close all;

adc_dat = load('adc_export_dat.bin');
len = length(adc_dat);

subplot(211);
plot(adc_dat);
subplot(212);
fft_data = abs(fft(adc_dat, len));
fft_data = 20*log10(fft_data);
fft_data = fft_data - max(fft_data);
plot(fft_data);

matlab分析数据结果

matlab分析存储文件结果

Modelsim仿真中,有多种方法可以将数据导出并写入文件: ### 方法一:使用Verilog代码将仿真数据文件Matlab分析 在Verilog代码中,可以使用系统任务`$fopen`和`$fwrite`将仿真数据写入文件。以下是示例代码: ```verilog `timescale 1ns/1ps module testbench(); localparam LEN = 8192 ; reg [15:0] adc_dat[8191:0] ; reg clk ; reg rst ; reg [12:0] cnt ; reg [15:0] sim_dat ; reg [15:0] wr_cnt ; initial begin $readmemh("./adc_dat.bin", adc_dat, 0, LEN-1); end initial begin clk = 0; rst = 1; cnt = 0; sim_dat = 0; #1000; rst = 0; end always #2.00 clk = ~clk ; always@(posedge clk) begin if(rst) begin cnt <= 0; end else begin cnt <= cnt + 1; sim_dat <= adc_dat[cnt]; end end integer fp; initial begin fp = $fopen("adc_export_dat.bin", "w"); end always@(posedge clk) begin if(rst) begin wr_cnt <=0; end else begin if(wr_cnt < 8192) begin wr_cnt <=wr_cnt + 1; end if(wr_cnt < 8192) begin $fwrite(fp, "%d\n", $signed(adc_dat[wr_cnt])); end end end endmodule ``` 此代码将`adc_dat`数组中的数据逐行写入`adc_export_dat.bin`文件中,每行一个数据,使用十进制格式[^1]。 ### 方法二:使用Tcl过程将波形图导出到txt文件 可以在Modelsim中定义一个Tcl过程`write_sim_data`,并调用该过程将指定波形数据导出到txt文件。示例代码如下: ```tcl proc write_sim_data {env name radix cycle file} { set fid [open $file w] for {set i 0} {$i <= $::now} {incr i [expr $cycle * 1000]} { set str [exa -env $env -radix $radix -time ${i}ps {*}$name] puts $fid $str } close $fid } write_sim_data tb_msdf_dot/msdf_dot_inst { msdf_adder_tree_inst/inst_adder_tree_depth[5]/inst_adder_tree_width[0]/genblk1/msdf_add_0/validArray_0 msdf_adder_tree_inst/inst_adder_tree_depth[5]/inst_adder_tree_width[0]/genblk1/msdf_add_0/dataOutArray_0 } unsigned 10 waveform_mult.txt ``` 这里定义了`write_sim_data`过程,它接受查找对象路径`env`、需要导出的变量列表`name`、进制`radix`、钟周期`cycle`和输出文件`file`作为参数,将指定变量在不同间点的值写入文件中[^2]。 ### 方法三:使用Tcl命令导出仿真数据到txt文件 直接使用Tcl命令导出仿真数据到txt文件,各参数含义如下: - `env`:指定查找对象名称的路径,如`top_tb/top_u`。 - `name`:需要导出的变量列表,如`{I_reset_n R_data_cnt}`。 - `radix`:进制,可选值有`ascii`、`binary`、`decimal`、`hexadecimal`、`unsigned`等。 - `cycle`:钟周期,单位为ns。 - `file`:输出文件,如`./1.txt`。 例如,若要导出特定变量数据到`./1.txt`文件,可根据实际情况设置参数并执行相应的Tcl命令[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值