ZYNQ

ZYNQ系列是赛灵思公司(Xilinx)推出的行业第一个可扩展处理平台,旨在为视频监视、汽车驾驶员辅助以及工厂自动化等高端嵌入式应用提供所需的处理与计算性能水平。该系列四款新型器件得到了工具和IP 提供商生态系统的支持,将完整的 ARM® Cortex™-A9 MPCore 处理器片上系统 (SoC) 与 28nm 低功耗可编程逻辑紧密集成在一起,可以帮助系统架构师和嵌入式软件开发人员扩展、定制、优化系统,并实现系统级的差异化。

CNN在ZYNQ上的实现

ZYNQ简介

ZYNQ系列是Xilinx推出的高端嵌入式SoC,其在片上集成了ARM处理器和FPGA。ZYNQ与传统的嵌入式CPU相比,具有强大的并行处理能力。开发人员利用FPGA强大的并行处理能力,不仅可以解决多种不同信号处理应用中的大量数据处理问题,而且还能通过加入更多外设来扩展处理系统的功能。ZYNQ通过引入最新的高速AXI-4总线,可轻松实现外设的扩展与高速互访。

ZYNQ SoC十分适用于硬件加速,最典型的架构就是将需要加速的大运算量逻辑部署到FPGA上,而将流程控制的逻辑部署到arm上。典型的ZYNQ SoC结构如图1。

CNN简介
CNN全称卷积神经网络,包括卷积层(convolutional layer)和池化层(pooling layer)。此处不对CNN算法原理进行赘述,仅对网络结构进行简单描述。

作者:Steve Leibson

很多嵌入式设计使用基于微处理器和微控制器的单板计算机 (SBC) 和系统级模块 (SoM)(例如,请参阅“使用 Raspberry Pi 3 构建低成本工业控制器”)。但是,更多嵌入式应用无法忍受与软件相关的响应时间所带来的延迟。

这些应用需要只有定制硬件方可实现的额外性能,而开发定制硬件的最快捷方法就是使用 FPGA。

本文将讨论使用 SoM 来开发嵌入式系统的优势,这些系统需要借由 FPGA 提供更高的处理能力。本文还将介绍各种不同的 FPGA SoM,并讨论它们在嵌入式设计开发中的使用。

FPGA 系统级模块的角色
系统级模块 (SoM) 可以帮助设计人员开发带有定制接口的特定外形尺寸的嵌入式系统,而无需从头开始开发内核处理系统。设计人员可将预先设计且经过测试的 SoM 插入到预先设计或定制的载卡中,以创建嵌入式设计,其功能与完全定制的设计相同,但硬件开发所需的时间要少得多。

与从头开始开发硬件相比,使用 SoM 具有几大优势,其中包括:

  • 节省成本(在开发和调试基于 SoC 的电路板的过程中,会产生很高的非经常性工程成本)
  • 降低设计风险
  • Zynq-7000 PS到PL端emio的使用

    作者:OpensLee,FPGA开源工作室

    1 背景知识
    上一节《Zynq-7000 ARM端MIO的使用》讲解了PS端MIO的使用,本节讲解ARM处理器通过emio(Extendable Multiuse I/O)控制PL端接口。如下图所示,ZYNQ-7000的GPIO分为两种(MIO,EMIO)。EMIO分布在Bank2和BANK3,共有64个引脚可以使用。

    如下图所示,当我们的MIO不够使用时我们可以使用EMIO,因为EMIO连接到FPGA端,所以管脚需要约束。

    Zynq-7000 ARM端MIO的使用

    作者:OpenSLee

    1. 背景知识

    Xilinx Zynq-7000 芯片的PS端MIO(multiuse I/O)所在位置如下图红色框所示。MIO(0:15)在bank0上,MIO(16:53)在bank1上。他们不需要管脚约束,既可以当做PS 端普通的IO也可以用做PS端SPI、I2C、CAN等总线。

    本节将使用MIO的GPIO功能实现LED流水灯。

    2. MIO流水灯实验
    对于工程的创建在此不再赘述。可参考《Zynq-7000 ARM端helloworld实验

    1) ZYNQ7 Processing System GPIO的设置

    点击MIO Configuration>>选中GPIO MIO如下图所示。其他配置根据自己的开发板设置。

    Zynq-7000 ARM端helloworld实验

    作者:OpenSLee

    1. 背景知识

    Helloworld 实验总是各种编程语言的开始第一课,这里我们将使用xilinx zynq-7000芯片ARM端完成串口打印”Helloworld”实验,旨在体验一下zynq-7000 的开发流程,为以后的zynq-7000的开发打下基础。

    2. Zynq-7000 HelloWord

    本人使用的zynq-7000芯片为xc7z010clg400。

    Vivado的工程创建我们在这里就不在详述。

    1) Create Block Design

    点击Create Block design >>填写Design name >> OK 如下图所示。

    2) 添加ZYNQ7 Processing System

    Zynq串口调试中遇到的问题

    作者:圆宵,来源:FPGA那点事儿

    串口是很常用的通信端口,其速率比较慢,控制也比较简单,一般来说,使用时不会出现太大的问题。但笔者前一阵调试一块zynq的板子,用CPU通过串口和板卡上的一款芯片进行通信时,却也碰到了不大不小的麻烦。现在把解决问题的过程分享出来,虽然犯的都是很low的错误,但是也希望能对读者有一些借鉴。

    整个系统中,涉及串口通信的部分大概是这样的:

    PL中使用的是Xilinx提供的标准串口IP,串口的波特率可调,应用中用的是115200 bps。整个系统裸跑,使用标准的驱动。调试时,基本的串口通信没有遇到什么障碍,很快就通了。但是把所有的功能整合到一起,在整个系统联调时,却在串口通信碰到了稀奇古怪的问题。

    Zynq AXI总线

    zynq AXI是很重要的内容,本篇仅是简单的介绍。大量参考了其他书籍。

    AXI (Advanced eXtensible Interface) 本是由ARM公司提出的一种总线协议, Xilinx从 6 系列的 FPGA 开始对 AXI 总线提供支持,目前使用 AXI4 版本。

    1.AXI总线

    ZYNQ有三种AXI总线:

    (1)AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输;

    (2)AXI4-Lite:(For simple, low-throughput memory-mapped communication )是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元。

    (3)AXI4-Stream:(For high-speed streaming data.)面向高速流数据传输;去掉了地址项,允许无限制的数据突发传输规模。

    AXI4总线和AXI4-Lite总线具有相同的组成部分:

    (1)读地址通道,包含ARVALID, ARADDR, ARREADY信号;

    (2)读数据通道,包含RVALID, RDATA, RREADY, RRESP信号;

    关于zynq debug进入main函数或汇编函数的小技巧

    相信很多朋友在调试ZYNQ的时候也遇到过这个问题,在SDK模式先DEBUG电路板的时候,执行完debug后,分布运行有时候进入C语言的main函数,有时候进入编译后的汇编main函数。

    对于我这种汇编小白,C函数显得更容易理解,也方便调试。下面解释一下为什么会出现这两种现象,完全是因为我们操作的原因,因而完全可以避免。

    在调试界面选择调试文件的时候,如果现在Debug文件夹下的应用程序,则分布运行跳转到C语言的main函数;如果选择Release文件夹下的应用程序,则分布运行跳转到编译后的汇编main函数。大家在debug的时候根据自己的喜好选择即可。


    Zynq平台移植知识点

    一、嵌入式Linux系统组成

    zynq平台上的Linux系统由四部分组成:BOOT.bin、devicetree.dtb、uImage、uramdisk.image.gz。
    (1)BOOT.bin:启动引导程序,包括第一阶段引导程序(FSBL)和第二阶段引导程序(SSBL),zynq平台上一般还需要一个system.bit文件,用于构建PL部分。
    (2)uImage:linux系统核心部分,完成虚拟地址到物理地址的映射、驱动设备的初始化、内存管理、进程间通信等工作。
    (3)devicetree.dtb:二进制格式的Device Tree描述,Device Tree是一种用来描述硬件的数据结构,包含了有关CPU、物理内存、总线、外部设备等信息。
    (4)uramdisk.image.gz:ramfs格式文件系统。根文件系统,可以重复使用,不需要每次都编译。

    二、BOOT.bin的制作

    zynq平台上的BOOT.bin的制作需要三个文件:U-boot、fsbl、system.bit。

    Xilinx Zynq 7000 FSBL启动分析(二)

    前言
    在上一次分析中,分析到了
    HandoffAddress = LoadBootImage();

    在分析这个函数之前,在从0地址运行之前,在复位(上电复位)之后会从bootROM这个位置开始执行代码,在bootROM中,程序会将QSPI(如果是从qspi启动的话)的前nK的数据拷贝到OCM中,然后跳转到OCM中执行。把生成的BOOT.bin文件用二进制程序打开,根据数据手册可以分析一下前面的数据含义。

    BOOT.bin
    在boot.bin中从地址0-0x8BF可以分成17个部分,每个部分都有一定的含义
    1. 0x000 中断向量表
    2. 0x020 固定值 0xaa995566
    3. 0x024 固定值 0x584c4e58 ASCII: XLNX
    4. 0x028 如果是0xa5c3c5a3或者0x3a5c3c5a为加密的
    5. 0x02C bootrom头版本号,不用管
    6. 0x030 从bootrom开始到app地址的总数(bytes)
    7. 0x034 从loadimage拷到OCM的长度
    8. 0x038 目的地址到哪儿拷贝FSBL
    9. 0x03C 开始执行的地址
    10. 0x040 同7
    11. 0x044 0x01为固定值

    同步内容