1. 程式人生 > >VIVADO和SDK聯合除錯--轉載我之前的blog的內容

VIVADO和SDK聯合除錯--轉載我之前的blog的內容

哈哈哈,終於在組會前一天把除錯搞定了,本來還愁彙報什麼呢?經過我幾天來不吃不喝(當然健身房還是不能落下的,hhh),總算把zynq的軟硬體除錯搞通了,但是這些僅僅是對付一些一般複雜性的系統,當系統變得龐大時,可能裡面需要更多的除錯技巧,但是掌握zynq的除錯技巧對zynq的開發來說,重要性不言而喻。廢話不多說,下面進入正題:

一、這是該系統的Top框圖。

二、除錯模型圖

1,因為GPIO_LED是8位訊號,如果只分配了4位,還有4位沒有用到,編譯會報錯,所以要加入約束條件: 當未分配引腳報錯時,加入以下的約束條件來生成bitstream。

set_property SEVERITY {Warning} [get_drc_checks NSTD-1]
set_property SEVERITY {Warning} [get_drc_checks UCIO-1]	

2,對MATH的reg0和reg1進行賦值,這是arm通過AXI匯流排來執行寫操作。所以我們設定W_VAILD為觸發訊號。

如圖:點選等待觸發()

3,在SDK中設定斷點,執行這兩行程式碼:

Xil_Out32(MATH_IP_BASE+MATH_REG0,0X42);
Xil_Out32(MATH_IP_BASE+MATH_REG1,0X12);

這兩句的意思就是對FPGA的MATH核兩個暫存器寫入資料

4,放大的寫axi匯流排的時序(發現地址和資料同時有效,因為獨立的地址和資料通道。)

5,將reg2的資料讀出

val = Xil_In32(MATH_IP_BASE+MATH_REG2);

放大的讀時序(當RVALID有效時RDATA總線上的資料就有效)

6,對LED的操作。設定自動觸發。

XGpio_axi_WriteReg(XPAR_GPIO_LITE_ML_0,GPIO_LITE_ML_REG0,1<<i);

Warning: 當設定多個觸發條件時,需要設定OR觸發條件(預設是AND,這樣就不會顯示波形)

7,MATH核的功能:當sel有效時把虛擬輸入放在總線上,反之是ip的執行輸入

ain_i <= ain_vio WHEN sel='1' ELSE ain; 
bin_i <= bin_vio WHEN sel='1' ELSE bin;

三、最後,讀者可以實現一個8路輸出的pwn波形,利用自定義ip

以下是我核心程式碼和加入ila來觀測到的波形圖。

Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR,99);//pwm0 fre
Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+4,10);//pwm0 wav

Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+8,99);//pwm1 fre
Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+12,20);//pwm1 wav

Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+16,99);//pwm2 fre
Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+20,40);//pwm2 wav

Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+24,99);//pwm3 fre
Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+28,80);//pwm3 wav


Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+32,49);//pwm0 fre
Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+36,10);//pwm0 wav

Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+40,49);//pwm1 fre
Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+44,20);//pwm1 wav

Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+48,49);//pwm2 fre
Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+52,30);//pwm2 wav

Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+56,49);//pwm3 fre
Xil_Out32(XPAR_PWN_V1_0_0_BASEADDR+60,40);//pwm3 wav

圖中可以看出利用ip核實現了8路的pwn輸出,無需cpu的參與,pl端自動輸出,在大型系統中可以減少cpu的負載。

總結:

自定義ip時,一般是新建一個工程,然後在裡面開啟tool->create and package IP 選擇AXI_LITE匯流排來生成模板,加入自己需要掛載總線上的ip,然後將暫存器和ip的輸入輸出線連線起來。 寫完程式碼,一定要綜合該IP,因為他不會自動報錯,等加入到工程時就會出現一堆問題,所有一定要保證IP的正確性。 最後在執行一次tool->create and package IP 。這時選擇的是Package your current project,並且包含.xci files。最後再新增到自己需要用的工程中去。

原始碼可以發我郵箱[email protected]索取。