This project provides example designs for working with the Zynq UltraScale+ RFSoC RF Data Converter on the Zynq UltraScale+ RFSoC ZCU111 Evaluation Kit.
You can read the Zynq UltraScale+ RFSoC RF Data Converter v2.6 Gen 1/2/3 Product Guide (PG269) for more details on the IP core.
Specifically, we will use the ZCU111 as an fully customizable Arbitrary Waveform Generator (AWG). In this way, we will be able to generate any arbitrarily defined waveshape with the Digital to Analog Converter (DAC) integrated to the ZCU111.
The big advantage of using a solution like this is the flexibility of the platform. In addition to using a fully customizable solution, it is possible to use IPs to enrich or accelerate our application with DSP, filters...
The ZCU111 features 8 14-bit DACs that can sample a signal up to 6.554 GSa/s.
Moreover, the board has 2 RAMs, both of which can be used in these examples:
-
4GB DDR4 Component, attached to Programmable Logic (PL)
-
4GB DDR4 SODIMM (scalable up to 32GB), attached to Processor Subsystem (PS)
Of course, the card has its limits (which depend among other things on the memory used), which I detail here.
These examples allow to generate 2 analog signals at a sampling frequency previously established. The duration of the signal (or the number of samples) and the sampling frequency will depend on the type of memory used: PS or PL.
In order to have 2 perfectly synchronized signals, I use a single signal which contains on the even numbers a signal A and on the odd numbers a signal B. It is thus necessary to send to the DMA a global signal which alternates the samples of signals A and B. I then realized an IP which separates this signal in 2 independent signals. More informations available here.
In each example file, you will find more details about the features of this example.
I use Vivado 2018.3 to design and generate the bitstream and Pynq 2.6 to run Jupyter Notebooks (or C programs).
Each example of AWG has a different sampling frequency and therefore adapted clocks and memory used. In each example folder, you will find 2 subfolders:
-
The project already built in the build folder. This can be useful for a first quick test.
-
The design sources available in the vivado folder. If you need to modify it.
In order to use these different examples, you have to use the PS. However, there are different possibilities
-
In the folder pynq_notebook you will find an example of a notebook that uses the pynq libraries. This one is quite simple to use, but limited for some features However, it is perfectly suitable for running the AWG in an initial instance.
-
In the C_codes folder (in progress), you will find a C code that uses the standard POSIX libraries. This one is more complicated to use, but allows more flexibility, especially by being able to choose the memory used. This one allows a programming closer to the machine, what I like most.
-
In the python_notebook folder (in progress), you will find an example notebook that uses the standard python libraries. It does the same thing as the C code (in fact, the python notebook is a simple rewriting of the C code). I wrote a python notebook because it is easier to use at first, especially for people not experienced with C. However, keep in mind that C being more powerful than python, it may be necessary in some cases.
Be careful, in these last 2 cases, I suppose you have changed the SODIMM memory for a capacity higher than 8 Gb.
In any case, you will find more informations here.
You can follow the same instructions as here and here.
Specifically, you need to :
- clone the repo directly in the ZCU111 (or clone it on a computer and copy files to the ZCU111) :
git clone https://github.com/DamienFruleux/ZCU111-AWG
- load the pynq_notebook in Jupyter :
http://<board_ip_address>:9090/lab
- and run it :)
In your computer :
- source the Vivado 2018.3 path :
<path_to_vivado>/2018.3/settings64.sh
- clone the repo :
git clone https://github.com/DamienFruleux/ZCU111-AWG
- move into the vivado folder :
cd ZCU111-AWG/vivado
- run
make
- import the freshly generated files into the ZCU111:
scp -r /my_build/* xilinx@<board_ip_address>/ZCU111-AWG/
. - load the pynq_notebook in Jupyter :
http://<board_ip_address>:9090/lab
- and run it :)