第八章 ZYNQ-MIZ701 軟硬調試高級技巧


 

軟件和硬件的完美結合才是SOC的優勢和長處,那么開發ZYNQ就需要掌握軟件和硬件開發的調試技巧,這樣才能同時分析軟件或者硬件的運行情況,找到問題,最終解決。那么本章將通過一個簡單的例子帶大家使用vivado+SDK進行系統的調試。

8.0難度系數★★☆☆☆☆☆

8.1 系統構架

這個實驗中,我們將添加一個名為MATH_IP的 Custom IP.並且添加Mark Debug觀察AXI4-Lite總線上的工作情況,添加VIO CORE觀察MATH_IP的工作情況,添加ILA CORE觀察LED的PIN腳輸出情況。

wpsF74F.tmp

8.2 ZYNQ核的添加及配置

Step1:新建一個名為為Miz701_sys的工程

wpsF750.tmp

Step2:選擇RTL Project 勾選Do not specify source at this time

wpsF751.tmp

Step3:選擇芯片類型xc7z010clg400-1。

wpsF762.tmp

Step4:單擊Finish

wpsF763.tmp

8.3使用IP Integrator創建硬件系統

Step1:單擊Create Block Design

Step2:輸入system

wpsF764.tmp

Step3:單擊下圖中wpsF765.tmp添加IP按鈕

wpsF766.tmp

Step4:搜素單詞z選擇ZYNQ7 Processing System,然后雙擊

wpsF776.tmp

Step5:添加進來了ZYNQ CPU IP,然后選中雙擊。

wpsF777.tmp

Step6:修改輸入時鍾頻率為50MHZ,PL端FCLK_CLK0頻率為100MHZ。

wpsF778.tmp

Step7: 修改內存型號為MT41K256M16RE-125 M。

wpsF779.tmp

Setp8:選擇MIO Configuration選項卡,再看到I/O Peripherals 中的GPIO一欄,勾選上其中的EMIO一欄,並選擇8位引腳輸出(最多可以選擇64位,但是這個使用只需要8位足夠了。)

wpsF78A.tmp

Setp9:展開PS-PL Cross Trigger interface >Input Cross Trigger, Cross Trigger Input 0設置為:CPU0 DBG REQ、Output Cross Trigger設置為CPU0 DBG ACK。

wpsF78B.tmp

Setp10:按照上圖設置好了之后,點擊OK,仔細觀察發現的zynq核心多出了GPIO_0、TRIGGER_OUT_0、TRIGGER_IN_0

wpsF78C.tmp

Setp11:接着,將如下兩引腳連接起來,其實就是給M_AXI_GP0_ACLK提供一個時鍾

wpsF78D.tmp

Step12:單擊Project SettingwpsF78E.tmp

Step13:單擊IP->Repository Manager添加Custom IP CORE

wpsF79E.tmp

Step14:單擊加號添加IP CORE 路徑之后單擊OK

wpsF79F.tmp

Setp15:單擊 IP iconwpsF7A0.tmp 搜索單詞“math ”之后雙擊添加IPCORE

wpsF7A1.tmp

Setp16:單擊Click on Run Connection Automation

wpsF7B2.tmp

Setp17:勾選math_ip_0 and S_AX之后單擊OK

wpsF7B3.tmp

這個mathi_ip實際上是一個簡單的硬件加法器。雖然這個簡單的加法器在這里沒有實用意義,但是如果換成了硬件算法,那么就具備實用價值了。紅色的方框內ain_vio和bin_vio是我們准備通過邏輯分析抓去的觀察信號。

Setp18:單擊Click on Run Connection Automation

wpsF7B4.tmp

8.4添加 ILA 和 VIO CORE

Step1:單擊IP icon wpsF7B5.tmp 添加 ila CORE

wpsF7B6.tmp

Step2:雙擊打開ILA CORE

wpsF7C7.tmp

Step3:雙擊打開ILA CORE

General Options設置如下

wpsF7C8.tmp

Probe_Ports設置如下,之后單擊OK

wpsF7C9.tmp

Step4:把GPIO Make Exteral,同時展開GPIO 鏈接GPIO_T到ILA的Prober_上

wpsF7CA.tmp

Step5:連接CLK接口到FCLK_CLK0接口

Step6:連接TRIGG_IN 和 TRIGGER_OUT_0、TRIG_OUT和TRIGGER_IN_0

Step7:添加 IP icon wpsF7DA.tmp 添加vio

wpsF7DB.tmp

Step8:雙擊 VIO core修改參數

General Options 設置如下,輸入proble為1 輸出為3

wpsF7DC.tmp

Probe_in設置位寬為5

wpsF7DD.tmp

Probe_out0設置位寬:1;Probe_out1設置位寬:4;Probe_out2設置位寬:4;

wpsF7DE.tmp

Step9:連接

PROBE_IN -> result

PROBE_OUT0 -> sel

PROBE_OUT1 -> ain_vio

PROBE_OUT2 -> bin_vio

CLK-> FCLK_CKL0

連接好后的系統圖

wpsF7EF.tmp

8.6 Mark Debug S_AXI總線

Step1:選中AXI Interconnect 和math_0 CORE之間的S_AXI總線

Step2:右擊選擇Mark Debug

wpsF7F0.tmp

Step3:菜單->選擇tool->Validate Design檢查是否有錯誤,如果有錯誤就要查找問題

Step4:菜單->選擇window->Address Editor 檢查是否有地址空間沒有分配

8.7產生HDL和約束文件

Setp1:接下來依然是,右鍵單擊Block文件,文件選擇Generate the Output Products,是文件得到一定的約束

wpsF7F1.tmp

Setp2:彈出如下對話框,直接點擊Generate

wpsF7F2.tmp

Setp3:繼續右鍵單擊Block文件,選擇Create a HDL wrapper,根據Block文件內容產生一個HDL 的頂層文件:

wpsF802.tmp

Setp4:並選擇讓vivado自動完成

wpsF803.tmp

Setp5:這里我們看到,Vivado給我創建了這樣的頂層文件,其中的gpio_0_tri_io就是我們配置的EMIO

wpsF804.tmp

8.8 EMIO的管腳約束修改

Step1:我們發現,之前引出的EMIO叫做GPIO_0,到了頂層他的名字gpio_0_tri_io,而不是GPIO_0。所以分配引腳的時候就要注意了名字別錯了,創建一個約束文件,分配引腳如下:

set_property PACKAGE_PIN  F17  [get_ports {gpio_0_tri_io[0]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[0]}]

set_property PACKAGE_PIN  J15  [get_ports {gpio_0_tri_io[1]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[1]}]

set_property PACKAGE_PIN  G14  [get_ports {gpio_0_tri_io[2]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[2]}]

set_property PACKAGE_PIN  D18  [get_ports {gpio_0_tri_io[3]}]

set_property IOSTANDARD LVCMOS33 [get_ports {gpio_0_tri_io[3]}]

Setp2:單擊Run Synthesis,如果有 Save 對話框彈出選擇保存

Setp3:綜合結束后選擇Synthesized Design option單擊 OK

8.9 設置調試信號

Step1:在如下對話框中找到Unassigned debug nets(如果對話框沒有出現選擇 菜單->Window > Debug)

wpsF805.tmp

Step2:右擊 Unassigned Debug Nets 選擇Set up Debug… 之后單擊 Next

Step3:刪除紅色錯誤的信號然后單擊Next 到結束

wpsF806.tmp

8.10 產生bit文件

此時可以,開始生成bit文件了(這個過程會彈出保存對話框單擊保存,然后彈出Implementation對話框單擊OK,重新編譯一次):

wpsF817.tmp

8.11 導出硬件和bit文件

編譯成功之后,依然是導出硬件:

wpsF818.tmp

8.12 軟硬聯合仿真調試

  Step1:在VIVADO中LAUNCH打開SDK,然后新建一個名為DEBUG_TECH的工程,以及添加一個main.c文件,具體過程參考前面章節。

添加程序如下:

#include <stdio.h>

#include "xgpiops.h"

#include "sleep.h"

int main()

{

static XGpioPs psGpioInstancePtr;

XGpioPs_Config* GpioConfigPtr;

int iPinNumber= 54; //想想為什么是54

u32 uPinDirection = 0x1; //1表示輸出,0表示輸入

int xStatus;

int i;

//--MIO的初始化

    GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);

if(GpioConfigPtr == NULL)

return XST_FAILURE;

xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr);

if(XST_SUCCESS != xStatus)

print(" PS GPIO INIT FAILED \n\r");

//--MIO的輸入輸出操作

     XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber,uPinDirection);//配置IO輸出方向

XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber,1);//配置IO的輸出

  Xil_Out32(XPAR_MATH_IP_0_BASEADDR, 0x12);

  Xil_Out32(XPAR_MATH_IP_0_BASEADDR+4, 0x34);

  i=Xil_In32(XPAR_MATH_IP_0_BASEADDR);

  xil_printf("result=%x\r\n",i);

while(1)

{

XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1);//輸出1

sleep(1);//延時

XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0);//輸出0

sleep(1);//延時

}

    return 0;

}

Step2:單擊wpsF819.tmp下載bit程序

Step3:回到VIVADO單擊Open Target->Auto Connect

wpsF81A.tmp

Step4:加載完成后的界面

wpsF82B.tmp

Step5:選擇菜單->window->Debugprobes 選擇AXI_WVALID做為觸發信號

wpsF82C.tmp

Step6:設置觸發條件為1

wpsF82D.tmp

Step7:設置觸發位置為512

wpsF82E.tmp

Step8:單擊箭頭所指向啟動觸發

wpsF83E.tmp

Step9:進入等待觸發狀態

wpsF83F.tmp

Step10、右擊->Debug As->Debug Configurations

wpsF840.tmp

Step11:雙擊GDB,勾選Run ps7_init、Run ps7_pst_config、Enable Cross-Triggering

wpsF841.tmp

Step12:設置串口后單擊Debug

wpsF852.tmp

Step:13

1、程序進入開始部分暫停住

2、在此處設置斷點

wpsF853.tmp

Step14:單擊運行wpsF854.tmp后VIVADO  HW_ILA2 窗口采集到波形輸出,可以看到AXI總線的工作時序。

wpsF855.tmp

Step15:同時可以觀察到VIO核采集到的數據

wpsF865.tmp

Step16:當再次單擊wpsF866.tmp后控制台輸出0X46

Step17:HW_ILA1 窗口采集到的數據是EMIO的可以看到第0位1S跳變下wpsF867.tmp

wpsF868.tmp

8.16 本章小結

在這個實驗中,筆者添加了一個用戶自定義的IP CORE 並且通過使用VIO CORE觀察其數據。通過ILA CORE觀察 AXI總線的通信時序情況,以及EMIO 的輸出情況。其中難點就是SDK 和VIVAOD的聯合調試。筆者在做的工程中出現過多次錯誤,讀者在做的時候下載程序一定要嚴格安裝筆者提供的方法進行。另外SDK中的bit文件一定要確認是最新的bit文件,確認下路徑,默認的可能是錯的,這可能是軟件的bug。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM