运行 Zynq 上的 Ada 使用 Digilent Zybo 开发板

Running Ada on the Zynq using a Digilent Zybo development board

我已经成功地使用 Vivado 和 SDK 为 Digilent Zybo 板上的 Zynq XC7Z010 开发了 VHDL 和 C。我也一直在使用 GNAT GPS IDE 学习针对 STM32F4 处理器的 Ada(使用受支持的开发板之一)。

GPS 还附带一组 zynq7000 运行 次定位到 XC7Z020(据我所知)。通过查看这些目标的 BSP,我相信生成的代码也应该在 XC7Z010 上 运行,因为 ARM 内核看起来是相同的。可能会发现存在差异,在这种情况下,我将尝试基于现有的 zynq7000 BSP 构建特定的 运行-time(Adacore 已经记录了这个过程并给出了生成示例一个新的 STM32F4 BSP)。

我的主要问题是我不确定如何在我的 Zybo 上加载和 运行 生成的 Ada elf 文件。我尝试生成一个 BOOT.ini 文件,其中包含一个 FSBL(使用 SDK 构建并使用我从 Vivado 导出的硬件)、一个比特流和 Ada elf 文件(Zybo有一个可以配置为启动设备的 MicroSD 接口,这与通过 Vivado / SDK 生成的比特流和 C elf 完美配合。

无论如何,这没有用...我猜这可能是链接问题、引导加载程序问题或类似问题。以我目前的知识水平,我现在还不确定。

如有任何建议或指点,我们将不胜感激!

事实证明我的 BOOT.ini 没有问题,问题与访问我的 bit-stream 中定义的自定义 AXI 寄存器有关。如果我从 Ada 中删除这些引用,生成的 ELF 文件将完美运行。例如,使用 Text_IO.Put_Line() 在 Zybo 的 VCP 上打印,使用 Ada run-time delayClock 操作等

由于某些原因,当我启动 Ada ELF 文件时,AXI 界面不工作。如果我用它代替等效的 C,那么一切都很好。

这个特殊问题目前尚未解决,但与我原来的问题无关!

(这可能是 Ada run-time 依赖于 FSBLu-Boot 来初始化这个,不确定。如果你知道,请随时发表评论,我'当我解决这个问题时,我也会添加评论)

**** 更新 ****

这里有一些额外的背景知识,并描述了我必须做些什么才能让我的自定义 AXI IP 正常工作。

提供的 AdaCore BSP(用于构建 run-time 的板级支持包)针对 Xilinx XC702 开发板。我使用的是 Digilent Zybo(旧版本)。这两个板使用不同的 Zynq 部分,XC702 基于 XC7Z020 而 Zybo 使用 XC7Z010(有一个带有 XC7Z020 选项的新版本)。

我按照 AdaCore 说明(可在其网站上找到)并专门为 Zybo 构建了一个 BSP。最初我只是更新了时钟细节,因为 Zybo 以不同的速度运行,然后验证 Ada delay 函数是否正常工作(作为 Ravenscar run-time 的一部分提供,从更新的 BSP).但是,我的自定义 AXI IP 仍然无效...

长话短说,Ada run-time 包含名为 start-ram.S 的汇编文件,其中包括设置 MMU。有一个名为 memmap.inc 的包含文件,其中包含作为一系列 .long 指令的实际 MMU 页面定义。我必须通过将特定指令编辑为

来更新 AXI_GP0 地址条目
.long 0x43c10c16  @ for 0x43c00000, axi_gp0

之前它被设置为 0x00000000 @ for 0x43c00000, *none*。这些条目在 start-ram.S 中解码,然后用于配置 MMU(前 12 位设置页面,其余位被切碎并用作页面配置)。

所以,一旦我在我的 Zybo BSP 和 re-built 和 run-time 中编辑了这个文件,IP 就可以从 PS 访问并且按预期工作。这一切都花了一些时间才弄明白,但这是值得的,因为我在探索死胡同的同时学到了很多东西!

我希望这对以后的人有所帮助,我也强烈推荐 Ada 用于 Zynq 开发,特别是如果您最终需要 DO-178 认证或类似认证。