在本文中,提出了一种基于模拟MATLAB /SIMULINK®模型转换为C代码的模数混合信号建模方法,以及实际案例研究。
现代电子模块的发展需要更合适的工具来促进其早期原型。今天的混合模拟/数字系统需要基于不同模拟和数字仿真工具之间的协同仿真的仿真平台,由于需要在它们之间进行连续的数据传输,因此成本更高,计算时间更慢。
在本文中,提出了一种基于模拟MATLAB /SIMULINK®模型转换为C代码的模数混合信号建模方法,以及实际案例研究。
此方法的目标是创建一个交互式模拟器,操作系统独立,能够运行时间有效的混合A / D信号仿真。
C代码(用于模拟模块)与VHDL/Verilog代码(用于数字核心)的集成消除了协同仿真的需要,从而降低了模型复杂性、成本并提高了代码的可移植性。
在目前的工作中,一个完整的发光二极管(LED)驱动模块的模型被复制。其模拟部分最初在Matlab/Simulink中建模,而数字核心用其相关的VHDL代码表示。实现了一个外部串行外设接口(SPI)模块的模型,向驱动程序发送数字命令,从而模拟虚拟单片机的控制。
所有这些都实现了一个“交互式的”用户友好的web图形用户界面(GUI),从而使改变几个系统参数和修改设备设置,同时模拟运行。显然,该工具的工作方式就像一个“实时数据表”,允许在动态条件下分析设备模型,以及虚拟微控制器发送的输入和数字命令的变化。它可以大量用于客户支持、营销活动、负载兼容性定义和设计支持。
在具体的案例中,最终生成的数字代码是为Modelsim®建立的,然后成功地用NCSim®测试,以证明该方法与数字模拟器的独立性。
关键词:Matlab、Simulink、Modelsim、NCSim、Simulink编码器、VHDL(超高速集成电路硬件描述语言)、Verilog、协同仿真、交互建模、代码转换、外语接口(FLI)、Verilog编程语言接口(PLI)。
在EDA Simulator Link®的支持下,可以在Matlab或Simulink环境中模拟混合模式A/D模型,该模拟器提供了与Mentor Graphics®、Cadence®和Synopsys®的商业HDL模拟器的联合仿真接口。Matlab代码或Simulink模型也可以用作由设计者提供的HDL模块产生刺激的测试平台,并用于分析仿真结果。通信接口可以是双向的,Matlab/Simulink-HDL模块可以闭环连接。
通过这种方式,任何混合A/D模型都可以进行虚拟模拟,开发模拟部分的模型,并将其与数字部分的HDL模块进行接口(图1)。
该解决方案的优点是突出阶段的高灵活性。在另一侧,必须为第三方用户提供在Matlab / Simulink + Toolbox(至少EDA Simulink Link)和兼容的HDL模拟器上组成的完整仿真环境。使用上述工具的大大降低成本和复杂性的一种方法是编译模拟Simulink部件并将它们集成在HDL模拟器中。
对于给定的A / D系统,所提出的建模工作流程如下:
现代HDL模拟器可以通过外部接口将外语代码(例如C. C / C ++)集成到行为模块描述。此外,可以在VHDL体系结构内实现C子程序,并将其与Verilog模块集成,反之亦然。
VHDL C接口通常称为外语界面(FLI)或VHDL程序界面(VHPI);FLI和VHPI实现依赖于HDL模拟器,通常用自己的参考手册中描述。相反,Verilog编程语言界面(PLI)是标准的程序界面,由IEEE 1364-2005语言参考手册和许多第三部分描述。
Simulink Coder™(以前的Real-Time Workshop®)是Mathworks®的一个应用程序,它从Simulink图、Stateflow®图和MATLAB函数生成和执行C和c++代码。
它自动构建用于大多数Simulink块的实时或独立非实时仿真的模块,以及许多MathWorks产品(图2)。
生成的源代码与原始MATLAB/Simulink的功能行为匹配,保真度高。
在“代码生成”窗格中选择“通用实时目标”(GRT)选项,一旦代码生成完成,在“XGRT_RTW”目录中生成几个C / C ++文件(其中'X'是型号名称)。生成文件的数量和大小取决于模型复杂性。
'x.c'是实现模型的独立C代码。
来自MATLAB安装路径的其他文件也用于代码生成和执行。
特别是,文件'grt_main.c'包含用于初始化所有变量的主例程,分配内存,调用实现模型的功能例程并终止程序。
为了简化上述过程,选择“GRT目标”的“创建Visual C / C ++解决方案文件”项目文件,从而引用所有必需的C / C ++文件和设置,并准备在Visual Studio中导入。
根据Modelsim FLI规范,需要修改使用VHDL,Visual Studio项目和“GRT_MAIN.c”文件的生成的代码。
在开始创建FLI应用程序之前,必须更好地澄清以下额外的概念。
外来VHDL架构是一种设计单元,它在设计中实例化,但不(一般)包含任何VHDL代码。更有可能是通过外架架构的端口与其余设计通信的C模型的链接。
FLI例程是C功能,提供模型技术的HDL模拟器中的信息的程序访问,如Modelsim。用户写入应用程序可以使用这些函数来遍历HDL设计的层次结构,获取有关设计中的VHDL对象的值并设置VHDL对象的值,获取有关模拟和控制模拟运行的信息。标题文件'MTI.h'实现了FLI应用程序可以使用的所有功能和类型,并且必须包含在修改后的“GRT_MAIN.c”中。
当模拟器启动时,它首先经历一个细化阶段,在此阶段中整个设计被加载、连接和初始值被设置。在此阶段,将加载所有外部共享库,并执行所有外部体系结构的初始化函数。
当执行第一个运行命令并继续执行QUIT或RESTART命令之前,仿真阶段开始。执行重新启动命令时,模拟器再次通过其精制阶段。
为了在C模型中使用外语接口,VHDL体系结构必须首先使用合适的foreign属性创建和编译,该属性包含初始化函数的名称(' app_init ')和要加载的共享对象文件的路径(' app.so ')。
ModelSIM FLI的C侧的第1步是根据以下步骤修改Visual Studio项目中的配置参数:
下一步是根据初始化FLI函数的声明修改' grt_main.c '中的主函数。
这个解决方案的缺点是它使用了特定的专有功能(Mentor, Cadence, Synopsys…),然后它只适用于该专有功能。为了用另一个数字模拟器模拟相同的系统,需要基于模拟器参考编写不同的FLI或VHPI(由于缺乏FLI/VHPI标准化)。下面是一个基于verilog PLI的替代解决方案,它适用于几乎所有数字模拟器。
PLI的C侧的第1步是根据以下步骤修改Visual Studio项目中的配置参数:
'-export:vlog_startup_routines'以“其他选项”。
第二步是在Verilog Simulator执行'$ app_vpi'系统任务时,编写C语言的“CallTF”例程。
创建一个新的PLI应用程序的第三步是通知Verilog模拟器关于新的系统任务或系统函数名和C例程与应用程序相关联(' register '例程)。
可以定义一个compiletf例程来验证系统任务或系统函数是否被正确使用,参数类型是否正确。
最后,' app_interface '例程(在' calltf '中定义)读取输入,调用' grt_main.c '中包含的C模型' rt_onestep ',并将输出写入Verilog信号。
已采用上述呈现的程序来开发模拟环境,包括STMicroelectronics智能电源和用于汽车应用的智能电力模型设备。在特定的测试用例中,已经再现了LED驱动器L99LD01的应用示意图,包括外部电路(图3)。
最初,整个仿真原理图是在MATLAB / SIMULINK(+SIMPOWERSYSTEMS®+ EDA模拟器链路中)开发的。数字核心由Modelsim共同模拟。
在另一步骤中,已经通过Simulink编码器和编译生成相关的C代码。同时,已经实现了合适的PLI界面。
PLI接口最初是为Modelsim环境设计的,在Linux/Sun环境下用NCSim进行了成功的测试。与VHPI相比,PLI的速度更快,对内存的要求更低;此外,它适用于几乎每一个数字模拟器能够运行混合VHDL/Verilog模拟。
由于PLI界面,可以在模型中的模拟器和NCSim环境中编译模拟器的最终版本。
为了方便这种模拟器的使用,开发了一个web GUI,这样就可以独立于所采用的操作系统,使用在服务器上运行的数字模拟器,并实时修改仿真参数值。最后,该工具就像一个“实时数据表”。web GUI使用了Java语言,这是由于可以使用telnet、ssh或ftp等多种功能。最终用户的唯一先决条件是最终安装java运行时环境,大多数常见操作系统都可以免费使用java运行时环境。
当模拟开始时,Web GUI通过SSH连接到服务器,检查许可证并启动ModelsIM或NCSIM数字工具。参数通过FTP通过文本文件传递给模拟器。每个绘图步骤(例如,例如)模拟器检查参数和绘图值。用户界面的寄存器页面允许用户用作微型,使得发送和接收SPI命令的可能性,强制一些故障,并在显式视图(通过彩色标志)中实时查看结果,或者更详细的视图显示每个寄存器位(图4和图5)。
例如,Vcc1在电压故障下被强制和LED电流设定点值的变化应用(图6)。
由于前一个动作的结果,与VCC1相关的一些标志变为红色,从而指示了涉及此参数的警告或误差以及全局错误标志(GEF)。后一动作导致SPI帧发送用于流过LED链的电流的设定点的每个变化。在图片中,当前设定点(蓝色)以及设备如何行为(以红色)都是可见的。
在另一个窗口(SPI接口)中,记录所有SPI帧,并且可以在特定时间(图7)发送批次SPI帧序列。
对商用意法半导体L99LD01高效恒流LED驱动器进行了A/D混合模式仿真,将Simulink模拟部分转换为C语言,并通过VHDL/Verilog外部C语言体系结构将其与数字模拟器连接。有了这种独特的混合信号仿真环境,仅基于Modelsim或NCSim数字工具,用户就可以模拟A/D混合模型。
完全独立环境的解决方案正在评估。为此,除了模拟零件模型转换为代码(例如C / C ++)之外,还可以在独立文件中编译和执行,并且还需要在同一语言中进行VHDL / Verilog代码转换。目前L99ld01数字代码已手动转换为嵌入式MATLAB函数,从此转换为C代码,然后与模拟部分相关的C代码集成。VHDL / Verilog代码的转换是整个过程的真正瓶颈。自动工具可以代表在独立格式中开发A / D混合模式模拟器的方向的巨大改进。