【第二季】CH11_ ZYNQ軟硬調試高級技巧
軟件和硬件的完美結合才是SOC的優勢和長處,那么開發ZYNQ就需要掌握軟件和硬件開發的調試技巧,這樣才能同時分析軟件或者硬件的運行情況,找到問題,最終解決。那么本章將通過一個簡單的例子帶大家使用vivado+SDK進行系統的調試。
11.1 方案框架
這個實驗中,我們將在上一章工程的基礎上添加一個名為MATH_IP的 Custom IP.並且添加Mark Debug觀察AXI4-Lite總線上的工作情況,添加VIO CORE觀察MATH_IP的工作情況,添加ILA CORE觀察LED的PIN腳輸出情況。
11.2 硬件工程搭建
Step1:做好備份后,直接打開上一章節的硬件工程。
Step2:在Project manager區中單擊Project settings。
Step3:選擇IP設置區中的repository manager。
Step:4:單擊+號圖標,將math_ip_0的路徑添加進去(math_ip可在我們附帶的第十一章程序文件夾中的Miz_ip_lib文件夾中找到),單擊OK。
Step5:雙擊ZYNQ processing System圖標,配置IP。
Step6:展開PS-PL Cross Trigger interface >Input Cross Trigger, Cross Trigger Input 0設置為:CPU0 DBG REQ、Output Cross Trigger設置為CPU0 DBG ACK,單擊OK完成修改。
Step7:單擊 IP icon 搜索單詞“math ”之后雙擊添加IPCORE。
Step8:單擊Click on Run Connection Automation。
Step9:勾選math_ip_0 and S_AX之后單擊OK。
這個mathi_ip實際上是一個簡單的硬件加法器。雖然這個簡單的加法器在這里沒有實用意義,但是如果換成了硬件算法,那么就具備實用價值了。紅色的方框內ain_vio和bin_vio是我們准備通過邏輯分析抓去的觀察信號。
Step11:雙擊打開ILA CORE
Step12:雙擊打開ILA CORE
General Options設置如下
Probe_Ports設置如下,之后單擊OK
Step13:連接Probe0到GPIO_LED。
Step14:連接CLK接口到FCLK_CLK0接口
Step15:連接TRIGG_IN 和 TRIGGER_OUT_0、TRIG_OUT和TRIGGER_IN_0
Step17:雙擊 VIO core修改參數
General Options 設置如下,輸入proble為1 輸出為3
Probe_in設置位寬為9
Probe_out0設置位寬:1;Probe_out1設置位寬:8;Probe_out2設置位寬:8;
Step18:連接
PROBE_IN -> result
PROBE_OUT0 -> sel
PROBE_OUT1 -> ain_vio
PROBE_OUT2 -> bin_vio
CLK-> FCLK_CKL0
Step19:連接好的系統整體電路。
Step20:選中AXI Interconnect 和math_0 CORE之間的S_AXI總線
Step21:右擊選擇Mark Debug
Setp22:接下來依然是,右鍵單擊Block文件,文件選擇Generate the Output Products。
Step23:繼續右鍵單擊Block文件,選擇Create a HDL wrapper,根據Block文件內容產生一個HDL 的頂層文件,並選擇讓vivado自動完成。
Setp24:單擊Run Synthesis,如果有 Save 對話框彈出選擇保存。
Setp25:綜合結束后選擇Synthesized Design option單擊 OK。
Step26:在如下對話框中找到Unassigned debug nets(如果對話框沒有出現選擇 菜單->Window > Debug)
Step27:右擊 Unassigned Debug Nets 選擇Set up Debug… 之后單擊 Next
Step28:刪除紅色錯誤的信號然后單擊Next 到結束
Step29:生成Bit文件。
11.3 加載到SDK
Step1:導出硬件。
Step2:新建一個空SDK工程,並添加一個main.c的文件。
Step3:在main.c文件中添加以下程序,按Ctrl+S保存后自動開始編譯。
/* * main.c * * Created on: 2016年11月8日 * Author: Administrator */ #include <stdio.h> #include "xparameters.h" #include "xil_io.h" #include "sleep.h" #include "xil_types.h" #define XGpio_axi_WriteReg(BaseAddr, RegOffset, Data) \ Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data)) #define XPAR_GPIO_LITE_ML_0 XPAR_GPIO_LITE_ML_0_BASEADDR #define GPIO_LITE_ML_REG0 0 #define MATH_IP_BASE XPAR_MATH_IP_0_BASEADDR #define MATH_REG0 0 #define MATH_REG1 4 #define MATH_REG2 0 int main() { u8 i=0; u8 val=0; Xil_Out32(MATH_IP_BASE+MATH_REG0,0X42); Xil_Out32(MATH_IP_BASE+MATH_REG1,0X12); val = Xil_In32(MATH_IP_BASE+MATH_REG2); xil_printf("val=%x",val); XGpio_axi_WriteReg(XPAR_GPIO_LITE_ML_0,GPIO_LITE_ML_REG0,0X00); while(1) { for(i=0;i<=3;i++) { XGpio_axi_WriteReg(XPAR_GPIO_LITE_ML_0,GPIO_LITE_ML_REG0,1<<i); usleep(500000); } i=0; } } |
Step4:右擊工程,選擇Debug as ->Debug configuration。
Step5:選中system Debugger,雙擊創建一個系統調試。
Step6:設置系統調試。
Step7:回到VIVADO單擊Open Target->Auto Connect
Step8:加載完成后的界面
Step9:選擇菜單->window->Debugprobes 選擇AXI_WVALID做為觸發信號
Step10:設置觸發條件為1
Step11:設置觸發位置為512
Step12:單擊箭頭所指向啟動觸發
Step13:進入等待觸發狀態
Step14:打開系統自帶的串口調試軟件。
Step15:在以下位置加入斷點(在圖中位置雙擊即可加入斷點),方便調試。
Step16:單擊運行后VIVADO HW_ILA2 窗口采集到波形輸出,可以看到AXI總線的工作時序。
Step17:同時可以觀察到VIO核采集到的數據
Step19:HW_ILA1 窗口采集到的數據是GPIO_LED的值為0x02,同時可觀察到開發板上的LED2亮起。
11.4 本章小結
在這個實驗中,筆者添加了一個用戶自定義的IP CORE 並且通過使用VIO CORE觀察其數據。通過ILA CORE觀察 AXI總線的通信時序情況,以及EMIO 的輸出情況。其中難點就是SDK 和VIVAOD的聯合調試。