硬件加速 - 系统架构(二)

发布时间 2023-08-14 21:51:16作者: 可达达鸭
  • 这篇博客中有详细介绍PS端和PL端的数据交互,以及PL端内部数据流向处理。
  • 本篇将详细介绍 PS端 需完成的设计任务。

1. PL端 主要任务

1.1 硬件加速IP核的驱动程序设计

  • 加速IP在HLS综合生成时,会一起产生IP的驱动文件,如下。".h"文件,头字母带x类。
    #include "xyolo_conv_top.h"
    #include "xyolo_max_pool_top.h"
    #include "xyolo_yolo_top.h"
    #include "xyolo_acc_top.h"
    #include "xyolo_upsamp_top.h"
    
  • 我们需要根据设计需求进一步修改这些驱动文件。主要根据IP寄存器地址分配,对寄存器内的值进行更改,控制加速IP核的工作状态。
    • 加速IP核寄存器信号一般包括控制信号、中断信号、输入特征图大小配置信号等。

1.2 Yolov3-Tiny网络参数的配置

  • Yolov3-Tiny网络中共有23层,若按照卷积进行划分,可以得到13层复合层;每个复合层包含当前卷积层和下一个卷积层之前其它计算层。
  • 编写结构体函数:定义网络每个卷积层的参数规模:输入输出大小、步长、激活方式以及完成该卷积层需要执行卷积IP核的个数。
    • 如下所示,使用make_layer_group()函数对复合层进行配置。其中input_fold_factor和output_fold_factor为输入/输出通道数是32的倍数。
    layer_group make_layer_group(int input_w,int input_h,int input_ch,int input_fold_factor,
                               int output_w,int output_h,int output_ch,int output_fold_factor,
                               bool conv_disable, ACTIVATION activate_type,POST_PROCESS post_process_type,int pooling_stride)
    
  • 对每一层执行该结构体函数,可以完成整个网络参数的配置。

1.3 完成网络的前向计算

  • 根据每个复合层,编写前向计算函数forward_layer_group(),完成复合层IP的计算,在执行13次前向计算函数之后,可以完成整个网络的前向计算。
  • forward_layer_group() 函数详解
    • 考虑到所有的复合层都是以卷积层为开始,所以可以首先检测是否为卷积层的最后一次累加.
      • 若不是卷积运算的最后一次累加,那么可将Switch 0-2的输入和输出都置为0,
typedef enum{
    NONE, MAX_POOL, YOLO, UPSAMPLE
} POST_PROCESS;