System Generator学习——将代码导入System Generator

news2024/12/23 18:38:11

文章目录

  • 前言
  • 一、步骤 1:用 M-Code 建模控制
    • 1、引言
    • 2、目标
    • 3、步骤
  • 二、步骤 2:用 HDL 建模模块
    • 1、引言
    • 2、目标
    • 3、步骤
  • 三、用 C/C++ 代码建模块
    • 1、引言
    • 2、目标
    • 3、步骤
    • 4、第 1 部分:从 Vivado HLS 创建一个系统生成器包
    • 5、第 2 部分:在 System Generator 设计中包含一个 Vivado HLS 包
  • 总结


前言

本节讲解如何讲讲代码(Matlab、HDL、C/C++)导入到 System Generator 并使用。


一、步骤 1:用 M-Code 建模控制

1、引言

在这一步中,你将使用 MCode 块创建一个简单的有限状态机(FSM)来检测二进制值 1011 的序列。FSM 也需要能够检测到多个传输,例如 10111011

2、目标

完成本实验后,你将能够使用 System Generator 中的 MCode 块创建有限状态机。

3、步骤

在本练习中,你将使用 M-code 为有限状态机创建控制逻辑。然后,你将模拟最终设计以确认正确的操作
①、启动 System Generator 并打开 Simulink 将 Lab2\M_code\Lab2_1.slx 打开,您可以看到下面这个不完整的图表
在这里插入图片描述

②、从 Xilinx Blockset/Index 库中添加一个 MCode 块。
在这里插入图片描述

③、双击 MCode 块,单击 “编辑m文件”,如下图所示
在这里插入图片描述

下图显示了 MATLAB 文本编辑器中的默认 m 代码
在这里插入图片描述

⑤、新建 state_machine.m 文件,使其包含函数名 state_machine 以及匹配的输入和输出。
在这里插入图片描述

⑥、编辑完成后,使用另存为将 MATLAB 文件保存为 state_machine.m 到 Lab2_1 文件夹。在 MCode 属性编辑器中,使用 Browse 按钮确保 MCode 块引用了本地的 M-code 文件(state_machine.m)。
在这里插入图片描述
⑦、在 MCode 属性编辑器中,单击 OK。您将看到 MCode 块使用了新的端口和函数名,现在将 MCode 块连接到下图中:
在这里插入图片描述
现在可以开始对状态机进行编码了。这个状态机的气泡图如下图所示。该 FSM 具有五种状态,能够连续检测两个序列
在这里插入图片描述

⑧、编辑 M-code 文件 state_machine。使用 Xilinx xl_state 数据类型定义状态变量,如下所示。这要求你将变量声明为持久变量。xl_state 函数需要两个参数:初始条件和一个定点声明。因为你需要数到 4,你需要 3 位

persistent state, state = xl_state(0,{xlUnsigned, 3, 0});

这部分的代码使用 persistent 将 state 在该 M 文件中做了一个变量的声明,可以在该 M 文件中进行使用,xl_state()这个则是对state进行赋值;


该函数的简单用法就是:xl_state(init, precision)


第一个 init 就是初始化的值,precision 就是其精度;


而代码中的{xlUnsigned, 3, 0}属于一个单元阵列,其中 xlUnsigned 代表数据类型是无符号的定点数;3代表数据的位宽,因为代码中的 state 需要达到4,所以至少要 3bit 的位宽;0 代表的是二进制点的位置,该部分代码不需要有小数,所以直接设置为 0。xl_state 以及 Percision 也都还有其他用法,可以自行对 MCode 使用 help 进行研究。

在这里插入图片描述

⑨、使用 switch-case 语句定义所显示的 FSM 状态。下面提供了一个小示例来帮助您入门
注意:你需要一个 otherwise 语句作为最后一个 case

switch state
    case 0
        if din == 1
            state = 1;
        else
            state = 0;
        end
        matched = 0;
    case 1
        if din == 0
            state = 2;
        else
            state = 0;
        end
        matched = 0;
    case 2
        if din == 1
            state = 3;
        else
            state = 0;
        end
        matched = 0;
    case 3
        if din == 1
            state = 4;
        else
            state = 2; 
        end
        matched = 0;
    case 4
        if din == 0;
            state = 0;
        else
            state = 1;
        end
        matched = 1;
    otherwise
        state = 0;
        matched = 0;
end

在这里插入图片描述

⑩、保存 M-code 文件并运行仿真。波形应该如下图所示。
在这里插入图片描述
可以看到只要出现了 “1011” 的序列,输出检测就会置 1,反之保持为 0。

二、步骤 2:用 HDL 建模模块

1、引言

在本实验练习中,您将把 RTL 设计作为黑盒导入 System Generator。黑盒子允许将设计导入 System Generator,即使描述是硬件描述语言(HDL)格式

2、目标

完成此步骤后,你将能够:

  • 将 RTL HDL 描述导入到 DSP 的 System Generator 中
  • 配置黑盒以确保设计能够成功模拟

3、步骤

①、我们将用到下面目录中的文件 D:\Work\system_generator学习资料\ug948-design-files\SysGen_Tutorial\Lab2\HDL

以下文件位于此目录中:

  • Lab2_2.slx:一个包含黑盒示例的 Simulink 模型
  • transpose_fir.vhd。顶级 VHDL 的转置形式的 FIR 滤波器。该文件是与黑盒相关联的 VHDL
  • mac.vhd:用于构建转置 FIR 滤波器的乘法和加法器组件。
    在这里插入图片描述
    ②、启动 System Generator 并打开 Simulink 将 Lab2\M_code\Lab2_2.slx 打开
    在这里插入图片描述

②、打开名为 Down Converter(下变频器)的子系统,打开名为 Transpose FIR Filter Black Box 的子系统。此时,子系统包含两个输入端口和一个输出端口。你将向这个子系统添加一个黑盒。此时,子系统包含两个输入端口和一个输出端口。你将在这个子系统中添加一个黑盒:
在这里插入图片描述

③、右键单击设计画布,选择 Xilinx BlockAdd,并向该子系统添加一个 Black Box 块。打开一个浏览器窗口,列出可以与黑盒关联的 VHDL 源文件。从这个窗口中,选择顶级 VHDL 文件 transpse_fir.vhd。如下图所示:
在这里插入图片描述
关联的配置 M-code 为 transpose_fir_config 在编辑器中打开以进行修改

④、关闭编辑器,将黑匣子的端口连接到相应的子系统端口并保存设计
在这里插入图片描述
⑤、双击 Black Box 以打开此对话框
在这里插入图片描述
以下是对话框中的字段:

  • Block configuration m-function:这为黑匣子指定配置 m 函数的名称。在本例中,该字段包含由 Configuration Wizard 生成的函数的名称。默认情况下,黑盒使用向导生成的函数。但是,你可以替换你自己创建的一个。
  • Simulation mode:有三种模拟模式
    • Inactive: 当模式为 Inactive 时,黑盒通过忽略其输入并产生零来参与模拟。此设置通常用于当一个单独的仿真模型可用于黑盒,并且该模型使用仿真多路复用器与黑盒并行连接时。
    • Vivado Simulator:当模式为 Vivado Simulator 时,对与黑盒相关的 HDL 进行联合仿真,生成黑盒的仿真结果
    • External co-simulator:当模式为外部协同模拟器时,需要在设计中添加 ModelSim HDL 协同仿真模块,并在 HDL 协同模拟器使用字段中指定 ModelSim 模块的名称。在该模式下,使用 HDL 协同仿真对黑盒进行仿真。

将模拟模式设置为 Inactive(非活动),然后单击“确定”关闭对话框

⑥、移动到设计的顶层,点击 run simulation 按钮运行仿真;然后双击 Scope 块。
注意,output Signal 作用域中显示的黑箱输出为零。这是预期的,因为黑盒在模拟期间被配置为 Inactive
在这里插入图片描述
⑦、从 Simulink 编辑器菜单中,选择 Display > Signals & Ports > Port Data Types 显示黑匣子的端口类型
在这里插入图片描述
⑧、编译模型(Ctrl-D)以确保端口数据类型是最新的。注意,黑匣子端口输出类型是 UFix_26_0。这意味着它是无符号的,26 位宽,并且在最低有效位的左边有一个二进制点 0
⑨、打开配置 M-function transpose_fir_config。将输出类型从 “UFix_26_0” 修改为 “Fix_26_12”。修改后的行(第 26 行)应该是这样的

dout_port.setType('Fix_26_12');

在这里插入图片描述

继续执行以下步骤,编辑配置 m-函数,将另一个 HDL 文件与黑盒关联起来,定位第 65 行:

this_block.addFile('transpose_fir.vhd');

在这行代码的上方,添加以下代码:

this_block.addFile('mac.vhd');

在这里插入图片描述
保存对配置 m-函数 的更改并关闭该文件

⑩、单击设计画布并重新编译模型(Ctrl-D),你的转置 FIR 滤波器黑盒子系统应显示如下:
在这里插入图片描述
在 “黑匣子” 块参数对话框中,将 “模拟模式” 字段从 “非活动” 更改为 “Vivado 模拟器”,然后单击 “确定”
在这里插入图片描述

⑪、移到设计的顶层并运行模拟,在模拟完成后检查范围输出。注意波形不再为零。当模拟模式为非活动时,输出信号范围显示恒定零。现在,输出信号显示一个正弦波作为 Vivado 模拟的结果。
在这里插入图片描述

右键单击 Output Signal 显示并选择 Configuration Properties。在 Main 选项卡中,将轴缩放设置为自动设置。
在这里插入图片描述
你应该看到类似于下面所示的显示
在这里插入图片描述

三、用 C/C++ 代码建模块

1、引言

Vivado 设计环境的系统版包括 Vivado HLS 功能,它具有将 C/C++ 设计源转换为 RTL 的能力。System Generator 在 Xilinx Blockset/Control Logic 和 Xilinx Blockset/Index 库中有一个 Vivado HLS 块,使你能够将 C/C++ 源文件引入到 System Generator模型中。
在这里插入图片描述

2、目标

完成本实验后,您将能够使用 Vivado HLS 将 C,C++ 或 SystemC 合成的设计作为块合并到你的 MATLAB 设计中

3、步骤

在这一步中,将首先使用 Vivado HLS 合成一个 C 文件。你将在 Vivado DSP 设计项目中操作,使用 MATLAB 中的设计文件以及相关的 HDL 包装器和约束文件。在第 2 部分中,你将把 Vivado HLS 的输出合并到 MATLAB 中,并使用 MATLAB 丰富的仿真功能来验证 C 算法是否正确地过滤了图像。

4、第 1 部分:从 Vivado HLS 创建一个系统生成器包

①、打开 Vivado HLS 2017.4
在这里插入图片描述
②、在欢迎界面中选择 Open Project,然后导航到 Vivado HLS 项目目录 D:\Work\system_generator学习资料\ug948-design-files\SysGen_Tutorial\Lab2\C_code\hls_project,如下图所示
在这里插入图片描述
③、展开 Explorer 窗格中的 Source 文件夹(左侧)并双击文件 MedianFilter.cpp,以查看 C++ 文件的内容,如下图所示
在这里插入图片描述
这个文件在 3x3 窗口大小上实现了一个二维中值过滤器

④、通过右键单击 solution1 并选择 C Synthesis > Active Solution,如下图所示
在这里插入图片描述
当合成完成时,Vivado HLS 显示这个消息:完成 C 合成。现在将源代码打包,以便在 System Generator 中使用
在这里插入图片描述
⑤、右键单击 solution1 并选择 Export RTL,如下图所示,选择 “Format Selection” 为 “System Generator for DSP”,单击 “OK”
在这里插入图片描述
当导出 RTL 过程完成时,Vivado HLS 显示此消息:Finished export RTL.

5、第 2 部分:在 System Generator 设计中包含一个 Vivado HLS 包

①、启动 System Generator,打开 Lab2_3。Lab2/C_code 文件夹下的 Lab2_3.slx 文件。这将打开模型,如下图所示:
在这里插入图片描述
②、通过右键单击画布工作区上的任何位置来添加一个 Vivado HLS 块

  • 选择 Xilinx BlockAdd
  • 在 “添加块” 对话框中输入 Vivado HLS
  • 选择 Vivado HLS,如下图所示

在这里插入图片描述
③、双击 Vivado HLS 块打开属性编辑器,使用 Browse 按钮选择 Vivado HLS 在第 1 部分 中创建的解决方案,位于D:\Work\system_generator学习资料\ug948-design-files\SysGen_Tutorial\Lab2\C_code\hls_project\solution1,如图所示:导入 Vivado HLS IP,单击 “确定”,导入 Vivado HLS IP
在这里插入图片描述
④、连接模块的输入输出端口,如下图所示:
在这里插入图片描述
⑤、导航到噪声图像子系统,双击来自文件的图像块 xilinx_logo.png,打开源块参数对话框,使用 Browse 按钮确保文件名正确指向文件 xilinx_logo.jpg,如下所示
在这里插入图片描述
单击 “确定”,退出 “源块参数” 对话框。

⑥、使用 “向上至父级” 工具栏按钮可返回到顶层,仿真设计并验证图像被过滤,如下图所示
在这里插入图片描述


总结

在这个实验室里你学到了

  • 如何使用 M-Code 创建控制逻辑。最终的设计可用于创建 HDL 网络列表,与使用 Xilinx Blocksets 创建的设计相同
  • 如何通过结合现有的 VHDL RTL 设计来使用 HDL 在 System Generator 中建模块,以及将 System Generator 模型的数据类型与 RTL 设计的数据类型匹配的重要性,以及如何在 System Generator 中模拟 RTL 设计
  • 如何将用 C++ 编写的滤波器,用 Vivado HLS 进行合成,并将设计融入到 MATLAB 中。这个过程允许您使用任何 C,C++ 或 SystemC 设计,并创建一个自定义块用于您的设计。本练习向您展示了如何导入由 Vivado HLS 生成的 RTL 设计并在 MATLAB 中使用该设计

我的qq:2442391036,欢迎交流!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1060387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《机器学习实战》学习记录-ch2

PS: 个人笔记&#xff0c;建议不看 原书资料&#xff1a;https://github.com/ageron/handson-ml2 2.1数据获取 import pandas as pd data pd.read_csv(r"C:\Users\cyan\Desktop\AI\ML\handson-ml2\datasets\housing\housing.csv")data.head() data.info()<clas…

优先级队列的模拟实现

目录 1. 优先级队列的概念 1.1堆的概念 1.2堆的性质 1.3堆的存储方式 2. 堆的创建 2.1堆的创建代码解析 2.2建堆的时间复杂度 2.3堆的插入 2.4 堆的删除 2.5常见习题 1. 优先级队列的概念 队列是一种先进先出 (FIFO) 的数据结构 &#xff0c;但有些情况下&#xff0c; 操作的数…

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导 在用Allegro进行PCB设计的时候,模块复用是使用的十分频繁的操作,当Allegro升级到了174 S034版本的时候,当使用模块复用的功能的时候,模块内的铜皮会自动动静转换,大部分情况是不需要的。 如下图 如何关闭…

【再识C进阶4】详细介绍自定义类型——结构体、枚举和联合

学习目标&#xff1a; 在上一篇博客中&#xff0c;我们已经详细地学习了字符分类函数、字符转换函数和内存函数。那这一篇博客和上一篇博客的关系不是那么相连。 这一篇博客主要介绍一下自定义类型&#xff0c;因为在解决实际问题时&#xff0c;由于世界上的因素有很多&#xf…

01.爬虫基础

1、Python爬虫介绍 爬虫的实战性要求很强。爬虫经常需要爬取商业网站或政府网站的内容&#xff0c;而这些网站随时可能进行更新&#xff0c;另外网络原因和网站反爬虫机制也会对爬虫代码演示造成干扰。 1、1 爬虫的用处 网络爬虫&#xff1a;按照一定的规则&#xff0c;自动…

【Java 进阶篇】JDBC 管理事务详解

在数据库操作中&#xff0c;事务是一个非常重要的概念。事务可以确保一系列的数据库操作要么全部成功执行&#xff0c;要么全部失败回滚&#xff0c;以保持数据库的一致性和完整性。在 Java 中&#xff0c;我们可以使用 JDBC 来管理事务。本文将详细介绍 JDBC 管理事务的方法和…

【Java 进阶篇】JDBC 数据库连接池详解

数据库连接池是数据库连接的管理和复用工具&#xff0c;它可以有效地降低数据库连接和断开连接的开销&#xff0c;提高了数据库访问的性能和效率。在 Java 中&#xff0c;JDBC 数据库连接池是一个常见的实现方式&#xff0c;本文将详细介绍 JDBC 数据库连接池的使用和原理。 1…

vs2015 函数声明、定义与引用

10.VS-函数声明、定义和引用 - 简书 简言之&#xff0c;函数先在头文件中被声明&#xff0c;然后在对应cpp文件中实现&#xff08;定义&#xff09;&#xff0c;最后被不同文件的代码调用&#xff08;引用&#xff09;。

集合原理简记

HashMap 无论在构造函数是否指定数组长度&#xff0c;进行的都是延迟初始化 构造函数作用&#xff1a; 阈值&#xff1a;threshold&#xff0c;每次<<1 &#xff0c;数组长度 负载因子 无参构造&#xff1a;设置默认的负载因子 有参&#xff1a;可以指定初始容量或…

ES6中对象的扩展

1. 属性的简洁表示法 可以直接写入变量和函数作为对象的属性和方法。在对象中只写属性名&#xff0c;不写属性值&#xff0c;代表属性值等于和属性名相同的的变量的值。 属性的简写 let foo bar; let baz {foo}; // { foo: bar } // 等同于 let baz { foo: foo}方法的简写…

力扣 -- 377. 组合总和 Ⅳ

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int combinationSum4(vector<int>& nums, int target) {int nnums.size();vector<double> dp(target1);//初始化dp[0]1;//填表for(int i1;i<target;i){for(int j0;j<n;j){//填表if(…

Windows下启动freeRDP并自适应远端桌面大小

几个二进制文件 xfreerdp # Linux下的&#xff0c;an X11 Remote Desktop Protocol (RDP) client which is part of the FreeRDP project wfreerdp.exe # Windows下的&#xff0c;freerdp2.0 主程序&#xff0c;freerdp3.0将废弃 sdl-freerdp.exe # Windows下的&…

Linux系统及Docker安装RabbitMq

目录 一、linux系统安装 1、上传文件 2、在线安装依赖环境 3、安装Erlang 4、安装RabbitMQ 5、开启管理界面及配置 6、启动 7、删除mq 二、docker安装 1、上传mq.tar包或使用命令拉取镜像 2、启动并运行 3、访问mq 一、linux系统安装 1、上传文件 2、在线安装依赖环…

B2主题优化:WordPress文章每次访问随机增加访问量

老站长都知道&#xff0c;一个新站刚开始创建&#xff0c;内容也不多的时候&#xff0c;用户进来看到文章浏览量要么是0&#xff0c;要么是 个位数&#xff0c;非常影响体验&#xff0c;就会有一种“这个网站没人气&#xff0c;看来不行”的感觉。 即使你的内容做的很好&#x…

5.Vectors Transformation Rules

在上节&#xff0c;有个问题&#xff1a;向量分量的转换方式 与 新旧基底的转换方式相反 用例子来感受一下&#xff0c; 空间中一向量V&#xff0c;即该空间的一个基底&#xff1a;e1、e2 v e1 e2 现把基底 e1 、 e2 放大两倍。变成 基向量放大了两倍&#xff0c; 但对于…

Day-05 CentOS7.5 安装docker

参考 &#xff1a; Install Docker Engine on CentOS | Docker DocsLearn how to install Docker Engine on CentOS. These instructions cover the different installation methods, how to uninstall, and next steps.https://docs.docker.com/engine/install/centos/ Doc…

「专题速递」RTC云网端联合优化、弱网对抗策略、QUIC协议的能力和实践

随着互联网日益增长的加速需求、复杂的网络环境和多样化的视频业务&#xff0c;音视频技术领域的专家们正在不断探索如何实现准确和极低延迟的网络传输能力。他们在应用层流控、传输层协议设计以及跨层优化等方面积极努力&#xff0c;以改善用户的网络体验。 在当今数字化时代&…

Spacewalk

Spacewalk Spacewalk是一种开源的系统管理工具&#xff0c;提供了集中管理多个Linux服务器的功能。以下是一些Spacewalk用例&#xff1a; Spacewalk是基于Substrate的parachains和Stellar之间的桥梁&#xff0c;可以实现与Stellar的资产转移。该拨款申请用于开发太空行走协议…

Java 基于 SpringBoot 的学生考勤系统

1 简介 本文讲解的是 Java基于 SpringBoot 的学生考勤系统。学生考勤管理系统能做到的不仅是大大简化管理员的信息管理工作&#xff0c;在提高学生考勤管理效率的同时还能缩减开支&#xff0c;更能在数字化的平面网络上将学生考勤管理最好的一面展示给客户和潜在客户&#xff…

MyBatisCodeHelper Pro3.x新版本插件自由

1效果图 我的版本为3.2.2 2.资源链接 码云地址点这里 3.使用说明 将我修改好后的MyBatisCodeHelper-Pro-obfuss.jar替换MybatisCodeHelperNew-3.x.x.zip&#xff08;原版本插件&#xff09;\MyBatisCodeHelper-Pro\lib中的MyBatisCodeHelper-Pro-obfuss.jar 4.实现与感谢…