HLS入门

一. HLS是什么?与VHDL/Verilog编程技术有什么关系?

高层次综合 (HLS)
  1. 抽象级别更高:HLS允许设计者在更高的抽象级别上工作,使用高级编程语言来描述硬件的功能。这种方法减少了设计者需要处理的底层细节,使得设计过程更加高效。
  2. 自动生成HDL代码:HLS工具可以将高级语言编写的算法自动转换为HDL代码,从而生成可综合的硬件描述。这种自动化过程可以减少手工编码的错误,并加快设计周期。
  3. 设计优化:HLS工具通常具有许多优化选项,可以自动进行循环展开、流水线化等优化,以生成更高效的硬件实现。
  4. 加快设计验证:由于使用高级语言进行设计,设计者可以利用软件调试工具进行早期验证,从而加快整个设计验证过程。
VHDL/Verilog编程技术
  1. 低级硬件描述:VHDL和Verilog是传统的硬件描述语言,设计者需要在较低的抽象级别上编写代码,详细描述硬件的行为和结构。这需要设计者具备深厚的硬件知识。
  2. 手工编码:使用VHDL或Verilog进行设计时,所有的代码都是手工编写的。这种方法尽管灵活,但也容易出现人为错误,并且开发周期较长。
  3. 详细控制:设计者可以完全控制硬件的每一个细节,因此在需要精确控制和优化硬件时,VHDL和Verilog是不可替代的。
  4. 广泛应用:尽管HLS越来越受欢迎,但VHDL和Verilog仍然是硬件设计中的主流语言,尤其在FPGA和ASIC设计中。
关系和区别
  1. 抽象级别:HLS使用高级语言进行设计,抽象级别较高;而VHDL和Verilog是低级的硬件描述语言,需要详细描述每个硬件组件。
  2. 设计流程:HLS的设计流程包括高级语言编写、自动综合、优化和验证;而VHDL/Verilog的设计流程主要是手工编写和验证。
  3. 应用场景:HLS适用于快速原型设计和算法验证,尤其在设计周期较短的项目中表现出色;而VHDL和Verilog适用于需要详细控制和优化的复杂硬件设计。

总的来说,HLS与传统的VHDL/Verilog编程技术是互补的。HLS提高了设计效率,减少了设计复杂度,而VHDL和Verilog则提供了更高的控制和优化能力。在现代硬件设计流程中,设计者往往会结合使用这两种技术,以充分发挥各自的优势。

二. HLS有哪些关键技术问题?目前存在什么技术局限性?

高层次综合 (HLS) 虽然提供了显著的设计效率提升和抽象级别的提高,但在实际应用中仍然面临一些关键技术问题和局限性:

关键技术问题
  1. 精确的硬件映射:如何将高级语言中的抽象描述精确地映射到硬件结构上是HLS的核心挑战之一。高级语言的抽象程度较高,而硬件设计需要精确的细节控制,这两者之间的映射是一个复杂的过程。

  2. 性能优化:尽管HLS工具可以进行自动化的性能优化,但如何高效地利用硬件资源(如寄存器、逻辑单元、内存等)仍是一个挑战。自动化优化可能无法达到手工优化的精细程度。

  3. 并行性和流水线化:高级语言中的并行性和流水线化在硬件中实现时,需要处理数据相关性、控制依赖性等问题。HLS工具需要智能地分析和处理这些依赖关系,以生成高效的并行和流水线化硬件。

  4. 代码风格和结构:高级语言代码的风格和结构对生成的硬件有很大影响。设计者需要熟悉如何编写适合HLS工具处理的代码,以便生成高效的硬件。

  5. 调试和验证:从高级语言到硬件描述语言的转换过程中,调试和验证是一个复杂的问题。如何在高级语言级别进行有效的调试,并在硬件级别验证功能正确性,是HLS面临的重要问题。

技术局限性
  1. 性能与手工设计的差距:HLS生成的硬件在性能上可能与手工优化的设计存在一定差距。手工设计可以进行更细粒度的优化,而HLS工具的自动化优化难以达到相同的精度。

  2. 对复杂控制逻辑的支持不足:HLS在处理复杂的控制逻辑时可能表现出局限性。这是因为高级语言通常更适合描述算法,而硬件设计需要详细的状态机和控制逻辑。

  3. 工具的成熟度和兼容性:目前市场上的HLS工具在成熟度和兼容性上存在差异。不同工具对高级语言的支持程度不同,生成的硬件描述语言代码质量也有所不同。这可能导致在不同工具之间进行移植时遇到问题。

  4. 学习曲线:尽管HLS提高了抽象级别,但设计者仍然需要学习如何有效使用HLS工具,以及如何编写适合硬件实现的高级语言代码。这对传统的软件工程师和硬件设计师都是一个新的挑战。

  5. 资源开销:HLS工具和方法可能引入额外的资源开销,如增加硬件面积、功耗等。虽然HLS可以显著提高设计效率,但在资源受限的应用中,这些开销需要仔细权衡。

未来发展方向

尽管存在这些问题和局限性,HLS技术仍在不断发展。未来的研究和改进可能包括:

  1. 提高工具智能化:利用人工智能和机器学习技术,提高HLS工具的智能化水平,自动识别和优化复杂的硬件结构。
  2. 改进调试和验证工具:开发更强大的调试和验证工具,支持从高级语言级别到硬件级别的全流程验证。
  3. 优化算法:研究和开发更高效的算法,用于自动优化生成的硬件描述,缩小与手工优化的性能差距。
  4. 标准化和互操作性:推动HLS工具的标准化,增强不同工具之间的兼容性和互操作性,使得设计者可以更灵活地选择和切换工具。

总体来说,HLS作为一种前沿的设计技术,正在不断进步,并有望在未来的硬件设计中发挥越来越重要的作用。

三. 在win10(或者Ubuntu系统下)安装 Intel 或者 Xilinx 的支持HLS的FPGA编程开发软件(Quartus18或者Vivado18),设置好环境,完成一个入门级的HLS程序,并进行仿真或者实际开发板运行。

创建项目

1、点击Vivado HLS 中的Create New Project

2、设置项目名

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


输入搜索选择芯片,点击ok,点击finish,完成工程创建

1.2添加文件
源文件添加
点击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));
    }
}

1.3 C仿真与C综合
点击project->project settings->synthesis->browser->选择顶层函数

点击project->Run C Simulation

输出01交替,表示C仿真结果正确


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


1.4创建Vivado工程
打开Vivado,选择Greate Project

点击Next,进行项目信息填写


勾选RTL Project

Source和约束文件添加,暂时不管,直接Next,之后选择器件

点击Finish

1.5导入HLS生成的IP核
生成IP核
选择Solution->Export RTL

  1. 导入
    点击setting

选择IP->Repository,并且点击加号,选择solution,将会自动识别到IP,识别到后,点击Apply->OK

检验是否导入成功


生成IP,选中后双击

1.6添加实验代码
选择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}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值