zynq学习笔记

您所在的位置:网站首页 zynq中文手册 zynq学习笔记

zynq学习笔记

#zynq学习笔记| 来源: 网络整理| 查看: 265

zynq-7000简介

   ZYNQ-7000系列是Xilinx推出的一款全可编程片上系统(All Programmable SoC),该芯片集成了ARM Cortex A9双核与FPGA,即PS部分和PL部分。

结构框图如下:

 

1、PS部分

PS部分集成两个ARM Cortex-A9处理器,AMBA互联,外设包括USB总线接口、以太网接口、SD/SDIO接口、I2C总线接口、CAN总线接口、UART接口、GPIO等。PS部分可以完全独立使用,不依赖PL部分。

2、PL部分

PL部分实质就是xilinx的FPGA。在ZYNQ中,我们可以把PL看成是PS的另一个具有可重配置特点的“外设”,它可以作为PS部分的一个从设备,受ARM处理器控制。也可以把PL部分看成一个不受ARM处理器控制,与ARM处理器对等的主设备,主动完成与外部芯片、接口的数据交互。更甚至PL部分也可以作为整个系统的主设备,主动从APU部分的存储器中获取、存储数据,并可控制ARM处理器的运算。所以,理论上PL部分也可以像PS部分那样独立运行。但限制是必须使用JTAG接口对PL部分进行配置。如果没有JTAG接口,就无法独立运行,因为ZYNQ的PS部分和PL部分都必须依靠PS来完成芯片的初始化配置。

3、AXI总线

AXI(Advanced eXtensible Interface)是一种总线协议,该协议是ARM公司提出的AMBA(Advanced Microcontroller Bus Architecture)3.0协议中最重要的部分,是一种面向高性能、高带宽、低延迟的片内总线。它的地址/控制和数据相位是分离的,支持不对齐的数据传输,同时在突发传输中,只需要首地址,同时分离的读写数据通道、并支持Outstanding传输访问和乱序访问,并更加容易进行时序收敛。AXI 是AMBA 中一个新的高性能协议。AXI 技术丰富了现有的AMBA 标准内容,满足超高性能和复杂的片上系统(SoC)设计的需求。

在ZYNQ7000中,将FPGA和ARM集成在一个芯片内部,两者之间的通信使用AXI_HP、AXI_GP、AXI_ACP三种接口通信,带宽可达吉比特,基本上不会存在二者通信带宽不足的问题。

AXI_ACP接口,是ARM多核架构下定义的一种64位高性能接口接口,理论带宽1200MB/s,用来管理DMA之类的不带缓存的AXI外设,PS端是Slave接口。

AXI_HP接口,是高性能/带宽的AXI3.0标准的64位高性能接口接口,理论带宽1200MB/s,总共有四个,PL模块作为主设备连接。主要用于PL访问PS上的存储器(DDR和On-Chip RAM)

AXI_GP接口,是通用的AXI 32位低性能接口,理论带宽600MB/S,总共有四个,包括两个32位主设备接口和两个32位从设备接口。

Zynq7000启动流程

详细说明请参考官方文档ug585第六章。

阶段1

在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控制。

在非JTAG启动模式下,ARM将执行Boot ROM中的代码,该部分代码负责对NAND、NOR、Quad-SPI、SD卡与PACP的基本外设控制器进行初始化,使得ARM核可以访问这些外设。而DDR等其他外设将在Stage 1或者之后进行初始化。处于安全考虑,在PS所有主要模块当中,CPU总是最先启动的。Boot ROM部分的代码并不对PL部分做任何配置。

Boot ROM控制整个芯片的初始化过程。Boot ROM中的代码是固化的,不可修改的,处理器在上电或者热启动时自动执行这部分代码。

阶段2

这个阶段由FSBL(First Stage Boot Loader)负责启动过程。Xilinx提供了FSBL代码,我们可以通过SDK生成这部分代码,这部分代码可以帮我们完成了PS部分必要外设的初始化工作。当然这部分的代码我们也可以根据自己的需要在SDK中进行修改。

FSBL主要完成以下几项工作:

根据XPS中的配置,完成PS端的初始化。       b、使用比特流文件对PL进行配置       c、加载SSBL或者裸跑程序到内存空间       d、跳转执行SSBL或者裸跑程序

PL部分的比特流文件、SSBL/裸机程序需要封装成特定格式的Flash分区镜像或是SD卡启动镜像,因为FSBL会遍历分区表来寻找比特流文件、SSBL/裸机程序,然后进行加载配置。

阶段3

该阶段是可选的。如果在ARM核上运行的是一个裸跑程序,那么该部分就可以省略了。其实,SSBL就是我们平常嵌入式系统开发中的Bootloader,主要负责将操作系统加载到内存中。

FPGA原理

FPGA内部主要基本结构:可编程的逻辑单元、可编程的连线和可编程的IO模块。

可编程逻辑单元

其基本结构某种存储器(SRAM、FLASH等)制成的4输入或6输入1输出地“真值表”加上一个D触发器构成。任何一个4输入1输出组合逻辑电路,都有一张对应的“真值表”,同样的如果用这么一个存储器制成的4输入1输出地“真值表”,只需要修改其“真值表”内部值就可以等效出任意4输入1输出的组合逻辑。

任何的时序逻辑都可以转换为组合逻辑和D触发器来完成。

可编程连线

在这些连线上有很多用存储器控制的链接点,通过改写对应存储器的值就可以确定哪些线是连上的而哪些线是断开的。这就可以把很多可编程逻辑单元组合起来形成大型的逻辑电路。

布线资源连通FPGA内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同而划分为4类不同的类别。第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;第二类是长线资源,用以完成芯片 Bank间的高速信号和第二全局时钟信号的布线;第三类是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;第四类是分布式的布线资源,用于专有时钟、复位等控制信号线。

  在实际中设计者不需要直接选择布线资源,布局布线器可自动地根据输入逻辑网表的拓扑结构和约束条件选择布线资源来连通各个模块单元。从本质上讲,布线资源的使用方法和设计的结果有密切、直接的关系。

 

可编程IO

可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配要求。为了便于管理和适应多种电器标准,FPGA的IOB被划分为若干个组(bank),每个bank的接口标准由其接口电压VCCO决定,一个bank只能有 一种VCCO,但不同bank的VCCO可以不同。只有相同电气标准的端口才能连接在一起,VCCO电压相同是接口标准的基本条件。

四、开发环境

由于ZYNQ将CPU于FPGA集成在一起,开发人员既需要设计ARM的操作系统应用程序和设备驱动程序,有需要设计FPGA部分的硬件逻辑设计。开发中既要了解Linux操作系统,系统的构架,也需要搭建一个FPGA和ARM系统之间的硬件设计平台。所以ZYNQ得开发是需要软件人员和硬件人员协同设计的并开发,这既是ZYNQ开发中所谓的“软硬件协同设计”。

开发工具

ZYNQ系统的硬件系统和软件系统的设计和开发需要用到以下开发环境和调试工具:

Xilinx vivado设计套件实现FPGA部分的设计和开发,管教和时序的约束,编译和仿真,实现RTL到比特流的设计流程。Xilinx SDK是xilinx软件开发套件,在Vivado硬件系统的基础上,系统会自动配置一些重要参数,其中包含工具和库路径、编译器选项、JTAG和闪存设置,调试器连接裸机板支持包(BSP)。SDK也为所有支持的Xilinx IP硬核提供驱动程序。交叉编译工具链是一个由编译器、连接器和解析器组成的综合开发环境,交叉编译工具链主要由binutils、gcc、和glibc 3个部分组成。xilinx zynq平台的交叉编译工具是基于GNU工具的(arm-xilinx-linux-gnueabi-gcc , arm-xilinx-linux-gnueabi-gdb)。FPGA的硬件调试工具有Xilinx提供的ChipScope Pro,可以在线观察FPGA内部的信号。

 

2、交叉编译工具链的安装 下载后的文件名为xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin。接下来安装交叉编译器,指令如下:  chmod +x xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin 

 ./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin       //开始安装,安装路径可以用默认路径,为 /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux

安装完后,若需要手动添加环境变量,以后每次编译软件的时候都需要通过export指令将编译环境路径加入到PATH环境变量,在终端中输入命令如下:         

export ARCH=arm

exportCROSS_COMPILE=arm-xilinx-linux-gnueabi-

exportPATH=/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/:$PATH

     若不想每次都输入,就在通过gedit /etc/bash.bashrc指令打开bash.bashrc文件,在里面加入上述指令,这样开机就会自动执行了。

3、Linux编译

   将zynq_zed_defconfig文件拷贝到arch/arm/configs目录下

   make ARCH=arm xilinx_zynq_defconfig

   make ARCH=arm menuconfig

   make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- UIMAGE_LOADADDR=0x8000 uImage

 

4、u-boot编译

   make CROSS_COMPILE=arm-xilinx-linux-gnueabi- clean

   make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_feima_defconfig

   make CROSS_COMPILE=arm-xilinx-linux-gnueabi-

5、根文件系统制作

  参考 http://blog.csdn.net/asklw/article/details/52611594

 

6、vivado使用 打开vivado,选择对应芯片型号,创建工程。添加.v源文件,编写verilog程序,添加需要的IP。添加约束文件.xdc,编写约束管脚。运行Run Synthesis综合,生成网表文件。运行Run Implementation 布局布线。运行Generate Bitstream  生成bit文件。 7、开发流程 在Vivado上新建工程,增加一个嵌入式的源文件。在Vivado里添加和配置PS和PL部分基本的外设,或需要添加自定义外设。在Vivado里生成顶层HDL文件,并添加约束文件。再编译生成比特流文件system.bit。导出到SDK软件开发环境,在SDK环境里可以编写一些调试软件验证硬件和软件,结合比特流文件单独调试ZYNQ系统。在SDK里生成FSBL。在linux环境中生成bootloader镜像(u-boot.elf)。在SDK里通过FSBL、比特流文件system.bit和u-boot.elf文件生成一个boot.bin文件。在linux环境里生成linux内核镜像文件Zimage(包含FPGA自定义 IP驱动)和文件系统ramdisk。把boot.bin、zimage和ramdisk三个文件放到SD卡(spi flash、nor ...)的FAT分区中,选择启动方式,启动开发板电源。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3