基于FPGA实现LED的闪烁——HLS

基于FPGA实现LED的闪烁——HLS

引言:

​ 随着电子技术的飞速发展,硬件设计和开发的速度与效率成为了衡量一个项目成功与否的关键因素。在传统的硬件开发流程中,工程师通常需要使用VHDL或Verilog等硬件描述语言来编写底层的硬件逻辑,这不仅耗时而且对于复杂算法的实现存在一定的局限性。为了解决这一问题,高层次综合(High-Level Synthesis, HLS)技术应运而生,它允许开发者使用更高级的编程语言,如C/C++,来设计硬件,从而大幅提高开发效率和灵活性。

·

本实验旨在通过一个具体的实例——LED灯的闪烁控制,来展示HLS技术的应用。我们将利用Xilinx的Vivado HLS工具,将C/C++代码转换为硬件电路,实现LED灯的闪烁效果。通过本实验,参与者不仅能够了解HLS的基本概念和关键技术,还能够掌握从环境配置到实际硬件实现的完整流程。

·

希望你在本次学习过后,能够有一定的收获!!!

推荐歌曲—雨爱-杨丞琳

​ 冲啊!!!! ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶

文章目录

  • 基于FPGA实现LED的闪烁——HLS
    • 一、任务介绍
    • 二、HLS的相关介绍
      • HLS的概念拓展
      • HLS的优势
      • HLS与VHDL/Verilog的比较
    • 三、HLS相关环境配置
      • 1.vivado 安装
      • 2.创建HLS工程
      • 3.添加相关文件
      • 4.C仿真与C综合
      • 5.创建Vivado工程
      • 6.导入HLS生成的IP核
      • 7.添加实验代码
      • 8.约束文件编写
      • 9.编译生成获取结果
    • 四、效果展示
    • 五、总结

一、任务介绍

  1. 了解HLS的相关内容
  2. 实现HLS的实验环境配置
  3. 使用HLS点亮一个小灯

二、HLS的相关介绍

HLS的概念拓展

高层次综合(High-Level Synthesis, HLS) 是一种先进的硬件设计方法,它允许开发者使用高级编程语言(如C、C++或SystemC)来描述硬件功能,而不是传统的硬件描述语言(HDL)如VHDL或Verilog。HLS工具能够自动将这些高级语言代码转换为寄存器传输级(Register Transfer Level, RTL)电路设计,这大大简化了硬件设计过程,并缩短了开发周期。

HLS的优势

  1. 提高生产力:开发者可以使用熟悉的高级语言进行编程,而不需要精通硬件描述语言。
  2. 算法优化:高级语言提供了更直观的方式来表达复杂的算法,HLS工具可以优化这些算法实现,以满足硬件性能要求。
  3. 快速原型开发:HLS允许快速迭代和原型设计,加速了从概念到实现的过程。
  4. 代码重用:现有的软件代码可以被重用,减少了从头开始编写代码的需求。

HLS与VHDL/Verilog的比较

  • VHDL/Verilog:这些是传统的硬件描述语言,适用于精确控制硬件行为和结构的场景。它们通常用于复杂的硬件设计,需要开发者有较强的硬件设计背景。
  • HLS:提供了一种更高层次的设计抽象,允许开发者专注于算法和功能,而不是硬件的具体实现细节。这使得HLS特别适合于算法密集型和数据处理密集型的应用。

HLS的关键技术

  1. 代码分析与优化:HLS工具需要能够理解和分析高级语言代码,并进行优化以满足性能、面积和功耗等硬件设计要求。
  2. 资源分配:自动决定使用哪些硬件资源(如查找表、寄存器、乘法器等)来实现代码。
  3. 时序分析:确保生成的硬件设计满足时序要求,能够在给定的时钟频率下稳定工作。
  4. 并行处理:利用并行处理技术来提高设计的性能。

技术局限性

  1. 复杂性:对于极其复杂的人工智能算法,HLS可能需要高级的优化技术来实现高效的硬件加速。
  2. 编程能力要求:虽然HLS简化了硬件设计过程,但仍然需要开发者具备强大的C/C++编程能力,以及对并行计算和硬件架构的理解。
  3. 工具限制:不同的HLS工具可能有不同的优化能力和支持的语言特性,这可能限制了设计的灵活性。

三、HLS相关环境配置

1.vivado 安装

1.下载Vivado(如Vivado2019.1)
这个可以去官网下载,或者找实验室同学要一个安装文件,大概四五十GB,准备好安装文件后,直接点解xsetup程序进入安装

在这里插入图片描述

(整个安装文件夹44G)

2.安装过程
会弹出:

在这里插入图片描述点击Next,

在这里插入图片描述

点击Continue

在这里插入图片描述

三个I Agree全部勾选,点击Next,

在这里插入图片描述

选中第二个,Next,会出现选择需要的工具,设备等(本次重装的原因就是因为原版本安装的时候没有选择需要的ZYNQ的设备型号,所以建议大家磁盘有空间的把Devices全部勾选)

在这里插入图片描述

这里我将默认安装在C盘,但完全可以定义自己的路径,没有影响

在这里插入图片描述

接着Next,这次将进入长期的安装过程(约2h),如下:

在这里插入图片描述

漫长的等待后,出现这个界面,此时离安装成功只剩一步———破解了:

在这里插入图片描述

点击Get Licenses,选择Load License,在右方选择 Copy Licenses

在这里插入图片描述

这时候找到我们准备好的License文件就好了,没有的可以在这下载:https://download.csdn.net/download/weixin_49457347/85014356
下载解压后是一个这个文件(名称不重要,源文件名是vivado_lic2037):

在这里插入图片描述

选中该文件后,弹出安装成功!

在这里插入图片描述

2.创建HLS工程

创建一个HLS工程
①打开Vivado HLS,点击Create New Project
在这里插入图片描述
②输入相关工程信息
在这里插入图片描述
③选择顶层函数,此处暂不管
在这里插入图片描述

④选择添加C仿真文件,此处可以暂时不管
在这里插入图片描述
⑤选择器件
在这里插入图片描述

3.添加相关文件

①源文件添加
点击Source,右键后,选择New File,创建文件

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 Bench,选择New File

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));
	}
}

4.C仿真与C综合

①点击project->project settings->synthesis->browser->选择顶层函数

在这里插入图片描述

②点击project->Run C Simulation(输出01交替,表示C仿真结果正确)

在这里插入图片描述

③点击Solution->Run C Synthesis->Active Solution

在这里插入图片描述

5.创建Vivado工程

①打开Vivado,选择Greate Project
在这里插入图片描述
②点击Next,进行项目信息填写
在这里插入图片描述
③勾选RTL Project
在这里插入图片描述
④Source和约束文件添加,暂时不管,直接Next
⑤选择器件
img
⑥点击Finish
在这里插入图片描述

6.导入HLS生成的IP核

①生成IP核
选择Solution->Export RTL
在这里插入图片描述
②导入
点击setting
在这里插入图片描述
选择IP->Repository,并且点击加号,选择solution,将会自动识别到IP,识别到后,点击Apply->OK
在这里插入图片描述
检验是否导入成功
在这里插入图片描述
生成IP
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.添加实验代码

①选择Add Sources
在这里插入图片描述
②文件名称填写
在这里插入图片描述
③代码内容

`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

8.约束文件编写

①创建约束文件
在这里插入图片描述
②填写相关文件信息
在这里插入图片描述
③代码内容

##############LED define################## 
set_property PACKAGE_PIN P15 [get_ports {led_o}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led_o}]

##############Reset define################## 
set_property PACKAGE_PIN P16 [get_ports {rst_n}] 
set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}]

##############50M CLK define################## 
create_clock -period 20.000 -name clk -waveform {0.000 10.000} [get_ports clk]
set_property PACKAGE_PIN N18 [get_ports {clk}] 
set_property IOSTANDARD LVCMOS33 [get_ports {clk}]

9.编译生成获取结果

①生成
在这里插入图片描述
②进行下载
点击Open Hardware Manager->Open target->Auto target后,显示如下
在这里插入图片描述
点击Program device,下载程序,直接点击Program
在这里插入图片描述

四、效果展示

在这里插入图片描述

五、总结

HLS的关键技术包括代码分析与优化、资源分配、时序分析和并行处理,这些技术共同确保了生成的硬件设计既高效又可靠。然而,HLS也存在一些局限性,尤其是在处理极其复杂的人工智能算法时,可能需要更高级的优化技术和对硬件架构的深入理解。此外,HLS的成功实施依赖于开发者强大的C/C++编程能力。

·

尽管有其挑战,HLS的优势不容忽视。它使得硬件设计更加快速、灵活,并且能够重用现有的软件代码,加速了从概念到实现的转换过程。随着技术的不断进步,HLS工具的优化能力和支持的语言特性也在不断增强,预示着HLS在未来硬件设计领域的广泛应用和发展潜力。

·

总结来说,高层次综合作为一种创新的设计方法,正在逐渐改变传统的硬件开发流程,为硬件设计领域带来新的机遇和挑战。随着对HLS工具的不断改进和优化,我们有理由相信,HLS将在未来的硬件设计和开发中扮演越来越重要的角色。

最后感谢大佬友情链接:

  • https://blog.csdn.net/qq_43279579/article/details/117084706
  • https://blog.csdn.net/weixin_49457347/article/details/123643998

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch深度学习实践笔记12(b站刘二大人)

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

锐捷网络与您相约第七届数字中国建设峰会 共话数字未来

第七届数字中国建设峰会将于5月24日至25日在福建福州举办,本届峰会是国家数据工作体系优化调整后首次举办的数字中国建设峰会,主题是“释放数据要素价值,发展新质生产力”。作为行业领先的ICT基础设施及解决方案提供商,锐捷网络与福建省电子信息集团、星网锐捷,围绕“发展新质生…

newinit.sh挖矿攻击处理与规避方案

目录 攻击分析 恢复措施&#xff1a; 问题排查 攻击入口分析 预防 临时处理方案&#xff1a; 攻击分析 攻击者&#xff1a;职业黑客&#xff08;99%&#xff09; 攻击方式&#xff1a;挖矿病毒newinit.sh和蠕虫病毒pnscan 中毒现象: 服务器负载异常&#xff0c;具体表…

06_知识点总结(JS高级)

一、进程与线程 1. 进程(process)&#xff1a;程序的一次执行, 它占有一片独有的内存空间 2. 线程(thread)&#xff1a; 是进程内的一个独立执行单元&#xff0c;CPU的基本调度单元, 是程序执行的一个完整流程 3. 进程与线程 * 应用程序必须运行在某个进程的某个线程上 * 一个…

反射、类加载、静态代理,jdk动态代理,cglib代理

一、 反射 反射是在程序运行状态下&#xff0c;动态获取类的结构&#xff08;属性&#xff0c;构造器&#xff0c;方法&#xff0c;注解&#xff09;&#xff0c;动态的创建类对象然后调用类中的属性方法。反射的起源Class&#xff0c;Class中包含类反射要使用的API 获取Class的…

【LeetCode】【2】两数相加(1411字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示Python实现模拟 个人主页&#xff1a;丷从心 系列专栏&#xff1a;LeetCode 刷题指南&#xff1a;LeetCode刷题指南 题目描述 给两个非空的链表&#xff0c;表示两个非负的整数&#xff0c;它们每位数字都是按…

大模型的发展方向:让大模型感知人类所处的物理世界,文字、听、看、闻、触摸、动手操作等信息接收和输出能力,向物理世界学习 大模型开发者方向

大模型的发展方向非常广泛&#xff0c;除了让大模型感知人类所处的物理世界&#xff0c;通过文字、听觉、视觉、嗅觉、触觉和动手操作等信息接收能力&#xff0c;还包括以下几个重要的方向&#xff1a; 多模态学习与融合&#xff1a; 多模态感知&#xff1a;整合来自不同感知渠…

neo4j详细安装教程

前言 最近开始学习知识图谱&#xff0c;现整理Neo4j的详细安装教程&#xff0c;Neo4j是一个高性能的,NOSQL图形数据库&#xff0c;它将结构化数据存储在网络上而不是表中。由于知识图谱中存在大量的关系型信息&#xff08;实体—关系—实体&#xff09;, 使用结构化数据库进行存…

SpringBoot + Redis实现对接口的限流

目录 前言 什么是限流&#xff1f; 实现限流 创建一个注解类 接着创建一个切面类 前言 在项目中&#xff0c;对于接口的限流&#xff0c;是任何项目都必不可少的一部分&#xff0c;主要是为了防止用户频繁的发送请求&#xff0c;对服务器造成压力。 另外一点就是防止外来攻…

Android USB调试模式下自动上下滑动(Go实现)

简介 有的时候要对手机UI界面进行滑动测试&#xff0c; 手动或许太消耗时间&#xff0c; 理由Android USB调试模式对UI进行上下滑动测试。 adb指令 使用adb --help 可以查看所有的adb支持指令, 但这里我们只需要上下, 使用到的指令&#xff1a; adb devices #列举所有设备 ad…

AI Agent教育行业落地案例

【AI赋能教育】揭秘Duolingo背后的AI Agent&#xff0c;让学习更高效、更有趣&#xff01; ©作者|Blaze 来源|神州问学 引言 随着科技的迅猛发展&#xff0c;人工智能技术已经逐步渗透到我们生活的各个方面。而随着AI技术的广泛应用&#xff0c;教育培训正引领着一场新的…

SHELL编程(三)网络基础命令 Makefile

目标 一、网络基础及相关命令&#xff08;一&#xff09;网络相关命令&#xff08;二&#xff09;重启网络服务 二、Makefile&#xff08;一&#xff09;标签式语法&#xff08;二&#xff09;目标:依赖 式语法1. 格式2. 编译流程&#xff1a;预处理 编译 汇编 链接3. 目标和伪…

7B2PRO5.4.2主题 wordpress主题开心版免授权源码

这款7B2 PRO主题也是很多小伙伴儿喜欢的一个主题&#xff0c;有伙伴儿反馈说想学习下新版本&#xff0c;这不就来了&#xff0c;免受权开心版本可供学习使用&#xff0c;要运营还是尊重下版权到官网进行购买吧。 下载&#xff1a;7B2PRO5.4.2 wordpress主题免授权直接安装_麦…

常见的几种数据库通过SQL对表信息进行查询

一、前言 我们查询数据库表的信息&#xff0c;一般都使用界面化的连接工具查看&#xff0c;很少使用SQL语句去查&#xff0c;而且不同的数据库SQL语句又各自有差异。但如果通过代码去获取数据库表的信息&#xff0c;这时就需要通过SQL语句去查了&#xff0c;这个在逆向代码生成…

接口测试及接口测试常用的工具详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息…

python打造自定义汽车模块:从设计到组装的全过程

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、定义汽车模块与核心类 三、模拟汽车组装过程 四、抽象与封装 五、完整汽车…

08、SpringBoot 源码分析 - 自动配置深度分析一

SpringBoot 源码分析 - 自动配置深度分析一 refresh和自动配置大致流程如何自动配置SpringBootApplication注解EnableAutoConfiguration注解AutoConfigurationImportSelector自动配置导入选择器DeferredImportSelectorHandler的handleDeferredImportSelectorGroupingHandler的r…

前端笔记-day07

学成在线网站 文章目录 效果图代码展示index.htmlindex.cssbase.css 效果图 代码展示 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-w…

怎么挑选护眼灯?分析选护眼台灯该注意什么问题

各位家长可能已经注意到一个令人关切的现象&#xff1a;戴眼镜的孩子人数在不断上升&#xff0c;许多孩子正在接受眼部治疗。眼睛健康的问题变得越来越普遍&#xff0c;这无疑令人担忧。在当今数字化时代&#xff0c;孩子们每日需长时间阅读和使用电子设备&#xff0c;这对他们…

H6246 60V降压3.3V稳压芯片 60V降压5V稳压芯片IC 60V降压12V稳压芯片

H6246降压稳压芯片是一款电源管理芯片&#xff0c;为高压输入、低压输出的应用设计。以下是对该产品的详细分析&#xff1a; 一、产品优势 宽电压输入范围&#xff1a;H6246支持8V至48V的宽电压输入范围&#xff0c;使其能够适应多种不同的电源环境&#xff0c;增强了产品的通用…