工具
Vivado 2018.3
一、HLS的介绍
- HLS的概念
HLS是一款高层次综合工具,可以帮助开发者加快开发效率。开发者可以通过HLS将C/C++等高级语言转换为RTL电路。尤其,在对于一些比较复杂的算法的时候,能够提供较大的便利。 - HLS与VHDL/Verilog
VHDL/Verilog对于一些算法比较简单,开发周期不长的来说是比较适用的,然而,一个开发过程,往往算法会比较复杂,并且可能会经历较长时间的仿真和调试,面对这样的问题,提出了HLS。通过高级语言编程,来实现功能模块,这样就会大大提供开发效率。 - HLS的关键技术
通过高级语言实现功能,并转换为RTL电路。实际上HLS相对于一个IP生成器。 - 技术局限性
对于人工智能方面来说,HLS在开发上,还是比较困难的,需要有强大的C/C++的编程能力,从而,来实现功能。
二、实现HLS的环境配置
安装vivado的参考链接:
https://blog.youkuaiyun.com/qq_43279579/article/details/116849636
对于vivado的安装,就已经自动完成了HLS
三、HLS的实例——Led点亮
- 创建一个HLS工程
①打开Vivado HLS,点击Create New Project
②输入相关工程信息
③选择顶层函数,此处暂不管
④选择添加C仿真文件,此处可以暂时不管
⑤选择器件
- 添加文件
①源文件添加
点击Source,右键后,选择New File,创建文件
led.h
led.cpp#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
②仿真测试文件添加#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)); } }
- C仿真与C综合
①点击project->project settings->synthesis->browser->选择顶层函数
②点击project->Run C Simulation(输出01交替,表示C仿真结果正确)
③点击Solution->Run C Synthesis->Active Solution
- 创建Vivado工程
①打开Vivado,选择Greate Project
②点击Next,进行项目信息填写
③勾选RTL Project
④Source和约束文件添加,暂时不管,直接Next
⑤选择器件
⑥点击Finish
- 导入HLS生成的IP核
①生成IP核
选择Solution->Export RTL
②导入
点击setting
选择IP->Repository,并且点击加号,选择solution,将会自动识别到IP,识别到后,点击Apply->OK
检验是否导入成功
生成IP
- 添加实验代码
①选择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
- 约束文件编写
①创建约束文件
②填写相关文件信息
③代码内容##############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}]
- 编译生成获取结果
①生成
②进行下载
点击Open Hardware Manager->Open target->Auto target后,显示如下
点击Program device,下载程序,直接点击Program
实验结果