跳转到主要内容

FPGA vivado系统集成操作

judy 提交于

本文档系列是我在实践将简单的神经网络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
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

之前一直以为是在add sources中加入IP core,后来发现加入之后IP core在相应的IP catalog中找不到。可能add source有其他的意思。IP core是在project setting中加入的。
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

在block design中加入
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

经常在图中看到变量[31:0]这样的东西,这个描述是什么意思呢?
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

二、搭建系统
1.DMA基础知识
搭建系统中有一个重要的因素是DMA:(Direct Memory Access),即直接存储器存取,是一种快速传送数据的机制。数据传递可以从适配卡到内存,从内存到适配卡或从一段内存到另一段内存。
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

<li>AXI4:主要面向高性能地址映射通信的需求;</li>
<li>AXI4-Lite:是一个简单地吞吐量地址映射性通信总线;</li>
<li>AXI4-Stream:面向高速流数据传输;</li>
<li>AXI4总线分为主、从两端,两者间可以连续的进行通信。</li>
<li>GP master interface与GP slave interface之间有什么区别?主与从的区别,一个发起一个接收。</li>

为了实现相应的系统,我们该把什么样的IP core加入block?加入block之后线如何连接?

下面几个可能为重要的IP core
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

可能有用的文档有UG895:System-Level Design Entry 系统级设计入门

UG895:Using the Vivado IDE 运用vivado集成设计环境

2.创建HDL wrapper
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

我们只创建了一个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。

<li>MM2S意思是memory-mapped to stream, S2MM意思是stream to memory-mapped</li>
<li>当用到scatter-gather时,DMA与controller之间有一条额外的AXI bus,为了简化这条线并不在图表之中。</li>
<li>AXI-lite bus让处理器与AXI DMA之间进行联系</li>
<li>AXI-MM2S与AXIS2MM让Memory-Mapped AXI4 buses提供与DDR之间的连接。</li>
<li>AXIS-MM2S与AXIS-S2MM为AXI4-Stream总线,只在source与sink之间进行相应的stream流,不需要地址。</li>

1.点击create block,先点添加IP,把AXI derect memory access和zynq processing system加入,然后点击相应的block automation和connection automation,系统会自动添加相应的IP块进行相应初步的IP连接。
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

<li>AXI4-Lite是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元;</li>
<li>AXI4-Stream去掉了地址项,允许无限制的数据突发传输规模;</li>

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)
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

3.加入FIFO,然后把FIFO与DMA进行连接
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt="fifo的入连DMA的MM2S"></center>
<p align="center"><strong>fifo的入连DMA的MM2S</strong></p>
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt="fifo的出连DMA的S2MM"></center>
<p align="center"><strong>fifo的出连DMA的S2MM</strong></p>

进行了下面两个连接之后,把areset连接到大家的reset上,把clock连在clock上。连完之后就是下面这种结构。(FIFO只是一个常见的IP core,它有相应IPcore的输入输出,但是没有运算,算是最简单的IPcore,所以用FIFO来代表IP core)
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

4.移除AXI stream statu管脚和DMA的control ports管脚

在设计中这两个管脚是不需要的,所以我们可以移除他们。双击DMA块,然后取消勾选enable control,我们能看到对应于图上的control管脚们都没有了。
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

5.连接DMA interrupt与PS

首先双击点进去processing system的块,然后在interrupt选项里面勾选fabric interrupts中IRQ F2P选项。
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

加入叫concat的IP块,然后按下图连管脚
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

四、validate与export
1.点击validate,运行完之后会显示success,no error等信息,
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

2.可以点击regenerate layout icon来进行重新布局
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

3.点击generate bitstream,生成相应的比特流(生成比特流之前应当生成HDL wrapper)
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

失败了,

教训1:项目的用的板子的名字任何地方都要一致。

教训2:要设置相应的clock。

出现这个错误是由于对clock用的不熟并且不知道每一个连接的意思。因此我们重复进行上面的步骤试一下,重复几次之后还是不能进行相应的系统设计。

为了解决连线等等问题,我们需要能看懂连线,所以我们查阅相应的文档PG082 Processing System 7来看解决这个问题。

在又运行了两次失败之后,我们不得不进行最简单的操作。设置最简单的系统以走完整个流程。
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

点击generate bitstream,运行成功后给出了整个板子的占用情况。
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

经过此次操作,我们虽然不能成功运用调用DMA,但是我们成功的搭建了整一个最简单的系统,下一步,我们就要搭建实际的系统。

五、重新搭建FIFO系统
1.了解了整个流程之后,我们就开始搭建实际的系统。

<img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt="">解压此文件夹,然后用vivado打开对应的xpr系统文件。

因为版本有可能不同,所以我们需要自动更新相应的IP。

2.在更新了IP之后,我们点开processing system,使能相应的GP与HP管脚用于DMA
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

3.对应的DMA取消勾选scatter gather engine,并且改变相应的最大并发速率。(unaligned transfer可以不勾选)
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

4.点击块自动连接和线自动连接,让系统自动连线。

5.将FIFO的时钟和reset连接到系统的时钟和reset上,输入与输出连接到DMA上,连法参见上面。
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

6.在source里面点击create HDL wrapper

7.generate bit stream

8.在硬件上验证相应的项目,具体操作见

相关内容:
<a href="https://blog.csdn.net/weixin_36474809/article/details/80743037&quot; rel="nofollow" target="_blank">FPGA实践教程(四)片上ARM运行程序</a>

验证了我们设计的正确性。走完了整个流程,FIFO设计生成的系统是OK的。
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

六、实现基本的卷积
把相应的FIFO的IP core替换为CNN的IP core,从而生成比特流。重复进行上面的工作。
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

依然运行程序失败。

事后发现,问题原因在于系统搭建的问题。每次换IPcore都需要把原IPcore去掉,并且把所有连线删掉,然后重新布线,不然只删IPcore会有连线错误。

AXI interconnect上有一定的管脚冗余,把连线删掉,然后再连。
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

最终的layout如图:
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2019-04/%E5%8D%9A%E5%AE%A2/100018831-65…; alt=""></center>

运行失败。相应错误原因查找和最终成型的系统搭建方式见:
<p><a href="https://blog.csdn.net/weixin_36474809/article/details/80830229&quot; rel="nofollow" target="_blank">调通DMA系统集成中遇到的问题</a></p>
<p><a href="https://blog.csdn.net/weixin_36474809/article/details/80840448&quot; rel="nofollow" target="_blank">FPGA实践教程(三)系统搭建与烧录</a>

---------------------
作者:邢翔瑞
来源:CSDN
原文:https://blog.csdn.net/weixin_36474809/article/details/80690368