HLS入门实验

news2024/12/24 21:35:23

文章目录

  • 一、HLS介绍
    • 1.1 什么是HLS
    • 1.2HLS与VHDL/Verilog编程技术有什么关系?
    • 1.3HLS的关键技术和技术局限性
      • 1.3.1关键技术
      • 1.3.2 技术局限性
  • 二、HLS入门实验
    • 2.1安装Vivado
    • 2.2创建项目
    • 2.3添加文件
    • 2.4仿真
    • 2.5创建Vivado工程
    • 2.6生成IP核
    • 2.7添加代码
  • 参考

一、HLS介绍

1.1 什么是HLS

高层次综合(High-level Synthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。所谓的高层次语言,包括C、C++、SystemC等,通常有着较高的抽象度,并且往往不具有时钟或时序的概念。

1.2HLS与VHDL/Verilog编程技术有什么关系?

VHDL(VHSIC Hardware Description Language)和 Verilog 是两种常见的硬件描述语言,用于描述数字电路的结构和行为。设计人员通常会使用这两种语言来描述硬件电路的功能、时序和结构,然后将其综合为最终的硬件实现。因此,HLS 技术可以将高级编程语言转换为 VHDL/Verilog 代码,进而实现硬件功能的描述和实现。总的来说,HLS 可以与 VHDL/Verilog 结合使用,从而提高硬件设计的效率和灵活性。

1.3HLS的关键技术和技术局限性

1.3.1关键技术

  • 高级别算法描述
  • 自动化综合
  • 并行化和流水线
  • 时序分析和约束
  • 优化技术
  • 仿真和验证

1.3.2 技术局限性

  • 复杂性转换难题
  • 性能不确定性
  • 资源利用效率
  • 时序约束挑战
  • 功耗优化困难
  • 难以调试和测试

二、HLS入门实验

2.1安装Vivado

下载安装:参考博客

2.2创建项目

打开Vivado
在这里插入图片描述

设置名称
在这里插入图片描述
next
在这里插入图片描述
next
在这里插入图片描述

选择器件
在这里插入图片描述
finish
在这里插入图片描述

2.3添加文件

创建文件
在这里插入图片描述
led.h

#ifndef _SHIFT_LED_H_
#define _SHIFT_LED_H_

#include "ap_int.h"
#define CNT_MAX 100000000
//#define CNT_MAX 100,100M时钟频率下计数一秒钟所需要的计数次数
#define FLASH_FLAG CNT_MAX-2
// typedef int led_t;
// typedef int cnt_t;
typedef ap_int<1> led_t;
typedef ap_int<32> cnt_t;
void flash_led(led_t *led_o , led_t led_i);

#endif

led.cpp

#include "led.h"

void flash_led(led_t *led_o , led_t led_i){
#pragma HLS INTERFACE ap_vld port=led_i
#pragma HLS INTERFACE ap_ovld port=led_o
	cnt_t i;
	for(i=0;i<CNT_MAX;i++){
		if(i==FLASH_FLAG){
			*led_o = ~led_i;
		}
	}
}


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

#include "led.h"
#include <stdio.h>

int main(){

	led_t led_i=0x01;
	led_t led_o;
	const int SHIFT_TIME = 4;
	int i;
	for(i=0;i<SHIFT_TIME;i++){
		flash_led(&led_o , led_i);
		led_i = led_o;
		printf("shift_out is %d \n",(int)(led_o&0x01));
	}
}

2.4仿真

在这里插入图片描述
在这里插入图片描述
运行
在这里插入图片描述
等待一会后,可以看见该界面出现0101交替
在这里插入图片描述

2.5创建Vivado工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先不管next
在这里插入图片描述
next
在这里插入图片描述
选择器件
在这里插入图片描述
next->finish

2.6生成IP核

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
出现报错,前往官网下载补丁
https://support.xilinx.com/s/article/76960?language=en_US
在这里插入图片描述
解压到该位置
在这里插入图片描述
运行之前检查是否有python环境,如果没有
安装:参考博客
打开cmd,进入该目录,执行命令 python y2k22_patch\patch.py
在这里插入图片描述
在这里插入图片描述
然后再生成,没有报错信息
在这里插入图片描述
导入,先点击settings
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
生成IP,双击进入
在这里插入图片描述

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

2.7添加代码

在这里插入图片描述
点击ok->finish,默认选择
在这里插入图片描述
点击后写入代码内容

在这里插入图片描述
代码内容:

`timescale 1ns / 1ps
module flash_led(
input wire clk ,
input wire rst_n ,
output wire led_o
);
 
wire rst ;//同步复位
wire ap_ready ;//当前可以接收下一次数据
reg ap_start ;//IP 开始工作
reg led_i_vld ;//输入数据有效
wire led_o_vld ;
reg led_i ;//输入的 led 信号
wire led_o_r ;
wire ap_done ;
wire ap_idle ;
reg [1:0] delay_cnt ;
assign rst = ~rst_n ;
assign led_o = led_o_r ;
 
//----------------delay_cnt------------------
always @(posedge clk) begin
if (rst==1'b1) begin
delay_cnt <= 'd0;
end
else if(delay_cnt[1]==1'b0) begin
delay_cnt <= delay_cnt + 1'b1;
end
end
 
//----------------ap_start------------------
always @(posedge clk) begin
if (rst==1'b1) begin
ap_start <= 1'b0;
end
else if(delay_cnt[1]==1'b1)begin
ap_start <= 1'b1;
end
end
 
//----------------led_i_vld------------------
always @(posedge clk) begin
if (rst==1'b1) begin
led_i_vld <= 1'b0;
end
else if(delay_cnt[1]==1'b1)begin
led_i_vld <= 1'b1;
end
end
 
//----------------ap_i------------------
always @(posedge clk) begin
if (rst==1'b1) begin
led_i <= 1'b0;
end
else if(led_o_vld==1'b1)begin
led_i <= led_o_r ;
end
end
 
 
flash_led_0 inst_flash_led (
.led_o_V_ap_vld(led_o_vld), // output wire led_o_V_ap_vld
.led_i_V_ap_vld(led_i_vld), // input wire led_i_V_ap_vld
.ap_clk(clk), // input wire ap_clk
.ap_rst(rst), // input wire ap_rst
.ap_start(ap_start), // input wire ap_start
.ap_done(ap_done), // output wire ap_done
.ap_idle(ap_idle), // output wire ap_idle
.ap_ready(ap_ready), // output wire ap_ready
.led_o_V(led_o_r), // output wire [0 : 0] led_o_V
.led_i_V(led_i) // input wire [0 : 0] led_i_V
); 
endmodule

创建约束文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击Flow
在这里插入图片描述

在这里插入图片描述
没有对应的开发板,跟着流程过一遍。编译结果均正确
在这里插入图片描述

参考

https://blog.csdn.net/weixin_54435584/article/details/130774070
https://blog.csdn.net/apple_52030329/article/details/130732768

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

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

相关文章

【C语言】解决C语言报错:Race Condition

文章目录 简介什么是Race ConditionRace Condition的常见原因如何检测和调试Race Condition解决Race Condition的最佳实践详细实例解析示例1&#xff1a;缺乏适当的同步机制示例2&#xff1a;错误使用条件变量 进一步阅读和参考资料总结 简介 Race Condition&#xff08;竞争条…

计算缺失msvcr120.dll文件怎么办,msvcr120.dll丢失的解决方法分享

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到msvcr120.dll”。那么&#xff0c;msvcr120.dll到底是什么&#xff1f;为什么计算机会找不到它&#xff1f;它会对计算机产生什么具体影响&#xff1f;如何解决这个问题&#xff1f;…

证照之星 XE版软件怎么下载安装? 【详细安装图文教程】

软件简介&#xff1a; 证照之星是国内顶级的证件照片制作软件&#xff0c;具有一键裁剪&#xff0c; 智能背景替换&#xff0c;批量制作、内置证照规格的四大优势。同时两大独创技术&#xff1a;智能去除皮肤油光、证照服装替换。同时支持联机拍摄&#xff1a;支持网络摄像头及…

linux中批量给文件改名

rename 需要批量将文件名前的UC-10_取消掉&#xff0c;以数字来命名文件 rename s/UC-10_// *.jpg 修改成功 要是修改为其他名字需要在单引号的第二个/后加字符即可 例如要改为li

一段代码读取Chrome存储的所有账号密码和Cookie

先写结论&#xff1a; Chrome密码管理里的账号密码&#xff0c;还有Cookie&#xff0c;安全性并不算太高&#xff0c;一段代码就可以自动读取并上报到其它地方。 尤其是国内用户大多喜欢破解软件&#xff0c;这些软件只要注入这样一段代码&#xff0c;就无声无息的把你的所有账…

74HC04做陶瓷和晶体振荡器实验初步

面包板&#xff0c;电压5V 17.6Mhz晶振&#xff0c;起振OK 其他的465K&#xff0c;1M&#xff0c;4M&#xff0c;10M&#xff0c;16M&#xff0c;20M陶瓷不起振 更换过Rf也不起作用&#xff0c;待研究。 rf参考&#xff0c;这是人家博客给出的。 还看到一个文章说&#xff…

框架的使用

什么是框架&#xff1f; 盖房子&#xff0c;框架结构 框架结构就是房子主体&#xff0c;基本功能 把很多基础功能已经实现&#xff08;封装了&#xff09; 框架&#xff1a;在基础语言之上&#xff0c;对各种基础功能进行封装&#xff0c;方便开发者&#xff0c;提高开发效…

3D ToF赋能小米CyberDog 2提升视觉灵敏度

随着科技的进步,智能机器人越来越多地融入我们的日常生活。其中,CyberDog 2作为一款前沿的四足机器人,凭借其出色的视觉灵敏度和多功能技术配备,受到了广泛的关注。本文将重点探讨CyberDog 2的视觉系统,尤其是其四种不同类型的摄像头如何共同提升其视觉灵敏度,以及激光传…

书生·浦语大模型实战营第二期作业六

1、安装环境&#xff1a; 2、安装legent和agentlego&#xff1a; 3、部署apiserver&#xff1a; 4、legent web demo&#xff1a; 5、没搜到&#xff0c;很尴尬&#xff1a; 6、自定义工具&#xff1a; 7、智能体“乐高”&#xff1a; 8、智能体工具&#xff0c;识别图片&#…

C++ 矩阵乘法

描述 如果A是个x行y列的矩阵&#xff0c;B是个y行z列的矩阵&#xff0c;把A和B相乘&#xff0c;其结果将是另一个x行z列的矩阵C。这个矩阵的每个元素是由下面的公式决定的 矩阵的大小不超过100*100 输入描述&#xff1a; 第一行包含一个正整数x&#xff0c;代表第一个矩阵的…

Vue32-挂载流程

一、init阶段 生命周期本质是函数。 1-1、beforeCreate函数 注意&#xff1a; 此时vue没有_data&#xff0c;即&#xff1a;data中的数据没有收到。 1-2、create函数 二、生成虚拟DOM阶段 注意&#xff1a; 因为没有template选项&#xff0c;所以&#xff0c;整个div root都…

华为od-C卷200分题目2 - 找城市

华为od-C卷200分题目2 - 找城市 题目描述 一个城市规划问题&#xff0c;一个地图有很多城市&#xff0c;两个城市之间只有一种路径&#xff0c;切断通往一 个城市i的所有路径之后&#xff0c;其他的城市形成了独立的城市群&#xff0c;这些城市群里最大的城 市数量&#xff0…

VirtualBox、Centos7下安装docker后pull镜像问题、ftp上传文件问题

Docker安装篇(CentOS7安装)_docker 安装 centos7-CSDN博客 首先&#xff0c;安装docker可以根据这篇文章进行安装&#xff0c;安装完之后&#xff0c;我们就需要去通过docker拉取相关的服务镜像&#xff0c;然后安装相应的服务容器&#xff0c;比如我们通过docker来安装mysql,…

【Android面试八股文】说一说JVM、DVM(Dalvik VM)和ART的区别

文章目录 1. JVM(Java Virtual Machine):2. DVM(Dalvik Virtual Machine):与JVM区别基于的架构不同执行的字节码不同3. ART(Android Runtime):与DVM的区别4. 什么是JIT?4.1 什么是JIT4.2 JIT 编译的优势包括:4.3 对于 DVM 和 ART,它们在 JIT(Just-In-Time)编译方…

【flink实战】flink-connector-mysql-cdc导致mysql连接器报类型转换错误

文章目录 一. 报错现象二. 方案二&#xff1a;重新编译打包flink-connector-cdc1. 排查脚本2. 重新编译打包flink-sql-connector-mysql-cdc-2.4.0.jar3. 测试flink环境 三. 方案一&#xff1a;改造flink连接器 一. 报错现象 flink sql任务是&#xff1a;mysql到hdfs的离线任务&…

基于ASRPRO智能离线语音识别模块实现人机交流对话应用

基于ASRPRO智能离线语音识别模块实现人机交流对话应用 ASRPRO智能离线语音识别模块简介ASRPRO智能离线语音识别模块功能介绍ASRPRO智能离线语音识别模块电路说明ASRPRO智能离线语音识别模块应用案例ASRPRO智能离线语音识别模块管脚说明ASRPRO芯片管脚分布图ASRPRO语音识别模块系…

统计套利—配对交易策略

配对交易是一种基于统计学的交易策略&#xff0c;通过两只股票的差价来获取收益&#xff0c;因而与很多策略不同&#xff0c;它是一种中性策略&#xff0c;理论上可以做到和大盘走势完全无关。 配对交易的基本原理是&#xff0c;两个相似公司的股票&#xff0c;其股价走势虽然在…

基于51单片机贪吃蛇小游戏

基于51单片机贪吃蛇小游戏 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.用74HC573驱动点阵显示游戏画面&#xff1b; 2.上电后贪吃蛇会自动寻食&#xff1b; 3.按下四个按键中的任何一个就手动寻食了&#xff1b; ​演示视频&#xf…

【MySQL】(基础篇十三) —— 联结

联结 本文介绍什么是联结&#xff0c;为什么要使用联结&#xff0c;如何编写使用联结的SELECT语句。介绍如何对被联结的表使用表别名和聚集函数。 SQL最强大的功能之一就是能在数据检索查询的执行中联结&#xff08;join&#xff09;表。联结是利用SQL的SELECT能执行的最重要…

CloudFlare 里如何设置参数传递的 301 重定向

自从接到【哈哈,笑死我了都,黔驴技穷了都!】一文里提到的代维客户订单,这两天明月就一直在加班加点的重新部署着客户的四个服务器,因为有三个都是 WordPress+WooCommerce 式的电商平台,很是有些费时费力,好在现在基本都搞定了,剩下的就是些细节方面的优化、调整了。期间…