zynq学习笔记

  • 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. 阶段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中的代码是固化的,不可修改的,处理器在上电或者热启动时自动执行这部分代码。

  1. 阶段2

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

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

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

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

  1. 阶段3

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

  • FPGA原理

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

  1. 可编程逻辑单元

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

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

  1. 可编程连线

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

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

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

 

  1. 可编程IO

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

四、开发环境

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

  1. 开发工具

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、交叉编译工具链的安装

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

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

  1. 安装完后,若需要手动添加环境变量,以后每次编译软件的时候都需要通过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使用

  1. 打开vivado,选择对应芯片型号,创建工程。
  2. 添加.v源文件,编写verilog程序,添加需要的IP。
  3. 添加约束文件.xdc,编写约束管脚。
  4. 运行Run Synthesis综合,生成网表文件。
  5. 运行Run Implementation 布局布线。
  6. 运行Generate Bitstream  生成bit文件。

7、开发流程

  1. 在Vivado上新建工程,增加一个嵌入式的源文件。
  2. 在Vivado里添加和配置PS和PL部分基本的外设,或需要添加自定义外设。
  3. 在Vivado里生成顶层HDL文件,并添加约束文件。再编译生成比特流文件system.bit。
  4. 导出到SDK软件开发环境,在SDK环境里可以编写一些调试软件验证硬件和软件,结合比特流文件单独调试ZYNQ系统。
  5. 在SDK里生成FSBL。
  6. 在linux环境中生成bootloader镜像(u-boot.elf)。
  7. 在SDK里通过FSBL、比特流文件system.bit和u-boot.elf文件生成一个boot.bin文件。
  8. 在linux环境里生成linux内核镜像文件Zimage(包含FPGA自定义 IP驱动)和文件系统ramdisk。
  9. 把boot.bin、zimage和ramdisk三个文件放到SD卡(spi flash、nor ...)的FAT分区中,选择启动方式,启动开发板电源。

 

### 回答1: zynq-linux移植学习笔记应包含以下内容: 1. 对zynq架构和硬件资源的理解,包括PS和PL部分的特点。 2. 如何使用Xilinx SDK来编译和配置u-boot和Linux内核。 3. 如何在硬件平台上运行和调试Linux系统。 4. 怎样在Linux系统中配置和使用各种硬件资源,如DMA、Ethernet、Flash等。 5. 如何在Linux系统中移植和运行应用程序,并与硬件资源进行交互。 6. 如何进行系统优化和资源管理,以提高系统性能和稳定性。 ### 回答2: Zynq是一款Xilinx公司开发的一种嵌入式系统芯片,其使用了双核Cortex-A9处理器和可编程逻辑器件(FPGA)的组合。移植Linux到Zynq芯片中,可以使其具备无限的扩展能力,极大地拓展了其应用领域,因此掌握Zynq-Linux移植技术是非常重要的。 Zynq-Linux移植分为四个主要步骤: 第一,准备工作 在移植前,需要确认硬件平台是否支持Linux运行,并且需要对硬件进行配置,最好使用Zynq开发板的官方配置; 第二,内核移植 内核移植是整个移植过程中最关键的一步。需要根据硬件平台的特性对内核进行选择和配置。可以从内核源代码库中获取内核代码,然后进行交叉编译。移植内核的过程中需要注意内核配置参数的设置,同时也要确保内核模块和驱动程序的编写。 第三,文件系统移植 在移植Linux的过程中,文件系统也是非常重要的。可以使用开发板官方Linux镜像,也可以自己编译镜像。移植文件系统还涉及到root文件系统的配置、挂载方式、网络配置和各种服务的配置等问题。 第四,驱动移植 驱动程序是连接硬件和软件的关键部分,需编写相应的驱动程序来实现对硬件的控制。移植驱动程序的过程中需要关注各种硬件接口和设备驱动API的使用,确保驱动程序与硬件配合良好。 总结来说,Zynq-Linux移植技术的掌握需要具备较强的Linux基础知识、驱动开发经验和交叉编译工具链的使用能力。同时,还需要有耐心和细心,对每个步骤进行仔细的分析和处理。 在学习中,需要结合实际开发项目,多进行实践操作才能更好地掌握Zynq-Linux移植技术,为后续项目的开发和应用提供更好的支持。 ### 回答3: Zynq-7000系列是一种由Xilinx开发的SoC(系统级芯片),它将双ARM Cortex-A9处理器和可编程逻辑(FPGA)集成在一起。这使得开发人员可以使用硬件加速加速器来加速运行在Linux上的各种应用。然而,实现这个目标需要进行移植。 在开始Zynq Linux移植学习笔记之前,需要一些基本的知识。首先,需要了解Linux内核的基本工作原理和Linux驱动程序的编写技术。然后,需要了解FPGA和SoC体系结构。 在开始移植之前,需要为SoC开发板选择正确的Linux发行版。这通常需要考虑处理器体系结构,内存大小和设备驱动程序的可用性。另外,还需要考虑是否需要自定义内核或驱动程序以满足应用程序的需求。 接下来,需要编写设备树文件(DT)来描述SoC架构。设备树文件是一种描述硬件配置信息的特殊语言。它会告诉内核有哪些设备可用以及如何访问这些设备。 接下来,需要配置Linux内核以支持Zynq-7000处理器。这可能包括启用适当的内核配置选项,编写设备驱动程序以及配置启动过程。 最后,需要启动Zynq板并验证Linux系统稳定运行。这些步骤包括在启动过程中将设备树文件加载到内存中,以及启动用户空间应用程序。 总之,移植Zynq Linux是一项复杂的任务,需要广泛的专业知识和技术。但是,它可以为开发人员提供强大的硬件加速支持,使他们能够加速处理一系列计算密集型应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值