原创 matlab和modesim的一种读写交互方式(通过txt文件)

2015-4-9 23:03 2223 8 12 分类: FPGA/CPLD 文集: modesim&tcl&perl

在进行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);
 
数据波形如下:
111111.jpg
 
 
第二步:简单的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));
 
2222.jpg
 
 
 
 
 
 

下面总结下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。

 
PARTNER CONTENT

文章评论4条评论)

登录后参与讨论

用户1715035 2015-4-19 00:43

嗯,应该是有问题的,但是modesim没有提示哦,写258是因为考虑到fpga程序有延迟,想把所有的数全部数出来

用户1833837 2015-4-16 14:04

好文章,谢谢分享

用户1377758 2015-4-16 08:58

好文

用户1816999 2015-4-14 00:17

博主,我想问一下,data_men存储器只有256×8大小,而下标i确实记录到0-258,不会出现地址读写错误?
相关推荐阅读
用户1715035 2015-05-18 10:41
The art of counting in fpga(2)
接前面,居然一篇放不下--------------------------------------------------------------------------------- Cus...
用户1715035 2015-05-18 10:40
The art of counting in fpga(1)
转载至fpga4fun,觉得对重新理解fpga很好,而且从来没有在中文网站上看到这种东西,而且讲的通俗易懂,以后多看点英文网站。先转下来备忘,从以前的一个自己的博客上转载过来的。。 (1)Bi...
用户1715035 2015-04-25 18:13
多相抽取fir滤波器的fpga仿真实现
今天仿真了下多相抽取滤波器的仿真实现,其原理其实很简单就是根据抽取的原则,将fir滤波器的系统函数分解,称之为多相,所以又叫多相抽取滤波器。 一、原理如下图:   系统实现函数为...
用户1715035 2015-04-20 16:20
fir 滤波器的matlab实现和modesim实现仿真对比
本测试主要是为了测试fir滤波器在matlab和modesim中有什么不同。。 用的fir滤波器都是8阶直接,而且信号处理过程也是一模一样。 第一步:以matlab为原型,现在matla中...
用户1715035 2015-04-19 00:29
直接型iir滤波器的matlab实现和modesim仿真对比
本文测试直接I型的IIr低通滤波器在matlab中和在fpga实现中有什么不同。。 为了看的清楚写的简略,可以参考后面贴的代码 第一步:产生两个信号源,采样率fs =1000hz,单频信号...
EE直播间
更多
我要评论
4
8
关闭 站长推荐上一条 /3 下一条