S03_CH02_AXI_DMA PL發送數據到PS
1.1概述
本課程的設計原理分析。
本課程循序漸進,承接《S03_CH01_AXI_DMA_LOOP 環路測試》這一課程,在DATA FIFO端加入FPGA代碼,通過verilog 代碼對FIFO寫。其他硬件構架和《S03_CH01_AXI_DMA_LOOP 環路測試》一樣。
《S03_CH01_AXI_DMA_LOOP 環路測試》課程中,詳解講解了工程步驟的創建,本章開始,一些簡單的操作步驟將會省去。
1.2系統構架框圖
在上圖中,紅色標記部分是和前面課程有稍微差異的部分。讀者需要好好注意下。
下面看下關鍵模塊的設置
1.2.1 ZYNQ IP的設置
增一路FCK_CLK1 為100MHZ(也可以設置其他頻率)並且引出到外部提供verilog編程時鍾。
雙擊S_AXIS設置參數
設置如下
雙擊FIFO 進行如下設置
由於只有寫DMA通道,因此不用勾選讀DMA通道
既然只用到了DMA寫通道,也就只要使用1路中斷資源。
1.3 PS部分
相對於《S03_CH01_AXI_DMA_LOOP 環路測試》中的代碼,本章代碼只有DMA的接收部分。在main.c源碼中,實現了數據DMA的測速,並且通過OLED顯示出來。為了實現測試,有增加了定時間中斷,定時器每過0.5S中斷一次。
中斷初始化函數,如下
表1-3-1 init_intr_sys函數
int init_intr_sys(void) { DMA_Intr_Init(&AxiDma,0);//initial interrupt system Timer_init(&Timer,TIMER_LOAD_VALUE,0); Init_Intr_System(&Intc); // initial DMA interrupt system Setup_Intr_Exception(&Intc); DMA_Setup_Intr_System(&Intc,&AxiDma,TX_INTR_ID,RX_INTR_ID);//setup dma interrpt system Timer_Setup_Intr_System(&Intc,&Timer,TIMER_IRPT_INTR); DMA_Intr_Enable(&Intc,&AxiDma); } |
DMA讀測速的部分的原理是計數DMA讀傳輸的次數,然后每過2秒,計算一次速度。通過OLED顯示測速。
表1-3-2 測試代碼
if(RxDone) { RxDone=0; RX_ready=1; RX_success++; } if(TxDone) { TxDone=0; TX_ready=1; TX_success++; } if(usec==2) { usec=0; sprintf(oled_str,"RX_cnt=%d",RX_success); xil_printf("%s\r\n",oled_str); print_message(oled_str,0); speed_rx = MAX_PKT_LEN*RX_success/1024/1024; sprintf(oled_str,"RX_sp=%.2fMB/S",speed_rx); xil_printf("%s\r\n",oled_str); print_message(oled_str,1); sprintf(oled_str,"TX_cnt=%d",TX_success); xil_printf("%s\r\n",oled_str); print_message(oled_str,2); speed_tx = (MAX_PKT_LEN)*TX_success/1024/1024; sprintf(oled_str,"TX_sp=%.2fMB/S",speed_tx); xil_printf("%s\r\n",oled_str); print_message(oled_str,3); RX_success=0; TX_success=0; } |
定時器中斷在第二季《S02_CH08_ ZYNQ 定時器中斷實驗》已經詳細講解過,至於DMA中斷《S03_CH01_AXI_DMA_LOOP 環路測試》中也已經詳細講解,不在過多復述。