当前位置:首页 > link - for - modelsim - 的简易用法
本内容涉及到一些matlab与modelsim连接的方法。首先说说我对于link for modelsim 的理解。首先matlab对于数据处理的方面有无可比拟的优越性,而modelsim应用于verilog语言和VHDL语言的仿真。有时候会遇到这样一些情况:我们仿真的输入数据很是复杂,比如是一个加入了杂散的高频的信号,我们用Verilog语言编写test bench 的话则很是复杂,但是用matlab产生的话就相对简单了许多。基于这种想法我在matlab帮助文件中输入link for modelsim,得到了一些启示。在这里与大家分享一下 1、 软件的下载于匹配
下载好的完整的matlab中有link for modelsim的功能的。对于匹配问题,开始我的matlab是2010a,modelsim是modelsim SE 6.4。结果运行的时候出现版本不匹配的错误。我又按照要求下载了modelsim SE 6.5结果可以用的。怎么确定你的matlab对应的modelsim版本,首先你在你的matlab中输入,demo然后在搜索框中输入link for modelsim。有这样的一个NOTE.。
如果modelsim不匹配的话建议在官网上下载一个,然后找一个破解文件就可以了。
2、 新建一个文件夹用来存放matlab函数和modelsim工程。文件夹的目录中不要有汉字。
把写好的matlab函数保存到已经建立的文件夹中,在这里我写的一个小程序,函数名为add1.m。
3、 建立一个连接端口。首先打开你的matlab软件,输入hdldaemon('status'),因为连接点还
没有建立,matlab显示HDLDaemon is NOT running。我们用hdldaemon('socket', 0),这个命令来建立一个连接。运行后显示HDLDaemon socket server is running on port 2325 with 0 connections。表示连接点已经建立端口号为2325,但是还没有和modelsim连接。要记住2325这个数字,后面的命令中还要用到的。
4、 在modelsim中输入vsim命令来打开你的modelsim。建立你的modelsim工程并保存在
步骤2中的文件夹中。在这里我的verilog程序为add1.v。
5、 建立matlab和modelsim的连接。在modelsim的命令行中输入vsimmatlab modsimrand,
其中modsimrand为你要仿真的块,在此实验中为add1,此时modelsim命令行窗口中会显示如下的信息。
接着输入以下的命令:
matlabtb add1 -mfunc add1 -rising /add1/clk -socket 2325
这里的 第一个add1 表示你的modelsim文件的实体名上面说过了,我的函数名为add1
-mfunc add1 表示matlab函数的名为add1 我的matlab函数名同样为add1 -rising/add1/clk 那么这个又是表示什么意思呢,这个表示在modelsim的实体的clk信号为上升沿的时候来调用我的matlab函数。
-socket 2325 这个表示连接到我们在第三步中建立的端口。
此时你在matlab中输入hdldaemon('status'),就会显示已经连接。 6、 设置verilog文件中的clk,rst 在modelsim中输入命令
force /add1/clk 0 0,1 5 ns -repeat 10 ns
表示零刻度出clk的值为0,一刻度出的值为5ns,每10ns重复 force /add1/rst 1 0, 0 50 ns同上 view wave 显示波形 add wave *加入输入输出 run 10000ns运行程序
此时你就会在你的modelsim的窗口中看到图形了。 下面介绍一下matlab及modelsim的文件的编写。
function [iport,tnext] = add1(oport, tnow, portinfo) %UNTITLED Summary of this function goes here % Detailed explanation goes here
tnext=[];
iport = struct(); persistent x; if isempty(x) x=0; else x=x+0.01; end %y=sin(x);
y=round(sin(x)*100); iport.addin=dec2mvl(y,16); end
这个函数的功能是将每隔0.01rad的sin的值输出作为verliog模块的输入。 第一行的函数定义比较有讲究
function [iport,tnext] = add1(oport, tnow, portinfo) oprt对应modelsim模块的输出。 tnow这一时刻调用函数的时间。
Portinfo第一次函数调用时传达的参数 Tnext下一次调用matlab函数的时间 Iport对应modelsim模块的输入
如果做一些简单的函数调用的话用不到tnow和tnext,我们可以用modelsim中 -rising/add1/clk这部分的设置来进行matlab函数调用。其中portinfo也很少用,看看matlab中的link for modelsim文件。
tnext=[];
iport = struct();
对输出的两个参数进行初始化,大家应该注意到初始化iport的时候用的是
struct()这个类似于C中的结构体。比如,你的verilog模块中有很多的输入 iport.addin就表示名为addin的输入。这样就可以对你单个的输入进行控制。
persistent x;要把x定义为静态变量,因为你要很多次调用函数。对于静态变量的初始化使用
if isempty(x) x=0; else x=x+0.01; end
不晓得能看明白不
iport.addin=dec2mvl(y,16);
这个也很重要,涉及到数据类型的转换,我们要把数据按一定的位数输出。这里我们把y作为16位输出的。 下面看一下verilog函数
module add1(clk,rst,addin,addout); input clk,rst;
input [15:0] addin; output[15:0] addout; reg [15:0]add1;
always@(posedge clk) begin if(rst) begin
add1=0; end else begin
add1=addin+1; end end
assign addout=add1; endmodule
这个模块是把输入的addin+1,作为输出。简单的模块。
好了,以上是简单的介绍,基于输入很复杂的小应用。如果想更深的研究的话建议看 Matlab帮助,很详细的。
Demo link for matlab,全是英文看了三四天了,才有点收获。
共分享92篇相关文档