Vivado與SDK的聯合調試方法-使用ILA

首先介紹一下我的硬件平臺:使用的開發板爲米聯客出的MIZ702,這個開發板與ZedBoard是兼容的。
Vivado硬件調試有幾種手段:ILA(集成邏輯分析器Integrated Logic Analyzer)、VIO(虛擬I/O Virtual Input/Output)、Jtag-to-AXI等,本方法主要使用了ILA
本實驗系統使用了兩種調試手段:ILA和VIO,ILA的引入方式又用了兩種,一種是標記Debug mark,一種是添加ILA_IP兩種方式我認爲是一致的。其中ILA-IP抓取的LED的寄存器的波形,而Debug mark標記的是接到一個自主IP的AXI總線系統的Block Design如下圖
這裏寫圖片描述
聯調步驟:
STEP1:在block design設計完系統硬件後,點擊想要抓取波形的網絡,右擊選擇mark debug,此時網絡兩端會顯示一個Debug標識如下圖,保存。
添加Debug
還有另外一種方法:直接添加ILA ip,設置好抓取波形的個數與每組波形的位寬,連接自己想要觀測的總線,在這裏我抓取的波形是一組8位的寄存器,所控制的是8個LED燈。如下兩圖
ILAset
probe_connect
我認爲這兩種方法沒有區別
STEP2:對工程進行綜合,綜合完成後查看綜合結果,可以看到下面的debug窗口中有未連接的Debug nets,點擊Set up Debug並進行相關配置完成Debug nets的連接。完成後如下圖所示:
stetup
STEP3:保存工程,此時系統會重新生成約束文件,對現有的約束文件進行填充,打開約束文件進行Reload即可,然後生成bitstream並將硬件導入SDK,運行SDK。
STEP4:在SDK中新建自己的調試應用程序,我的演示程序爲流水燈主函數代碼如下:

#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  XPAR_AXI_GPIO_0_DEVICE_ID //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*/
    while(1){
        u32 status;
        status = GpioMarquee (GPIO_DEVICE_ID,GPIO_BITWIDTH);
        if (status == 0)
            print("SUCESS!.\r\n");
        else print("FAILED.\r\n");
    }
    return XST_SUCCESS;
}

然後常規方法進入軟件調試界面,設置斷點。(這裏提醒一下,聯合調試一定要在SDK下將比特流下載到FPGA中,而不要在vivado中下載比特流。Xilinx官方給出的解釋是:由於使用PS端的時鐘來接入ILA,所以要現在SDK中將比特流進行下載)
STEP5:在Vivado中連接目標板,此時進入硬件調試界面如圖
vivado debug
左邊欄hardware會顯示系統添加的硬件調試IP,我的硬件中手動加入了一個ila ip和vio ip也將一段總線標記了mark debug,標記了mark debug的總線,在進行set up debug的操作時系統會自動添加一個ila ip,左邊欄顯示了三個調試ip。
這裏面大大小小有好多窗口一一介紹一下:
1、設置窗口,window data depth其實就是波形的分辨率,trigger position in window就是數據的觸發在波形中顯示的起始位置,設置了觸發後纔會有作用。
set
2、觸發設置窗口,可以設置觸發信號,以及觸發方式(上升沿、下降沿)等等。若在SDK中的命令執行一句的過程中FPGA有時序變化,且時序是相關的,比如說我的寫操作,當write有上升沿的時候執行,對目標地址寫操作數。這時候如果設置了觸發信號爲write,系統的時序顯示就會隨着write進行動作,且在觸發位置處進行改變。這個功能我們可以進行一些總線的時序分析。ILA2中檢測了AXI總線,我們就可以看到相關時序圖。ILA1只是對一個寄存器進行了監視,只能看到他的值的變化而已。
trigger
3、狀態窗口:顯示當前調試狀態
4、調試波形窗口
waveform
調試波形圖窗口,左側這裏寫圖片描述表示循環自動進行觸發, 這裏寫圖片描述按下後,在SDK中執行一步即在波形圖上顯示波形,而 這裏寫圖片描述是在SDK執行完命令後,進行點擊即顯示當前硬件狀態的波形。
至此我們就搭建好Vivado和SDK的聯合調試平臺了,我們每在SDK中執行一條語句後,可以在波形窗口中點擊點擊來更新硬件狀態。
大家調試不必按照此硬件系統和軟件來調試,完全可以在自己的系統中添加ILA-IP來對自己的系統進行調試

歡迎大家批評指正,也希望能與大家交流ZYNQ的學習經驗。

參考文獻:
1、嵌入式系統軟硬件協同設計實戰指南-基於Xilinx ZYNQ
2、ug936-vivado-tutorial-programming-debugging

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章