1. 程式人生 > >Xilinx Vivado的使用詳細介紹(4):Zedboard+vivado之流水燈(加SDK)

Xilinx Vivado的使用詳細介紹(4):Zedboard+vivado之流水燈(加SDK)

Vivado+zedboard之初學流水燈

Author:zhangxianhe

環境:vivado 2016.3(已驗證適用於2015.4)

開發板:Zedboard version xc7z020clg484-1

實驗:使用Vivado和SDK進行Zedboard開發,製作一個簡單的流水燈程式以說明軟硬體協同設計的方法、開發流程等。

本文將分為三個部分:

1. 使用Vivado建立一個工程,並構建一個Zynq嵌入式處理系統。

2. 在上述基礎上,將完成後的硬體匯入到SDK中進行軟體設計。

3. 最後下載到ZedBoard上進行除錯。

具體步驟如下:

1. 使用Vivado建立工程

1.1新建工程

  1).滑鼠左鍵雙擊Vivado2016.3圖示,開啟Vivado 2016.3;

  2).單擊Create New Project建立一個新的工程;

  3).單擊Next執行下一步;

  4).選擇工程所在的位置,並輸入工程名ledflow,單擊Next;

  5).在Vivado中新建一個RTL工程,暫不新增檔案(勾選 Do not specify sources at this time),後面需要的時候新增,單擊Next;

  6).這一步要注意,在左上角Select處選擇Boards,選擇ZedBoard Zynq Evaluation and Development Kit version D器件,單擊Next;

  7).單擊Finish

  8).等待軟體根據設定新建一個RTL工程。

這樣新建工程的步驟就完成了,下面進行硬體設計步驟;

1.2 Vivado硬體設計

  1). 單擊Create Block Design,建立並新增IP核;

  2).輸入工程名led,單擊OK;

  3).等待軟體Create Block Design

  4).Add IP.右邊空白處一般會提示This design is empty. To get started, Add IP from the catalog,單擊 Add IP會出現IP的目錄,如果此處沒有提示,可以單擊Diagram左邊框的Add IP新增;

  5). 在目錄Search中輸入ZYNQ7 Processing System;

  6).雙擊ZYNQ7 Processing System完成IP核的新增;

  7).等待軟體Add IP,接下來工程窗上部分會出現Run Block Automation,點Run Block Automation,直接點OK。

  8).接下來繼續新增IP,Add Ip 並在在搜尋中尋找AXI GPIO,雙擊新增。

  9).完成後繼續點Run Connect Automation,出現視窗先打鉤S_AXI,右邊設定保持不變,直接點OK。之後繼續點run connect automation,打鉤剩下的,注意此時右側選擇leds_8bits(LED)。之後OK.點選Diagram的Regenerate Layout,重新佈局,完成後出現如下介面。

1.3硬體處理

  1). Tools >Validate Design

  2).等待軟體執行,執行後的介面如下:

  3).單擊OK;

  4).Right-Click the Top-level Subsystem Design->Generate Output Products,預設設定,直接點generate,執行結束後,點選OK。

  5). Right-Click the Top-level Subsystem Design->Create HDL Wrapper,選擇第二項 Let Vivado manage Wrapper and auto-update,點選OK,

  6). 在左側Flow Navigator中最下邊,單擊Generate Bitstream,點選save(如果有提示)然後單擊Yes,直接生成位元流檔案。執行此過程首先會自動進行分析綜合和實現。(這裡也可以直接先點選Run Synthesis進行綜合,然後點選Run Implementation進行實現,然後再點選Generate Bitstream生成位元流) 需要等待執行的時間比較長,耐心等待;

  7).執行完成後,會自動彈出對話方塊,選擇Open Implemented Design,單擊OK:

  8).執行完成後的介面如下:

 

  9).在關聯到SDK時,需要將Package和Device都開啟,如果執行後只是自動打開了Device,需要在Flow Navigator下找到Synthesis並在其下點選Open Synthesized Design來開啟Package,單擊NO,將Package和Device同時顯示出來;

  10).單擊Open Block Design to invoke the IP integrator design

  11).準備兩條USB線,一條連線 micro-usb cable between the PC and the PROG port of the board;另外一條 micro-usb cable between the PC and the UART port of the board,開啟Zedboard板的電源,如下圖所示,開啟電源之後POWER燈會亮;

  12).單擊左側導航視窗最下方Hardware Manager中的Open Target,然後選擇Auto Connect

  13).單擊Hardware Manager中的Program Device,單擊xc7z020_1預設設定,單擊Program將位元流燒寫到ZedBoard板上;完成後板上的DONE藍燈會亮, 提示位元流檔案下載到ZedBoard板上成功:

  14).單擊File中的Export,單擊Export Hardware,注意打鉤include bitstream,點選OK。

  15).單擊File中的Launch SDK,預設設定,單擊OK,這時會自動啟動SDK。

這樣在Vivado中的操作就完成了,軟體會自動開啟。

1.4 SDK中的軟體設計

開啟後的SDK介面如下:

 

  1). 單擊File > New > Application Project

  2).輸入工程名ledflow,其它預設,注意勾選 Use default location(預設已經勾選)單擊Next;

  3). 選擇一個空的模板:empty application,單擊Finish,等待工作環境的建立;

  4). 單擊ledflow>右擊src>New > Source File

  5).輸入工程名ledflow.c(一般命名為main.c),單擊Finish;

  6). 編寫如下程式:

 1 * ledflow.c
 2  *
 3  *  Created on: 2017年11月16日
 4  *      Author: zhangxianhe
 5  */
 6 #include"xparameters.h"
 7 #include"xgpio.h"
 8 #include"xil_printf.h"
 9 #include"xil_cache.h"
10 #define GPIO_BITWIDTH 8
11 #define GPIO_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID
12 #define LED_DELAY 100000000
13 #define LED_MAX_BLINK 0x1
14 #define LED_CHANNEL 1
15 #define printf xil_printf
16 XGpio Gpio;
17 XGpio GpioOutput;
18  
19 int GpioMarquee(u16 DeviceId,u32 GpioWidth)
20 {
21     volatile int Delay;
22     u32 LedBit;
23     u32 LedLoop;
24     int Status;
25     Status=XGpio_Initialize(&GpioOutput,DeviceId);
26     if(Status!=XST_SUCCESS)
27     {
28        return XST_FAILURE;
29     }
30     XGpio_SetDataDirection(&GpioOutput,LED_CHANNEL,0x0);
31     XGpio_DiscreteWrite(&GpioOutput,LED_CHANNEL,0x0);
32     for(LedBit=0x0;LedBit<GpioWidth;LedBit++)
33     {
34        for(LedLoop=0x0;LedLoop<LED_MAX_BLINK;LedLoop++)
35        {
36            XGpio_DiscreteWrite(&GpioOutput,LED_CHANNEL,1<<LedBit);
37            for(Delay=0;Delay<LED_DELAY;Delay++);
38            XGpio_DiscreteClear(&GpioOutput,LED_CHANNEL,1<<LedBit);
39            for(Delay=0;Delay<LED_DELAY;Delay++);
40        }
41     }
42     return XST_SUCCESS;
43 };
44 int main(void)
45 {
46     while(1)
47     {
48        u32 status;
49        status=GpioMarquee(GPIO_DEVICE_ID,GPIO_BITWIDTH);
50        if(status==0)
51            printf("SUCCESS!.\r\n");
52        else
53            printf("FAILED.\r\n");
54     }
55     return XST_SUCCESS;
56 }

然後Ctrl+S,儲存的同時,軟體會自動開始編譯,在左下角problem處可以看到相應的warning和error(如果存在),在console裡面可以看到編譯成功的效果;無誤後,如果有錯誤Click Project-> clean (in case you get any errors with the BSD).

  7).單擊Xilinx Tools > program FPGA將位元流燒寫到板上(在Vivado中就先將位元流燒寫到板上有兩個原因:1.如果SDK除錯時出現問題,這樣可以檢測首先是不是Vivado的問題,如果成功燒寫,說明板的連線沒有問題,並且Vivado軟體本身沒有問題;2.在之前的除錯過程中出現過直接Xilinx Tools > program FPGA無法燒寫的情況;因此,保險起見,選擇在Vivado中就先將位元流燒寫到板上)

  8).單擊Program(和在Vivado中燒寫的現象一樣,完成後DONE藍色指示燈會亮)

注:如果軟體本身以及板的連線沒有問題,那麼這個步驟會在三秒左右完成,如果一直卡在一半的進度,說明SDK和Vivado沒有很好的建立關聯;

  9). 選擇按鈕. 如果找不到這個標誌選擇 Window > Show view > Terminal.

  10).單擊 並且選擇合適的 COM port (取決你自己的電腦), and configure the terminal with the parameters as shown below.

  11).在用到串列埠列印時,需要設定的COM口,為裝置管理器中的USB Serial Port(本機為COM5),因此要選擇COM5,注意波特率為115200:

  12).右鍵工程目錄中的ledflow目錄,選擇Debug As > Debug Configurations,雙擊Xilinx C/C++ application (GDB),自動選擇工程,然後選擇Reset Entire System。

 

在STDIO Connection中,勾選Connect STDIO to Console設定COM 5和波特率115200;

  13).單擊Apply,再單擊Debug,再點選圖示箭頭所指圖示,即可看到現象。

 

(第一次的時候會出現選擇,直接選擇第一個執行方式),看到流水燈的效果,每次跑完一圈Console視窗會出現SUCESS!.的訊息。

至此,Vivado+Zedboard的流水燈實驗就完成了,板子不使用時要記得關閉電源。