4. 脉冲序列描述与编程
在量子脉冲自动校准系统中,脉冲序列描述是连接“物理意图”与“硬件执行”的中间层。实验者想要实现的是一次 X 门、一个 CZ 门或一段 dynamical decoupling 序列,而任意波形发生器(AWG)最终接收到的是一组离散采样点、通道偏置和触发信号。脉冲序列描述格式的任务,就是把前者翻译成后者,并在翻译过程中显式表达波形、包络、通道映射和时序约束四类信息。
波形与包络:从数学表达式到采样点
波形(waveform)通常指载波层面的快速振荡,例如超导量子比特常用的 4–6 GHz 微波;包络(envelope)则是叠加在载波上的慢变幅度调制,决定脉冲的上升沿、平台和下降沿。以高斯脉冲为例,其包络可写为
A(t) = A0 * exp( -(t - t0)^2 / (2*sigma^2) ), 0 <= t <= t_gate
其中 A0 是峰值幅度,t0 是包络中心,sigma 控制脉宽。若采用 DRAG 校正,还会在正交分量上叠加包络的导数项,以抑制泄漏到非计算态。实际写入 AWG 时,需要把 A(t) 与 cos(2πf_c t + φ) 相乘并离散化。假设采样率 f_s = 1 GS/s、脉冲总长 20 ns,则每条通道要写入 20 个采样点;若使用 2 GS/s,则写入 40 个点。采样率不足会直接导致包络失真,因此描述格式中必须携带采样率或时间步长信息。
包络参数通常以“门时间”为单位给出,例如 t_gate = 20 ns、sigma = t_gate/4、DRAG 系数 β = 0.5。这些参数在自动校准中会作为可调变量,由优化器迭代修改,因此脉冲序列描述格式需要支持参数化表达,而不是只存一组固定采样点。
通道映射:逻辑通道与物理端口
一个量子比特往往需要多条控制线:XY 驱动线用于微波脉冲,Z 偏置线用于频率调谐,读取线用于色散读出。脉冲序列描述中通常先定义逻辑通道,例如 q0.xy、q0.z、q0.ro,再通过映射表绑定到具体仪器端口,如 AWG1.ch1、AWG1.ch2、ADC1.ch1。这种间接层的好处是:当实验室更换接线或复用同一段序列到不同芯片时,只需修改映射表,不必重写脉冲逻辑。
通道映射还需处理偏置与增益。Z 通道常带一个直流偏置,用于把比特调到工作频率;XY 通道则可能需要 I/Q 两路,分别对应同相与正交分量。若 I/Q 增益不平衡或存在正交误差,会在脉冲中引入额外相位,自动校准中通常把增益比和相位偏移也作为可调参数写入通道配置。
时序约束:对齐、等待与同步
多通道脉冲序列的核心难点不在单条波形,而在通道之间的时间关系。常见约束包括:
- 绝对起始对齐:所有通道在 t = 0 同时开始,适用于同时驱动多个比特的并行门。
- 相对延迟:某通道相对参考通道延迟 Δt,用于补偿电缆长度差或实现回波序列中的等待。
- 最小间隔:两个脉冲之间必须留出至少 t_min,避免 AWG 输出级未恢复或量子比特未完全弛豫。
- 触发同步:采集卡与 AWG 之间通过触发信号对齐,确保读出窗口落在脉冲结束之后。
这些约束若只用“时间列表”描述,很容易在修改某一通道时破坏整体对齐。因此现代脉冲描述格式倾向于把时序写成相对关系,例如“q1.xy 在 q0.xy 结束后 4 ns 开始”,由编译器自动求解绝对时间。下面这张图展示了一个两比特 CZ 校准序列的通道—时间关系,其中包含 XY 驱动、Z 偏置和读出三条通道,以及它们之间的对齐与延迟约束。
常用描述格式与工具链
目前实验室中常见的脉冲描述方式大致分为三类。第一类是文本化领域语言,如 Qiskit Pulse、QUA、QCoDeS 的序列描述,它们用 Python 或类 Python 语法直接构造脉冲对象,优点是灵活、易参数化,缺点是编译到硬件需要额外步骤。第二类是表格/配置文件,例如把每个通道的起始时间、包络类型、参数写成 CSV 或 JSON,由脚本读取后生成 AWG 序列文件,适合固定序列的批量执行。第三类是图形化时序编辑器,如某些商业 AWG 配套软件,允许拖拽脉冲块并自动检查通道冲突,适合快速搭建原型但不利于版本管理和自动校准。
在自动校准场景中,推荐采用“参数化文本描述 + 编译器 + 硬件抽象层”的工具链。参数化文本负责表达脉冲形状和时序关系;编译器把相对时序求解为绝对采样点,并检查最小间隔、通道冲突和幅度上限;硬件抽象层则把逻辑通道映射到具体仪器,并处理采样率转换、I/Q 调制和触发配置。这样,当校准算法调整某个包络参数时,只需修改参数值并重新编译,而不必手工改动底层波形文件。
一个可执行的参数化描述示例
下面给出一个简化的 YAML 风格描述片段,用于表达前述两比特 CZ 校准序列。它包含通道定义、包络参数和时序约束,可直接作为编译器输入。
channels:
q0.xy: {port: AWG1.ch1, sample_rate: 2e9}
q1.xy: {port: AWG1.ch2, sample_rate: 2e9}
q0.z: {port: AWG2.ch1, sample_rate: 1e9}
readout: {port: ADC1.ch1, sample_rate: 1e9}
pulses:
x90_q0:
type: gaussian
duration: 20e-9
sigma: 5e-9
amplitude: 0.35
drag_beta: 0.5
channel: q0.xy
x90_q1:
type: gaussian
duration: 20e-9
sigma: 5e-9
amplitude: 0.33
drag_beta: 0.5
channel: q1.xy
z_pulse:
type: square
duration: 20e-9
amplitude: 0.12
channel: q0.z
sequence:
- play: x90_q0
start: 0
- play: x90_q1
start: after(x90_q0) + 4e-9
- play: z_pulse
start: after(x90_q1)
- play: readout
start: after(z_pulse) + 6e-9
duration: 20e-9
constraints:
min_gap: 4e-9
max_amplitude: 0.8
align: trigger
编译器读取该描述后,会先解析 after() 表达式,把相对时间转换为绝对时间:x90_q0 在 0–20 ns,x90_q1 在 24–44 ns,z_pulse 在 44–64 ns,readout 在 70–90 ns。随后检查 min_gap:x90_q1 与 x90_q0 之间间隔 4 ns,满足;z_pulse 与 readout 之间间隔 6 ns,满足。最后按各通道采样率生成采样点数组,并写入 AWG 序列内存。若某次自动校准把 x90_q1 的 duration 改为 24 ns,编译器会重新计算后续所有起始时间,并再次检查约束,避免手工修改带来的时序错位。