ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SIMULINK模型自动生成Verilog代码

2022-02-25 14:57:59  阅读:385  来源: 互联网

标签:代码生成 SIMULINK 代码 点击 Verilog 设置 HDL 模型


SIMULINK模型自动生成Verilog代码的关键,主要有两部分:1、Verilog代码生成方法。2、根据芯片实际可用资源调整模型结构。其中第二点尤为重要,笔者之前曾因为模型生成的代码过多,超过芯片可用资源而导致程序在芯片上编译失败。接下来我从这两方面来介绍Verilog自动生成。

一、Verilog代码生成方法

 1、代码生成前参数设置

在使用HDL Coder转换代码之前,需要对一些参数和环境进行设置,保证后续Verilog代码正常生成。

使用HDL Coder转换代码需要先将待转换模型封装为一个系统,具体做法是,选中全部待转换部分,单击鼠标右键,点击Create Subsystem from Selection,即可生成一个Subsystem,双击名称,即完成封装。

此外,还需要配置模型参数。在Simulink的主页面点击Simulation,点击Model Configuration Param,进行参数配置。首先选中Solver,将Simulation time仿真时间的Stop time设置为10,将Solver options的Type设置为Fixed-step,将Solver设置为discrete(no continuous states),然后点击Hardware Implementation,将Device vendor设置为ASIC/FPGA,最后点击OK保存,至此完成模型参数配置。

2、关联编译软件

HDL Coder代码生成需要结合具体的FPGA编译软件,这就需要Simulink与PFGA编译软件进行关联。在MATLAB中运行如下命令:hdlsetuptoolpath ('ToolName','Xilinx Vivado','ToolPath','E:\Xilinx\Vivado\2018.3\bin\vivado.bat')。其中ToolName是代码编译的工程软件,Xilinx的编译软件有ISE、Vivado等,具体的软件还需要根据具体的开发板确定。本文使用Vivado编译软件。ToolPath是编译软件的安装路径,其它具体信息可以参考hdlsetuptoolpath的帮助文档。

3、HDL Coder代码生成

完成上述设置后,点击Simulink主页面上的Code,在弹出小窗中点击HDL Code,再选择HDL Workflow Advisor。之后会弹出一个System Selector的窗口,需要在这里选择代码转换的模型系统。打开待转换模型所在总文件,选择待转换模型,点击OK,等待片刻之后,便打开了HDL Coder代码生成的HDL Workflow Advisor窗口,如图 1所示。整个进程分为3个部分,分别是设定目标、为HDL代码生成准备模型以及HDL代码生成。第一部分主要是对将要生成的一些代码进行参数设定,包括开发板型号,时钟频率等等;第二部分是生成用作代码转换的模型;第三步是根据模型生成代码。若要得到可用的Verilog代码,需要完整通过这三个进程。

图1

首先双击Set Target,点击Set Target Device and Synthesis Tool,打开界面,在这里选择程序编译软件以及具体的开发板,用于分析开发板可用资源是否够用。在右边Synthesis tool处,选择仿真软件;在Family、Package和Speed处选择目标芯片的参数;在Project folder处修改至指定项目工作夹,最后点击Run This Task。完成这一步后,页面左侧会出现第四部分,是关于FPGA综合与分析,分析该开发板资源情况是否符合要求。

之后是1.2 Set Target Frequency,在这里设置目标频率。根据开发板的资料,设置时钟频率,设置完成后,点击Apply,点击Run This Task,完成频率设置。

第二部分Prepare Model For HDL Code Generation是为HDL代码生成准备模型,没有需要特别设置的地方,只需要右击标题,点击Run All即可。

第三部分是HDL代码生成,在这里需要对生成的代码做进一步要求。3.1是设置代码生成选项,在Set Basic Options中,主要是设置生成的语言形式,本文是基于Verilog开发的,故选择Verilog。Set Advanced Options是进行一些高级设置,在此处,要注意将Reset asserted level设置为Active-low,表示复位信号采用低电平有效,其余设置默认即可。Set Optimization Options部分为优化设置,这里不需要特别修改,默认即可。3.1.4的Set Testbench Options是设置仿真测试的选项,点击打开后,在Test Bench Generation Output中,勾选HDL test bench和Cosimulation model,其余默认不用修改,点击Apply即可。3.2是生成RTL代码和测试台,打开后在Input Paramenters中勾选Generate RTL code和Generate test bench,然后点击Apply。3.3. Verify with HDL Cosimulation不需要设置修改。最后右键点击3. HDL Code Generation,选择Run All即可。此处需要几分钟的运行时间,完成后已经生成了Verilog代码,可选择相应文件打开。若3.3处出现报错如‘Failed Cannot connect to 'ModelSim' HDL simulator.’,是因为Simulink没有与Modelsim建立联系,在这里直接选择Skip this task,再重新Run This Task,直接忽略错误即可。

第四步是FPGA综合与分析,用于验证生成的代码的具体资源占用情况,并与开发板可用资源做对比,验证该开发板能否完成代码的正常运行。此处不需要进行特殊设置,直接鼠标右键点击4.FPGA Synthesis and Analysis,选择Run All即可。此处分析时间较长。

HDL Coder代码自动生成的过程中,需要左侧四个部分全部出现绿色标记,表示顺利完成代码生成以及开发板资源情况分析。如果只完成到第三步,而在第四步报错,则表示Verilog代码已经生成,但是步骤一选定的开发板不能实现代码编译,需要对模型再次调整。当左侧各项全部通过后,具体如图2所示,则表示HDL Coder代码转换全部完成。此时可返回到前文设置的代码生成文件夹,打开工程文件,可以看到模型转换后的Verilog代码。

 图2

二、模型结构调整

模型代码转换失败,通常是因为数据类型、程序包过大引起的,现在开始介绍这方面问题的解决办法。

1、模型输入输出接口调整

笔者发现,在模型(特别是复杂模型)转换生成代码后后,模型内部程序代码可读性很差,因此一定要合理设置模型的输入输出,后续调用程序时,只需要给定输入,获取输出即可,这方面因要求而已,就不再赘述。

2、数据格式调整

模型中的数据格式直接影响到模型的代码转换,因此也需要做出细致调整。首先需要在Simulink的主页面中,点击左上角的Display,再点击Signal & Ports,选中Signal Dimensions,以显示传输过程中数据的长度;再点击Display、Signal & Ports,选中Port Data Types以显示具体的数据类型,方便后续观察数据类型并依此进行调整。

在模拟输入信号部分,因为使用MATLAB Function无法调整数据输出格式,默认输出为Double型,为此使用Data Type Conversion模块对数据格式强制转换。双击打开Data Type Conversion模块,将输出数据格式Output data type设置为fixdt(1,16,0),将数据总长度Word length设置为32位,将小数部分长度Fraction length设置为16位,并在末尾选中Saturate on integer overflow,点击OK即可。这样,输出数据就被调整为32位,其中1个符号位,16个小数位。

对于Gain模块,将Signal Attributes中的Output data type和Parameter Attributes中的Parameter data type的数据类型也按照Data Type Conversion中的设置方法进行调整,还包括其他模块的Output data type,都按照这样的格式进行调整。

3、模型计算量调整

调整模型的整体计算量是笔者的一大难点,在生成代码的过程中,在很长一段时间内都出现了需求资源超过开发板可用资源的情况。如何在保证精度的情况下,尽量减小整体计算量以适应开发板完成模型算法,这就需要对模型进行多处调整。

第一,预估数据大小,调整数据位数大小。对于输入数据,这里使用的是AD采集到的数据。根据AD的电压采集范围,笔者使用的AD电压范围是-5~5V,因此整数部分最大为5。根据这一特点,整数部分只需要3位便可达到最大为7的表示范围,因此,将Data Type Conversion输出数据格式调整为20位,其中16个小数位。而对于Constant中的数据,最大为19.5,因此需要5个整数位,将输出数据格式调整为22位,其中16个小数位。同理,经过计算,其他部分的数据的整数位都不超过7,为此,其他数据输出全部调整为20位,其中16个小数位。

第二,模型中尽量不要用到根号。笔者也不清楚FPGA中的运算方式,为了防止增大计算量,所有根号都使用小数表示,精确到6位小数即可。还需要注意的是,常数模块Constant中的Sample time默认为Inf,表示采样时间为无穷大,不满足FPGA资源有限的条件,因此,此处将其设置为2即可。

第三,模型中若有三角函数计算,更需要做调整。对于Trigonometric Function形式的三角函数,它采用迭代的方式进行计算,默认进行11次迭代运算。但是运算量极大,远远超过开发板的可用资源。如果将迭代次数减小到足够小以至于能够完成代码转换的时候,它的精度变得很差,为此,这个三角函数模块不能使用。之后,笔者尝试过根据泰勒展开式,自己使用基础模块搭建模型计算三角函数,但计算量更大,无法满足条件。后来采用查表法,使用Sine HDL Optimized和Cosine HDL Optimized模块,将Number of data points设置为64点,将Table data type设置为fixdt(1,16,0),将数据总长度Word length设置为19位,将小数部分长度Fraction length设置为16位,点击OK保存。

至此,笔者模型修改已经完成,成功生成代码。

以上就是笔者之前使用HDL Coder时积累到的经验和方法。鉴于笔者能力有限,若有错误可在评论区指出,感谢各位的支持和理解。

标签:代码生成,SIMULINK,代码,点击,Verilog,设置,HDL,模型
来源: https://blog.csdn.net/m0_53229736/article/details/123131988

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有