在Digilent Zybo开发板上运行Ada程序的方法

3
我一直在使用Vivado和SDK开发Digilent Zybo板上的Zynq XC7Z010的VHDL和C,进展顺利。我还使用GNAT GPS IDE学习Ada,并针对支持的开发板之一的STM32F4处理器进行目标设置。
GPS还提供了一组针对XC7Z020的zynq7000运行时(据我所知)。通过查看这些目标的BSP,我认为生成的代码也应该可以在XC7Z010上运行,因为ARM内核似乎是相同的。可能会发现有差异,在这种情况下,我将尝试基于现有的zynq7000 BSP构建特定的运行时(Adacore已经记录了此过程,并提供了一个用于生成新的STM32F4 BSP的示例)。
我的主要问题是我不确定如何在我的Zybo上加载和运行生成的Ada elf文件。我尝试生成一个包含FSBL(使用Vivado中导出的硬件构建SDK),一个比特流和Ada elf文件的BOOT.ini文件(Zybo具有可配置为引导设备的MicroSD接口,使用Vivado / SDK生成的比特流和C elf文件可以完美地工作)。
然而,这并没有起作用……我猜测可能是链接问题,或者是启动加载程序问题等等。在当前知识水平下,我现阶段就不确定了。
非常感谢您给出任何建议或指向!
1个回答

4
原来我的BOOT.ini文件没问题,问题是与访问我位流中定义的自定义AXI寄存器有关。如果我从Ada中删除这些引用,生成的ELF文件就可以完美运行。例如,使用Text_IO.Put_Line()在Zybo的VCP上打印、使用Ada运行时的delayClock操作等。
不知何故,当我启动Ada ELF文件时,AXI接口无法正常工作。如果我将其替换为相应的C,则一切都正常。
目前这个特定问题尚未解决,但与我的原始问题无关!
(可能是因为Ada运行时依赖于FSBLu-Boot已经初始化了它,不确定。如果您知道,请随意发表评论,我解决后也会添加评论)
**** 更新 ****
这里提供一些背景信息,并描述了我必须采取的措施才能使我的自定义AXI IP正常工作。
提供的AdaCore BSP(用于构建运行时的板支持包)针对Xilinx XC702开发板。我正在使用Digilent Zybo(旧版本)。这两个板使用不同的Zynq部件,XC702基于XC7Z020,而Zybo使用XC7Z010(有一个带有XC7Z020选项的新版本)。
我遵循了AdaCore的说明(可在其网站上找到),专门为Zybo构建了一个BSP。最初,我只更新了时钟详细信息,因为Zybo运行速度不同,然后验证了Ada delay函数是否正常工作(作为从更新的BSP构建的Ravenscar运行时的一部分提供)。然而,我的自定义AXI IP仍然无法正常工作...
长话短说,Ada运行时包含一个名为start-ram.S的汇编文件,其中包括设置MMU等内容。有一个名为memmap.inc的包含文件,其中包含实际的MMU页面定义,作为一系列.long指令。我必须通过编辑特定指令来更新AXI_GP0地址条目。
.long 0x43c10c16  @ for 0x43c00000, axi_gp0

以前它被设置为0x00000000 @ for 0x43c00000,*none*。这些条目在start-ram.S中解码,然后用于配置MMU(顶部12位设置页,剩余的位被切分并用作页配置)。
因此,一旦我在我的Zybo BSP中编辑了这个文件并重新构建运行时,IP就可以从PS中访问并按预期工作。虽然花了一段时间才弄清楚,但在探索死胡同的过程中学到了很多!希望这能帮助未来的某个人,我也强烈推荐使用Ada进行Zynq开发,尤其是如果您最终需要DO-178认证或类似认证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接