allan 的blog

在前面的几个例子中,我们经常会看到AXI接口或是总线,那么AXI到底是什么呢?如果你想进行系统的了解,可以查阅Xilinx的文档UG761《AXI Reference Guide》。这里如文章题目,只是做一个简答的介绍,主要提炼出一些知识点。大部分是翻译的那篇文章,有的地方为了表述准确,直接引用原文。

AXI全称Advanced eXtensible Interface,是Xilinx从6系列的FPGA开始引入的一个接口协议,主要描述了主设备和从设备之间的数据传输方式。在ZYNQ中继续使用,版本是AXI4,所以我们经常会看到AXI4.0,ZYNQ内部设备都有AXI接口。其实AXI就是ARM公司提出的AMBA(Advanced Microcontroller Bus Architecture)的一个部分,是一种高性能、高带宽、低延迟的片内总线,也用来替代以前的AHB和APB总线。第一个版本的AXI(AXI3)包含在2003年发布的AMBA3.0中,AXI的第二个版本AXI(AXI4)包含在2010年发布的AMBA 4.0之中。

ModelSim仿真入门

注:本文记录内容在ModelSim6.2b、ModelSim6.5、ModelSim10.1a中均做过。

本文以一个四分频的Verilog程序为例,记录一下自己学习的ModelSim的入门过程。除了帮自己加深记忆,希望对别人有一点帮助。

一,建立工程

点击”File”->”New”->”Project”,出现”Create Project”对话框,如图:

PS与PL通信概述

传统的SoPC设计无外乎两种方式:(1)在FPGA上设计一个软核,比如Altera的NIOSII,Xilinx的MicroBlaze等(2)将一个独立的FPGA和处理器芯片(比如ARM等)联合使用。第一种方式的局限在于软核的性能远远不及硬核,而且会占用大量的FPGA资源;第二种方式的局限在于如果处理器核FPGA之间需要大量数据通信的时候,两者之间的带宽往往就会成为瓶颈。而ZYNQ-7000芯片的出现,解决了这两方面的问题:一方面FPGA和ARM做在同一款芯片里面,使用的是硬核处理器,处理能力相比软核大大提升;另一方面,做在同一个芯片内,通过高速总线,解决了FPGA和ARM通信瓶颈的问题。前面的一系列文章其实已经对两者之间的通信有所涉及,但因为最近发现有很多人想对PS和PL部分的通信多了解一些,所以我决定写一篇文章,介绍一下。介绍的宗旨是全而不详,因为每一种方式都在Xilinx官方有很详细的文档,我就不做文字搬家了,只写出所有的通信方式,每一种大家可以去芯片手册或者其他相关文档查找。

通过前面的几个例子,我们可以看出,在使用Zynq做设计时,合理使用Xilinx已有的IP核非常的关键,可以极大地方便与简化我们的开发。但是有的时候我们需要根据自己的需要设计自己的IP核,即所谓的用户IP。这篇文章就通过一个完整的例子介绍如何设计用户IP,并且会对驱动级的应用程序设计流程进行一个详细的介绍。

用户IPCore
用户IPCore就是用户自定义的IP核,用以和官方提供的IP核做区别。IPCore属于PL部分,所以在Zynq上创建IPCore时就需要考虑如何跟PS交换数据。对于一般的IP核来说,有两种可行的方案,一是通过EMIO交换数据(GPIO、SPI等),二是制作满足AXI协议的IP核。第一个方案其实是将PL的IP核看做系统的外设,在数据交互性能和效率上都有很大的欠缺,常用的方法是第二种,Xilinx提供的IP核也都属于第二种。但是第二种方案的问题在于,制作的IP核和AXI协议密切相关,这提高了IP核设计的难度。为了降低难度,Xilinx提供了用户IP向导(Wizard)。它会自动生成总线(AXI)相关的代码,做好地址译码逻辑、读写控制逻辑,并在用户工作区生成一些寄存器。我们写的PL逻辑通过读写这些寄存器和PS交互。这里我们介绍一个PWM发生器的例子,介绍一下用户IPCore的开发流程。这个PWM发生器内部只有两个寄存器,一个是调节周期的周期寄存器,另一个是调节占空比的占空比寄存器。其中周期寄存器的最高位是状态位,控制PWM波最后是否产生。该例参考自《ZYNQ嵌入式系统软硬件协同设计实战指南》一书。

前面在生成从Flash和SD卡启动的镜像文件时有提到一个FSBL,这个和ZYNQ的启动有关系。今天我就介绍一下ZYNQ的启动和配置。因为ZYNQ SoC由PS和PL部分组成,所以它的启动和配置也会稍微复杂一点,这里仅作简单介绍,希望可以起到抛砖引玉的效果。要了解具体的细节可以参考Xilinx官方文档UG585 第6章.

概述
在Zynq上,有一块静态存储区ROM,专门负责zynq刚上电时的启动过程,这个区域称之为boot ROM。系统上电后,根据用户选择的启动方式,boot ROM读取启动方式寄存器内容来决定用户设置的启动方式。不过,只有当电源复位信号PS_POR_B和系统复位信号PS_SRST_B没有处于复位状态时,boot ROM才会读取该寄存器。这里,用户可以选择的启动方式包括Quad-SPI,SD卡,NAND Flash,NOR Flash和JTAG。上电自检完成后,boot ROM会从先前选择的启动设备处读取下一启动阶段会用到的启动镜像(我们之前编译的fsbl镜像),并先读取该镜像文件的头部信息,然后根据这些信息对镜像进行认证。通过认证后,就会把镜像从Flash加载到OCM(On-Chip Memory),然后接下来的启动过程就由FSBL控制。

在《ZYNQ-7000使用总结(3)——PS和PL部分配合使用》中我们介绍了一个PS和PL配合使用的例子,在那个例子中我们有加入两个用于调试的IP核:ChipScope AXI Monitor和Chipscope Integrated Controller,这两个IP核用于ChipScope的调试。ChipScope是Xilinx提供的一种硬件调试工具,类似于我们在硬件调试中经常会用到一些逻辑分析仪,这里前一个IP核就相当于逻辑分析仪的探头,可以捕捉AXI总线上的信号;后一个IP和是ChipScope和JTAG的接口,控制AXI Monitor采集信号和给上位机传输数据。关于这两个IP核的配置与连线,前面已经讲过,这里我们以那篇文章里面的例子为例直接开始讲如何使用ChipScope进行硬件调试。

在《ZYNQ-7000使用总结(3)——PS和PL部分配合使用》中,我们已经可以将PL与PS部分一起使用,并且通过JTAG下载到板子运行。对于ZYNQ,有多种启动方式,比如从JTAG启动、从QSPI(即Flash)启动,从SD卡启动等。对于从JTAG启动的,我们直接运行程序就OK了。对于从Flash和SD卡启动的,需要我们生成这两种情况下对应的文件,并烧到对应的位置才可以。那么下面就介绍一下如何生成以及烧录。

前面在《ZYNQ-7000使用总结(2)——PS部分的使用》中讲述了ZYNQ-7000中PS部分的用法,主要是对软件的使用以及设计流程进行了介绍。但是在实际使用中,往往会将PL和PS部分配合使用,以充分使用ZYNQ的资源,发挥其优势。对于ZYNQ-7000,PS部分可以作为一个子系统独立工作(上篇文章已经介绍),但是PL部分“不能”独立使用(无JTAG的情况下),需要作为PS部分的扩展部分来使用。下面就介绍一个PS和PL配合使用的例子。如果你没有看上一个例子,这里推荐你看一下,因为这里的很多步骤和前面是相同的,这里就不在配图去做说明了。

ZYNQ-7000包括PS和PL两部分,其中你可以只使用PS部分,而不用PL部分,这样可以认为你在单纯的使用一个ARM Cortex A9 MPore芯片。更多的情况下,我们会将PS和PL部分联合使用,不然也就失去了使用ZYNQ芯片的意义。但是,为了更好的理解和学习ZYNQ,我们先讲一个只使用PS部分的例子,这样可以更快的掌握工具的使用和开发流程。

和大多数教程一样,我们这里实现一个在串口输出“Hello World”的程序(如果你刚开始接触ZYNQ,强烈推荐看这一篇文章,因为我会配很多图做非常详细的说明,后续的文章就不会这样详细的说明了)。

因为马上要离职的原因,需要将一些东西整理一下做交接。就将Xilinx ZYNQ-7000的使用经验做一下总结,希望对刚接触的人有一点帮助。需要说明的是,在接触到ZYNQ-7000之前,我并没有做过FPGA的设计,这一部分的基础可以说是零。而这一年的工作重心也并不是FPGA设计,所以这一系列文章的重点是工具的使用,以及ZYNQ-7000的设计流程,而不是具体如何设计。该系列文章的硬件平台是:ZC702(XC7Z020-1CLG484CES )。所用软件包括:PlanAhead、Xilinx Platform Studio、Xilinx Software Development Kit,版本均为14.4。串口工具为Tera Term。

ZYNQ-7000是Xilinx推出的一款全可编程片上系统(All Programmable SoC),该芯片集成了ARM Cortex A9双核与FPGA,所以ZYNQ是一款SoPC芯片。其架构如下图:

ZYNQ-7000架构

同步内容