文章目录
- 一HLS是什么
- 1HLS介绍
- 二HLS核心技术以及技术局限性
- 1HLS的核心技术
- 2HLS的技术局限性
- 三HLS的LED流水灯
- 1创建项目工程
- 2代码
- 3仿真
一HLS是什么
1HLS介绍
HLS是一种将高级编程语言(如 C、C++等)描述的算法或逻辑自动转换为 FPGA 可实现的硬件描述语言。
二HLS核心技术以及技术局限性
1HLS的核心技术
输入语言采用类 C语言:而非前两代的 HDL 语言,如 C、C++、SystemC 以及 SpecC、HandelC 等,这能够使得系统模型得到复用,进行进一步的软硬件实现。
对时序比较精确的评估和调度:实现了对验证环境的重复使用,通过 TLM 建模技术可以将系统验证环境复用于 RTL 级验证,降低了验证的复杂度。
对代码进行优化转换:支持代码报告,能够将用户代码进行优化转换,但在某些情况下,工具的高效实施是不可能的,例如当必须将太多的加速器映射到硬件部分时。
2HLS的技术局限性
并行性局限性:HLS 技术需要将顺序代码转换为并行电路,但有些代码无法实现高效的并行计算,从而导致电路的性能不够优秀。
时序局限性:由于HLS 转换器的限制,有些复杂的时序逻辑难以实现,从而导致电路的时序问题。
存储器局限性:由于FPGA芯片的存储器资源有限,因此对于大规模的存储器数据操作,往往需要采用一些额外的技术来优化。
代码复杂性:在复杂的代码中,可能存在很多特殊情况,需要使用特殊技巧才能正确转换为硬件电路,这也使得HLS技术的使用更加困难。
调试复杂性:从高级语言转换到硬件实现后,调试过程可能会变得复杂,不像软件调试那样直观和容易定位问题。
缺乏灵活性:在某些特殊的、非标准的硬件设计需求下,可能难以灵活地满足所有要求。例如一些非常新颖独特的硬件结构设计理念可能较难通过 HLS 来实现。
表达能力限制:虽然使用类 C 语言,但某些复杂的硬件特性和结构可能难以用这种高级语言精确表达,可能会导致一些设计细节无法完美呈现。
三HLS的LED流水灯
1创建项目工程
1点击Vivado HLS 中的Create New Project
2设置项目名
3加入文件
点击Source与Test Bench,右键后,选择New Fill创建文件。
2代码
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_ocnt_t i;for(i=0;i<CNT_MAX;i++){if(i==FLASH_FLAG){*led_o = ~led_i;}}
}
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));}
}
3仿真
1c仿真
点击project->project settings->synthesis->browser->选择顶层函数
点击project->Run C Simulation
2c综合
点击Solution->Run C Synthesis->Active Solution
3联合仿真
在Helloworld.cpp界面,右边的Drective界面,右键led_o,进入如下界面
按下图来配置,并点击OK。
然后点击联合仿真
仿真结束后,出现下面界面,说明联合仿真成功