热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HLS编程环境入门——LED灯闪烁

目录一、HLS简介二、点亮LED灯——入门级HLS程序(一)、仿真1、新建工程2、添加源文件3、添加c仿真文件4、进行C仿真与C综合(二)、烧录1、导出HLS工程生成的IP核2、v

目录

      • 一、HLS简介
      • 二、点亮LED灯——入门级HLS程序
        • (一)、仿真
          • 1、新建工程
          • 2、添加源文件
          • 3、添加c仿真文件
          • 4、进行 C 仿真与 C 综合
        • (二)、烧录
          • 1、导出 HLS 工程生成的 IP 核
          • 2、vivado工程导入ip
          • 3、在 IP Catalog 中选中由 HLS 生成的 IP,双击并生成该 IP
          • 4、烧录
          • 5、结果

一、HLS简介

1、HLS是什么
HLS是高层综合(High level Synthesis)
是将C或者c++语言编译为FPGA能够读懂和运行的RTL级别的语言
2、与VHDL或者verilog的比较
优点:用高级语言完成期望在硬件电路上实现的功能,更加抽象和容易实现。
缺点:尽管是用高级语言描述实现在硬件电路上实现功能,但会有很多限制,例如动态分配内存等函数或定义的禁用,也有很多不足,例如循环的优化始终是个大难题。
3、HLS关键技术
将高级语言转化为RTL电路;循环优化,并行处理

二、点亮LED灯——入门级HLS程序

(一)、仿真

环境:xilinx20.2
板子: Z7-Lite7020

1、新建工程

《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
选择定成函数 这里直接next
《HLS编程环境入门——LED灯闪烁》
添加c仿真文件,testbench文件,next
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
这里选择xc7z020clg400-2,对应Z7-Lite7020
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
新建工程完成页面
《HLS编程环境入门——LED灯闪烁》

2、添加源文件

《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
同样方法添加头文件
《HLS编程环境入门——LED灯闪烁》
led.h代码

#ifndef _SHIFT_LED_H_
#define _SHIFT_LED_H_
#define CNT_MAX 100000000
//#define CNT_MAX 100
#define FLASH_FLAG CNT_MAX-2
typedef int led_t;
typedef int cnt_t;
void flash_led(led_t *led_o , led_t led_i);
#endif

其中计数最大值 CNT_MAX 100000000 是在 100M 时钟频率下计数一秒钟所需要的计数次数
FLASH_FLAG 是 LED 闪烁的标志,当计数到该值
时,LED 发生变化
flash_led是该工程需要设计的定成函数
后续优化代码
led.h

#ifndef _SHIFT_LED_H_
#define _SHIFT_LED_H_
#include "ap_int.h"
#define CNT_MAX 100000000
//#define CNT_MAX 100
#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.h代码

#include "led.h"
void flash_led(led_t *led_o , led_t led_i){
cnt_t i;
for(i=0;i<CNT_MAX;i++){
if(i==FLASH_FLAG){
*led_o = ~led_i;
}
}
}

变量 i 计数到 FLASH_FLAG 时 led_o 的状态发生变化

3、添加c仿真文件

《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
test_led.cpp代码

#include "led.h"
#include
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));
}
}

后续优化设置
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》

4、进行 C 仿真与 C 综合

选择 flash_led 作为顶层函数
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
c仿真
《HLS编程环境入门——LED灯闪烁》
c仿真结果与预期相符
《HLS编程环境入门——LED灯闪烁》
c综合
《HLS编程环境入门——LED灯闪烁》
结果成功
Latency 指的是,设计电路完成一次任务需要的时间
Interval 指的是两次任务之间的时间间隔
FF触发器数量:62
LUT查找表数量:105
《HLS编程环境入门——LED灯闪烁》
联合仿真
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
结果:和c仿真结果一致
《HLS编程环境入门——LED灯闪烁》

(二)、烧录

1、导出 HLS 工程生成的 IP 核

《HLS编程环境入门——LED灯闪烁》
不做改变,直接OK
《HLS编程环境入门——LED灯闪烁》
导出的 IP 核将在 Solution 这个文件夹中可以找到
《HLS编程环境入门——LED灯闪烁》

2、vivado工程导入ip

打开vivado,新建工程
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
添加ip
《HLS编程环境入门——LED灯闪烁》
定位到solution
《HLS编程环境入门——LED灯闪烁》
添加成功后应用
《HLS编程环境入门——LED灯闪烁》
添加成功
《HLS编程环境入门——LED灯闪烁》

3、在 IP Catalog 中选中由 HLS 生成的 IP,双击并生成该 IP

《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
向工程中添加一个新的文件,用于完成本次实验
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
led.v是代码将生成的 HLS IP 例化进工程当中


//
// Company:
// Engineer:
//
// Create Date: 2021/05/22 14:40:22
// Design Name:
// Module Name: led
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//


`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_ap_vld(led_o_vld), // output wire led_o_V_ap_vld
.led_i_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

接下来是添加约束文件

《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
top_pin.xdc

##############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}]

添加ila观察中间过程
《HLS编程环境入门——LED灯闪烁》
这个ip对应.v文件中的
《HLS编程环境入门——LED灯闪烁》
生成bit流文件
《HLS编程环境入门——LED灯闪烁》

4、烧录

完成后打开硬件烧录页面
《HLS编程环境入门——LED灯闪烁》
将板子连接电脑,点击自动连接就会自动寻找已连接的板子
《HLS编程环境入门——LED灯闪烁》
右键点击Program Device
《HLS编程环境入门——LED灯闪烁》
《HLS编程环境入门——LED灯闪烁》
这里就会自动将可烧录的程序填入,点击Program即可烧录
《HLS编程环境入门——LED灯闪烁》

5、结果

《HLS编程环境入门——LED灯闪烁》


推荐阅读
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
author-avatar
EMBRACE-老王
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有