硬件加速 | ZYNQ-7000 GP接口實現

1、GP接口簡介

       GP接口是ZYNQ-7000系列器件中用於實現PS與PL端進行數據通信的數據接口,GP接口傳輸數據速率一般較慢,通常用作控制信息的傳輸,在利用GP接口的時候,PS端的角色是Master,PL端爲Slave,此時PS端傳送控制信息控制PL端進行相應操作。整個PS端PL端利用GP接口進行數據交換的示意圖如下圖所示:

在這裏插入圖片描述

       寄存器數量爲4-512個,寄存器位寬爲32位。

2、GP接口創建流程

  • 打開vivado軟件,菜單欄選擇Tools->Create and Package New IP
    在這裏插入圖片描述

  • Next->Create AXI4 Peripheal->Next

在這裏插入圖片描述

  • 修改名字,選擇IP保存位置,修改完畢後然後Next

在這裏插入圖片描述

  • 根據需求修改寄存器數量,其他設置保持默認設置,然後Next

在這裏插入圖片描述

  • 選擇Add IP to the repository,然後Finish

在這裏插入圖片描述

  • 創建完成後,Vivado會自動生成Verilog代碼,用戶可以根據自己需要在如下圖所示位置添加用戶代碼。

在這裏插入圖片描述

  • 在添加好自己的用戶代碼後,可以創建一個頂層文件,把剛纔生成的IP文件例化,然後包起來形成一個用戶IP,步驟爲Tools->Create and Package New IP->Next->Package your current project

在這裏插入圖片描述

然後一路Next直至Finish。

3、GP接口的使用

       在這裏我簡單的使用了GP接口,實現了PS和PL簡單的數據交流,首先我們創建了GP接口,寄存器數量爲4個,主要實現的功能就是,PS通GP接口向四個寄存器裏面分別傳送長度爲32位的數據,PL將reg0,reg1,reg2的高16位分別按位異或賦值給reg3的高16位,reg3的低16位爲從PS端接收的數據保持不變,同時PS端對這個四個數據做相同的操作,比較兩個結果是否相同,如果相同表示該過程實現,同時將四個寄存器的各個比特位異或結果用於點亮LED燈。Vivado中創建的塊設計如下圖所示:

在這裏插入圖片描述

PS端的代碼如下圖所示:

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
 
#define REG_0 (*(volatile unsigned int *)(XPAR_GP_DEMO_V1_0_0_BASEADDR+0))
#define REG_1 (*(volatile unsigned int *)(XPAR_GP_DEMO_V1_0_0_BASEADDR+4))
#define REG_2 (*(volatile unsigned int *)(XPAR_GP_DEMO_V1_0_0_BASEADDR+8))
#define REG_3 (*(volatile unsigned int *)(XPAR_GP_DEMO_V1_0_0_BASEADDR+12))
 
int main()
{
    init_platform();
 
    //xil_printf("Hello World\n\r");
 
    REG_0=0x0AAA0880;
    REG_1=0x0A3B12F4;
    REG_2=0x12368F78;
    REG_3=0xECD54321;
 
    unsigned int expected_result= ((REG_0^REG_1^REG_2) & 0xFFFF0000) | (REG_3 &0x0000FFFF);
 
    xil_printf("ARM_REG_3_Result=%x\n",expected_result);
    xil_printf("FPGA_REG_3_Result=%x\n",REG_3);
 
    cleanup_platform();
    return 0;
}

結果通過串口打印如下所示,從結果可以看出PS端和PL端運算的結果完全相同,測試通過。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章