此示例使用HDL Cosimulation和FPGA-In-Loop(FIL)仿真来验证包括生成和传统HDL代码的HDL设计。此处使用术语“遗留”来指示可能已从第三方购买或为另一个项目生成的代码,并在此设计中保存重复使用。
该示例中的遗留代码实现了一个有限状态机(FSM),其是用于在无线通信系统中用于无线通信系统的多输入多输出(MIMO)解码器的子模块。大多数MIMO解码器已经在Simulink中开发,HDL代码将由HDL编码器生成。万博1manbetxFSM属于Simulink设计内部。万博1manbetxFSM的遗留代码将与Simulink模型集成,并通过代码生成过程并入FPGA实现。万博1manbetx
该示例将展示设计师或验证工程师如何使用HDL Verifier协同仿真向导将遗留的FSM与Simulink模型集成并验证它。万博1manbetxHDL协同仿真提供了完整的可见性和控制,使代码能够调试和验证。
在成功集成传统FSM之后,Cyimulation块在从Simulink模型生成HDL代码时自动包含传统代码,从而产生了MIMO解码器的完整FPGA实现。万博1manbetx最后,使用FPGA-in--in-in-in循环在实际FPGA上验证整个设计。
使用联合仿真向导将遗留的HDL代码导入Simulink模型万博1manbetx
通过对遗留HDL代码进行共同模拟并将结果与行为模型进行比较来验证它
使用BlackBox中的Cosimulation块生成整个MIMO解码器的HDL代码
使用FPGA-IN--in--in--in--in--in循环验证MIMO解码器
需要并建议运行此示例:
HDL Verifier™
HDL编码器™(推荐用于可选的代码生成步骤)
Communications Toolbox™
上述产品s manbetx 845需要MATLAB®,Simulink®,固定点设计器™。万博1manbetx
此外,对于cosimulation和fpga-in--in-look,您需要以下软件和硬件:
FPGA设计软件
其中的一个万博1manbetx支持的FPGA开发板及配件
使用以太网连接:主机上安装了千兆以太网适配器,千兆以太网交叉电缆
有关使用JTAG的连接:USB Blaster I或II电缆和INTEL FPGA板的驱动程序。Digilent®JTAG电缆和Xilinx FPGA板的驱动器。
MATLAB®和FPGA设计软件可以本地安装在您的计算机上或在网络可访问的设备上。如果使用来自网络的软件,则需要在计算机中安装第二个网络适配器,以便为FPGA开发板提供专用网络。请参阅计算机的硬件和网络指南,了解如何安装网络适配器。
注意:该示例包括代码生成。万博1manbetxSimulink不允许您修改MATLAB安装区域。在启动此示例之前,更改为不在MATLAB安装区域的工作目录。如果您无权访问HDL编码器软件,则可以跳过此示例中的代码生成步骤,并使用为您提供的HDL文件与FIL向导一起使用FPGA-In--in--in--in--in--in.
参考模型是实现的行为的模拟模型。它通常在HDL验证中使用,通过将其与RTL实现实例化,为两者提供相同的输入并进行比较它们的输出。验证中的参考模型的优点是它们可以独立于实现(通常由不同的人)开发,提供了对预期行为的独立验证,它们比实际实现更容易(不需要合成或实际设备时序))它们通常在模拟中快速运行。
在本例中,验证遗留HDL代码的第一步是为设计的那一部分创建一个参考模型。FSM已经这样做了。打开behavioral_mimo模型。双击MIMO解码器子系统,您将看到FSM子系统包含一个实现FSM行为的MATLAB功能块。此参考模型将用于验证FSM的传统HDL代码。
通过执行以下命令将传统的HDL代码文件复制到当前目录:
copyFILDemoFiles ('verical_legacy');
如果您已经熟悉协同模拟向导并希望跳过此步骤,请打开cosim_mimo_mq模型,如果您使用ModelSim或Questa HDL模拟器或cosim_mimo_in.模型如果使用Incisive HDL模拟器并跳转到步骤2。
通过在matlab命令提示符下键入以下内容,调用Cosimulation向导:
CosimWizard.
从下拉列表中选择与Simulink的HDL联合仿真和您首选万博1manbetx的HDL模拟器。如果HDL模拟器不在您的系统路径上,请提供路径并单击Next。
使用CosimWizard的Add按钮添加3个HDL文件,并重新排序列表以在列表顶部的底部和fsmsubsystem_pkg.vhd处放置fsmsubsystem.vhd,以实现正确的编译排序。然后单击“下一步”。
单击以下2面板上的“下一步”以接受默认值并到达输入/输出端口面板。在输入端口列表中,从前3个端口的下拉列表中选择以下端口类型值:
CLK:端口类型=时钟复位:端口类型= reset clk_enable:端口类型=重置
这种端口类型的识别导致协同仿真块在HDL模拟器中强制执行这些信号,而不是要求它们在Simulink图中驱动。万博1manbetx在本例中,我们将clk_enable端口视为协同仿真的另一个重置。在继续下一步之前,类似地为ce_out选择“unused”,使它从联合仿真块中被省略,因为它在Simulink中是不需要的。万博1manbetx
协同仿真向导自动识别HDL代码中的输入和输出,并根据它在那里找到的端口为Simulink创建协同仿真块。万博1manbetx有一些输出端口的细节是它无法从HDL代码中了解的。在HDL代码中,输出只是位的集合,没有任何迹象表明您想在Simulink中如何解释这些位。万博1manbetx您必须告诉协同模拟向导,您希望这些位被看作是有符号的值还是无符号的值,如果它们被解释为定点数字,那么小数点应该放在哪里。
在“输出端口详细信息”面板中,优化每个输出的数据类型。在这种设计的情况下,输出端口将被解释为如下。请注意,传输端口的HDL代码中有多个标量端口(OUT_1,OUT_6,OUT_9,OUT_10,OUT_11,OUT_12):
OUT_1:签名,分数长度=0(4标量港口)OUT_2:无符号,分数长度=0OUT_3:无符号,分数长度=0OUT_4:无符号,分数长度=0out_5:带符号,分数长度=10out_6:带符号,分数长度=10(3个标量港口)out_7:带符号,分数长度=2out_8:无符号,分数长度=0Out_9:签名,分数长度=0(4标量港口)Out_10:签名,分数长度=0(4标量港口)Out_11:签名,分数长度=10(4标量港口)Out_12:签名,分数长度=10(4标量港口)Out_13:无符号,分数长度=0Out_14:签名,分数长度=0
在时钟/重置详细信息面板上设置以下值:
clk时期=10ns., 积极的边缘=不断上升的重置最初的价值=1,持续时间= 27 ns clk_enable最初的价值=0,持续时间= 37 ns
单击“下一步”,进入起始时间对齐面板,并将“HDL启动协同仿真时间(ns)”设置为40。
继续到最后一步,取消“在模拟开始时自动确定时间刻度”的复选框。对于这个例子,我们知道联合仿真的时间尺度应该是1秒,在Simulink中对应10 ns。万博1manbetx在HDL模拟器中。有关在其他设计中使用自动时间刻度设置功能的信息,请参阅HDL验证器文档。设置上述时间刻度并单击Finish。
为了将遗留的HDL代码导入到Simulink模型中,将生成协同仿真块。万博1manbetx您可以将新生成的协同仿真块和2个方便的命令块拖放到Simulink模型中,在fsm子系统块中,并将其连接到fsm子系统的输出端口。万博1manbetx本例提供了一个在MIMO解码器子系统中带有比较器和断言块的协同仿真模型。添加了比较器和断言块,以提醒您嵌入式控制器参考模型的输出和遗留HDL实现之间的任何不匹配。
使用以下命令调整生成的cosimulation块的大小以使其更容易将其插入Cosimulation Model:
set_param('untitled/ fsm子系统','Position',[0 0 16552]); / /设置当前位置
打开Cosim_mimo.模型。将cosimWizard创建的新块和便利命令块拖到协同仿真模型中,替换MIMODecoder子系统中的占位符子系统。
在您的Cosimulation模型中,双击“启动HDL模拟器”块以启动所选的HDL模拟器。单击Simulink中的播放按钮以启动Cosimu万博1manbetxlation并观察Matlab窗口中显示警告消息。由于参考FSM模型与HDL实现之间的差异,这些在输出信号上表示不匹配。
现在您可以使用Simulink和万博1manbetxHDL模拟器调试特性来隔离问题并修复bug。在这种情况下,会出现错误,因为在HDL实现中错过了状态转换弧。注意,在HDL模拟器的波形显示中,FSM状态在仿真中很早就被卡住了。
已为此示例提供更正的HDL代码。使用以下命令将新代码复制到您的工作目录,覆盖嵌入式的坏版本_controller.vhd:
if ('verify_legacy_hdlsrc', 'fixed_hdl', 'Embedded_Controller.vhd'), 'verify_legacy_hdlsrc', 'f');
通过双击“Compile HDL Design”块重新编译遗留HDL代码。如果在上次执行联合仿真之后HDL模拟器仍然打开,则退出HDL模拟器,并重新启动HDL模拟器,然后重播联合仿真。这次你不应该看到错配。
现在,您已经调试和验证了嵌入式控制器的遗留HDL代码,您可以继续使用fpga在环验证整个MIMODecoder。
在使用FPGA in-the- loop之前,请确保您的系统环境已正确设置,以便访问FPGA设计软件。你可以使用这个函数hdlsetuptoolpath将FPGA设计软件添加到当前MATLAB会话的系统路径中。
为了准备FPGA在环模型,合并遗留的HDL代码,并为MIMO解码器的其余部分生成新的HDL代码,您需要做两件事来完成FPGA实现:
编辑Cosimulation模型以删除FSM参考设计
使用HDL Coder Blackbox将遗留HDL合并到模型中以进行代码生成
如果您想跳过编辑和Blackbox步骤,请打开fil_codegen_mimo模型并直接转到步骤3。
如果要遵循使用HDL Blackbox准备HDL代码生成模型的所有步骤,请使用不同的名称保存Cosimulation模型,并继续如下更改模型准备:
1.编辑Cosimulation模型以删除FSM参考设计
在MIMO解码器子系统内部删除嵌入式_Controller功能块
删除驱动Embedded_Controller输入的"from"块,除了enablecoder输入
在输出上删除比较器和断言块
重新连接Cosimulation块输出到DelaysubSystem1的输入
2.使用HDL编码器BlackBox将传统HDL合并到模型中的模型中
选择Cosimulation块和类型Control-G以创建子系统
右键单击新的Cyimulation子系统,然后选择HDL代码和HDL块属性
选择架构= BlackBox
输入fsmsubsystem作为实体名称
确定HDL块属性对话框
保存模型
这一步需要HDL编码器。如果您没有这个软件,您可以使用预生成的HDL文件进行FIL模拟。直接跳到步骤5。使用filWizard进行模拟。
如果您想按照生成HDL文件的过程返回到模型的顶层,右键单击MIMODecoder子系统并在“HDL Code”下启动HDL Coder Workflow Advisor。
步骤1.1:选择FPGA-in- loop Target Workflow,从下拉列表中选择首选的FPGA开发板,并标识一个可写目录来保存生成的HDL代码。
步骤4.1:在“设置FPGA选项”中,选择“添加”并使用浏览器导航到在步骤1中将复制到工作文件夹中复制的EmbeddedController HDL文件,并在步骤3中修改固定的HDL代码。
步骤4.2:在左侧导航树中右键单击工作流的步骤4.2,选择“Run to this task”。这个步骤可能需要几分钟,因为它包括合成、映射和为FPGA设备设计路由的步骤。
结果将是一个用于MIMO解码器子系统的FPGA在环仿真的FPGA编程文件,以及一个包含解码器的原始模型(包括用于FSM的遗留HDL)和FPGA在环块的新模型。它还将使用带有断言块的比较器来识别不匹配信号,类似于我们在联合仿真模型中看到的那些信号。
由于生成的验证模型包括fsmsubsystem的辅助,因此您需要使用HDL模拟器运行整个FIL模型。确保从先前的Cosimulation中的HDL模拟器关闭并重新启动HDL模拟器。
在步骤3生成的fpga - In - loop模型中,打开FIL块。
选择“Load”将FPGA编程文件下载到您的板上的设备上。
单击Simulink模型中的播放以运万博1manbetx行FPGA-in-in-Loole仿真。
在比较范围和模型中的错误计算中观察结果。您的仿真结果应与参考模型完全匹配。
对于那些没有HDL Coder软件的人来说,这个步骤是步骤4的替代方法。如果你已经完成了第4步,你就不需要继续这个步骤了。
以下命令将预先生成的HDL文件复制到工作文件夹:
copyFILDemoFiles(“verify_legacy_gen”);
现在,您可以使用FIL向导为loop中的FPGA创建FPGA编程文件。FIL向导还将创建一个可以丢弃的FIL块,因为为本示例提供的FIL模型已经包含了这个FIL块。
输入以下命令打开FIL向导:
filwizard.
在fil选项从列表中选择FPGA开发板。
在源文件中选择添加然后选择文件夹verify_legacy_gen_hdlsrc中的所有文件并进行识别mimodecoder.vhd.作为顶级文件。
接受FileWizard选项剩余部分的默认值
等待FIL块和要创建的FPGA编程文件。由于合成和路由FPGA实现所需的时间,这可能需要几分钟。
打开gm_fil_codegen_mimo_fil模型,并将新生成的FIL块拖动到模型中指定的位置。
打开FIL块掩码,单击Signal Attributes选项卡。将每个rx_decoded输出的数据类型更改为fixdt(1,6,0),以匹配行为块的数据类型。
打开FIL块屏蔽,单击主选项卡,选择“加载”并等待将下载到设备的FPGA编程文件。
在Simulink模型中按Play运万博1manbetx行fpga -in- loop。
在比较范围和模型中的错误计算中观察结果。您的仿真结果应与参考模型完全匹配。
这结论了使用HDL Cosimulation和FPGA-in-in-Loop来验证HDL设计的示例。