热门标签 | 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灯闪烁》


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 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的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
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社区 版权所有