在裸机应用内进行内核寻址 - 2022.1 简体中文

Versal ACAP AI 引擎编程环境 用户指南 (UG1076)

Document ID
UG1076
Release Date
2022-05-25
Version
2022.1 简体中文

对于裸机应用,从嵌入式应用进行 PL 内核寻址时,必须使用控制寄存器,或者在硬件中实现内核的相应基址和偏移处读取和写入该内核。通过观察前述应用,嵌入式应用可将数据交付给 MM2S 内核,将其引入 AI 引擎 graph 以供 InterpolatorClassifier 内核使用,并从 S2MM 内核读取数据以便继续在嵌入式应用中进行处理。在此例中,按固定平台上 PL 区域中实现 MM2SS2MM 内核的地址来对这些内核进行寻址。

此示例的 main.cpp 显示了特定寄存器的内核基址和地址偏移的 #define 语句。例如:

#define MM2S_BASE XPAR_MM2S_S_AXI_CONTROL_BASEADDR
#define S2MM_BASE XPAR_S2MM_S_AXI_CONTROL_BASEADDR

#define MEM_OFFSET 0x10
#define SIZE_OFFSET 0x1C
#define CTRL_OFFSET 0x0

要判定内核的地址和偏移,请检验固定平台中的部分文档。已实现的内核的基址位置位于固定平台的 xparameters.h 文件中,此文件位于 <platform_name>/standalone_domain/bspinclude/include 文件夹下。对于设计示例,请在 xparameters.h 中使用以下条目来判定这些内核的基址。

/* Definitions for peripheral MM2S */
#define XPAR_MM2S_S_AXI_CONTROL_BASEADDR 0xA4020000
#define XPAR_MM2S_S_AXI_CONTROL_HIGHADDR 0xA402FFFF

/* Definitions for peripheral S2MM */
#define XPAR_S2MM_S_AXI_CONTROL_BASEADDR 0xA4030000
#define XPAR_S2MM_S_AXI_CONTROL_HIGHADDR 0xA403FFFF
注释: xparameters.h 文件采用动态生成和寻址。引用内核的地址宏比硬编码效果更好。

地址偏移的位置位于 Vitis™ 编译器生成的已编译内核的 _x/<kernel>/<kernel>/<kernel>/solution/impl/ip/drivers/<kernel>_v1_0/src 文件夹下的 <kernel_driver>_hw.h 文件内。例如,MM2S 内核驱动程序 xmm2s_mm2s_hw.h 会显示以下数据。

#define XMM2S_MM2S_CONTROL_ADDR_AP_CTRL    0x00
#define XMM2S_MM2S_CONTROL_ADDR_GIE        0x04
#define XMM2S_MM2S_CONTROL_ADDR_IER        0x08
#define XMM2S_MM2S_CONTROL_ADDR_ISR        0x0c
#define XMM2S_MM2S_CONTROL_ADDR_MEM_V_DATA 0x10
#define XMM2S_MM2S_CONTROL_BITS_MEM_V_DATA 64
#define XMM2S_MM2S_CONTROL_ADDR_SIZE_DATA  0x1c
#define XMM2S_MM2S_CONTROL_BITS_SIZE_DATA  32

读取或写入内核时,请使用以下偏移。例如,在 main.cpp 应用文件示例中,使用以下语句来写入存储器位置。

Xil_Out32(MM2S_BASE + MEM_OFFSET, (uint32_t) memAddr);