SDSoc学习(四):搭建包含AXI_GPIO的平台(解决找不到基地址的问题)

简介
本篇博客大部分内容前三篇博客都已经包含了,此处重点叙述不同之处,主要对比Tcl命令的不同和解决SDSoc程序找不到基地址的问题。

使用ZedBoard开发板,SDSoc 2017.4, Win10系统;此处通过AXI_GPIO点亮ZedBoard板子上连接在PL端的8个LED灯。

Tcl命令
搭建平台的步骤在 SDSoc学习(二)中进行了较为详细的描述,同时也可以参见官方文档 ug1146 和 ug1236 。

VIVADO工程如下:

AXI_GPIO设置如下:

部分Tcl命令如下:
set_property PFM_NAME "xilinx.com:zedgpio:zedgpio:1.0" [get_files E:/sdsoc20174/projects/myplatform/zedgpio/zedgpio/zedgpio.srcs/sources_1/bd/zedgpio/zedgpio.bd]
set_property PFM.CLOCK { \
FCLK_CLK0 {id "0" is_default "true" proc_sys_reset "rst_ps7_0_100M" } \
} [get_bd_cells /processing_system7_0]
set_property PFM.AXI_PORT { \
M_AXI_GP1 {memport "M_AXI_GP"} \
S_AXI_ACP {memport "S_AXI_ACP" sptag "ACP" memory "ps7 ACP_DDR_LOWOCM"} \
S_AXI_HP0 {memport "S_AXI_HP" sptag "HP0" memory "ps7 HP0_DDR_LOWOCM"} \
S_AXI_HP1 {memport "S_AXI_HP" sptag "HP1" memory "ps7 HP1_DDR_LOWOCM"} \
S_AXI_HP2 {memport "S_AXI_HP" sptag "HP2" memory "ps7 HP2_DDR_LOWOCM"} \
S_AXI_HP3 {memport "S_AXI_HP" sptag "HP3" memory "ps7 HP3_DDR_LOWOCM"} \
} [get_bd_cells /processing_system7_0]
set intVar []
for {set i 0} {$i < 16} {incr i} {
lappend intVar In$i {}
}
set_property PFM.IRQ $intVar [get_bd_cells /xlconcat_0]

其中PFM_NAME、PFM.CLOCK、PFM.IRQ这些接口的声明和SDSoc(二) 中的声明一样;PFM.AXI_PORT的接口声明有些区别,没有声明M_AXI_GP0这个接口。原因在SDSoc(三)中提到过,PL和PS之间通过AXI总线连接,而写Tcl命令声明AXI接口,其目的是SDSoc将某些函数从PS调入PL中做硬件加速时,数据需要先从PS传给在PL中用硬件实现的函数,然后当在PL中加速的函数运行完成后,该函数的返后数据又需要从PL回传到PS中,而传输这些数据的就需要AXI接口;因此需要通过Tcl命令声明这些AXI接口,以便SDSoc调用传输数据。

在这个工程中,我们已经用了AXI_GP0连接AXI_GPIO这个IP,不能被SDSoc调用去传输数据了,因此这里不声明这个接口,这就是不同的原因。

基地址寻找
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"
#include "xil_types.h"
#define XGpio_axi_WriteReg(BaseAddr, RegOffset, Data) Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data))

#define AXI_LED XPAR_AXI_GPIO_0_BASEADDR

int main() {
u8 k = 0x01;
while (1) {
XGpio_axi_WriteReg(AXI_LED, 0, k);
k = k << 1;
usleep(100000);
if (k == 0)
k = 0x01;
}
}

在SDSoc中,我通过如下代码实现控制开发板上的8个LED:
奇怪的是报错了,这个程序我通过VIVADO+SDK试验过没问题的,错误原因是宏定义中找不到XPAR_AXI_GPIO_0_BASEADDR,这个是AXI_GPIO的基地址,我通过XGpio_axi_WriteReg() 函数向基地址写入一个字节数据,控制某一位为0或者1实现对应位置的LED的亮灭。 \

XPAR_AXI_GPIO_0_BASEADDR 这个定义位于xparameters.h 这个文件中,出错的原因是SDSoc没有找到正确的xparameters.h,默认情况下,SDSoc找到的xparameters.h是位于下图中划线的文件夹中

这个文件夹下的xparameters.h文件中的确没有XPAR_AXI_GPIO_0_BASEADDR 这个定义,所以报错了。而真正包含XPAR_AXI_GPIO_0_BASEADDR 这个定义的xparameters.h 文件是位于如下位置:

或者是如下位置:

也就是说SDSoc没有找到正确的位置。在仔细查看ug1146 后找到了解答:

需要重新生成一遍平台,解决方法如下:
1、双击打开platform.xpr

2、单击Board Support Package,找到system.mss文件

3、单击Library,在Include Path 中找到相应文件

步骤2、3中可以是
E:\sdsoc20174\projects\myplatform\zedgpio\zedgpio\zedgpio.sdk\empty_bsp\system.mss

E:\sdsoc20174\projects\myplatform\zedgpio\zedgpio\zedgpio.sdk\empty_bsp\ps7_cortexa9_0\include。

4、分别点击Generate Platform 和Add to Custom Repositories

5、然后把zedgpio这个文件夹关闭(下图红圈所示,打开多个文件担心有影响),再新建一个zedgpio_test的SDSoc工程,在新工程中把原来的程序复制粘贴进去;在Includes下多了一个文件(红色下划线所示)。

右击头文件#include”xparameters.h”,选择Open Declaration,通过查找工具就能查找到XPAR_AXI_GPIO_0_BASEADDR。

6、然后就直接Debug,等待执行完成,然后将sdcard中的文件拷贝到SD卡中,启动即可。

结束
这里简单比较了一下Tcl命令,也算基本解决了基地址找不到的问题,在之后搭建更加复杂的平台打基础。

本文转载自:CLGo的博客
*本文由作者授权转发,如需转载请联系作者本人

最新文章

最新文章