Signal Generators - QICK Firmware
Overview
QICK ships several signal-generator IP cores. They all connect to the
tProcessor the same way (one AXI-Stream waveform port per channel, driven
by WPORT_WR/QickProgram.pulse()) and the same way to a DAC, but
they trade off differently between flexibility (arbitrary pulse shapes)
and simultaneity (how many tones at once). Picking the right one for a
channel is a hardware/firmware decision (which core is instantiated on that
DAC channel in your board’s bitstream) – as a user you mostly just need to
know which kind of channel you have and how to talk to it, both covered
below.
Core |
Tones |
Envelope |
Typical use |
|---|---|---|---|
1 (arbitrary shape) |
Yes, full rate |
The default choice for shaped pulses (Gaussian, DRAG, flat-top) – qubit drive, readout drive. |
|
Interpolated Signal Generator v2 (axis_sg_int4_v2) - QICK Firmware |
1 (arbitrary shape) |
Yes, 4x-interpolated |
Same use case as SG-v6 on boards/channels where this lighter-weight
core is instantiated instead; has a DAC-side mixer ( |
1 (arbitrary shape) |
Yes, full rate |
Legacy predecessor to SG-v6; not used in any board design currently in this repository. Documented for driver/backward-compatibility reference, not for new designs. |
|
up to 8 (fixed CW) |
No |
Playing several simultaneous fixed tones from one channel – e.g. a frequency comb, or driving several resonators/qubits at once without one DAC channel per tone. |
|
Multiplexed Signal Generator with Mixer (axis_sg_mixmux8_v1) - QICK Firmware |
up to 8 (fixed CW) |
No |
Same as SG-Mux8, plus a shared DAC-side mixer so the whole comb can be
placed anywhere (including outside the first Nyquist zone) via one
|
Arbitrary-envelope vs. multiplexed: which do I need?
Use an arbitrary-envelope generator (SG-v6, SG-int4-v2, or the legacy
SG-v4) when you need to shape a pulse – a Gaussian, a DRAG pulse, a
flat-top pulse with rounded edges, or any other waveform you can compute in
Python. These cores have envelope memory (BRAM) you upload I/Q samples into
with QickProgram.add_envelope(), and play back with an arb or
flat_top pulse style. Only one tone plays at a time per channel.
Use a multiplexed generator (SG-Mux8 or SG-MixMux8) when you need several simultaneous CW tones from one DAC channel and don’t need to shape each tone’s envelope – only its amplitude, phase, and which subset of tones is on for how long. This is the common case for a frequency comb or for driving multiple fixed resonances (e.g. several readout resonators) through a single physical channel. Pick SG-MixMux8 over plain SG-Mux8 if you need the comb somewhere the DAC’s un-mixed first Nyquist zone can’t reach on its own.
If you need both – multiple simultaneous tones and per-tone arbitrary shaping – no single QICK generator core does that; you need one arbitrary-envelope channel per shaped tone.
Common Python workflow
Every generator in this family is configured the same way, regardless of
which core is behind a given channel: declare it once with
QickProgram.declare_gen(), define named pulses with
QickProgram.add_pulse() (and QickProgram.add_envelope() first,
if it needs a shape), then play them with QickProgram.pulse(). See
Signal Generator v6 (SG-v6) - QICK Firmware’s “Python Usage” section for worked examples (single pulse,
shaped pulse, multiple queued pulses), and Multiplexed Signal Generator with Mixer (axis_sg_mixmux8_v1) - QICK Firmware’s Python
section for the multiplexed-generator variant (mux_freqs/mux_gains
instead of one freq/gain per pulse).