运行 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 delay
和 Clock
操作等
由于某些原因,当我启动 Ada ELF
文件时,AXI
界面不工作。如果我用它代替等效的 C,那么一切都很好。
这个特殊问题目前尚未解决,但与我原来的问题无关!
(这可能是 Ada run-time 依赖于 FSBL
或 u-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 认证或类似认证。
我已经成功地使用 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 delay
和 Clock
操作等
由于某些原因,当我启动 Ada ELF
文件时,AXI
界面不工作。如果我用它代替等效的 C,那么一切都很好。
这个特殊问题目前尚未解决,但与我原来的问题无关!
(这可能是 Ada run-time 依赖于 FSBL
或 u-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 认证或类似认证。