I have to interface a fast ADC with an FPGA and then do the data processing. The FPGA used will be Zynq Ultrascale+ RFSoC ZU29DR. I have been given the information that ADC_clk = 4x FPGA_clk. ADC output data is 12/16-bits. The data processing will be multiply-accumulate over a number of samples.

I = I + adc_data * cos;

Q = Q + adc_data * sin;

There is a data sample output at every clock of ADC. So, it will be something like:

I[0] = I[0] + adc_data[0] * cos[0];

Q[0] = Q[0] + adc_data[0] * sin[0];

I[1] = I[1] + adc_data[1] * cos[1];

Q[1] = Q[1] + adc_data[1] * sin[1];

And so on.

I have a DDS CORDIC-LUT module that can be instantiated to generate 4 sin, cos values parallelly based on the phase word. What I'm not sure about is how to multiply with adc_data as adc generates faster than what the FPGA can accept.

I have come up with the below timing diagram and architecture. Any input will be appreciated.

enter image description here

enter image description here


1 Answer 1


The FPGA should have transceivers that work with clocks much higher than the FPGA clock. These transceivers widen the data word and turn a "narrow word, high clock" into "wide word, slow clock". You may need an external SERDES chip to package up the ADC data into one or more "gigabit" narrow (serial-ish) streams that the FPGA will then internally deserialize/widen.

Generally, you need to interface the ADC so that the FPGA fabric sees the data as a 64-bit word at the FPGA clock (or a 128-bit word at 1/2 FPGA clock, etc.).

The widening could be done externally, in a pinch, using discrete D-registers, timed from a programmable clock delay and divider chip. The clock gen would make 4 clocks at the fADC/4 frequency, and their phases would be adjusted so that the registers would properly capture each 4th word from the ADC, with a 1/fADC offset in phases between the registers.

External widening consume a lot of I/O and would be a pain to lay out. Counterintuitively perhaps, serializing into a faster data stream right next to the ADC will be easier, as there'll be fewer differential traces to lay out between the SERDES and the FPGA.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.