基于ZYNQ-7000的AI加速器设计之GP接口的实现

1、GP接口简介

     GP接口是ZYNQ-7000系列器件中用于实现PS与PL端进行数据通信的数据接口,GP接口传输数据速率一般较慢,通常用作控制信息的传输,在利用GP接口的时候,PS端的角色是Master,PL端为Slave,此时PS端传送控制信息控制PL端进行相应操作。整个PS端PL端利用GP接口进行数据交换的示意图如下图所示:

基于ZYNQ-7000的AI加速器设计之GP接口的实现_第1张图片

    寄存器数量为4-512个,寄存器位宽为32位。 

2、GP接口创建流程

  • 打开vivado软件,菜单栏选择Tools->Create and Package New IP

基于ZYNQ-7000的AI加速器设计之GP接口的实现_第2张图片

  • Next->Create AXI4 Peripheal->Next

基于ZYNQ-7000的AI加速器设计之GP接口的实现_第3张图片

  •  修改名字,选择IP保存位置,修改完毕后然后Next

基于ZYNQ-7000的AI加速器设计之GP接口的实现_第4张图片

  •  根据需求修改寄存器数量,其他设置保持默认设置,然后Next

基于ZYNQ-7000的AI加速器设计之GP接口的实现_第5张图片

  •  选择Add IP to the repository,然后Finish

基于ZYNQ-7000的AI加速器设计之GP接口的实现_第6张图片

  •  创建完成后,Vivado会自动生成Verilog代码,用户可以根据自己需要在如下图所示位置添加用户代码。

基于ZYNQ-7000的AI加速器设计之GP接口的实现_第7张图片

  • 在添加好自己的用户代码后,可以创建一个顶层文件,把刚才生成的IP文件例化,然后包起来形成一个用户IP,步骤为Tools->Create and Package New IP->Next->Package your current project

基于ZYNQ-7000的AI加速器设计之GP接口的实现_第8张图片

  •  然后一路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中创建的块设计如下图所示:

基于ZYNQ-7000的AI加速器设计之GP接口的实现_第9张图片

    PS端的代码如下图所示: 

#include 
#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端运算的结果完全相同,测试通过。

基于ZYNQ-7000的AI加速器设计之GP接口的实现_第10张图片

你可能感兴趣的:(FPGA-Zynq7000)