Vivado+Zedboard之流水灯例程

环境:  Vivado 2014.2

开发板:Zedboard version xc7z020clg484-1

实验:  使用Vivado和SDK进行Zedboard开发,制作一个简单的流水灯程序以说明软硬件协同设计的方法、开发流程等。

 

本文将分为三个部分:

1. 使用Vivado创建一个工程,并构建一个Zynq嵌入式处理系统

2. 在上述基础上,将完成后的硬件导入到SDK中进行软件设计。

3. 最后下载到ZedBoard上进行调试。

1. 使用Vivado创建工程

1.1新建工程

1.鼠标左键双击Vivado 2014.2图标,打开Vivado 2014.2,出现如下界面:

Vivado+Zedboard之流水灯例程_第1张图片

 

 

 

 

2.单击Create New Project创建一个新的工程:

Vivado+Zedboard之流水灯例程_第2张图片

 

3.单击Next执行下一步;

Vivado+Zedboard之流水灯例程_第3张图片

 

 

4.选择工程所在的位置,并输入工程名test_led,单击Next;

Vivado+Zedboard之流水灯例程_第4张图片

 

5.在Vivado中新建一个RTL工程,暂不添加文件,单击Next;

Vivado+Zedboard之流水灯例程_第5张图片

 

6. 单击Next执行下一步;

Vivado+Zedboard之流水灯例程_第6张图片

 

7. 单击Next执行下一步;

Vivado+Zedboard之流水灯例程_第7张图片

 

8. 单击Next执行下一步;

Vivado+Zedboard之流水灯例程_第8张图片

9.这一步要注意,在左上角Specify处选择Boards,选择ZedBoard Zynq Evaluation and Development Kit version D器件,单击Next;

Vivado+Zedboard之流水灯例程_第9张图片

10.单击Finish

Vivado+Zedboard之流水灯例程_第10张图片

11.等待软件根据设定新建一个RTL工程。

     这样新建工程的步骤就完成了,下面进行硬件设计步骤;

1.2硬件设计

    新建工程的界面如下:

Vivado+Zedboard之流水灯例程_第11张图片

 

  1. 单击Create Block Design,创建并添加IP核;

Vivado+Zedboard之流水灯例程_第12张图片

 

2.输入工程名led,单击OK;

 

 

 

 

 

3.等待软件Create Block Design,创建完成后的界面如下:

Vivado+Zedboard之流水灯例程_第13张图片

 

4. Add IP,一般会提示This design is empty.To get started, Add IP from the catalog,单击

Add IP会出现IP的目录,如果此处没有提示,可以单击Diagram左边框的Add IP添加;

Vivado+Zedboard之流水灯例程_第14张图片

 

 

 

 

5. 在目录Search中输入ZYNQ7 Processing System;

Vivado+Zedboard之流水灯例程_第15张图片

 

6.双击ZYNQ7 Processing System完成IP核的添加;

Vivado+Zedboard之流水灯例程_第16张图片

 

 

 

 

7.等待软件Add IP,添加完成后的界面如下:

Vivado+Zedboard之流水灯例程_第17张图片

 

8.单击Run Block Automation;

Vivado+Zedboard之流水灯例程_第18张图片

 

 

9.单击processing_system7_0;

Vivado+Zedboard之流水灯例程_第19张图片

 

 

10.单击OK;

Vivado+Zedboard之流水灯例程_第20张图片

 

 

 

 

 

11.等待软件运行,运行后的界面为:

Vivado+Zedboard之流水灯例程_第21张图片

 

12.如果想了解内部的详细结构和进行接口配置,可以双击ZYNQ7 Processing System核,(此实验不需要设置,如果想直接进行下一步实验可以直接跳到步骤16

Vivado+Zedboard之流水灯例程_第22张图片

 

 

 

13.等待软件运行,运行后的界面为:

Vivado+Zedboard之流水灯例程_第23张图片

 

14.单击左侧对应内容可以进行接口配置:

Vivado+Zedboard之流水灯例程_第24张图片

15.单击OK完成配置;

 

16.继续添加IP ,单击左侧的Add IP图标:

Vivado+Zedboard之流水灯例程_第25张图片

17.在目录Search中输入AXI GPIO;

Vivado+Zedboard之流水灯例程_第26张图片

 

 

18.双击AXI GPIO添加;

Vivado+Zedboard之流水灯例程_第27张图片

 

19.继续添加IP,单击左侧的Add IP图标,在目录Search中输入AXI BRAM Controller:

Vivado+Zedboard之流水灯例程_第28张图片

 

 

 

 

20.双击AXI BRAM Controller,完成添加;

Vivado+Zedboard之流水灯例程_第29张图片

 

21.继续添加IP,单击左侧的Add IP图标,在目录Search中输入Block Memory Generator:

Vivado+Zedboard之流水灯例程_第30张图片

 

 

 

 

22. 双击Block Memory Generator,完成添加;

Vivado+Zedboard之流水灯例程_第31张图片

 

23.右键单击Block Memory Generator,选择Customize Block:

Vivado+Zedboard之流水灯例程_第32张图片

Vivado+Zedboard之流水灯例程_第33张图片

 

24. Mode处选择BRAM Controller,Memory Type处选择True Dual Port RAM:

Vivado+Zedboard之流水灯例程_第34张图片

 

25.单击OK完成设置;

Vivado+Zedboard之流水灯例程_第35张图片

26.连接the Block Memory Generator to the AXI4 BRAM Controller

 Vivado+Zedboard之流水灯例程_第36张图片

 

27.Run Connection Automation 选择 /axi_gpio_0/S_AXI:

Vivado+Zedboard之流水灯例程_第37张图片

 

Vivado+Zedboard之流水灯例程_第38张图片

 

 

 

 

 

 

28.单击OK,完成此部分的连接;

Vivado+Zedboard之流水灯例程_第39张图片

 

29. Run Connection Automation again, 选择/axi_gpio_0/GPIO;

Vivado+Zedboard之流水灯例程_第40张图片

 

 

 

 

 

 

30.选择leds_8bits,单击OK;

Vivado+Zedboard之流水灯例程_第41张图片

 

31.Run Connection Automation again, 选择/axi_bram_ctrl_0/S_AXI;

Vivado+Zedboard之流水灯例程_第42张图片

 

 

 

 

 

 

32.单击OK;

Vivado+Zedboard之流水灯例程_第43张图片

 

33. 修改the range of the AXI BRAM Controller to 64K:

Vivado+Zedboard之流水灯例程_第44张图片

 

 

 

 

 

 

34. 单击File选择Save Block Design保存设计(也可以直接Ctrl+S)

Vivado+Zedboard之流水灯例程_第45张图片

 

1.3硬件处理

1. Tools >Validate Design

Vivado+Zedboard之流水灯例程_第46张图片

 

 

 

2.等待软件运行,运行后的界面如下:

Vivado+Zedboard之流水灯例程_第47张图片

3.单击OK;

 

4.right-click the top-level subsystem design->Generate Output Products

Vivado+Zedboard之流水灯例程_第48张图片

Vivado+Zedboard之流水灯例程_第49张图片

 

5.单击Generate,等待软件运行,运行完成后right-click the top-level subsystem design->Create HDL Wrapper

Vivado+Zedboard之流水灯例程_第50张图片

 

Vivado+Zedboard之流水灯例程_第51张图片

6.单击OK;

 

7. 单击Generate Bitstream,单击Yes,首先进行分析综合和实现;(这里也可以直接先点击Run Synthesis,然后点击Run Implementation,然后再点击Generate Bitstream)

需要等待运行的时间比较长,本机大概需要15分钟;

Vivado+Zedboard之流水灯例程_第52张图片

 

Vivado+Zedboard之流水灯例程_第53张图片

 

8.运行完成后,会自动弹出对话框,选择Open Implemented Design,单击OK:

Vivado+Zedboard之流水灯例程_第54张图片

 

 

 

 

 

 

 

 

 

 

 

9.运行完成后的界面如下:

Vivado+Zedboard之流水灯例程_第55张图片

 

10. 在关联到SDK时,需要将Package和Device都打开,如果运行后只是自动打开了device,需要Open Synthesized Design来打开Package

Vivado+Zedboard之流水灯例程_第56张图片

 

 

 

 

11.单击NO,将Package和Device同时显示出来;

Vivado+Zedboard之流水灯例程_第57张图片

 

打开后的界面如下:

Vivado+Zedboard之流水灯例程_第58张图片

 

 

12. 单击Open Block Design to invoke the IP integrator design

Vivado+Zedboard之流水灯例程_第59张图片

 

13. 连接 micro-usb cable between the PC and the JTAG port of the board, another micro-usb cable between the PC and the UART port of the board,.打开Zedboard板的电源,如下图所示,打开电源之后POWER灯会亮;

Vivado+Zedboard之流水灯例程_第60张图片

 

 

14.单击Hardware Manager中的Open Target,这里因为曾经在本机上使用过Zedboard,所以会直接显示出Localhost,如果是第一次连接Zedboard,要单击Open New Target

如果直接显示出Localhost,可以直接点击Localhost进行步骤18

Vivado+Zedboard之流水灯例程_第61张图片

Vivado+Zedboard之流水灯例程_第62张图片

 

15.单击Next;(如果hardware manager中找不到硬件板,这是由于在任务管理器的进程中,hw_server.exe进程一直在执行,需要将其关掉,如果关了之后还检测不到硬件板,则需要关机之后再开机便可;

Vivado+Zedboard之流水灯例程_第63张图片

16.选择Local server,单击Next;

Vivado+Zedboard之流水灯例程_第64张图片

17.软件会自动检测出Localhost,选择后单击Next;

Vivado+Zedboard之流水灯例程_第65张图片

18.单击Finish,自动Open Target;

19. 单击Hardware Manager中的Program Device,单击xc7z020_1:

Vivado+Zedboard之流水灯例程_第66张图片

Vivado+Zedboard之流水灯例程_第67张图片

20.单击Program将比特流烧写到ZedBoard板上;完成后板上的DONE蓝灯会亮,

提示成功:

Vivado+Zedboard之流水灯例程_第68张图片

 

 

 

 

 

 

 

 

 

 

 

21.单击File中的Export,单击Export Hardware

Vivado+Zedboard之流水灯例程_第69张图片

 

22.单击OK

Vivado+Zedboard之流水灯例程_第70张图片

 

 

 

23. 单击File中的launch SDK:

Vivado+Zedboard之流水灯例程_第71张图片

 

24.单击OK;

Vivado+Zedboard之流水灯例程_第72张图片

 

这样在Vivado中的操作就完成了,软件会自动打开SDK:

Vivado+Zedboard之流水灯例程_第73张图片

SDK中的软件设计

打开后的SDK界面如下:

 

1. 单击File > New > Application Project

Vivado+Zedboard之流水灯例程_第74张图片

Vivado+Zedboard之流水灯例程_第75张图片

 

2.输入工程名zj,单击Next:

Vivado+Zedboard之流水灯例程_第76张图片

3. 选择一个空的模板:empty application,单击Finish,等待工作环境的建立:

Vivado+Zedboard之流水灯例程_第77张图片

4. 单击led > 右键单击src > new > Source File

Vivado+Zedboard之流水灯例程_第78张图片

5.输入工程名zj.c,单击Finish;

Vivado+Zedboard之流水灯例程_第79张图片

 

 

 

6. 编写如下程序,Ctrl+S,保存的同时,软件会自动开始编译,在左下角problem处可以看到相应的warning和error;

Vivado+Zedboard之流水灯例程_第80张图片

程序如下:

 

#include "xparameters.h"        /* Peripheral parameters  */

#include "xgpio.h"              /* GPIO data struct and APIs */

#include "xil_printf.h"

#include "xil_cache.h"

#define GPIO_BITWIDTH   8       /* This is the width of the GPIO */

#define GPIO_DEVICE_ID   0//device id

#define LED_DELAY       10000000/* times delay*/

#define LED_MAX_BLINK   0x1     /* Number of times the LED Blinks */

#define LED_CHANNEL     1       /* GPIO channel*/

#define printf xil_printf   /* A smaller footprint printf */

XGpio Gpio; /* The Instance of the GPIO Driver */

XGpio GpioOutput; /* The driver instance for GPIO Device configured as O/P */

 

int GpioMarquee (u16 DeviceId, u32 GpioWidth)

{

    volatile int Delay;

    u32 LedBit;

    u32 LedLoop;

    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(&GpioOutput, DeviceId);

    if (Status != XST_SUCCESS)

    {

        return XST_FAILURE;

     }

    //Set the direction for all signals to be outputs

     XGpio_SetDataDirection(&GpioOutput, LED_CHANNEL, 0x0);

    // Set the GPIO outputs to low

     XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL, 0x0);

 

    for (LedBit = 0x0; LedBit < GpioWidth; LedBit++)

    {

        for (LedLoop = 0; LedLoop < LED_MAX_BLINK; LedLoop++)

        {

            //Set the GPIO Output to High

            XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL,1 << LedBit);

            //Wait a small amount of time so the LED is visible

            for (Delay = 0; Delay < LED_DELAY;Delay++);

            //Clear the GPIO Output

            XGpio_DiscreteClear(&GpioOutput, LED_CHANNEL,1 << LedBit);

            // Wait a small amount of time so the LED is visible

            for (Delay = 0; Delay < LED_DELAY; Delay++);

          }

     }

    return XST_SUCCESS;

}

int main(void)

{//Application start

    /* loop forever*/

    int cnt=0;

    while(1)

    {

        u32 status;

        status = GpioMarquee (GPIO_DEVICE_ID,GPIO_BITWIDTH);

        if (status == 0)

        {

            printf("%d:SUCESS!.\r\n",cnt++);

            if(cnt>=1000)

                cnt=0;

        }

        else

            printf("FAILED.\r\n");

    }

    return XST_SUCCESS;

}

 

 

7. 单击Xilinx Tools > program FPGA将比特流烧写到板上(Vivado中就先将比特流烧写到板上有两个原因:1.如果SDK调试时出现问题,这样可以检测首先是不是Vivado的问题,如果成功烧写,说明板的连接没有问题,并且Vivado软件本身没有问题;2.在之前的调试过程中出现过直接Xilinx Tools > program FPGA无法烧写的情况;因此,保险起见,选择在Vivado中就先将比特流烧写到板上

Vivado+Zedboard之流水灯例程_第81张图片

 

 

 

 

8.单击Program(和在Vivado中烧写的现象一样,完成后DONE蓝色指示灯会亮

Vivado+Zedboard之流水灯例程_第82张图片

注:如果软件本身以及板的连接没有问题,那么这个步骤会在三秒左右完成,如果一直卡在一半的进度,说明SDKVivado没有很好的建立关联;

Vivado+Zedboard之流水灯例程_第83张图片

 

9.在Terminal处,单击带有加号的图标,对串口进行配置:

Vivado+Zedboard之流水灯例程_第84张图片

10. 在用到串口打印时,需要设置的COM口,为设备管理器中的USB serial port(本机为COM5),因此要选择COM5,注意波特率为115200:

Vivado+Zedboard之流水灯例程_第85张图片

 

 

11.右键工程目录中的zj目录,选择Run As > Run Configurations;

  Vivado+Zedboard之流水灯例程_第86张图片

 

12.在STDIO Connection中设置COM 5和波特率115200:

Vivado+Zedboard之流水灯例程_第87张图片

 

 

 

13.单击Run即可运行程序,看到流水灯的效果,每次跑完一圈会打印:数字:SUCESS!.的消息,数字为流水灯循环的次数。

  Vivado+Zedboard之流水灯例程_第88张图片

Vivado+Zedboard之流水灯例程_第89张图片

至此,Vivado+Zedboard的流水灯实验就完成了,板子不使用时要记得关闭电源。

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(关于zynq)