本文档系列是我在实践将简单的神经网络LeNet-5实现到Xilinx 的zynq-7z035的FPGA上遇到的问题和解决方法。
本文档重点探讨vivado软件的使用。
完成此过程可以参阅的文档有
UG892: Design Flows Overview 设计流程概览
UG895:System-Level Design Entry 系统级设计入门
UG895:Using the Vivado IDE 运用vivado集成设计环境,可能后两个更加着重探讨软件的使用。
背景:我们用vivado HLS对相关软件生成了相应的IP core,现在需要对IP core进行系统集成,形成完整的设计。
一、添加之前生成的IP core
之前一直以为是在add sources中加入IP core,后来发现加入之后IP core在相应的IP catalog中找不到。可能add source有其他的意思。IP core是在project setting中加入的。
在block design中加入
经常在图中看到变量[31:0]这样的东西,这个描述是什么意思呢?
二、搭建系统
1.DMA基础知识
搭建系统中有一个重要的因素是DMA:(Direct Memory Access),即直接存储器存取,是一种快速传送数据的机制。数据传递可以从适配卡到内存,从内存到适配卡或从一段内存到另一段内存。
- AXI4:主要面向高性能地址映射通信的需求;
- AXI4-Lite:是一个简单地吞吐量地址映射性通信总线;
- AXI4-Stream:面向高速流数据传输;
- AXI4总线分为主、从两端,两者间可以连续的进行通信。
- GP master interface与GP slave interface之间有什么区别?主与从的区别,一个发起一个接收。
为了实现相应的系统,我们该把什么样的IP core加入block?加入block之后线如何连接?
下面几个可能为重要的IP core
可能有用的文档有UG895:System-Level Design Entry 系统级设计入门
UG895:Using the Vivado IDE 运用vivado集成设计环境
2.创建HDL wrapper
我们只创建了一个PS,并且没有用到相应的fabric,但是zynq PS已经与Gigabit Ethernet PHY, the USB PHY, the SD card, the UART port and the GPIO相连接,所以我们仍然有许多工作可以做,比如在这个PS上运行linux,或者运行裸程序。
三、连接相应的IP
DMA (Direct Memory Access)让系统将数据从一个部分传到另一个部分,可以将任何一个data producer传输到memory,也可以从任何一个memory传输到data consumer。
- MM2S意思是memory-mapped to stream, S2MM意思是stream to memory-mapped
- 当用到scatter-gather时,DMA与controller之间有一条额外的AXI bus,为了简化这条线并不在图表之中。
- AXI-lite bus让处理器与AXI DMA之间进行联系
- AXI-MM2S与AXIS2MM让Memory-Mapped AXI4 buses提供与DDR之间的连接。
- AXIS-MM2S与AXIS-S2MM为AXI4-Stream总线,只在source与sink之间进行相应的stream流,不需要地址。
1.点击create block,先点添加IP,把AXI derect memory access和zynq processing system加入,然后点击相应的block automation和connection automation,系统会自动添加相应的IP块进行相应初步的IP连接。
- AXI4-Lite是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元;
- AXI4-Stream去掉了地址项,允许无限制的数据突发传输规模;
2. 下面需要在PS上使能一个高性能的AXI slave interface,我们需要在ZYNQ processing system双击IP core使这个管脚出来。双击ZYNQ processing system,然后点击PS-PL configuration,然后点击HP slave Interface,勾选第一个S_AXI_HP0_interface,以使能这个管脚。(HP的意思就是Hign-performance,意思是高性能线。PS的意思是processing system,PL为FPGA板子,即为FPGA)
3.加入FIFO,然后把FIFO与DMA进行连接
fifo的入连DMA的MM2S
fifo的出连DMA的S2MM
进行了下面两个连接之后,把areset连接到大家的reset上,把clock连在clock上。连完之后就是下面这种结构。(FIFO只是一个常见的IP core,它有相应IPcore的输入输出,但是没有运算,算是最简单的IPcore,所以用FIFO来代表IP core)
4.移除AXI stream statu管脚和DMA的control ports管脚
在设计中这两个管脚是不需要的,所以我们可以移除他们。双击DMA块,然后取消勾选enable control,我们能看到对应于图上的control管脚们都没有了。
5.连接DMA interrupt与PS
首先双击点进去processing system的块,然后在interrupt选项里面勾选fabric interrupts中IRQ F2P选项。
加入叫concat的IP块,然后按下图连管脚
四、validate与export
1.点击validate,运行完之后会显示success,no error等信息,
2.可以点击regenerate layout icon来进行重新布局
3.点击generate bitstream,生成相应的比特流(生成比特流之前应当生成HDL wrapper)
失败了,
教训1:项目的用的板子的名字任何地方都要一致。
教训2:要设置相应的clock。
出现这个错误是由于对clock用的不熟并且不知道每一个连接的意思。因此我们重复进行上面的步骤试一下,重复几次之后还是不能进行相应的系统设计。
为了解决连线等等问题,我们需要能看懂连线,所以我们查阅相应的文档PG082 Processing System 7来看解决这个问题。
在又运行了两次失败之后,我们不得不进行最简单的操作。设置最简单的系统以走完整个流程。
点击generate bitstream,运行成功后给出了整个板子的占用情况。
经过此次操作,我们虽然不能成功运用调用DMA,但是我们成功的搭建了整一个最简单的系统,下一步,我们就要搭建实际的系统。
五、重新搭建FIFO系统
1.了解了整个流程之后,我们就开始搭建实际的系统。
解压此文件夹,然后用vivado打开对应的xpr系统文件。
因为版本有可能不同,所以我们需要自动更新相应的IP。
2.在更新了IP之后,我们点开processing system,使能相应的GP与HP管脚用于DMA
3.对应的DMA取消勾选scatter gather engine,并且改变相应的最大并发速率。(unaligned transfer可以不勾选)
4.点击块自动连接和线自动连接,让系统自动连线。
5.将FIFO的时钟和reset连接到系统的时钟和reset上,输入与输出连接到DMA上,连法参见上面。
6.在source里面点击create HDL wrapper
7.generate bit stream
8.在硬件上验证相应的项目,具体操作见
FPGA实践教程(四)片上ARM运行程序
验证了我们设计的正确性。走完了整个流程,FIFO设计生成的系统是OK的。
六、实现基本的卷积
把相应的FIFO的IP core替换为CNN的IP core,从而生成比特流。重复进行上面的工作。
依然运行程序失败。
事后发现,问题原因在于系统搭建的问题。每次换IPcore都需要把原IPcore去掉,并且把所有连线删掉,然后重新布线,不然只删IPcore会有连线错误。
AXI interconnect上有一定的管脚冗余,把连线删掉,然后再连。
最终的layout如图:
运行失败。相应错误原因查找和最终成型的系统搭建方式见:
调通DMA系统集成中遇到的问题
FPGA实践教程(三)系统搭建与烧录