I've been successfully using Vivado and the SDK to develop VHDL and C for the Zynq XC7Z010
on a Digilent Zybo board. I've also been using the GNAT GPS IDE to learn Ada targeted to an STM32F4
processor (using one of the supported development boards).
GPS also ships with a set of zynq7000
run-times targeted to the XC7Z020
(as far as I can tell). Having looked through the BSPs for these target I believe that the code generated should also run on the XC7Z010
as the ARM cores appear to be the same. It may turn out that there are differences, in which case I will have a go at building a specific run-time based on the existing zynq7000
BSP (Adacore have documented this process and give an example for generating a new STM32F4
BSP).
My main problem is I'm not sure how to load and run the generated Ada elf
file on my Zybo. I have tried to generate a BOOT.ini
file containing a FSBL
(built with the SDK and using my exported hardware from Vivado), a bit-stream and the Ada elf
file (The the Zybo has an MicroSD interface that can be configured as a boot device, this works perfectly with a bit-stream and C elf
produced via Vivado / SDK).
Anyway, this didn't work... I'm guessing that it might be a linking issue, or a boot loader issue, or similar. With my current level of knowledge I'm just not sure at this stage.
Any advice or pointers would be greatly appreciated!
It turns out that my BOOT.ini
was fine, the problem was related to accessing custom AXI
registers defined in my bit-stream. If I remove these references from the Ada the generated ELF
file works perfectly. For example, printing over the Zybo's VCP using Text_IO.Put_Line()
, using Ada run-time delay
and Clock
operations etc.
For some reason the AXI
interface isn't working when I boot an Ada ELF
file. If I substitute this for the equivalent C, then all is well.
This particular problem is currently unresolved, but not related to my original question!
(It might be that the Ada run-time is relying on the FSBL
or u-Boot
to have initialised this, not sure. Feel free to comment if you know, I'll also add a comment when I resolve this)
**** Update ****
Here is some additional background and a description of what I had to do to get my custom AXI IPs to work.
The provided AdaCore BSP
(Board Support Package used to build the run-time) is targeted at the Xilinx XC702
development board. I'm using a Digilent Zybo (the older version). The two boards use different Zynq parts, the XC702
is based on a XC7Z020
and the Zybo uses a XC7Z010
(there is a new version with a XC7Z020
option).
I followed the AdaCore instructions (available on their web site) and built a BSP
specifically for the Zybo. Initially I just updated the clock details as the Zybo runs at a different speed and then verified that the Ada delay
function worked correctly (provided as part of the Ravenscar
run-time built from the updated BSP
). However, my custom AXI
IPs still didn't work...
To cut a long story short, the Ada run-time contains as assembly file called start-ram.S
that amongst other things sets up the MMU
. There is an include file called memmap.inc
that contains the actual MMU
page definitions as a series of .long
directives. I had to update the AXI_GP0
address entry by editing the particular directive to,
.long 0x43c10c16 @ for 0x43c00000, axi_gp0
Previously it was set to 0x00000000 @ for 0x43c00000, *none*
. These entries are decoded within start-ram.S
and then used to configure the MMU
(the top 12 bits set the page and the remaining bits are chopped up and used as page config).
So, once I edited this file in my Zybo BSP
and re-built the run-time, the IPs became accessible from the PS and worked as expected. This all took a while to figure out, but was worth it as I learn loads whilst exploring the dead ends!
I hope this helps someone in the future, I also highly recommend Ada for Zynq development especially if you ultimately need DO-178 certification, or similar.