FPGA基础知识(二)HLS相关知识

本文档是我在实践将简单的神经网络LeNet-5实现到Xilinx 的zynq的FPGA上遇到的问题和解决方法。

本文档为实现相应操作所需掌握的背景知识,有了这些基础之后才能进行后面相应的软件操作。需要反复阅读相关概念,这样在运行相应软件时才能明白每个步骤的意义。

FPGA基础知识参阅我之前的文章:

FPGA入门教程:赛灵思文档解析UG998 FPGA设计与vivado高层次综合介绍(一)

 

完成LeNet-5的FPGA实现可能需要用到和查阅的文档有:

UG902:Vivado Design Suite User Guide: High-Level Synthesis:

该文档主要涉及vivado HLS的理解,vivado HLS软件的初步使用,以及相应的HLS相关的c语言库等,我们主要关注该文档的第一章:用vivado HLS软件实现HLS(高层综合High-level Synthesis)

UG871:Vivado Desigh Suite Tutoril:High-level Synthesis

该文档主要涉及vivado HLS软件的具体操作过程,包括HLS的介绍、c的验证、管脚综合、任意精度数、设计分析、优化分析、RTL验证、用HLS生成集成IP、在Zynq的AP Soc设计中用HLS生成的IP、这个文档是操作的重点。

 

HLS相关概念(UG902 v2016.4第一章中的内容)

我们需要明白在HLS过程中发生了什么,HLS是高层综合(High level Synthesis),是将C或者c++语言编译为FPGA能够读懂和运行的RTL级别的语言。通过HLS这个过程可以显著加快FPGA的设计进程,而不用从底层的FPGA语言编起。

HLS包含下面这些阶段

  • scheduling:确定每个时钟周期中执行哪些步骤
  • Binding:确定哪些硬件资源会被用到
  • 控制逻辑提取:提取控制逻辑,创建一个有限状态机(FSM:Finite state machine)来进行RTL的设计。

HLS需要对相应的c代码进行下面的综合:

  • 函数层面的c语言参数综合为相应的RTL 的输入输出管脚
  • c函数综合为RTL块架构
  • c中的循环初始状态下还是循环执行:通过优化方案可以将循环展开
  • c中的数组会被综合为FPGA中的块RAM或者UltraRAM

HLS创建一个优化的方案,评价标准有下面这些:

  • Area:用到的LUT,寄存器,BRAM和DSP48的数量
  • 时延:函数算出所有输出用的时钟周期
  • II(Initiation interval):函数可以接受新的输入数据需要的时钟周期
  • 循环迭代时延:运行一次循环需要的时钟周期
  • 循环间隔时延:新运行一次循环需要的时钟周期
  • 循环时延:运行循环需要的所有时钟周期

UG902文档v2016.4中9-13页具体举了两个具体的例子来了帮助理解HLS的schedule、binding和控制逻辑提取工作,这里我们跳过暂不讨论,如果以后用到可以回来看加深理解。

vivado HLS需要进行的步骤:

  1. 编译、执行(仿真)、调试相应的c语言代码
  2. 把c算法综合为RTL实现,在这个过程中可以使用优化指令
  3. 生成综合分析报告并分析设计
  4. 验证RTL的实现
  5. 打包RTL进入IP块

vivado HLS软件需要的输入信息

  • c函数用c/c++、SystemC、OpenCL API或者C kernel写成
  • Constrains:资源限制,例如时钟周期、时钟不确定性、与FPGA目标板
  • Directives:可选的过程,来实现特定的优化
  • c测试台(c test bench)与相关文档
  • HLS用c测试台来仿真c代码并且验证相应用c/RTL联合仿真得到的RTL输出

vivado HLS软件输出的信息

  • RTL实现文件,用HDL(hardware description language)语言写成,这是最重要的输出,有两种模式,VHDL语言和Verilog语言。这种实现文件会被作为IP块,并且可以被其他xilinx的设计工具所使用。
  • 报告文档:综合、c/RTL协同仿真、IP封装的输出结果。

 

下图1-4为vivado HLS所需要的输入输出。

 

FPGA基础知识(二)HLS相关知识_第1张图片

Synthesis,optimization,analysis

  1. 创建工程,初始solution
  2. 验证相应的c没有错误
  3. 运行synthesis获得一系列结果
  4. 分析结果

在HLS中有下面这些优化方法

  • pipeline,在上个进程运行结束前开始下个进程
  • 给函数、循环、区域指定时延
  • 针对具体的操作指令同时运行
  • 选择相应的I/O协议确保硬件可以与其他的设施相连接

了解这些知识之后,我们就可以开始运用vivado HLS进行相应的IP生成了。

相关论文

深鉴科技FPGA2017最佳论文ESE Efficient speech recognition engine with sparse LSTM on FPGA论文详解

PipeCNN论文详解:用OpenCL实现FPGA上的大型卷积网络加速

韩松EIE:Efficient Inference Engine on Compressed Deep Neural Network论文详解

韩松博士毕业论文Efficient methods and hardware for deep learning论文详解

   FPGA基础知识

FPGA基础知识(一)UG998相关硬件知识

FPGA基础知识(二)HLS相关知识

FPGA基础知识(三)UG902 接口综合

FPGA基础知识(四)UG902 RTL simulation and export

FPGA基础知识(五)系统集成知识

FPGA基础知识(六)UG586 Mermoy Interface Solutions

FPGA基础知识(七)片上单片机

FPGA基础知识(八)vivado设计流程中的知识

FPGA基础知识(九)SDK相关知识

FPGA基础知识(十)DMA与AXI4总线

尝试用IPcore调用DDR3及相关知识

   vivado HLS硬件化指令

vivado HLS硬件化指令(一)HLS针对循环的硬件优化

vivado HLS硬件化指令(二)HLS针对数组的硬件优化

vivado HLS硬件化指令(三)HLS增大运算吞吐量的硬件优化

vivado HLS硬件化指令(四)卷积相关的指令优化

卷积操作的HLS优化

   FPGA实践教程

FPGA实践教程(一)用HLS将c程序生成IPcore

FPGA实践教程(二)连接片上ARM

FPGA实践教程(三)系统搭建与烧录

FPGA实践教程(四)片上ARM运行程序

FPGA实践教程(五)PS用MIG调用DDR

FPGA实践教程(六)AXI-Lite实现PS与PL通信

FPGA实践教程(八)PS与PL共享DDR

FPGA vivado系统集成操作

DMA在linux下PS端c语言相关内容

数据流输入输出IPcore时c语言相关内容

调通DMA系统集成中遇到的问题

ARM用MIG调用DDR3的c程序解析

MIZ7035上的AXI接口的MIG测试

MIZ7035交叉编译单片机程序运行

你可能感兴趣的:(FPGA,FPGA基础知识)