FPGA——HLS入门-LED闪烁仿真

系列文章目录


一、HLS介绍

1、什么是HLS

HLS就是高综合(High level Synthesis)的缩写,通过HLS,我们可以将C或者c++语言编译为FPGA能够读懂和运行的RTL级别的语言。

这个术语是行为和电子系统的结合:是一门技术,也是一门科学,它把设计意图抽象化,抽象视图可以自动地将人类设计者的努力付诸现实。最终生成的设计应遵循一系列要求,包括芯片面积、时钟频率、功耗和时间性能的要求等等。

通过HLS将电路设计规范的算法级或行为级描述在一定的约束条件下转化为电路结构描述的方法和过程。高层次综合又称为行为级综合、算法级综合等。它使设计者能够在更高层次进行电子设计,更快速有效地在较高层次设计验证和仿真,而较低层次的工作由工具来自动完成,从而让数字电路系统设计工程师可以有更多的精力和更充分的条件去进行设计空间的搜索,寻求最佳的设计方案。

HLS 的过程通常基本包括预处理、编译、转换、调度、分配、控制器、综合、RTL 、生成、和反编译等几个部分。编译、转换部分决定了软件的兼容性和易用性,调度(schedule)和分配(binding)主要决定了产生的 RTL 的性能、资源大小等。

2、与VHDL/Verilog有什么关系?

verilog 适合于RTL 级别的硬件描述,但是RTL 级别的硬件描述其实还是过于底层,因此这也带来了很多繁重的编码和设计工作,类似于汇编程序一样,Verilog可以精准的控制电路实现,但实现起来需要较长的周期,而HLS虽然可快速迭代,但其从软件到硬件翻译无论是面积还是资源均难以控制。

VHDL/Verilog两者结构基本相似,并行语句的种类也类似;

VHDL语言需要进行大量说明,程序通常比较长;

Verilog HDL通常不进行说明,或只进行非常简短的说明,程序比较简短。

3、关键技术局限性

关键技术
输入语言采用了类 C语言而非前两代的 HDL 语言,如 C、C++、SystemC 以及 SpecC、HandelC 等,这能够使得系统模型得到复用,进行进一步的软硬件实现。
实现了对时序(timing)比较精确的评估和调度。
实现了对验证环境的重复使用,通过 TLM 建模技术可以将系统验证环境复用于 RTL 级验证,降低了验证的复杂度。

局限性
没有早期的性能估计以及任何违反设计和平台限制的行为
没有利用所有可能的数据通信方式
没有功能概述,也没有对用户代码进行优化转换
支持代码报告得太晚了
在某些情况下,工具的高效实施是不可能的,例如当必须将太多的加速器映射到硬件部分时。 HLS工具无法预先检测到这种情况,也无法在用户坚持的情况下尽量减轻其影响。

二、Vivado HLS - LED闪烁仿真

1、项目配置

1.点击Vivado HLS 中的Create New Project

在这里插入图片描述
在这里插入图片描述

2.接下来选择定成函数,我们在这里暂不不添加,直接点击 Next
在这里插入图片描述
3.接下来是添加 C 仿真文件,我们同样先不添加,点击 Next
在这里插入图片描述
4.接下来进行器件的选择,在首先我们点击图中所示位置选择元器件

在这里插入图片描述
在这里插入图片描述
5.在导航栏中,文件列表所示
在这里插入图片描述
6.添加源文件
在这里插入图片描述

2、C仿真

1.编写代码
Helloworld.h

//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

//Helloworld.cpp
#include "HelloWorld.h"
void flash_led(led_t *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);
		}
	}
}

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));
	}
}


2、仿真
在这里插入图片描述

在这里插入图片描述

弹出这个界面,什么都不用选。

运行仿真后,出现下面这个界面就说明仿真成功了:

在这里插入图片描述
3、综合
进行综合之前,先选择Top Function。

点击Project -> Project Setting -> Synthesis ,点击Helloworld.cpp,并点击Browse选择函数flash_led。

在这里插入图片描述
在这里插入图片描述

结束后,会有一个总结文件如下:
在这里插入图片描述
在这个文件的最后,有关于端口的表格:
在这里插入图片描述
文件:

在这里插入图片描述

3、联合仿真

在这里插入图片描述
在这里插入图片描述
在Helloworld.cpp界面,右边的Drective界面,右键led_o,进入如下界面:

在这里插入图片描述
按上图来配置,并点击OK。

然后点击联合仿真:

在这里插入图片描述

三、总结

通过HLS工具进行LED闪烁仿真可以帮助我们验证设计的正确性和功能性。在仿真过程中,我们可以观察LED的闪烁模式是否与我们预期的一致,并进行必要的调试和修正。仿真还可以帮助我们评估性能指标,如时序约束和资源利用率。

猜你喜欢

转载自blog.csdn.net/qq_52187415/article/details/130837572