Vitis2024 HLS项目生成IP核,Vivado验证IP核

前言

最近在学FPGA,使用HLS开发,我下载的Vitis2024.2版本,网上关于这个版本的教程很少,正在慢慢摸索中。Vitis 2024.2 将 HLS 和 SDK 功能融合在一起,支持使用 C/C++ 进行硬件设计。本文章主要是介绍了在Vitis中使用HLS组件和C++语言创建一个IP核然后导入到Vivado中使用。
这里附一张Vivado HLS和Vitis HLS的介绍。
在这里插入图片描述

工程创建

新界面如下图所示,首先需要为你的工程设置一个工作区,后续的工程都可以放到这个工作区内。
在这里插入图片描述
创建一个HLS空白组件
在这里插入图片描述
重命名你的组件名称,点击next。
在这里插入图片描述
这里默认就好,后面会生成一个可修改的配置文件hls_config。
在这里插入图片描述
这里就先不导入源文件,待会儿自己写。
在这里插入图片描述
选择自己板子对应的器件型号。
在这里插入图片描述
这里可以保持默认(7000系列的板子PL频率应该是50MHz和27%)。
在这里插入图片描述
最后总结页面,点击finish。
在这里插入图片描述
至此,工程创建完毕,工作区界面如下:
①工程文件目录
②可以在这里修改设置
③最后要进行的编译步骤
在这里插入图片描述

编写代码

添加源文件
首先添加两个源文件:led_twinkle的.c和.h文件。
在这里插入图片描述

下面附上这两个文件的代码:
led_twinkle.cpp

#include "ap_int.h"

// LED闪烁函数
void led_twinkle(ap_int<1> *led) {

    static int counter = 0;  // 静态计数器
    static ap_int<1> led_state = 0;  // LED状态

    counter++;
    if (counter >= 50000000) {  // 假设系统时钟为50MHz,50000000个时钟周期约等于1秒
        counter = 0;
        led_state = !led_state;  // 切换LED状态
    }
    *led = led_state;  // 输出LED状态
}

led_twinkle.h

#include <ap_int.h>
void led_twinkle(ap_int<1> *led);

点击到led_twinkle.cpp文件里,在右边点开HLS DIRECTIVES按钮。
在这里插入图片描述
指令优化:在Vitis HLS中,优化代码性能通常涉及使用特定的指令(pragma)来指导编译器如何综合代码,以提高硬件效率和性能。
选中led_twinkle,点击右边的加号。
在这里插入图片描述
按照下图配置。
在这里插入图片描述
再选中led,点击右边加号。
在这里插入图片描述
在弹出来的界面中,按照下图配置。
在这里插入图片描述
添加测试文件
在Test Bench中添加一个新测试文件。源码如下:

#include "led_twinkle.h"

ap_int<1> led_1;

int main(){
	led_twinkle(&led_1);
	printf("Run successfully!");
	return 0;
}

将所有文件保存,点击工程目录的设置按钮。
在这里插入图片描述
这里就是前面提到的可修改配置文件。
在这里插入图片描述
然后选中C Synthesis source,找到top一栏,把led_twinkle.cpp中的主函数名称复制到这里来,即led_twinkle。
这个是顶层模块,可以点击browse选择函数,或者直接输入,这里的主函数文件名字必须与文件内的函数名字一模一样。
在这里插入图片描述
至此,所有文件配置完成。

验证测试

接下来进行测试,依次点击下面五个Run,所有验证通过,则会生成IP核。
在这里插入图片描述
跑完5个Run都通过后,最后结果如图所示,这时候工程文件目录里会生成一个压缩包,这就是一个IP核。
在这里插入图片描述
也可以在工程的电脑文件夹目录里找到这个压缩包,记住这个路径,后面在Vivado中添加IP核时会用。
在这里插入图片描述
至此,Vitis HLS生成IP核就完成了。
————————————————这是一条分割线————————————————
接下来演示将上面生成的IP核添加到Vivado中进行下一步开发的设计。

Vivado验证IP核

创建工程
在Vivado中create project,修改工程名和工程目录。
在这里插入图片描述
可以先选择不定义源文件,后面会使用IP核自动生成RTL代码。
在这里插入图片描述
选择开发板型号后next,最后finish工程创建。
在这里插入图片描述
导入IP核
选择setting,按下图添加IP核。
在这里插入图片描述
点击加号,找到上文生成的IP核所在目录,选中到ip那一级目录即可。
在这里插入图片描述
IP核验证
点击Create Block Design,修改文件名。
在这里插入图片描述
在新画布上添加上面生成的IP核,直接搜即可。
在这里插入图片描述
再添加一个门IP核,点击加号直接搜util。
在这里插入图片描述
对这个IP进行配置,改成非门,位宽设置为1位。
在这里插入图片描述
画布空白处右键,选择Create Port,添加时钟和复位端口。
在这里插入图片描述
在这里插入图片描述
右键led[0:0],选择Make External,添加一个输出端口。最后将几个器件连接起来,如下图。点击验证,检验是否有错误,提示successful即可进行下一步。
在这里插入图片描述
在这里插入图片描述
综合
点击Generate Block Design
在这里插入图片描述
按照下图配置,Number of jobs是电脑的核数,选择的数越大应该会越快。
Out of Context per IP(OOC)允许为每个IP核单独生成综合结果(如DCP文件),而不是在每次综合时重新处理整个工程,在IP核未改变的情况下,Vivado不会重新综合这些IP核,从而显著减少综合的运行时间。
在这里插入图片描述
生成完后,在Sources目录里可以看到生成了源文件。不同于使用Verilog从头开始写代码,这种方法会自动生成代码。
在这里插入图片描述
右键选择Create HDL Wrapper,下一个界面选择默认即可。
HDL Wrapper 是一个用于封装Block Design(块设计)的工具,它将Block Design转换为一个可综合的顶层HDL文件(通常是Verilog或VHDL)。这个顶层文件可以被Vivado工具读取,并用于后续的综合、实现和生成比特流文件
在这里插入图片描述
在这里插入图片描述
管脚约束
右键Constrains,添加一个约束文件。
在这里插入图片描述
这里还有一种添加约束文件的方法,不需要自己写,只需要指定管脚,软件会自动生成。点击下图所示。
在这里插入图片描述
软件下方会有I/0 Ports窗口。如果没有这个窗口,就去软件右上角找到I/O Planning打开。
在这里插入图片描述
配置管脚和电平完成后如下图,Ctrl+S保存,XDC文件里会自动生成代码。
我的开发板是正点原子领航者V1,不同开发板约束管脚和电平不一样,要去查自己板子的原理图
在这里插入图片描述
在这里插入图片描述
至此,所有配置完成,接下来进行仿真和综合。
综合和实现
依次点击综合和实现,最后生成比特流,下载到开发板验证。
在这里插入图片描述
最终可以看到开发板的led0闪烁。

led闪烁

此实验只是打通了从Vitis HLS到Vivado BD设计的流程,其中的实验代码以及一些配置的含义并不清楚,后续会继续学习HLS开发的内容,自己编写较为复杂的HLS代码,还要学习Vitis软件开发ZYNQ。
参考博客
Vitis HLS 构建项目并生成IP核(Vivado HLS)-菜鸡渣渣一个 https://blog.csdn.net/weixin_44115643/article/details/124216930?fromshare=blogdetail&sharetype=blogdetail&sharerId=124216930&sharerefer=PC&sharesource=qq_52033578&sharefrom=qq(想看更多?下载CSDN APP:https://www.csdn.net/apps/download/)

Vivado验证Vitis HLS生成的IP核-菜鸡渣渣一个 https://blog.csdn.net/weixin_44115643/article/details/124232562?fromshare=blogdetail&sharetype=blogdetail&sharerId=124232562&sharerefer=PC&sharesource=qq_52033578&sharefrom=qq(想看更多?下载CSDN APP:https://www.csdn.net/apps/download/)

高效的VIVADO BlockDesign设计方法:将自己设计的模块信号以总线形式聚合-FPGA从入门到跑路 https://blog.csdn.net/xxqlover/article/details/139426981?fromshare=blogdetail&sharetype=blogdetail&sharerId=139426981&sharerefer=PC&sharesource=qq_52033578&sharefrom=qq(想看更多?下载CSDN APP:https://www.csdn.net/apps/download/)

FPGA学习笔记#4 Vitis HLS 入门的第一个工程-绅士羊OuO https://blog.csdn.net/qq_38876396/article/details/143645004?fromshare=blogdetail&sharetype=blogdetail&sharerId=143645004&sharerefer=PC&sharesource=qq_52033578&sharefrom=qq(想看更多?下载CSDN APP:https://www.csdn.net/apps/download/)

视频课程源:http://xilinx.eetop.cn/category-83 目录 1 从软件工程师的角度来看 FPGA 架构 3 2 Vivado HLS的工作机制 5 3-4 HLS设计流程基本概念 9 5 任意精度数据类型 15 5.1 C语言支持的数据类型 15 5.2 sizeof()函数使用 16 5.3 设置Visual Studio支持任意精度数据类型 17 6 数组类型转换 17 6.1 变量的定义和初始化 17 6.2 定点数据类型 18 6.3 浮点数据类型的定义和初始化 19 6.4 隐式数据类型转换 19 6.5 显示数据类型转换 19 7 Vivado HLS中的复合数据类型 20 7.1 结构体 20 7.2 枚举类型 22 8 Vivado HLS中的C++基本运算 23 9 测试平台的基本架构 25 9.1 Test Bench 25 9.2 C Test Bench 26 10 测试激励 28 11 测试输出检测与格式控制 28 11.1 Scoreboard 28 11.2 输出格式控制 30 12 接口综合基本介绍 33 12.1 接口综合概述 33 12.2 block-level interface protocol和port-level interface protocol 34 13 接口综合之数组 35 14 接口综合案例演示 37 14.1 添加寄存器 37 14.2 添加时钟使能信号 38 14.3 指令优化 38 15 for循环优化-基本性能指标 40 15.1 基本衡量指标 40 15.2 for循环pipeline 41 15.3 for循环UNROLL展开 41 15.4 for循环变量i 42 16 for循环优化-循环合并 42 17 for循环优化-数据流 46 18 for循环优化-嵌套的for循环优化 54 18.1 循环嵌套类型 54 18.2 Perfect loop nest示例 55 18.3 Imperfect loop nest示例 56 19 for循环优化-其他优化方法 59 19.1 for循环的并行性 59 19.2 for循环pipeline时的rewind选项 61 19.3 for循环的循环边界是变量时处理方法 64 20 数组优化-数组分割 67 20.1 数组接口 67 20.2 数组分割 67 21 数组优化-数组映射和重组 69 21.1 数组的映射 69 21.2 数组的重组 72 21.3 综合对比 72 22 数组优化-其他优化方法 72 22.1 定义ROM 72 22.2 数组的初始化 74 23 函数层面优化 75 23.1 代码风格 75 23.2 Inline 75 23.3 Allocation 75 23.3 Dataflow 75 24 总结分析 77 24.1 改善吞吐率(Throughput) 77 24.2 改善时延(Latency) 78 24.3 改善资源(Area) 79
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值