【干货分享】ZYNQ开发基本流程

ZYNQ内部包含PS和PL两部分,PS中包含以下4个主要功能模块:

  • Application processor unit (APU)

  • Memory interfaces

  • I/O peripherals (IOP)

  • Interconnect

ZYNQ内部的总体框架如所示,PS中包含2个ARM Cortex-9的内核,一些基本的外设扩展口以及Memory接口。PS和PL的相互通信通过两个通路完成,分别是GP(General Purpose)Ports和HP(High Performance)Ports。

GP Ports包含2个Master接口和2个Slave接口,符合标准的AXI协议数据位宽是32bit。HP Ports包含4个接口,全部是PL作为Master;有两个专用的连接到DDR Controller的接口和一个连接到OCM的接口。HP与GP相比,最大的特点在于有额外的FIFO作为Buffer,可以提高传输效率和数据吞吐量。

所以从功能角度,GP Ports主要用于寄存器的读写以及小数据量的传输;HP Ports用于大量数据的传输,主要是Memory数据的读写。

图片

ZYNQ中最常用的设计思路是将主程序放在PS中完成,在PL中设计相应的逻辑功能作为PS的外设使用,将逻辑设计封装成IP,且每个IP都包含一个标准的AXI-Lite接口。PS对于逻辑设计的控制是通过控制逻辑设计的功能寄存器,进而控制逻辑设计进行相应的操作,同时将工作情况通过状态寄存器返回给PS端。如果逻辑设计与PS端需要进行大量数据的交互,则会在逻辑设计中增加AXI-Full接口,与PS的HP Port相连。

综上,ZYNQ设计的基本流程包含以下步骤:

  1. Vivado中搭建ZYNQ平台,完成基本外设控制。

  2. 创建逻辑设计,并封装成IP。

  3. ZYNQ设计中调用封装的IP。

  4. 对设计的IP进行仿真。

ZYBO开发板简介

ZYBO是Digilent开发的以XC7Z010-1CLG400C为核心处理器的开发板,其主要功能包括有:

  • 1片32bit位宽,512MB容量的 DDR3

  • 1个 HDMI port

  • 1个VGA source port

  • 1个(1Gbit/100Mbit/10Mbit) Ethernet PHY 与RJ45接口

  • 1个MicroSD slot

  • 1个OTG USB 2.0 PHY

  • 1个外部 EEPROM

  • 1个耳机输出接口和1个麦克风输入接口

  • 1片128Mb QSPI Flash作为加载Flash

  • 1个JTAG接口和1个USB-Converter下载接口

  • GPIO: 6 pushbuttons, 4 slide switches, 5 LEDs

  • 6个 Pmod ports

其板上器件分布情况如图 2和图 3所示。

图片

图2

图片

图3

Vivado中进行ZYNQ硬件部分设计

Step1: Viavdo中选择XC7Z010-1CLG400器件,建立工程。

Step2: 建立Block Design。

图片

图 4

Step3: 加入ZYNQ7 Processing System和其他所需要的外设IP。

点击“Add IP”,加入ZYNQ7 Processing System和AXI GPIO,双击IP可以对其进行配置。该实验中ZYNQ7配置使能UART,引脚为MIO48和49,其ZYBO相关电路图如图 5所示。(注:如果需要在Step11中选择Hello World工程,则需要使能UART)。AXI GPIO的位宽设置为4,其余为默认配置。

图片

图 5

图片

图 6

注意:这里有个地方非常容易出错。在Vivado建立工程选择器件的过程中没有选择ZYBO开发板的配置,而是直接选择的XC7Z010-1CLG400C器件的配置。系统默认的ZYNQ7 Processing System配置中Input Clock Frequency是33.3333MHz,而ZYBO板上为50MHz。此处必须修改过来,否则后面的系统时钟会完全错乱,导致软件工程无法运行。

图片

图 7

Step4: 点击“Run Block Automation”,其作用是完成ZYNQ7 Processing System专用引脚的连接,包括FIXED_IO和DDR引脚的连接。

图片

图 8

Step5: 点击“Run Connection Automation”,其作用是自动完成ZYNQ与外设的连接,连接是按照工具对于用户所设计系统的理解,如果需要进行修改,可以手动更改Block中的连线。该操作工具会默认增加:

  1. AXI interconnect

  2. Processor System Reset

  3. 自动完成了外设IP的AXI-Lite端口与ZYNQ7 Processing System的连接,默认接法是ZYNQ的FCLK_CLK0作为外设AXI时钟,Processor System Reset产生外设复位信号连接到所有外设的复位端口。

  4. 将AXI GPIO的引脚引出。

可以使用“Regenerate Layout”,重新布局Block Design。

图片

图 9

Step6: 在“Address Editor”中查看、修改外设在总线上的地址。

图片

图 10

Step7: 首先在Block design界面右击弹出的菜单中点击Validate Design,以验证Block Design的设计和连接是否有错误。至此Block Design完成了,但是还需要根据Block Design的配置生成相应的源代码。右击.bd设计,并选择“Create HDL Wrapper”。随后即生成了相应的HDL代码。

图片

图 11

Step8: 对于PL端的外接引脚,需要设置相应的Constraints。

图片

图 12

Step9: 与普通FPGA设计一样,完成Synthesis、Implementation和Generate Bitstream。

Step10: 将Step9中完成的硬件设计导入到SDK开发平台下。

图片

图 13

Step11: 从这一步开始,开发平台转移到SDK平台。此时硬件平台已经确定,接下来是软件的开发。首先在SDK中建立软件工程。

图片

图 14

图片

图 15

Step12: 在新建工程中完成C代码的设计。

#include <stdio.h> #include <xgpio.h> #include "xparameters.h" #include "sleep.h" #include "platform.h"   int main() {     XGpio output;     int Status;     /*      * Initialize the GPIO driver so that it's ready to use,      * specify the device ID that is generated in xparameters.h      */      Status = XGpio_Initialize(&output, XPAR_GPIO_0_DEVICE_ID);      if (Status != XST_SUCCESS)  {           return XST_FAILURE;      }      /* Set the direction for all signals to be outputs */      XGpio_SetDataDirection(&output, 1, 0x0);     init_platform();     while(1){     usleep(200000);         //delay     XGpio_DiscreteWrite(&output, 1, 0x0);     usleep(200000);         //delay     XGpio_DiscreteWrite(&output, 1, 0xF);     };     cleanup_platform();     return 0; }

Step13: 首先点击“Program FPGA”,将硬件平台下载到ZYNQ中。

图片

图 16

Step14: 运行软件工程进行调试。

图片

图 17

在ZYBO板上也能看到LED灯闪烁,至此完成了ZYNQ的一个基本设计的所有开发流程。

DK中进行ZYNQ软件部分设计

首先对“Vivado中进行ZYNQ硬件部分设计”中让LED闪烁的C代码做详细的注释。

int main()

{

    /*定义外设对于的类型指针,用于绑定外设,便于后面程序调用时选择

     * 外设

     */

    XGpio output;

    int Status;

     /* XGpio_Initialize()函数是xgpio.c中的函数,在BSP Documentation可以

      * 查到该函数的描述。

      * int XGpio_Initialize(XGpio * InstancePtr, u16 DeviceId)

      * InstancePtr为GPIO类型的指针

      * DeviceId是在板级配置中已经定义好的外设的ID,该定义包含在BSP的xparameters.h中

      * 即在xparameters.h已经为该硬件设计中的每一种类型的多个外设设置了唯一的ID

      * 例如设计中如果有2个GPIO外设,则ID分别为0和1.

      * 该语句完成之后将ID对应的外设对象与该指针进行了绑定,后面可以通过调用该指针指

      * 定到该外设

      */

     Status = XGpio_Initialize(&output, XPAR_GPIO_0_DEVICE_ID);

     if (Status != XST_SUCCESS)  {

         return XST_FAILURE;

     }



     /* void XGpio_SetDataDirection (XGpio * InstancePtr,

      *                    unsigned Channel,u32 DirectionMask )

      * InstancePtr:外设指针,用于指定到对应的外设设备,已经与外设绑定

      * Channel: 每个AXI_GPIO中可以有两个32bit的GPIO端口,该参数用来

      * 选择是该外设中的哪一个端口

      * DirectionMask:选择GPIO的方向,0为output,1为input

      * 该函数的作用是设置GPIO的方向,如前所述,可以通过output指定到

      * 该GPIO外设,

      */

     XGpio_SetDataDirection(&output, 1, 0x0);

   

     //初始化ARM内核

    init_platform();



    while(1){

    usleep(200000);         //delay

    XGpio_DiscreteWrite(&output, 1, 0x0);

    usleep(200000);         //delay

    XGpio_DiscreteWrite(&output, 1, 0xF);

    };

    cleanup_platform();

    return 0;

}

以上调用的这些函数,其定义及使用方法全部可以在BSP(Board Support Package)板级支持包中找到。当在Vivado平台中设计完成硬件,将其导入到SDK平台时,工具会根据硬件设计中使用到的外设,自动生成相应的板级支持包。在SDK的“Project Explorer”界面中可以查看,并且可以在其中打开相应的BSP说明文档,如图 18所示。

图片

图 18

但是虽然BSP中提供了所有相关的API函数,但是对于初学者来说,想搭建一个可以实现基本功能的平台还是有些困难。于是另一个方法是利用SDK生成新的Application时提供的Peripheral Test模板。

图片

图 19

该模板生成的代码中,在主函数中找到相应外设的测试函数,例如本例中GPIO的测试函数“GpioOutputExample()”,再通过追述该函数的具体实现,可以一定程度上作为最基本的范例代码。

图片

图 20

如果再进一步深入到ARM编程的本质,其实与硬件的所有控制和通信都是依靠读写底层的寄存器来完成的。例如如果查看一下“XGpio_SetDataDirection()”函数的底层实现,可以发现逐级调用的分别是“XGpio_WriteReg()”函数和“XGpio_Out32()”函数,而“XGpio_Out32()”调用的是“Xil_Out32()”。其实“Xil_Out32()”和“Xil_In32()”这两个函数分别是写读底层硬件寄存器的两个函数,所有的上层与底层的寄存器级别的通信,也就是绝大多数的外设控制,都是依靠这两个函数完成的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
csdn zynq7000开发流程包括以下几个步骤: 1. 硬件设计:确定项目需求并设计系统架构,选择Zynq7000系列芯片作为硬件平台,设计硬件电路和原理图。包括选择和配置处理系统(PS)和可编程逻辑(PL)部分、板级设计和PCB布局等。 2. Vivado工程:使用Xilinx Vivado工具创建一个新工程,设置约束条件,并进行整个设计的综合、实现和比特流。 3. PS配置:对处理系统(PS)进行配置,包括设计PS部分的参数、选择启动器和外设以及配置处理器等。这个过程可以使用Xilinx SDK工具进行。 4. PL设计:使用HDL语言(如VHDL或Verilog)进行可编程逻辑(PL)的设计。设计包括FPGA逻辑、IP核的选择、配置和连接、约束和验证等。 5. 代码编写:使用Xilinx SDK工具开发嵌入式软件。这一步骤包括写C/C++代码、编译、链接等,以控制硬件逻辑、实现算法等功能。 6. 运行和调试:将代码烧录到Zynq7000平台上,通过调试工具(如JTAG)进行程序调试和性能优化。 7. 系统集成:在硬件和软件开发完成后,将软件和硬件进行集成测试。通过使用各种测试工具和算法验证系统的功能和性能。 8. 项目验证和优化:进行系统的整体性能测试,并重新优化系统设计,以满足项目需求和性能要求。 总之,csdn zynq7000开发流程涵盖了硬件设计、Vivado工程、PS配置、PL设计、代码编写、运行调试、系统集成、项目验证和优化等多个环节,通过这些步骤可以完成一个完整的Zynq7000开发项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值