Hello, I am using the RFSoC 4x2 with PYNQ, and I’m having some trouble generating some of the waveforms which I want to. Using the loopback method shown in the tutorial RFDC notebook, I want to get started with generating a simple pulse – however, I’m not sure how to transmit a variable waveform. All of the example notebooks used a fixed waveform, where the frequency of the transmission was set before the receiver was set up. However, for something like a pulsed or frequency modulated wave, I will need to have this transmitter waveform change while the receiver is enabled. Can anyone point me in the right direction? Thanks, any help is appreciated.
Welcome to the forums!
It sounds like you want to create a signal generator that responds (in some way) to a signal received by the RF ADC. Does this sound correct?
I am interested in this too. In particular, I would like to create a generalised framework for others (such as yourself) to generate their custom waveforms based on feedback from the RF ADC.
Could I ask a few questions?
- What application do you have in mind? Are you focusing on wireless communications, instrumentation, quantum, or something else?
- What kind of signals do you want to generate from the RF DAC? Do you have any equations or algorithms that mathematically describe these signals, or are they reasonably arbitrary?
- What analysis would you like to perform on a waveform received from the RF ADC? How does this interact with the signal generation part of your system?
- Do you have a transfer function, or similar, which describes what you want to achieve?
To answer your question, I am unaware of anything out of the box that will do what you are describing. You will need to design a custom FPGA architecture that can respond correctly to received waveforms (from the RF ADC) and feedback information to the signal generation stage (to the RF DAC).
I’d like to explore this problem further, and the questions above would help me a lot here and hopefully give you back something useful in the future,
Sorry for the confusion regarding the “loopback method”, I don’t think that’s quite what I meant. I did not mean to imply having a system where the DAC transmitter depends on the ADC receiver.
Although that does sound like an interesting problem, I am not quite there yet – I just want to be able to generate different types of waveforms from the DAC, independent of the ADC. For simplicity’s sake, I would just want to be able to connect the ADC to the DAC directly with a SMA connector for now (rather than using separate transmitter/receiver antennas).
From what I understand, in the example notebooks, we are just generating continuous wave waveforms from the DAC – however, I want to be able to generate other types of signals from the DAC, such as pulse waves and frequency modulated continuous waves. Due to the sequential nature of Python, I am not sure how to have a transmitter signal that changes, while the receiver is receiving. Perhaps I have to use multithreading/multiprocessing, but I’m not sure if that is overcomplicating it, or maybe it is simpler to design from the FPGA architecture.
No problem, and I think I can answer your question and offer some advice.
Python does execute commands sequentially due to the Global Interpreter Lock (GIL). However, you can use the FPGA portion of the RFSoC to perform concurrent processing for the transmitter and receiver. Additionally, as I mentioned before, there isn’t any out-of-the-box infrastructure to help you generate arbitrary signals, so you will need to design your own FPGA architecture design, which can be a little tricky if you are new to this. Here are a few tools to get you started:
- MathWorks HDL Coder
- AMD’s Model Composer (which runs in Simulink)
- AMD’s Vivado HLS
- You can also design FPGA architectures using VHDL, Verilog, and other hardware description languages.
It sounds like you want a transmitter and receiver operating simultaneously, which is possible using the FPGA logic fabric. However, to help you progress, my advice is to focus on just one part of the system at the moment and try to list, using bullet points, precisely what you would like to achieve. Then, try sketching out a diagram based on your specification. From here, you can start designing the system components using the tools I have given above for FPGA implementation. It would be best if you have a good understanding of digital electronics to proceed here.
You can see some design examples that the StrathSDR team have implemented below:
And, of course, you have the base overlay for the RFSoC4x2, which will show you how to interact with the RF Data Converters on this platform.
Hopefully, this is useful,
Thanks, this was very helpful!
What would designing my own FPGA architecture constitute? With an FPGA design, I would be directly coding the PL, so I would no longer need an overlay from what I understand. Or would I still need to interface PYNQ with the HDL?
Are there any sample HDL (VHDL or Verilog) tutorials for the RFSoC4x2 that you can point me to?
Also, can you please point me in the right direction regarding loading in a new overlay (which files are necessary – tcl, bit, hwh – and where do I upload them?
I am new to the RFSoC4x2/PYNQ framework so I am still trying to understand how everything works.
Thanks for all the help.