軟件和硬件的完美結合才是SOC的優勢和長處,那么開發ZYNQ就需要掌握軟件和硬件開發的調試技巧,這樣才能同時分析軟件或者硬件的運行情況,找到問題,最終解決。那么本章將通過一個簡單的例子帶大家使用vivado+SDK進行系統的調試。
8.0難度系數★★☆☆☆☆☆
8.1 系統構架
這個實驗中,我們將添加一個名為MATH_IP的 Custom IP.並且添加Mark Debug觀察AXI4-Lite總線上的工作情況,添加VIO CORE觀察MATH_IP的工作情況,添加ILA CORE觀察LED的PIN腳輸出情況。
8.2 ZYNQ核的添加及配置
Step1:新建一個名為為Miz701_sys的工程
Step2:選擇RTL Project 勾選Do not specify source at this time
Step3:選擇芯片類型xc7z010clg400-1。
Step4:單擊Finish
8.3使用IP Integrator創建硬件系統
Step1:單擊Create Block Design
Step2:輸入system
Step4:搜素單詞z選擇ZYNQ7 Processing System,然后雙擊
Step5:添加進來了ZYNQ CPU IP,然后選中雙擊。
Step6:修改輸入時鍾頻率為50MHZ,PL端FCLK_CLK0頻率為100MHZ。
Step7: 修改內存型號為MT41K256M16RE-125 M。
Setp8:選擇MIO Configuration選項卡,再看到I/O Peripherals 中的GPIO一欄,勾選上其中的EMIO一欄,並選擇8位引腳輸出(最多可以選擇64位,但是這個使用只需要8位足夠了。)
Setp9:展開PS-PL Cross Trigger interface >Input Cross Trigger, Cross Trigger Input 0設置為:CPU0 DBG REQ、Output Cross Trigger設置為CPU0 DBG ACK。
Setp10:按照上圖設置好了之后,點擊OK,仔細觀察發現的zynq核心多出了GPIO_0、TRIGGER_OUT_0、TRIGGER_IN_0
Setp11:接着,將如下兩引腳連接起來,其實就是給M_AXI_GP0_ACLK提供一個時鍾
Step13:單擊IP->Repository Manager添加Custom IP CORE
Step14:單擊加號添加IP CORE 路徑之后單擊OK
Setp15:單擊 IP icon 搜索單詞“math ”之后雙擊添加IPCORE
Setp16:單擊Click on Run Connection Automation
Setp17:勾選math_ip_0 and S_AX之后單擊OK
這個mathi_ip實際上是一個簡單的硬件加法器。雖然這個簡單的加法器在這里沒有實用意義,但是如果換成了硬件算法,那么就具備實用價值了。紅色的方框內ain_vio和bin_vio是我們准備通過邏輯分析抓去的觀察信號。
Setp18:單擊Click on Run Connection Automation
8.4添加 ILA 和 VIO CORE
Step2:雙擊打開ILA CORE
Step3:雙擊打開ILA CORE
General Options設置如下
Probe_Ports設置如下,之后單擊OK
Step4:把GPIO Make Exteral,同時展開GPIO 鏈接GPIO_T到ILA的Prober_上
Step5:連接CLK接口到FCLK_CLK0接口
Step6:連接TRIGG_IN 和 TRIGGER_OUT_0、TRIG_OUT和TRIGGER_IN_0
Step8:雙擊 VIO core修改參數
General Options 設置如下,輸入proble為1 輸出為3
Probe_in設置位寬為5
Probe_out0設置位寬:1;Probe_out1設置位寬:4;Probe_out2設置位寬:4;
Step9:連接
PROBE_IN -> result
PROBE_OUT0 -> sel
PROBE_OUT1 -> ain_vio
PROBE_OUT2 -> bin_vio
CLK-> FCLK_CKL0
連接好后的系統圖
8.6 Mark Debug S_AXI總線
Step1:選中AXI Interconnect 和math_0 CORE之間的S_AXI總線
Step2:右擊選擇Mark Debug
Step3:菜單->選擇tool->Validate Design檢查是否有錯誤,如果有錯誤就要查找問題
Step4:菜單->選擇window->Address Editor 檢查是否有地址空間沒有分配
8.7產生HDL和約束文件
Setp1:接下來依然是,右鍵單擊Block文件,文件選擇Generate the Output Products,是文件得到一定的約束
Setp2:彈出如下對話框,直接點擊Generate
Setp3:繼續右鍵單擊Block文件,選擇Create a HDL wrapper,根據Block文件內容產生一個HDL 的頂層文件:
Setp4:並選擇讓vivado自動完成
Setp5:這里我們看到,Vivado給我創建了這樣的頂層文件,其中的gpio_0_tri_io就是我們配置的EMIO
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)
Step2:右擊 Unassigned Debug Nets 選擇Set up Debug… 之后單擊 Next
Step3:刪除紅色錯誤的信號然后單擊Next 到結束
8.10 產生bit文件
此時可以,開始生成bit文件了(這個過程會彈出保存對話框單擊保存,然后彈出Implementation對話框單擊OK,重新編譯一次):
8.11 導出硬件和bit文件
編譯成功之后,依然是導出硬件:
8.12 軟硬聯合仿真調試
Step1:在VIVADO中LAUNCH打開SDK,然后新建一個名為DEBUG_TECH的工程,以及添加一個main.c文件,具體過程參考前面章節。
添加程序如下:
#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; } |
Step3:回到VIVADO單擊Open Target->Auto Connect
Step4:加載完成后的界面
Step5:選擇菜單->window->Debugprobes 選擇AXI_WVALID做為觸發信號
Step6:設置觸發條件為1
Step7:設置觸發位置為512
Step8:單擊箭頭所指向啟動觸發
Step9:進入等待觸發狀態
Step10、右擊->Debug As->Debug Configurations
Step11:雙擊GDB,勾選Run ps7_init、Run ps7_pst_config、Enable Cross-Triggering
Step12:設置串口后單擊Debug
Step:13
1、程序進入開始部分暫停住
2、在此處設置斷點
Step14:單擊運行后VIVADO HW_ILA2 窗口采集到波形輸出,可以看到AXI總線的工作時序。
Step15:同時可以觀察到VIO核采集到的數據
Step17:HW_ILA1 窗口采集到的數據是EMIO的可以看到第0位1S跳變下
8.16 本章小結
在這個實驗中,筆者添加了一個用戶自定義的IP CORE 並且通過使用VIO CORE觀察其數據。通過ILA CORE觀察 AXI總線的通信時序情況,以及EMIO 的輸出情況。其中難點就是SDK 和VIVAOD的聯合調試。筆者在做的工程中出現過多次錯誤,讀者在做的時候下載程序一定要嚴格安裝筆者提供的方法進行。另外SDK中的bit文件一定要確認是最新的bit文件,確認下路徑,默認的可能是錯的,這可能是軟件的bug。