目录
1:什么是linkformodelsim2:linkformodelsim的安装与设置3:使用linkformodelsim仿真的实例什么是linkformodelsim
Linkformodelsim是一个联合仿真的接口,它将MathWorks工具整合到EDA工作环境中,使其应用于FPGA和ASIC的开发。这个接口在HDL仿真器ModelSimSE/PE于MathWorks的产品Matlab和SimuLink间提供了一个双向连接,以指导硬件的设计验证和联合仿真。这种整合可以分别充分发挥Matlab/SimuLink和ModelSim各自的优势。1.联合仿真环境
LinkforModelSim是一个客户/服务器的车是平台和联合仿真应用,ModelSim在这个仿真环境中所起的作用取决于ModelSim与Matlab还是SimuLink连接,本说明只讲ModelSim与Matlab的连接。a.ModelSim与Matlab连接
当与Matlab相连接时,ModelSim作为客户端,如下图所示:
在这个模式中,Matlab服务器等到ModelSim客户端发出的服务请求,当接收到一个请求时,Matlab建立一个通信连接,而且调用一个指定的Matlab函数,这个函数封装了用于计算数据以验证或者使当前在ModelSim中仿真的HDL模型的可视化。下图显示了在一个测试平台环境中Matlab函数如何与ModelSim进行通信
Matlab服务器可以用于多个HDL实体之间的联合仿真,但是你必须为多个HDL实体指定一个通信方式使他们可以相互通信,下图显示了两个ModelSim客户端如何连接到服务器的TCP/IP的4449端口:
回到目录
2.通信模式
在ModelSim和Matlab之间的通信模式有共享内存和网络两种,当你的ModelSim和MatLab运行与同一个系统的时候,可以指定为共享内存方式和网络方式,但共享内存方式更加合适,其也是默认的方式。
网络方式的应用范围更加广泛,它可以应用于单系统和网络环境,对于有增长潜力的系统它更加适合。
使用linkformodelsim的过程
1.安装和设置
a.确定应用环境要求b.对配置作出决定
c.如为网络环境,则识别出服务器d.选择TCP/IP端口e.检查产品要求
f.安装相关应用软件g.安装Linkformodelsimh.设置modelsim
Linkformodelsim的安装与设置
当所有要求的软件都已经安装好了以后,你就可以安装modelsim,使它可以与Matlab或simulink一起工作,你可以立即完成或者稍后在完成这份工作。为配置ModelSim使它可以与LinkforModelSim一起工作,作为安装的以部分,可以使用Matlab函数setupmodelsim.setupmodelsim函数为Modelsim仿真器注册一个新的Matlab和Simulink相关的Tcl令,通过在Modelsim安装目录中创建文件...\cl\\ModelSimTclFunctionsForMATLAB.tcl。注意,setupmodelsim并不选择所配置的Modelsim为使用vsim命令时的默认仿真器。
你可以使用setupmodelsim命令用交互式或者命令行的方式,交互式的方式显示小心和提示。命令行的方式在教本方式下可以使用,以下为如何使用交互式方式:1.在matlab命令提示符或键入:
Setupmodelsim
又或者你可以指定属性名称和属性值‘action’,‘install’
安装教本提示你确认你相为Linkformodelsim安装的Modelsim的版本
IdentifytheModelSiminstallationtobeconfiguredforMATLABandSimulink
DoyouwantsetupmodelsimtolocateinstalledModelSimexecutables[y]/n?n
2.指定一个已经安装的modelsim版本,如果你想明确指定已经安装的modelsim的路径的
话,可以键入n,命令提示符提示你输入一个明确的路径PleaseenterthepathtoyourModelSimexecutablefile(modelsim.exeorvsim.exe):
回到目录如果你希望setupmodelsim定位和显示所有已经安装的modelsim的版本,键入y或者直接按enter键,函数将搜索已经安装的modelsim版本而且显示如下:SelectaModelSiminstallation:[1]d:\\Modeltech_6.1b\\win32[0]None
ModelSimSE6.1b
SelectedModelsiminstallation:
3.根据第2步得到得信息,键入完整得Modelsim或者vsim可执行文件得路径,或者从列
表中选择一个已经搜索到得版本,键入1。函数将修改已经安装的文件,并显示如下:PreviousMATLABstartupfilefoundinthisinstallationofModelSim:d:\\Modeltech_6.1b\\win32\\..\cl\\ModelSimTclFunctionsForMATLAB.tclDoyouwanttoreplacethisfile[y]/n?y是否替代已经安装得文件?y是,n否。
ModelsimsuccessfullyconfiguredforMATLABandSimulink
仿真实例
一:加法器的仿真
本实例假设已经安装了linkformodelsim和相关的软件。1.加法器的verilog代码入下:moduleadd8(sum,cout,a,b,cin);output[7:0]sum;outputcout;input[7:0]a,b;inputcin;
assign{cout,sum}=a+b+cin;endmodule
2.在使用linkformodelsim仿真时,你必须建立一个满足仿真要求的Matlab函数,在此例中,函数的代码如下:
function[iport,tnext]=add8(oport,tnow,portinfo)persistentodata;persistentinc;tnext=[];
iport=struct();ifisempty(odata)
inc=0;end
tnext=tnow+1e8;%下次modelsim调用matlab函数的时间,距开始的时间,以秒为单位a=int8(10+40*rand(1));%tnow为这次mdoelsim调用matlab函数的时间b=int8(10+40*rand(1));cin=randint(1);
iport.a=dec2bin(a,8);
回到目录iport.b=dec2bin(b,8);iport.cin=dec2bin(cin,1);
odata.a(inc+1)=a;odata.b(inc+1)=b;odata.cin(inc+1)=cin;odata.dout(inc+1)=mvl2dec(oport.sum);odata.cout(inc+1)=mvl2dec(oport.cout);if(inc==50)
fori=1:50
x=[odata.a(i),odata.b(i),odata.cin(i);odata.dout(i),odata.cout(i),0];disp(i);disp(x);
end
end
inc=inc+1;函数说明:
a.function[iport,tnext]=add8(oport,tnow,portinfo),指定函数名和相关的参数。这个函
数定义了matlab与modelsim相互通信的通道,当定义函数时应考虑以下几点:(1).默认情况下,linkformodelsim假设matlab函数名与VHDL实体名相同,你也可以明确指定与当前仿关的matlab函数名。
(2).函数必须包括2个输出参数,iport,tnext,3个输入参数oport,tnow,portinfo。注意参数的名字可以不同。以下简要说明各个参数的意义:
Iport:指定VHDL实体的输入端口,并可以对其赋值。如上例中
iport.a=dec2bin(a,8);指定Verilog实体中的a赋值为随机数a转化为的8位二进制数iport.b=dec2bin(b,8);指定verilog实体中的b赋值为随机数b转化为的8位二进制数
iport.cin=dec2bin(cin,1);指定verilog实体中的进位cin为随机数cin转化为的1位二进制。Tnext:指定下次回调matlab函数的时间(距仿真开始时),默认单位位秒,如tnext=tnow+1e8;指定下次回调matlab函数的时间为距这次调用matlab函数1e8秒。Oport:接收VHDL实体的输出端口的输出值,如:
odata.dout(inc+1)=mvl2dec(oport.sum);dout等于输出端口sum的输出值odata.cout(inc+1)=mvl2dec(oport.cout);cout等于输出端口cout的输出值tnow:此次回调matlab函数的时间
portinfo:第一次调用matlab函数时返回端口的信息。(3):注意,输出参数,iport,tnext必须被初始化为空值。tnext=[];
iport=struct();
因为每次都重新开始调用函数,所以一定要用persistent或者global变量类型保存每次所获得的值。
(4):注意,为VHDL实体定义的数据端口的类型,由matlab输入的数据必须转化为HDL模型可以接收的数据,如:iport.a=dec2bin(a,8);将a转化为8位二进制。
从HDL模型中得到的输出也必须转换位matlab中可以比较的数据,以便于输出,比较。如
回到目录
odata.dout(inc+1)=mvl2dec(oport.sum);将sum端口的输出值转化为十进制。详细资料可以参考matlab帮助文档。
(5):显示输出结果,便于分析模型的正确性。3.将以上两个文件一道一个有写权限的文件夹。此例中将他们移到D:\\simulate\\MyPlayerArea4.启动matlab程序,改变当前工作目录为刚才所建立的目录
5.建立连接:在matlab命令窗口中输入hdldaemon命令,建立连接。(a).hdldaemon(‘status’)显示当前连接的情况,如:没有连接的情况hdldaemon('status')
HDLDaemonisNOTrunning
b:建立连接,默认为共享内存方式>>hdldaemon
HDLDaemonsharedmemoryserverisrunningwith0connections>>hdldaemon('status')
HDLDaemonsharedmemoryserverisrunningwith0connectionsc:建立连接,以网络模式进行通信,端口好为4999。>>hdldaemon('socket','4999')
HDLDaemonsocketserverisrunningonport4999with0connections>>hdldaemon('status')
HDLDaemonsocketserverisrunningonport4999with0connections>>
6.启动modelsim.
在命令窗口中输入vsim
vsim('PropertyName','PropertyValue'...)vsim的参数名和参数值:
当你使用这个命令启动modelsim仿真器以后,你可以使用modelsim命令行的方式,加载将要使用matlab或者simulink仿真的VHDL实体;
使用wrapverilog命令封装verilog代码。和编译vhdl实体(详见wrapverilog和vcom)propertyName和propertyvalue允许你自定义tcl命令以启动modelsim,如使用哪个vsim可执行文件,存储开始时执行命令的DO文件的路径和名字,和对于simulink,具体的通信模式。所用属性名和属性值对:
'tclstart','tcl_commands'
指定一个或者多个tcl命令,在modelsim启动后执行。'vsimdir','pathname'
指定所使用modelsim程序的版本和其路径。'startupfile','pathname'指定DO文件的路径和名称例如:
vsim('tclstart','vsimmatlabwork.parse;matlabtbparse10ns-socket4449')
7.启动modelsim后,建立一个新的新的工程,vlibwork,建立一个新的工程名位work,显示如下。
回到目录
8.编译verilog代码vlogadd8.v编译add8.vverilog文件,显示如上。9.将add8verilog模块封装为vhdl实体。
使用wrapverilog–nocompileadd8命令将上步得到的add8模块封装为vhdl实体,nocompile参数指明在封装的时候不进行编译,此命令得到add8_wrap.vhd文件9.编译add8_wrap.vhd文件。
vcom–performdefaultbindingadd8_wrap.vhd,运行此命令后显示如上。10.加载需要仿真的VHDL实体vsimmatlabadd8_wrap
11.初始化测试平台,为当前的仿真。
matlabtbadd8_wrapmfuncadd8,初始化测试平台,指定回调的matlab函数为add8.12.初始化时钟信号和其它信号,在此例中不用,详见matlab帮助文档。13.启动仿真run10000
回到目录
此命令指示modelsim仿真10000个时间单元(10000ns,使用默认的时间周期)
14.分析结果。
在matlab中得到的显示为
由以上可以看到,此加法器的逻辑时正确的,输出的结果比输入延时一个时钟周期。
回到目录