一、什么是HLS?
HLS概念
HLS(High-Level Synthesis)是一种硬件设计方法,它允许使用高级编程语言(如C、C++)来描述硬件功能,然后通过自动化工具将其转换为硬件描述语言(如Verilog或VHDL)。这种方法可以显著提高硬件设计的效率和可移植性,缩短开发周期,并减少设计错误的可能性。
HLS与VHDL/Verilog
HLS(High-Level Synthesis)和传统的硬件描述语言(如VHDL和Verilog)在硬件设计方法上有几个重要的对比点:
-
抽象级别:
- HLS使用高级编程语言(如C、C++)来描述硬件功能,这使得设计者能够更加抽象地表达设计意图,而不需要深入考虑底层硬件实现细节。
- VHDL和Verilog是硬件描述语言,需要设计者详细地描述电路逻辑、状态机行为等底层硬件细节。
-
开发效率:
- HLS可以显著提高硬件设计的效率,因为它允许设计者使用熟悉的高级编程语言进行设计。这可以缩短开发周期,并降低设计错误的可能性。
- VHDL和Verilog的学习曲线较陡,设计过程通常更为繁琐和耗时。
-
可移植性:
- HLS代码通常更加抽象和可移植,因为高级编程语言的抽象级别使得代码更容易在不同的硬件平台上进行重用。
- VHDL和Verilog的代码通常更为特定于目标硬件,可移植性较低。
-
性能优化:
- 在某些情况下,手动编写的VHDL或Verilog代码可以实现比HLS生成的代码更优化的硬件结构,特别是对于对性能要求极高的应用。
- HLS工具在生成硬件描述语言时,可能无法完全优化以达到手动优化的水平。
HLS的局限性
HLS 的局限性包括:
-
性能限制:由于 HLS 工具需要将高级语言转换为硬件描述语言,因此生成的硬件结构可能无法完全优化,导致性能略低于手动编写的硬件描述语言。
-
复杂性:对于某些复杂的硬件功能,使用 HLS 可能会导致生成的硬件描述语言较复杂,难以理解和调试。
-
资源利用:HLS 生成的硬件结构可能会使用较多的硬件资源,尤其是在某些情况下,无法充分利用硬件资源以实现最佳性能。
二、HLS的实例——Led点亮仿真实现
1、新建项目
1、点击 create new project
2、为项目命名,选择项目的路径
3、点击next(选择顶层函数,此处暂不管)
4、继续点击next(选择添加C仿真文件,此处可以暂时不管)
5、选择器件
到此一个最基本的项目完成
2、代码编写
1、点击Source,右键后,选择New File,创建文件
Helloworld.h
#ifndef _HELLOWORLD_H_
#define _HELLOWORLD_H_
#include "ap_int.h"
typedef ap_int<1> led_t;
void flash_led(led_t *led_o);
#endif
Helloworld.cpp
#include "HelloWorld.h"
void flash_led(led_t *led_o){
#pragma HLS INTERFACE ap_ovld port=led_o
#pragma HLS INTERFACE ap_ovld port=led_o
int i;
for(i=0;i<10000;i++){
if(i==9999){
*led_o = ~(*led_o);
}
}
}
2、仿真测试文件添加,右键Test Bench,选择New File
tb_Helloworld.cpp
#include "HelloWorld.h"
#include <stdio.h>
int main(){
led_t led_o;
const int SHIFT_TIME = 4;
int i;
for(i=0;i<SHIFT_TIME;i++){
flash_led(&led_o);
printf("result : %d \n",(int)(led_o&0x01));
}
}
3、添加后如图
3、c仿真
1、点击 run c sinulation
2、
弹出这个界面,什么都不用选。
运行仿真后,出现下面这个界面就说明仿真成功了
3、综合
进行综合之前,先选择Top Function。
点击Project -> Project Setting -> Synthesis ,点击Helloworld.cpp,并点击Browse选择函数flash_led。
4、点击此处
5、结束后,会有一个总结文件如下
在这个文件的最后,有关于端口的表格:
7、已经生成好的.v文件:
8、联合仿真
在Helloworld.cpp界面,右边的Drective界面,右键led_o,进入如下界面:
9、点击ok,结果如下
三、总结
通过HLS工具进行LED闪烁仿真可以帮助我们验证设计的正确性和功能性。在仿真过程中,我们可以观察LED的闪烁模式是否与我们预期的一致,并进行必要的调试和修正。仿真还可以帮助我们评估性能指标,如时序约束和资源利用率。