热度 12
2015-4-9 23:03
2226 次阅读|
4 个评论
在进行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 data_in, output reg 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 data_in; wire 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 data_mem ; //定义一个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。