update TechSpecification.md

This commit is contained in:
WalkerLau 2020-08-24 16:20:47 +08:00 committed by GitHub
parent a5f317cfcc
commit 598d5ac78d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -20,7 +20,7 @@
本系统的主要功能部件包括ARM Cortex-M3核、决策树算法硬件加速器、AHB总线矩阵、DDR控制器、片上存储模块、摄像头模块、显示器模块、APB外设等系统框图见图2.1。
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/Architecture.png"></div>
<center style="font-size:10px;color:#C0C0C0">图2.1 系统总框图</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图2.1 系统总框图</p>
本系统采用ARM公司提供的DesignStart Eval版本Cortex-M3软核IP 作为中央处理单元SOC整体部署在FPGA平台上。
@ -33,7 +33,7 @@ ARM公司还提供了一个相当有用的工具——Cortex-M System Design Kit
更为重要的是CMSDK提供了可配置的总线矩阵模块AHB Bus Matrix。我们可以利用总线矩阵模块作为系统总线与DTCM及低速外设的互联模块同时配置好各个部件的地址映射。图2.2展示的是本项目利用CMSDK总线矩阵模块配置地址映射的脚本代码。其中总线矩阵只有一个slave端S0_SYS连接到Cortex-M3的系统总线端口以及两个master端M0_DTCM及M1_APB_BRIDGE分别连接DTCM及APB低速外设部分。slave端与两个master端将在总线矩阵内部进行互联与仲裁从而使M3能够通过预设的地址方便地访问、控制系统的各部件。
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/busMatrixSet.png"></div>
<center style="font-size:10px;color:#C0C0C0">图2.2 CMSDK总线矩阵地址映射配置</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图2.2 CMSDK总线矩阵地址映射配置</p>
为了达到更好的性能我们并不直接将低速的LED、UART等外设连接到M3的AHB系统总线上。对于低速外设我们采用的是APB协议这将涉及到AHB协议与APB协议的相互转换。得益于CMSDK的“AHB to APB”转接模块我们可以先将LED、UART等外设通过APB协议挂载到APB Bridge模块上然后再把APB Bridge模块挂载到AHB总线上。
@ -43,7 +43,7 @@ ARM公司还提供了一个相当有用的工具——Cortex-M System Design Kit
我们使用OmniVision公司的ov5640型摄像头实时采集图像数据。经过测试我们发现当采集图像大小设置为640×480时能够在检测速度和检测准确度上取得良好平衡。
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/camera.png" width=50%></div>
<center style="font-size:10px;color:#C0C0C0">图2.3 摄像头模块</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图2.3 摄像头模块</p>
图2.3展示了摄像头模块的详细框图。首先我们的配置单元CONFIG将摄像头的配置信息通过I2C协议传输给摄像头外设。摄像头经过配置后将逐帧采集图像数据摄像头采集到的图像为RGB565格式即每个像素点占据16位数据空间红色通道5位、绿色通道6位、蓝色通道5位。由于每个时钟仅能传输8位数据因此需要2个时钟周期才能完成一个像素数据的传输为此我们加入了8bit转16bit的转换单元。
@ -57,10 +57,10 @@ ARM公司还提供了一个相当有用的工具——Cortex-M System Design Kit
显示器模块要解决的关键问题是如何做到图像读写不冲突若写图像的地址与读图像的地址是相同的显示器显示的图像数据有可能是正在从摄像头写入的数据从而产生图像割裂。因此我们设置了两个不同的地址它们交替作为图像的写地址和读地址实现读写分离如图2.5所示。
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/monitor.png" width=50%></div>
<center style="font-size:10px;color:#C0C0C0">图2.4 显示器模块</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图2.4 显示器模块</p>
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/addrSwitch.png"></div>
<center style="font-size:10px;color:#C0C0C0">图2.5 图像读写地址分离与交替变换过程</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图2.5 图像读写地址分离与交替变换过程</p>
### 2.4 APB外设
本系统的APB外设有LED灯、UART、动作发生器Igiter、计时器Timer这几个模块它们由APB总线挂载到系统中负责实现系统的辅助功能。
@ -104,7 +104,7 @@ Cortex-M3的启动文件需要用汇编语言编写主要可以分为三个
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/startup1.png" width=60%></div>
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/startup2.png" width=60%></div>
<center style="font-size:10px;color:#C0C0C0">图3.1 启动文件部分代码</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图3.1 启动文件部分代码</p>
对于在M3上运行的软件而言之前搭建的SOC中的ITCM就相当于ROM空间软件的启动代码及操作指令都保存在这里。而DTCM相当于RAM空间堆栈空间由RAM开辟我们把堆和栈的大小分别设置为1MB。
@ -113,12 +113,12 @@ Cortex-M3一共支持256个中断其中包含240个外部中断。最高优
对于低速外设的访问我们还需要定义简单的驱动函数通过对外设所在地址进行读写操作从而控制外设的动作。以LED的控制为例我们先定义一个结构体方便访问LED如图3.2。注意需要在定义LED变量时加入volatile关键字禁止编译器对变量访问优化。如果不加这个volatile关键字程序可能会利用cache当中的数据可能读取的是该变量过时的值或者不能把新的值写入物理地址中加了volatile就在需要用的时候程序重新去对应的地址去提取保证是最新的。
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/structure.png" width=50%></div>
<center style="font-size:10px;color:#C0C0C0">图3.2 LED访问结构体</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图3.2 LED访问结构体</p>
而用户程序部分我们采用C语言实现所选用的决策树智能算法。在利用keil编译软件代码时需要用fromelf工具将axf可执行文件转换为面向Verilog HDL内存模型的hex文件如图3.3所示。hex文件是由axf文件的32位指令翻译成16进制表示后的可执行代码。得到特定格式的hex文件后我们就可以在ITCM的Verilog代码中通过readmemh语句将编译得到的可执行代码初始化到ROM中。需要注意的是需要在执行fromelf工具时添加--vhx参数转换为面向Verilog HDL内存模型的hex文件否则系统软件将无法启动这个问题曾阻碍了我们队伍较长时间。
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/keiloption.png"></div>
<center style="font-size:10px;color:#C0C0C0">图3.3 将axf文件转换为特定格式的hex文件</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图3.3 将axf文件转换为特定格式的hex文件</p>
## 4. 智能算法硬件加速器设计
通过分析最初版本的人脸检测系统的性能瓶颈,我们团队为检测系统提出了软硬件高度配合与定制化的多项加速方案,包括图像灰度转换单元、片上存储优化、多线程移窗并行加速器等硬件加速模块。它们共同组成了一个高效的加速系统集群,极大提升了本系统检测人脸的速度。
@ -132,7 +132,7 @@ Cortex-M3一共支持256个中断其中包含240个外部中断。最高优
我们在检查决策树硬件加速器的运行时序时发现受到DDR传输延迟的限制将数据从DDR读取到加速器内需要消耗大量的时间。如图4.1所示尽管在优化了DDR访问的配置后加速器从DDR读取一个32位数据仍然需要耗费40~50个时钟这足以完成近20个加速器的常规操作。
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/ddraccess.png" width=60%></div>
<center style="font-size:10px;color:#C0C0C0">图4.1 从DDR读取数据耗时与加速器常规操作耗时对比</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图4.1 从DDR读取数据耗时与加速器常规操作耗时对比</p>
我们通过计算分析发现算法读取参数文件的数据传输量占据总数据传输量的40%。为了尽可能减少DDR的访问频率我们将预先训练好的决策树参数文件从DDR转移到FPGA片上块状存储Block RAM内。相比于延时较长的DDR访问加速器对片上存储Block RAM的访问仅需要2个时钟延时就能完成。
@ -140,7 +140,7 @@ Cortex-M3一共支持256个中断其中包含240个外部中断。最高优
多线程移窗并行加速器是硬件加速系统的核心成员。它由AXI控制单元、加速核、中断控制单元等部件所组成如图4.2所示。
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/accelerator.png" width=60%></div>
<center style="font-size:10px;color:#C0C0C0">图4.2 多线程移窗并行加速器框架</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图4.2 多线程移窗并行加速器框架</p>
#### 4.3.1 加速器的数据流动
为了尽可能减短数据的传输路径我们把移窗并行加速器直接接在DDR上所有待处理的输入数据都不会经过Cortex-M3处理器加速器将从片上存储模块Block RAM以及DDR中直接读取所需要的数据并将检测结果直接存回DDR。因此我们为每个加速器核都配备了一个独立的AXI控制单元来和DDR进行数据传输使加速器核能够独立存取DDR上的数据。同时我们采用了双端口的片上存储Block RAM单元为多线程加速器访问片上数据提供带宽支持。
@ -155,7 +155,7 @@ Cortex-M3一共支持256个中断其中包含240个外部中断。最高优
为此我们的人脸检测系统引入了多线程移窗的概念采用多个硬件加速核组成了多线程的并行硬件加速器每个加速核都可以独立历遍级联决策树处理一个移窗位置的运算。图4.3展示了单线程移窗和多线程移窗的区别,在多线程移窗模式下,加速器可以同时处理多个移窗位置的检测任务,从而极大提高了人脸检测的速度。
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/multiThreads.png" width=90%></div>
<center style="font-size:10px;color:#C0C0C0">图4.3 单线程串行移窗与多线程并行移窗对比</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图4.3 单线程串行移窗与多线程并行移窗对比</p>
### 4.4 其他加速优化策略
我们团队还持续监测检测系统每一次迭代优化后的性能瓶颈,并根据瓶颈分析结果给下一步优化方向提供参考。因此,除了上述由我们团队独立设计的硬件加速模块外,我们还找到了许多细节性而十分关键的算法加速方法。
@ -165,7 +165,7 @@ Cortex-M3一共支持256个中断其中包含240个外部中断。最高优
我们对DDR进行的数据访问都是随机地址的为此我们将用户层地址到物理层地址的映射模式设置为更适合数据随机访问的Bank-Row-Column模式进一步优化了DDR的访问速度。
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/bankrowcol.png" width=80%></div>
<center style="font-size:10px;color:#C0C0C0">图4.4 Bank-Row-Column模式的内存地址映射</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图4.4 Bank-Row-Column模式的内存地址映射</p>
在AXI互联模块中我们用同步整数比时钟转换Synchronous integer-ratio conversion代替了需要利用更多硬件资源且会引入更大延时的异步时钟转换Asynchronous clock conversion
@ -181,7 +181,7 @@ Cortex-M3一共支持256个中断其中包含240个外部中断。最高优
图4.5展示了采用硬件加速器前后的人脸检测时间对比情况。
<div align="center"><img src="https://raw.githubusercontent.com/WalkerLau/DetectHumanFaces/master/images/accComp.png" width=90%></div>
<center style="font-size:10px;color:#C0C0C0">图4.5 未采用硬件加速器(左)和采用硬件加速器(右)</center>
<p align="center" style="font-size:10px;color:#C0C0C0">图4.5 未采用硬件加速器(左)和采用硬件加速器(右)</p>
## 参考文献
[1] Nenad Marku V S, Frljak Miroslav, Pand V Z I C Igor-S, et al. Object detection with pixel intensity comparisons organized in decision trees[J]. arXiv preprint arXiv:1305.4537, 2013.