# 操作原理

## 原理及模块划分

RBPU16 是一颗用于完成超导量子比特的态读出的 SoC 基带芯片。芯片模拟部分包括 ADC、DAC、PLL、LVDS、POR 和温度传感器；数字部分主要包括 DAQ、AWG、PlsGen、Feedback 以及 System 模块。读出芯片的总体功能组成如下图所示。

![rbpu_schematic](../assets/rbpu_schematic.png)

在激励信号生成路径上，AWG 用于控制激励通道待输出的波形，接着波形经过 DAC 转换成基带读出激励信号，同时 AWG 模块触发 PlsGen 模块实时发出脉冲信号使能外部 Pump 通道。回波信号处理路径上，ADC 用于采集反射的读出基带信号，接着 DAQ 对基带信号进行分析处理，结果再通过 LVDS 接口发送出去，同时 DAQ 模块触发 Feedback 模块将部分结果上报或者下发到外部芯片。

片内 PLL 用于管理整个芯片的时钟，为 ADC 采样时钟、DAC 更新时钟、数字模块主时钟等生成所需频率。POR 用于在芯片上电时对整个芯片进行复位，保障芯片正常工作。温度监视模块用于实时监测芯片温度变化，保障芯片稳定工作。System 模块用于管理芯片上控制的状态，为芯片运维和调试提供支撑。

<div class="important">
读出芯片不仅支持以 ASIC 芯片模式工作，也支持部分核心控制在 FPGA 内部工作。这两种工作模式受制于 ASIC 和 FPGA 资源以及外部 ADC、DAC 硬件性能不同，部分功能实现存在差异，后续阅读时需要重点关注。
</div>

## 关键数据路径

### 读出激励输出通道

<!-- MERGED from ../readout_program/ri_datapath.md -->

读出激励输出通道（RO 通道）由 AWG 模块和 Pump 模块协同工作，负责产生基带读出激励信号和 Pump 使能信号。

AWG 模块需要编程六类数据：

1. **控制器指令 (MCU_INS)**：控制 MCU 执行指令流，指令位于地址空间 `0x700000`
2. **控制器数据 (MCU_DAT)**：MCU 指令需要引用的初始数据，位于地址空间 `0x800000`
3. **控制寄存器 (AWG_REG)**：配置 AWG 工作模式与参数，位于地址空间 `0x900000`
4. **波形映射表 (AWG_IDX)**：码字 → 波形段的映射查找表，位于地址空间 `0xA00000`
5. **波形数据存储 (AWG_WVE)**：实际输出的波形采样点，位于地址空间 `0xB00000`
6. **模拟配置 (SYS_ANA)**：DAC 输出模式（NRZ/MIX/HBMIX）与偏置校准

波形输出流程如下：

1. MCU 每 3 个时钟周期执行一条指令，发出控制码字
2. 码字中的 `WAVE_ID` 字段通过查找表映射为波形段的起始地址和长度
3. 波形数据从 WVE 存储中读取，经希尔伯特变换生成 I/Q 两路
4. I/Q 信号与 NCO 混频，实现频率搬移
5. 经数字调幅、半带插值滤波
6. 输出至 DAC 转换为模拟信号

AWG 支持以下输出模式：

| 模式 | 描述 | 特点 |
|:-|:-|:-|
| **直出模式 (NRZ)** | 基带波形直接输出 | 输出频率 DC–3 GHz，适用于直接产生多音基带信号 |
| **调制模式 (MIX)** | 基带波形与 NCO 混频 | 输出频率 0.3–2.4 GHz，通过 NCO 频率控制精确频点定位 |
| **NCO Only 模式** | 仅 NCO 连续波形 | 方便连接外部仪器进行芯片测试 |
| **半带调制模式 (HBMIX)** | 混频 + 半带插值 | 提升高频输出信号质量 |

<div class="note">
一般情况下，直出模式用于量子实验，通过直接输出包含多个读出频率的波形，可以实现对多个量子比特的并行读出；调制模式用于腔频扫描等应用，通过实时修改 NCO 频率实现扫频功能；NCO Only 模式可以输出连续波形，方便连接外部仪器上进行测试。
</div>

**射频直出**：在 NRZ 模式下利用高阶奈奎斯特区输出，可以实现 6–7 GHz 的射频直出，功率平坦度约 2 dB（受限于 sinc 滚降特性）。

**Pump 通道**：由 MCU 码字中的 `PUMP_EN` 位触发 PlsGen 模块，产生可编程宽度的脉冲信号，通过 `PO_PUMP_EN` 管脚输出，用于使能外部 Pump 上变频通道。

**软复位**：通过写 AWG_REG 中的软复位寄存器，可复位 AWG 内部状态机和 FIFO，复位后需重新编程。

### 读出回波信号处理

<!-- MERGED from ../readout_program/ro_datapath.md -->

读出回波输入通道（RI 通道）由 ADC + DAQ 模块构成，负责采集和处理反射回来的基带信号。

**模拟信号路径**：RF 回波信号经外部混频器下变频为基带 → 巴伦差分转换 → ADC 采样（FPGA 平台 8 位 @4 GSPS，ASIC 平台 8 位 @6 GSPS）。

DAQ 模块需要编程五类数据：

1. **控制器指令 (MCU_INS)**：DAQ 内部 MCU 的执行指令流，位于地址空间 `0x200000`
2. **控制器数据 (MCU_DAT)**：MCU 需要引用的初始数据，位于地址空间 `0x300000`
3. **控制寄存器 (DAQ_REG)**：配置 DAQ 工作模式与参数，位于地址空间 `0x400000`
4. **读出参数与滤波器权重 (DAQ_PAR + DAQ_FLT)**：解模参数、匹配滤波器系数，位于地址空间 `0x500000` 和 `0x580000`
5. **模拟配置 (SYS_ANA)**：ADC 参考电压选择

数据处理流程：

1. ADC 采集原始波形数据
2. 数字解模：原始波形与匹配滤波器进行相关运算，得到 I/Q 复数数据
3. 态判定：根据 I/Q 数据判定量子态（0 态/1 态/2 态/未定义）
4. 态统计：对多次测量的态结果进行计数统计
5. 结果输出：通过 `RSLT_PUSH` LVDS 接口发送数据

DAQ 支持多种数据采集模式：

| 模式 | 输出数据量 | 适用场景 |
|:-|:-|:-|
| 原始波形 | 最大 | 调试、原始数据分析 |
| IQ 数据 | 中等 (64 bit × N) | 解模结果分析 |
| 态数据 | 小 (2 bit × N) | 高速态读出 |
| 态统计 | 最小 | 多次测量统计 |

软复位功能：通过写 DAQ_REG 中的软复位寄存器复位 DAQ 状态机。

## 接口控制协议

### SPI 配置协议

读出芯片通过 SPI 来配置内部寄存器和内存，SPI 采用四线模式。时钟极性 CPOL = 1，即时钟在空闲时处于高电平状态；时钟相位 CPHA = 1，即在第一个时钟沿输出数据，第二个时钟沿采样数据。SPI 的通信数据格式采用自定义协议，支持流模式发送接收。

![spi_prot](../assets/spi_prot.png)

**SPI 帧格式：**

| 字段 | RW | ADDR | CHIP_ID | RSV | DATA |
|:-:|:-:|:-:|:-:|:-:|:-:|
| 位宽 | 1 | 25 | 5 | 1 | 32 × N |
| 含义 | 0: 读, 1: 写 | 32 MB 寻址空间 | 总线片选 | 保留位 | 数据 |

<div class="note">
协议首先发送 1 比特读写标识位，然后发送 25 比特地址位，接着再发送 5 比特的芯片选择信号，最后再发送/接收数据。数据发送/接收以 32 比特为单位，以流模式发送，支持发送/接收 N × 32 位的数据，直到主控端将 CSN 拉低后结束通信（N ≥ 1）。流模式要求从设备在完成 32 比特数据接收/发送后自动对地址进行 4 字节递增。
</div>

### LVDS 通信协议

从读出芯片到多功能母卡的数据推送接口 `rslt_push_[p,n]`、反馈上报接口 `glb_tx_[p,n]` 和从多功能母板到读出芯片的反馈下发接口 `glb_rx_[p,n]` 采用定制的 LVDS 通信协议。

**帧格式：**

```
    +---------------------------------------+
    |           LVDS DATA FRAME             |
    +------+-------------------+------------+
    |  4   |    16/32/64/128   |     8      |
    +------+-------------------+------------+
    | HEAD |       Payload     |    CRC8    |
    +------+-------------------+------------+
    MSB                                   LSB
```

帧头包含 4 比特数据，其中最高位比特用于指示是否启动数据传输，次高位置 0 保留，最低两位用于指示本次传输的数据量（0: 16 比特，1: 32 比特，2: 64 比特，3: 128 比特）。载荷后面附带 8 比特 CRC 校验码，校验多项式为：

$$x^8 + x^2 + x + 1$$

![lvds_prot](../assets/lvds_prot.png)

**同步机制**：接收端在接收数据之前必须先和发送端同步。发送端通过发送同步码来同步接收端，当完成设定数量的同步码发送完毕后发送一个结束码结束同步过程。同步码为字符串 "hfnl" 对应的 32 比特数据，结束码为 "exit" 对应的 32 比特数据。

接收端在启动时被初始化到未同步状态，此时必须接收到足够次数的同步码之后才能进入确认状态，直到接收到结束码之后发送端和接收端同时进入就绪状态。接收端后续如果在接收数据过程中发现 CRC8 校验码出错，会再次进入未同步状态。

**空闲状态**：当处于空闲状态不用传输数据时，发送端将 LVDS 信号电平拉高。当传输数据时，发送端将 LVDS 电平拉低两个数据周期启动数据发送。
