使用Vitis HLS生成 IP核 (verilog版和图形化版)

news2025/7/14 3:13:23

文章目录

  • 实验一、 自动旋转式栅门
    • 1.1 实验题目
    • 1.2 实验建模
      • 1.2.1 Verilog建模IP
      • 1.2.2 图形化建模IP
    • 1.3 实验总结
  • 实验二、 餐巾纸售货机
    • 2.1 实验题目
    • 2.2 实验建模
      • 2.2.1 Verilog建模IP
      • 2.2.2 图形化建模IP
    • 2.3 实验总结

实验一、 自动旋转式栅门

1.1 实验题目

旋转式栅门是一个由三个齐腰高旋转柄组成的门,其中一个旋转柄在进道
口。旋转式栅门一般安装在地铁站出入口等公共场所人行道,控制行人的进出。
初始时这旋转柄是锁住的,挡住进口,阻止行人通过。当交通卡(或投币)
在旋转式栅门上的刷卡机扫描(或投币)成功时,这旋转柄就解锁了,允许一个
行人通过。在行人通过后,旋转柄又锁住了。

1.2 实验建模

以两种形式来对栅门进行IP建模,分别是图形化建模IP和Verilog建模IP。

1.2.1 Verilog建模IP

首先是Turnstile.h

#include<ap_cint.h>
uint8 turnstile(uint8 C, uint8 P, uint8 reset);

函数声明完成后,需要具体实现该函数,Turnstile.cpp内容如下所示:

#include "turnstile.h"
uint8 S = 0;
uint8 reset = 0;
uint8 S0 = 0;
uint8 S1 = 1;
uint8 C_last = 0;

uint8 turnstile(uint8 C, uint8 P, uint8 reset)
{
    if(reset)
    {
        S = S0; 
    }
    else
    {
        switch (S)
        {
        case 0:
            if(C)
            {
                S = S1;
            }
            else
            {
                S = S0;
            }
            break;
        case 1:
            if(P)
            {
                S = S0;
            }
            else
            {
                S = S1;
            }
            break;
        default:
            break;
        }
    }
    return S;
}

最后还需要一个test bench文件,Turnstile_tb.cpp内容如下所示:

#include <cstdio>
#include<iostream>

#include "turnstile.h"
using namespace std;
int main()
{
    uint8 reset = 0;
    uint8 C = 0;
    uint8 P = 0;
    const uint8  time = 8;
    for(uint8 i = 0; i < time; i++)
    {
        if(i<=2)
        {
            reset = 1;
        }
        else if(i<=4)
        {   
            reset = 0;
            C = 1;
        }
        else if(i <= 6)
        {
            C = 0;
            P = 1;
        }
        else{
            P = 0;
        }
        uint8 result = turnstile(C, P, reset);
       // cout<<result<<endl;
        printf("%d\n",reset);
    }
    return 0;
}

添加设计文件

在这里插入图片描述

添加测试文件
在这里插入图片描述

C Simulation
在这里插入图片描述
在这里插入图片描述

C Synthesis

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C/RTL Cosimulation

左侧的C,P,reset 分别代表输入, return 代表状态:0表示闸门关,1表示闸门开,从波形图可以看出当C=1时 闸门开。
在这里插入图片描述

导出生成verilog 版IP。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.2.2 图形化建模IP

打开Vivado,创建新项目,在Settings里的Ip下的Repository加载之前导出的verilog核。
在这里插入图片描述

打开IP Catalog,找到Turnstile。
在这里插入图片描述

双击Turnstile得到图形化核

在这里插入图片描述

1.3 实验总结

相同性:两者都有相同的输入和输出端口C、P、 reset、clk。
差异性:使用HLS生成的verilog代码更加复杂,端口种类也更多,多了一些控制端口,C/C++ 的参数输入作为输入端口,参数返回作为输出端口。而在自己写的verilog中是自己设定的。

实验二、 餐巾纸售货机

2.1 实验题目

一款餐巾纸售货机,只接受 5 角和 1 元硬币,1 包餐巾纸价格为 1.5 元,没有找零功能。其中, Mealy型自动机如图2.1所示。
在这里插入图片描述

2.2 实验建模

使用两种形式来对售货机进行IP建模,分别是图形化建模IP和Verilog建模IP。

2.2.1 Verilog建模IP

首先是Vender.h

typedef unsigned char uint8;
uint8 vender(uint8 J, uint8 Y, uint8 reset);

函数声明完成后,需要具体实现该函数,vender.cpp的内容如下所示:

#include "vender.h"
uint8 S = 0;
uint8 reset = 0;
uint8 S0 = 0, S5 = 1, S10 = 2;
uint8 state = 0;
uint8 open = 1;
uint8 close = 0;
uint8 vender(uint8 J, uint8 Y, uint8 reset)
{
    state = 0;
    if(reset)
    {
        S = S0;
        state = 0;
    }
    else
    {
        switch (S)
        {
        case 0:
            if(J)
            {
                S = S5;
                state = 0;
            }
            else if(Y)
            {
                S = S10;
                state = 0;
            }
            else{
                S = S;
            }
            break;
        case 1:
            if(J)
            {
                S = S10;
                state = 0;
            }
            else if(Y)
            {
                S = S0;
                state = 1;
                
            }
            else{
                S = S;
            }
            break;
        case 2:
            if(J)
            {
                
                S = S0;
                state =  1;
            }
            else if(Y)
            {
                S = S0;
                state =  1;
            }
            else{
                S = S;
            }
        break;
        default:
            break;
        }
    }
    if(state == 1)
        return open;
    else
        return close;
}

最后还需要一个test bench文件,vender_tb.cpp内容如下所示:

#include <cstdio>
#include<iostream>

#include "vender.h"
using namespace std;
int main()
{
    uint8 reset = 0;
    uint8 J = 0;
    uint8 Y = 0;
    uint8 result = 0;
    const uint8  time = 4;
    for(uint8 i = 0; i <= time; i++)
    {
        if(i<=1)
        {
            reset = 1;
        }
        else if(i<=2)
        {   
            reset = 0;
            J = 1;
            Y = 0;
        }
        else if(i <= 3)
        {
            J = 0;
            Y = 1;
        }
        else
        {
            Y = 0;
            J = 1;
        }
        result = vender(J, Y, reset);
       // cout<<result<<endl;
        printf("%d\n",result);

    }
    return 0;
}

源代码添加到vitis HLS的源文件中,需要添加Top Function。

在这里插入图片描述

测试文件vender_tb.cpp添加到TestBench中。
在这里插入图片描述

运行C simulation,结果如下图所示。
在这里插入图片描述

运行C Synthesis,Part选择xc7z20clg484-1;
在这里插入图片描述

综合结果如下图所示,可以得到运行时间和LUT、FF等一系列资源的使用情况。
在这里插入图片描述

执行CoSimulation,结果如下。
在这里插入图片描述

当收到J和Y = 1 的时候,售货机打开。

在这里插入图片描述

导出Verilog 版IP
在这里插入图片描述

导出成功。
在这里插入图片描述
在这里插入图片描述

2.2.2 图形化建模IP

打开Vivado,创建新项目,在Settings里的Ip下的Repository加载之前导出的verilog核。
在这里插入图片描述

打开IP Catalog,找到Vender。
在这里插入图片描述

双击Turnstile得到图形化核
在这里插入图片描述

2.3 实验总结

相同性:两者都有相同的输入和输出端口J、Y、 reset、clk,都能实现相同的功能。
差异性:使用HLS生成的verilog代码更加复杂,没有自己编写的verilog代码简洁,端口种类也更多,多了一些控制端口,C/C++ 的参数输入作为输入端口,参数返回作为输出端口。HLS使得设计师不掌握硬件描述语言就可以使用一些硬件IP核。

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

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

相关文章

基于SpringBoot的共享单车管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;采用HTML和Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Mav…

一款轻量级的NuGet服务器

一、简介 BaGet (发音为“baguette”) 是一个轻量级的 NuGet、Symbol 服务器。它是开源的、跨平台的和云化的&#xff0c;可以运行再自己得电脑、Docker、Azure、AWS、Google Cloud 、Alibaba Cloud (Aliyun) 等。支持 MySQL、SQLite:、SqlServer、PostgreSQL、Azure Table St…

XSS-labs靶场实战(七)——第16-18关

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是XSS-labs靶场实战第16-18关。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对…

Windows系统封装初始化工具sysprep

Windows系统封装初始化工具sysprep Sysprep简介 Sysprep程序是微软公司用来配置Microsoft Windows全新安装的一个工具&#xff0c;是为方便企业用户部署系统而设计的。 Sysprep&#xff08;系统准备&#xff09;可以准备 Windows 客户端或 Windows Server 安装以生成映像。 Sys…

7.2 Verilog 文件操作

Verilog提供了很多可以对文件进行操作的系统任务。经常使用的系统任务主要包括&#xff1a; 文件开、闭&#xff1a;$fopen, $fclose, $ferror文件写入&#xff1a;$fdisplay, $fwrite, $fstrobe, $fmonitor字符串写入&#xff1a;$sformat, $swrite文件读取&#xff1a;$fget…

计算机毕业设计ssm+vue+elementUI 校园短期闲置资源置换平台

项目介绍 随着互联网时代的到来&#xff0c;人们的生活结构发生了很大的变化&#xff0c;网上交易占据了人们日常交易的很大一部分&#xff0c;这个比例还会继续增长。社会在飞速发展同时伴随着问题的出现&#xff0c;生活节奏的加快&#xff0c;使闲置物品处理成了一个突出问…

VFP发送XML与MSSQL的互操作, 解决一个传大表查询的大大大问题

瓜哥有个需求场景&#xff0c;比如要按订单号查一批订单&#xff0c;数量2w个&#xff0c;如果用in拼接要写好长的语句&#xff0c;用string_split又限制长度8000。所以想想有什么什么好招。 瓜哥就是MYFLL作者木瓜大侠 那就可以传入XML&#xff0c;让MSSQL把XML解析成表&#…

【实验十二】决策树判断你是否可学python

一、实验目的 1.熟练安装scikit-learn扩展库(本库有许多依赖库&#xff0c;如该库建立在NumPy&#xff0c;SciPy和matplotlib之上&#xff0c;一般要先安装这些扩展库后&#xff0c;再安装。当然在线安装的话也会一次性将依依赖库安装完&#xff0c;前提是这些库的网站能连上)…

(杂谈)世界上本没什么prompt,有的只是加权平均——关于NLP中embedding的一点思考

&#xff08;杂谈&#xff09;世界上本没什么prompt&#xff0c;有的只是加权平均——关于NLP中embedding的一点思考0. 写在前面1. 问题的提出2. 备受嫌弃的NSP&#xff0c;为什么效果不佳2. 比句子更小的片段——Span Bert3. 更加纯粹的表示方法——PURE4. 风光无限的prompt&a…

编写bat脚本调用hexview进行软件签名

上一篇《编写Bat脚本调用Vecotr工具软件HexView》介绍了如何使用bat脚本编写Bat脚本调用Vecotr工具软件HexView进行文件合并、填充、AES加密、SHA256哈希校验等基本操作&#xff0c;这篇介绍一下编写bat脚本调用hexview进行软件签名的具体用法&#xff0c;在编程过程中体会代码…

Linux--shell脚本详解

目录 一、shell脚本的类型 二、read命令 三、数组 3.1 定义数组 3.2 赋值数组元素 3.3 取得元素个数 3.4 取得单个元素长度 3.5 取消或删除数组中的元素 四、赋值时使用引号的作用 五、位置参数 5.1 $* 和 $的区别 六、预定义变量 七、变量的算术运算 7.1 双小括…

[一篇读懂]C语言三讲:选择、循环

[一篇读懂]C语言三讲&#xff1a;选择、循环1. 选择if-else讲解1 关系表达式与逻辑表达式计算表达式的过程2 if-else语句【例】判断输入值是否大于02. 循环while&#xff0c;for讲解&#xff0c;continue&#xff0c;break讲解1 while循环【例】计算1到100之间所有整数之和2 fo…

【MySQL进阶】B+树索引的使用

【MySQL进阶】B树索引的使用 文章目录【MySQL进阶】B树索引的使用一、索引的代价二、B树索引适用的条件1、全值匹配2、匹配左边的列3、匹配列前缀4、匹配范围值5、精确匹配某一列并范围匹配另外一列6、用于排序7、用于分组三、回表的代价1、回表的代价2、覆盖索引四、如何挑选索…

论文管理系统(登录功能)

目录 一、后端部分 1.1 实体类 1.2 UserMapper类 1.3 Service层 接口 实现类 1.4 controller层 1.5 拦截器 二、前端部分 效果图 源码如下 代码讲解 准备工作和数据库都已经准备好了,接下来我们来写登录功能,登录功能我们通过mybatisplus来码写,所以不需要在UserMapper.…

台灯到底对眼睛好不好?2022精选眼科医生推荐护眼灯

台灯是我们最常见的照明工具了&#xff0c;台灯对眼睛会有一定的伤害的&#xff0c;光对人的视觉会产生一些影响的&#xff0c;选择质量过关的护眼台灯&#xff0c;对人的眼睛伤害是比较小的&#xff0c;基本上在光照进行优化&#xff0c;做到无可视频闪、无眩光等&#xff0c;…

巯基化PEG试剂——N3-PEG-SH,Azide-PEG-Thiol,叠氮-聚乙二醇-巯基

巯基化PEG化学试剂叠氮-聚乙二醇-巯基&#xff0c;其英文名为Azide-PEG-Thiol&#xff08;N3-PEG-SH&#xff09;&#xff0c;它所属分类为Azide PEG Thiol PEG。 此peg试剂的分子量均可定制&#xff0c;有&#xff1a;5k N3-PEG-SH、20k 叠氮-聚乙二醇-巯基、10k N3-PEG-SH、…

[11]重绘与回流

在看今天的分享之前&#xff0c;希望大家先关注一下&#xff0c;因为你可以免费获取一枚前端路上的陪跑师。 什么是回流 回流&#xff1a;英文是reflow 当render tree中的一部分(或全部)&#xff0c;因为元素的规模尺寸、布局、隐藏等改变 而需要重新构建&#xff0c;这就是回流…

基于web在线餐饮网站的设计与实现——蛋糕甜品店铺(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

你的新进程是如何被内核调度执行到的?(上)

所谓的运行队列到底长什么样子、新进程是如何被加入进来的、调度是如何选择一个新进程的、新进程又如何被切换到 CPU 上运行的&#xff0c;这些细节咱们都没提到。今天就来展开看看这些进程运行背后的原理。 通过今天的文章&#xff0c;你将对以下两个问题有个更深入的理解。 …

mysql高手进阶优化篇

​MySql理论 逻辑架构 连接层-->服务层-->引擎层-->存储层 存储引擎 查看方式 1.查看mysql现在提供的搜索引擎--->show engines 2.查看mysql当前默认存储引擎show variables like storageenginestorage_enginestorageengine 存储引擎对比 MyISAM: BTree叶节…