重新整理文件

This commit is contained in:
guocheng 2026-07-18 00:51:43 +08:00
parent efa44b4496
commit f04a3dc263
42 changed files with 1665 additions and 309 deletions

16
.claude/settings.json Normal file
View File

@ -0,0 +1,16 @@
{
"permissions": {
"allow": [
"Bash(ls -la \"D:\\\\repo\\\\ezq3p0\\\\design_doc\\\\readout_test_record\")",
"Read(//d/repo/ezq3p0/design_doc/readout_test_record/**)",
"Bash(pip install *)",
"Bash(python -c ' *)",
"Bash(where python *)",
"Read(//c/Users/Administrator/AppData/Local/Programs/**)",
"Bash(ls /c/Python*/python.exe)",
"Bash(find /c -name \"python.exe\" -type f)",
"Bash(dir \"电流测试.xlsx\")",
"Bash(/c/Users/Administrator/anaconda3/python.exe -c ' *)"
]
}
}

View File

@ -0,0 +1,29 @@
{
"permissions": {
"allow": [
"Bash(ls -la \"D:\\\\repo\\\\ezq3p0\\\\design_doc\\\\case-generator\")",
"Read(//d/repo/ezq3p0/design_doc/case-generator/**)",
"Bash(cp \"D:\\\\repo\\\\ezq3p0\\\\design_doc\\\\case-generator\\\\figure\\\\dut.jpg\" \"d:\\\\repo\\\\ezq3p0\\\\manual_doc\\\\rbpu_datasheet\\\\assets\\\\dut.jpg\" && echo \"copied dut.jpg\")",
"Bash(cp \"D:\\\\repo\\\\ezq3p0\\\\design_doc\\\\case-generator\\\\2509_Readout_ChipTest\\\\analog_func\\\\dac\\\\tc_dac_mixhb_auto\\\\base300-2300MHz.png\" \"d:\\\\repo\\\\ezq3p0\\\\manual_doc\\\\rbpu_datasheet\\\\assets\\\\dac_freq_sweep.png\" && echo \"copied\")",
"Bash(cp \"D:\\\\repo\\\\ezq3p0\\\\design_doc\\\\case-generator\\\\2509_Readout_ChipTest\\\\analog_func\\\\adc\\\\tc_adc_full\\\\full.png\" \"d:\\\\repo\\\\ezq3p0\\\\manual_doc\\\\rbpu_datasheet\\\\assets\\\\adc_full.png\")",
"Bash(cp \"D:\\\\repo\\\\ezq3p0\\\\design_doc\\\\case-generator\\\\2509_Readout_ChipTest\\\\analog_func\\\\adc\\\\tc_adc_0\\\\adc0.png\" \"d:\\\\repo\\\\ezq3p0\\\\manual_doc\\\\rbpu_datasheet\\\\assets\\\\adc_sample0.png\")",
"Bash(cp \"D:\\\\repo\\\\ezq3p0\\\\design_doc\\\\case-generator\\\\2509_Readout_ChipTest\\\\analog_func\\\\adc\\\\tc_adc_1\\\\adc1.png\" \"d:\\\\repo\\\\ezq3p0\\\\manual_doc\\\\rbpu_datasheet\\\\assets\\\\adc_sample1.png\")",
"Read(//d/repo/ezq3p0/manual_doc/**)",
"Read(//d/repo/ezq3p0/**)",
"WebSearch",
"WebFetch(domain:www.analog.com)",
"WebFetch(domain:www.sekorm.com)",
"Read(//d/share/publications/datasheets/03_芯片手册/04_DAC/ADI/**)",
"Read(//d/repo/**)",
"Bash(python -c ' *)",
"Bash(pip install *)",
"Bash(python -m pip install pymupdf)",
"Bash(where python *)",
"Bash(python -c \"import fitz; print\\('fitz ok'\\)\")"
],
"additionalDirectories": [
"D:\\repo\\ezq3p0\\design_doc\\case-generator\\figure",
"D:\\repo\\ezq3p0\\design_doc\\case-generator\\2509_Readout_ChipTest\\analog_func\\dac\\tc_dac_mixhb_auto"
]
}
}

5
.gitignore vendored
View File

@ -1,3 +1,4 @@
script/读出子系统IDS表.xls script/读出子系统IDS表.xls
读出芯片用户使用手册.html output/
pin_loc.xlsx __pycache__/
*.pyc

143
CLAUDE.md Normal file
View File

@ -0,0 +1,143 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
本项目是 **RBPU16 读出基带处理芯片** 的数据手册datasheet/user manual。RBPU16 是一款用于超导量子比特态信息读出的 SoC 芯片,最大支持 16 个量子比特并行读出,内部集成 PLL、ADC、DAC、DSP 等模块。
手册基于纯文本管理,通过 Python 脚本生成精美的 HTML 和 PDF 报告(参考 AD9164 数据手册风格)。
## 文件结构
| 路径 | 用途 |
|------|------|
| `chapters/*.md` | 手册章节源文件Markdown按章节拆分纯文本 git 友好) |
| `chapters/appendix/*.md` | 附录(运维手册、配置用例) |
| `data/pin_name.csv` | 管脚定义表(编号、名称、类型、描述) |
| `data/pin_loc.csv` | 管脚物理位置网格表(行×列 → 信号名) |
| `data/seg_define.csv` | 寄存器地址段定义(功能模块→子模块→起始地址→大小) |
| `data/ids.json` | 寄存器详细定义 JSON由 XLS 生成,供脚本读取) |
| `assets/` | 手册内嵌图片(框图、管脚图、协议图等 PNG/JPG 文件) |
| `templates/` | Jinja2 模板base HTML + macros + CSS |
| `templates/css/report.css` | 报告样式表AD9164 风格,支持打印和屏幕) |
| `templates/macros/` | 可复用 Jinja2 宏(管脚表、寄存器表、地址映射表) |
| `build.py` | 主构建脚本(一键生成 HTML + PDF |
| `requirements.txt` | Python 依赖Jinja2, markdown, Pygments, WeasyPrint |
| `output/` | 构建产物gitignore |
| `script/ids_import.ipynb` | Jupyter notebook解析 `读出子系统IDS表.xls` 生成 `data/ids.json` |
| `script/读出子系统IDS表.xls` | 寄存器详细定义 Excel多 sheet |
### 旧文件(过渡期保留)
| 路径 | 说明 |
|------|------|
| `读出芯片用户使用手册.md` | 旧 MPE 单文件手册(过渡期保留,不再更新) |
| `读出芯片用户使用手册.html` | 旧 MPE 导出 HTML |
| `specification.md` | 旧 SPI/LVDS 规格(内容已合并到 chapters/ |
| `pin_name.csv` (root) | 旧位置(已复制到 data/ |
| `pin_loc.csv` (root) | 旧位置(已复制到 data/ |
| `seg_define.csv` (root) | 旧位置(已复制到 data/ |
| `ids/` | 旧位置JSON 已复制到 data/ids.json |
| `pin_loc.xlsx` | 旧 Excel 文件 |
## 构建流程
### 一键构建
```bash
# 安装依赖
pip install -r requirements.txt
# 构建 HTML + PDF
python build.py
```
产物输出到 `output/` 目录:
- `output/RBPU16 读出基带处理芯片_数据手册.html`
- `output/RBPU16 读出基带处理芯片_数据手册.pdf`
### 构建步骤build.py 内部流程)
1. 加载数据源:`data/*.csv` + `data/ids.json`
2. 初始化 Jinja2 模板引擎
3. 处理章节文件:`chapters/*.md`
- 识别 `<!-- MACRO: xxx -->` 标记并替换为 Jinja2 宏渲染的 HTML
- Python-Markdown 将 Markdown 转为 HTML
4. 生成目录 (TOC)
5. 渲染完整 HTML封面 + TOC + 章节 + 修订历史)
6. WeasyPrint 将 HTML 转为 PDF
### 宏标记说明
章节 Markdown 文件中使用 `<!-- MACRO: xxx -->` 注释标记来指示脚本动态生成表格:
| 宏标记 | 功能 | 数据源 |
|--------|------|--------|
| `<!-- MACRO: pin_table -->` | 渲染管脚描述表 | `data/pin_name.csv` |
| `<!-- MACRO: pin_loc_grid -->` | 渲染 BGA 焊球网格 | `data/pin_loc.csv` |
| `<!-- MACRO: address_map -->` | 渲染地址映射总表 | `data/seg_define.csv` |
| `<!-- MACRO: register_table -->` | 渲染完整寄存器定义 | `data/ids.json` |
### 寄存器定义更新流程
当 XLS 寄存器定义文件更新后:
1. 在 VS Code 中打开 `script/ids_import.ipynb`,运行所有 cell
2. notebook 解析 `script/读出子系统IDS表.xls` 的多个 sheet
3. 输出为 `data/ids.json`
4. 运行 `python build.py` 重新构建手册
## 章节编辑指南
### 添加新章节
1. 在 `chapters/` 下创建新 `.md` 文件
2. 文件名格式:`{序号}_{英文名}.md`(如 `10_timing_diagrams.md`
3. 文件以 `# 章节标题` 开头
4. 运行 `python build.py` 验证
### 修改管脚定义
1. 编辑 `data/pin_name.csv`(或根目录 `pin_name.csv`,然后复制到 data/
2. 运行 `python build.py`,管脚表自动更新
### 修改寄存器定义
1. 编辑 `script/读出子系统IDS表.xls`
2. 运行 `script/ids_import.ipynb` 更新 `data/ids.json`
3. 运行 `python build.py`,寄存器表自动更新
### 修改样式
编辑 `templates/css/report.css`
- CSS 变量(颜色、字体、间距)在 `:root` 块中
- 打印样式使用 `@page` 规则
- 屏幕样式使用 `@media screen`
## 技术栈
- **模板引擎**: Jinja2 — Python 标准Flask 生态
- **Markdown 解析**: Python-Markdown + extensions (tables, codehilite, toc, fenced_code)
- **HTML→PDF**: WeasyPrint — 纯 PythonCSS Paged Media
- **代码高亮**: Pygments — Python-Markdown codehilite 依赖
- **数学公式**: KaTeX — CDN 加载HTML 中动态渲染
- **图表**: Mermaid — CDN 加载(当前手册未使用)
## 关键约定
- 所有文档内容为中文技术术语保留英文缩写ADC、DAC、PLL、LVDS、SPI、AWG、DAQ、MCU、NCO 等)
- 管脚编号采用 BGA 网格命名(字母行 + 数字列,如 F4、G7
- 地址和寄存器偏移使用 24 位十六进制表示(如 `0x100000`
- SPI 协议格式1 bit R/W + 25 bit addr + 5 bit chip_id + 1 bit reserved + N×32 bit data
- LVDS 协议帧格式4 bit header + 16/32/64/128 bit payload + 8 bit CRC8
- 章节文件命名:`{序号}_{英文名}.md`,序号决定章节顺序
- 图片路径:相对于 repo 根目录,从 `assets/` 引用
## PDF 生成注意事项
WeasyPrint 需要系统依赖:
- **Windows**: 通常开箱即用
- **macOS**: `brew install pango cairo`
- **Linux**: `apt install libpango-1.0-0 libpangocairo-1.0-0`
中文 PDF 字体:若系统缺少中文字体,可在 CSS `:root` 中调整 `--font-body``--font-heading` 变量,使用系统可用字体。

BIN
assets/adc_full.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

BIN
assets/adc_sample0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
assets/adc_sample1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
assets/dac_1300M.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

BIN
assets/dac_1300M_mix.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

BIN
assets/dac_1300M_mix_hb.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

BIN
assets/dac_freq_sweep.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

BIN
assets/dut.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

BIN
assets/irq_exitir.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
assets/irq_illegal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
assets/irq_linkdown.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
assets/lvds_speed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
assets/nco_freq_sweep.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

BIN
assets/spi_25mbps.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
assets/spi_50mbps.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
assets/temp_monitor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

321
build.ipynb Normal file
View File

@ -0,0 +1,321 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# RBPU16 数据手册\n",
"\nRun All → 生成自包含 HTML可直接发送给他人。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import sys, os, csv, json, re, subprocess, base64, mimetypes\n",
"from datetime import datetime\n",
"from pathlib import Path\n",
"from html import escape\n",
"\n",
"try:\n",
" import markdown as md_lib\n",
"except ImportError:\n",
" subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"markdown\", \"Pygments\", \"-q\"])\n",
" import markdown as md_lib\n",
"\n",
"BASE = Path(os.getcwd()).resolve()\n",
"print(f\" {BASE.name}\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Build"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# ============================================================\n",
"# Data loaders\n",
"# ============================================================\n",
"\n",
"def csv_dicts(path):\n",
" rows = []\n",
" with open(path, encoding=\"utf-8\") as f:\n",
" for row in csv.DictReader(f):\n",
" rows.append({k.strip(): v.strip() if v else \"\" for k, v in row.items()})\n",
" return rows\n",
"\n",
"def csv_raw(path):\n",
" rows = []\n",
" with open(path, encoding=\"utf-8\") as f:\n",
" for row in csv.reader(f): rows.append([c.strip() for c in row])\n",
" return rows\n",
"\n",
"pins = csv_dicts(BASE / \"data\" / \"pin_name.csv\")\n",
"pin_loc_raw = csv_raw(BASE / \"data\" / \"pin_loc.csv\")\n",
"with open(BASE / \"data\" / \"ids.json\", encoding=\"utf-8\") as f:\n",
" ids = json.load(f)\n",
"reg_modules = ids.get(\"Modules\", {})\n",
"print(f\" {len(pins)} pins, {len(reg_modules)} reg modules\")\n",
"\n",
"# ============================================================\n",
"# Table renderers\n",
"# ============================================================\n",
"\n",
"def eh(s): return escape(str(s))\n",
"\n",
"def render_table(rows, cols=None):\n",
" if not rows: return \"<p><em>no data</em></p>\"\n",
" cols = cols or list(rows[0].keys())\n",
" h = [\"<table><thead><tr>\"]\n",
" for c in cols: h.append(f\"<th>{eh(c)}</th>\")\n",
" h.append(\"</tr></thead><tbody>\")\n",
" for r in rows:\n",
" h.append(\"<tr>\")\n",
" for c in cols: h.append(f\"<td>{eh(str(r.get(c,\\\"\\\")))}</td>\")\n",
" h.append(\"</tr>\")\n",
" h.append(\"</tbody></table>\")\n",
" return \"\\n\".join(h)\n",
"\n",
"def render_bga_grid(raw):\n",
" if len(raw) < 2: return \"<p><em>no data</em></p>\"\n",
" ncols = len(raw[0]) - 1\n",
" h = ['<table class=\"compact pin-grid\"><thead><tr><th></th>']\n",
" for c in range(1, ncols+1): h.append(f'<th class=\"text-center\">{c}</th>')\n",
" h.append(\"</tr></thead><tbody>\")\n",
" for r in raw[1:]:\n",
" if not r: continue\n",
" h.append(f'<tr><th class=\"text-center\">{eh(r[0])}</th>')\n",
" for c in range(1, ncols+1):\n",
" val = r[c] if c < len(r) else \"\"\n",
" h.append(f'<td class=\"text-center text-mono\" style=\"font-size:6pt\">{eh(val)}</td>')\n",
" h.append(\"</tr>\")\n",
" h.append(\"</tbody></table>\")\n",
" return \"\\n\".join(h)\n",
"\n",
"def render_registers(data):\n",
" order = [\"SYS_REG\",\"SYS_ANA\",\"SYS_PLL\",\"DAQ_REG\",\"DAQ_PAR\",\"DAQ_FLT\",\"AWG_REG\",\"TRIG_CTRL\",\"PUMP_REG\",\"MIXER_REG\"]\n",
" descs = {\"SYS_REG\":\"系统控制\",\"SYS_ANA\":\"模拟配置\",\"SYS_PLL\":\"PLL 配置\",\"DAQ_REG\":\"DAQ 控制\",\"DAQ_PAR\":\"DAQ 参数\",\"DAQ_FLT\":\"DAQ 滤波器\",\"AWG_REG\":\"AWG 控制\",\"TRIG_CTRL\":\"触发控制\",\"PUMP_REG\":\"Pump 控制\",\"MIXER_REG\":\"混频器控制\"}\n",
" def bits_str(b):\n",
" if not b: return \"\"\n",
" return f\"[{b[0]}]\" if len(b)==1 or b[0]==b[-1] else f\"[{b[0]}:{b[-1]}]\"\n",
" def rng_str(r):\n",
" if not r or not r.get(\"value\"): return \"\"\n",
" t, v = r.get(\"type\",\"str\"), r.get(\"value\",\"\")\n",
" if t == \"str\":\n",
" if v == \"ANY\": return \"<em>任意</em>\"\n",
" if v == \"NA\": return \"<em>-</em>\"\n",
" return eh(str(v))\n",
" if t == \"list\" and isinstance(v,list): return f\"{v[0]}~{v[1]}\"\n",
" if t == \"set\" and isinstance(v,list): return \", \".join(str(x) for x in v)\n",
" return eh(str(v))\n",
" def perm_b(p):\n",
" m = {\"RW\":'<span class=\"perm-rw\">RW</span>',\"RO\":'<span class=\"perm-ro\">RO</span>',\"WC\":'<span class=\"perm-wc\">WC</span>'}\n",
" return m.get(p, eh(p))\n",
" h = []\n",
" for mn in order:\n",
" if mn not in data: continue\n",
" entries = data[mn]\n",
" h.append(f'<h3 id=\"reg-{mn.lower()}\">{mn} - {descs.get(mn,\"\")}</h3>')\n",
" h.append(f\"<p>{len(entries)} 个寄存器/存储段</p>\")\n",
" for sn, seg in entries.items():\n",
" addr = seg.get(\"OffsetAddress\",\"\"); perm = seg.get(\"Permission\",\"\")\n",
" sd = seg.get(\"SegDescription\",\"\"); fields = seg.get(\"Fields\",[])\n",
" h.append(f'<h4 id=\"reg-{sn}\">{sn.upper()}</h4>')\n",
" h.append(f'<p class=\"reg-summary\"><strong>地址:</strong><code>{eh(addr)}</code> <strong>权限:</strong>{perm_b(perm)} <strong>描述:</strong>{eh(sd)}</p>')\n",
" if fields:\n",
" h.append('<table class=\"compact\"><thead><tr><th style=\"width:11%\">Bits</th><th style=\"width:18%\">Field</th><th style=\"width:14%\">Reset</th><th style=\"width:12%\">Range</th><th>Description</th></tr></thead><tbody>')\n",
" for f in fields:\n",
" b = f.get(\"Bits\",[])\n",
" h.append(f'<tr><td class=\"bits\">{bits_str(b)}</td><td class=\"text-mono\">{eh(f.get(\"FieldName\",\"\"))}</td><td class=\"reset-val\">{eh(f.get(\"ResetValue\",\"\"))}</td><td>{rng_str(f.get(\"Range\"))}</td><td>{eh(f.get(\"FieldDescription\",\"\"))}</td></tr>')\n",
" h.append(\"</tbody></table>\")\n",
" h.append(\"\")\n",
" return \"\\n\".join(h)\n",
"\n",
"# ============================================================\n",
"# @import handler\n",
"# ============================================================\n",
"\n",
"IMPORT_RE = re.compile(r'^@import\\s+\"([^\"]+)\"\\s*$', re.MULTILINE)\n",
"\n",
"def handle_import(import_path):\n",
" fp = (BASE / import_path).resolve()\n",
" if not fp.exists():\n",
" return f'<div class=\"warning\">@import not found: {import_path}</div>'\n",
" fn = fp.name.lower(); sf = fp.suffix.lower()\n",
" try:\n",
" if \"pin_loc\" in fn: return render_bga_grid(csv_raw(fp))\n",
" if \"seg_define\" in fn:\n",
" segs, prev = [], \"\"\n",
" for r in csv_dicts(fp):\n",
" func = r.get(\"功能划分\",\"\")\n",
" if func == \"^\": func = prev\n",
" else: prev = func\n",
" segs.append({\"功能划分\":func,\"子模块\":r.get(\"子模块\",\"\"),\"开始地址\":r.get(\"开始地址\",\"\"),\"大小\":r.get(\"大小\",\"\")})\n",
" return render_table(segs, [\"功能划分\",\"子模块\",\"开始地址\",\"大小\"])\n",
" if sf == \".csv\": return render_table(csv_dicts(fp))\n",
" if sf == \".json\":\n",
" with open(fp, encoding=\"utf-8\") as f: return render_registers(json.load(f))\n",
" if sf == \".md\": return process_chapter(fp.read_text(encoding=\"utf-8\"))\n",
" return f'<p><em>unsupported: {import_path}</em></p>'\n",
" except Exception as e:\n",
" import traceback\n",
" return f'<div class=\"warning\">@import error: {e}<pre>{traceback.format_exc()}</pre></div>'\n",
"\n",
"def process_chapter(md_text):\n",
" processed = IMPORT_RE.sub(lambda m: handle_import(m.group(1)), md_text)\n",
" return md_lib.markdown(processed,\n",
" extensions=[\"tables\",\"fenced_code\",\"codehilite\",\"toc\",\"nl2br\",\"sane_lists\"],\n",
" extension_configs={\"codehilite\":{\"css_class\":\"highlight\",\"guess_lang\":False}})\n",
"\n",
"# ============================================================\n",
"# Process chapters\n",
"# ============================================================\n",
"\n",
"chapter_names = []\n",
"with open(BASE / \"project.yaml\", encoding=\"utf-8\") as f:\n",
" in_ch = False\n",
" for line in f:\n",
" line = line.rstrip()\n",
" if line.startswith(\"chapters:\"): in_ch = True; continue\n",
" if in_ch:\n",
" m = re.match(r\"^\\s*-\\s+(.+)$\", line)\n",
" if m: chapter_names.append(m.group(1).strip())\n",
" elif line and not line.startswith(\" \"): in_ch = False\n",
"\n",
"chapters = []\n",
"for i, name in enumerate(chapter_names):\n",
" fp = BASE / \"chapters\" / name\n",
" if not fp.exists(): continue\n",
" print(f\" [{i+1}] {name}\")\n",
" content = process_chapter(fp.read_text(encoding=\"utf-8\"))\n",
" m = re.search(r\"<h1[^>]*>(.*?)</h1>\", content)\n",
" chapters.append({\"id\":f\"ch{i+1}\",\"number\":str(i+1),\"title\":m.group(1) if m else fp.stem,\"content\":content})\n",
"\n",
"apd = BASE / \"chapters\" / \"appendix\"\n",
"if apd.exists():\n",
" for j, fp in enumerate(sorted(apd.glob(\"*.md\"), key=lambda p: p.name)):\n",
" label = chr(65+j)\n",
" print(f\" [appendix/{label}] {fp.name}\")\n",
" content = process_chapter(fp.read_text(encoding=\"utf-8\"))\n",
" m = re.search(r\"<h1[^>]*>(.*?)</h1>\", content)\n",
" chapters.append({\"id\":f\"app{label}\",\"number\":f\"附录 {label}\",\"title\":m.group(1) if m else fp.stem,\"content\":content})\n",
"\n",
"# ============================================================\n",
"# CSS (local)\n",
"# ============================================================\n",
"\n",
"css_path = BASE / \"doc_builder\" / \"themes\" / \"datasheet.css\"\n",
"CSS = css_path.read_text(encoding=\"utf-8\") if css_path.exists() else \"body{font-family:sans-serif}\"\n",
"\n",
"# ============================================================\n",
"# Assemble\n",
"# ============================================================\n",
"\n",
"TITLE = \"RBPU16 读出基带处理芯片\"\n",
"SUBTITLE = \"数据手册\"\n",
"AUTHOR = \"郭成\"\n",
"DATE = datetime.now().strftime(\"%Y-%m-%d\")\n",
"FEATURES = [\"DAC 12 GSPS\",\"ADC 6 GSPS\",\"16 Qubit 并行读出\",\"AWG 任意波形\",\"DAQ 数据采集\",\"片上 PLL\",\"LVDS 高速接口\",\"SPI 配置接口\"]\n",
"\n",
"feat_li = \"\".join(f\"<li>{f}</li>\" for f in FEATURES)\n",
"COVER = \"\".join([\n",
" '<div class=\"cover-page\">',\n",
" '<div class=\"product-family\">Quantum Readout SoC</div>',\n",
" '<h1>RBPU16<br>读出基带处理芯片</h1>',\n",
" '<div class=\"subtitle\">数据手册 &middot; User Manual</div>',\n",
" f'<ul class=\"feature-list\">{feat_li}</ul>',\n",
" f'<div class=\"cover-meta\"><p>版本 1.0 &middot; {DATE}</p><p>{AUTHOR}</p></div>',\n",
" \"</div>\",\n",
"])\n",
"\n",
"toc_items = [f'<li class=\"toc-h1\"><a href=\"#{c[\"id\"]}\">{c[\"number\"]} {eh(c[\"title\"])}</a></li>' for c in chapters]\n",
"TOC = '<div class=\"toc\"><h2>目录</h2><ul class=\"toc-list\">' + \"\\n\".join(toc_items) + \"</ul></div>\"\n",
"SIDEBAR = '<nav class=\"screen-toc\"><strong>目录</strong><ul>' + \"\\n\".join(toc_items) + \"</ul></nav>\"\n",
"ch_html = \"\\n\".join(f'<div class=\"chapter\" id=\"{c[\"id\"]}\">{c[\"content\"]}</div>' for c in chapters)\n",
"\n",
"FULL_HTML = \"\\n\".join([\n",
" \"<!DOCTYPE html>\",\n",
" '<html lang=\"zh-CN\">',\n",
" \"<head>\",\n",
" '<meta charset=\"utf-8\">',\n",
" '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">',\n",
" f\"<title>{TITLE} {SUBTITLE}</title>\",\n",
" f'<meta name=\"author\" content=\"{AUTHOR}\">',\n",
" \"<style>\", CSS, \"</style>\",\n",
" \"</head>\",\n",
" '<body class=\"auto-numbering\">',\n",
" COVER, TOC, ch_html,\n",
" '<div class=\"page-break\"></div>',\n",
" \"<h1>修订历史</h1>\",\n",
" '<table class=\"revision compact\">',\n",
" \"<thead><tr><th>版本</th><th>日期</th><th>修订内容</th><th>作者</th></tr></thead>\",\n",
" f\"<tbody><tr><td>1.0</td><td>{DATE}</td><td>初版发布</td><td>{AUTHOR}</td></tr></tbody>\",\n",
" \"</table>\",\n",
" SIDEBAR,\n",
" \"</body>\",\n",
" \"</html>\",\n",
"])\n",
"\n",
"# ============================================================\n",
"# Embed images as base64\n",
"# ============================================================\n",
"\n",
"print(\"\\n Embedding images...\")\n",
"SRC_RE = re.compile(r'src=\"(\\.\\./assets/[^\"]+)\"')\n",
"mimetypes.init()\n",
"\n",
"def embed_image(match):\n",
" rel_path = match.group(1)\n",
" img_path = (BASE / \"chapters\" / rel_path).resolve()\n",
" if not img_path.exists():\n",
" img_path = (BASE / rel_path).resolve()\n",
" if not img_path.exists():\n",
" return match.group(0)\n",
" mime, _ = mimetypes.guess_type(str(img_path))\n",
" if not mime: mime = \"image/png\"\n",
" with open(img_path, \"rb\") as f:\n",
" b64 = base64.b64encode(f.read()).decode(\"ascii\")\n",
" return f'src=\"data:{mime};base64,{b64}\"'\n",
"\n",
"FULL_HTML = SRC_RE.sub(embed_image, FULL_HTML)\n",
"\n",
"out = BASE / \"output\"\n",
"out.mkdir(exist_ok=True)\n",
"html_path = out / f\"{TITLE}_{SUBTITLE}.html\"\n",
"html_path.write_text(FULL_HTML, encoding=\"utf-8\")\n",
"print(f\"\\n {html_path.name} ({html_path.stat().st_size/1024:.0f} KB)\")\n",
"print(f\" Self-contained - ready to share.\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Done\n",
"\n报告在 `output/` 目录,可直接发送给他人。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

19
chapters/00_cover.md Normal file
View File

@ -0,0 +1,19 @@
# 简介
## 主要特点
* DAC 更新率最高 12 GSPS
* ADC 采样率最高 6 GSPS
* AWG 支持直接/调制波形输出
* AWG 支持标记脉冲输出
* DAQ 支持多种数据采集模式
* DAQ 支持低延迟反馈控制
* AWG/DAQ 支持指令集的编程
## 简要描述
RBPU16 是一款用于量子比特态信息读出的 SoC 芯片,最大支持 16 个量子比特态信息并行读出。芯片内部集成了 PLL、ADC、DAC 和 DSP 等模块,其可以利用高速 DAC 产生微波信号激发读取腔,并通过数字 I/O 使能外部 Pump 通道,接着利用高速 ADC 采集处理反射回来的信号,并通过 DSP 计算量子态信息,最后将读出的量子态信息通过 LVDS 接口实时发送出去,为量子比特态信息读出提供高集成度解决方案。
## 功能框图
![系统框图](../assets/chip_schematic.png)

View File

@ -0,0 +1,19 @@
# 规格参数
## 数字接口规格
| 规格项 | 最小值 | 典型值 |
|:-|:-|:-|
| SPI 速率 | 50 Mbps | — |
| LVDS 速率 | 750 Mbps | — |
## SPI 时序参数
| 标识 | 定义 | 时序 (ns) |
|:-|:-|:-|
| Tc2s | SPI 帧开始时CSN 下降沿到 SCLK 下降沿的时间 | >3 |
| Tms | MOSI 数据的建立时间 | >3 |
| Tmh | MOSI 数据的保持时间 | >3 |
| Tss | MISO 数据的建立时间 | >3 |
| Tsh | MISO 数据的保持时间 | >3 |
| Tc2h | SPI 帧结束时SCLK 上升沿到 CSN 上升沿的时间 | >3 |

View File

@ -0,0 +1,21 @@
# 操作最大值
## 供电电压
| 参数 | 符号 | 标称值 | 单位 | 来源 |
|:-|:-|:-|:-|:-|
| 数字内核供电电压 | DIG_VDD | 1.0 | V | pin_name.csv |
| 数字 IO 供电电压 | IO_VDD | 1.8 | V | pin_name.csv |
| DAC 模拟 1.0V 供电电压 | AVDD_ENCODER, AVDD_P2S | 1.0 | V | pin_name.csv |
| DAC 模拟 1.8V 供电电压 | DAC_AVDD18 | 1.8 | V | pin_name.csv |
| DAC 数字 1.0V 供电电压 | DAC_DVDD | 1.0 | V | pin_name.csv |
| PLL 模拟 1.0V 供电电压 | PLL_VDD, VCO_VDD | 1.0 | V | pin_name.csv |
| PLL 模拟 1.8V 供电电压 | PLL_VDD18 | 1.8 | V | pin_name.csv |
| PLL 数字 1.0V 供电电压 | PLL_DVDD | 1.0 | V | pin_name.csv |
| ADC 模拟 1.0V 供电电压 | ADC_VDD | 1.0 | V | pin_name.csv |
| ADC 模拟 1.8V 供电电压 | ADC_VDD18 | 1.8 | V | pin_name.csv |
| ADC 数字 1.0V 供电电压 | ADC_DVDD | 1.0 | V | pin_name.csv |
<div class="note">
所有电压值均以对应地平面DGND 或 AGND为参考。操作最大值的绝对值最小/最大极限电压、结温和存储温度范围、ESD 防护等级等参数待补充。
</div>

View File

@ -0,0 +1,24 @@
# 管脚描述
## 管脚顶视图
芯片配置,顶视图:
![pin_map](../assets/pin_map.png)
## 管脚定义表
@import "data/pin_name.csv"
## BGA 焊球位置表
下图列出了芯片 13 × 13 BGA 焊球阵列中每个位置的信号分配。
@import "data/pin_loc.csv"
### 封装信息
* 焊球中心间距1 mm
* 焊球大小0.5 mm
* 焊球数量13 × 13 = 169 个
* 基板大小1.4 cm × 1.4 cm

View File

@ -0,0 +1,168 @@
# 典型性能特点
除非特殊说明以下性能指标的测试条件为DIG_VDD = 1.0VIO_VDD = 1.8VAVDD = 1.0VAVDD18 = 1.8VT = 25℃。
## 电源特性
### 标称电压与最低过流要求
| 供电域 | 标称电压 | 最低过流要求 | 单位 |
|:-|:-|:-|:-|
| DIG_VDD | 1.0 | 2000 | mA |
| IO_VDD | 1.8 | 1000 | mA |
| AVDD_ENCODER, AVDD_P2S | 1.0 | 400 + 150 | mA |
| DAC_AVDD18 | 1.8 | 120 | mA |
| DAC_DVDD | 1.0 | 50 | mA |
| PLL_VDD18 | 1.8 | 50 | mA |
| PLL_VDD, VCO_VDD | 1.0 | 50 + 50 | mA |
| PLL_DVDD | 1.0 | 50 | mA |
| ADC_VDD | 1.0 | 400 | mA |
| ADC_VDD18 | 1.8 | 200 | mA |
| ADC_DVDD | 1.0 | 100 | mA |
### 实测电流分布
(来源:电流测试.xlsx单位 mA
| 测试条件 | +1.8V 模拟轨 | +1.0V PLL | +1.8V IO | +1.0V DVDD | +1.0V DIG | +1.0V P2S | +1.0V ENCD | +1.0V ADC | 总电流 |
|:-|:-|:-|:-|:-|:-|:-|:-|:-|:-|
| 复位前(空闲) | 207.8 | 26.0 | 8.0 | 8.0 | 26.0 | 168.7 | 19.2 | 71.0 | 531.7 |
| 复位后 | 210.5 | 136.3 | 7.0 | 42.0 | 26.0 | 162.2 | 257.2 | 207.0 | 1045.2 |
| 满载 6G 时钟 | 205.8 | 137.4 | 7.0 | 25.0 | 330.0 | 192.2 | 168.3 | 145.7 | 1208.4 |
| 满载 10G 时钟 | 206.0 | 130.3 | 7.0 | 29.0 | 477.0 | 219.7 | 253.4 | 153.1 | 1472.5 |
| 满载 12G 时钟 | 206.0 | 144.6 | 7.0 | 33.0 | 539.0 | 227.3 | 251.0 | 164.7 | 1569.6 |
<div class="note">
+1.8V 模拟轨对应 DAC_AVDD18 + PLL_VDD18 + 其它 1.8V 模拟域,实测稳定在 ~206 mA。+1.0V DIG 电流随时钟频率显著变化是总功耗的主要变量26 mA @ 空闲 → 539 mA @ 12G。满载条件为满占空比、功能全开AWG + DAQ + MIX + 插值 + NCO + 解模。VREF / PLL_VREF520 / ADC_VR850 / ADC_VR350 等基准电压端口电流可忽略(<1 mA
</div>
## 时钟与 NCO 特性
| 参数 | 条件 | 来源 |
|:-|:-|:-|
| DAC 更新时钟 (DAC_CLK) | 内部 PLL 倍频,最高 12 GHz | 宣传页 |
| ADC 采样时钟 (ADC_CLK) | 内部 PLL 倍频,最高 6 GHz | 宣传页 |
| NCO 频率范围 | 测试覆盖 100 MHz ~ 2400 MHz | tc_awg_nco_freq |
| NCO 基频 (fs/8) | 750 MHz | ChipConfig.py |
NCO 频率扫频测试结果4002400 MHz
![nco_freq_sweep](../assets/nco_freq_sweep.png)
<div class="note">
参考时钟频率范围、VCO 输出频率、PLL 锁定时间、时钟抖动等参数待补充。
</div>
## DAC 特性
| 参数 | 条件 | 来源 |
|:-|:-|:-|
| 更新速率 | 最高 12 GSPS | 宣传页 |
| 测试输出频率 | 413.3 / 983.7 / 1300 / 1632.9 MHz | tc_dac_wave / tc_dac_mix |
| 扫频范围 | 300 ~ 2300 MHz混频+半带模式) | tc_dac_mixhb_auto |
| 输出阻抗 | 内部 50 Ω | 手册 7.1.1 |
以 1300 MHz 输出为例DAC 三种输出模式的频谱如下:
| 输出模式 | 测试结果 |
|:-|:-|
| NRZ 直出 | ![dac_1300M](../assets/dac_1300M.jpg) |
| 混频模式 | ![dac_mix](../assets/dac_1300M_mix.jpg) |
| 半带混频模式 | ![dac_mix_hb](../assets/dac_1300M_mix_hb.jpg) |
DAC 基带输出扫频特性(混频+半带模式3002300 MHz
![dac_freq_sweep](../assets/dac_freq_sweep.png)
<div class="note">
SFDR、NSD、相位噪声、DNL、INL、输出共模电压等参数待补充。
</div>
## ADC 特性
| 参数 | 条件 | 来源 |
|:-|:-|:-|
| 采样速率 | 最高 6 GSPS | 宣传页 |
ADC 采集波形示例(满量程正弦波输入):
![adc_full](../assets/adc_full.png)
![adc_sample](../assets/adc_sample0.png)
<div class="note">
分辨率、SNR、SINAD、ENOB、SFDR、输入带宽、输入范围、输入阻抗等参数待补充。
</div>
## 数字接口特性
| 参数 | 条件 | 值 | 来源 |
|:-|:-|:-|:-|
| SPI 速率 | 最低 | 50 Mbps | specification.md |
| LVDS 速率 | 最低 | 750 Mbps | specification.md |
| LVDS 发送延迟 | — | 85 ns | tc_lvds_delay |
| LVDS 接收延迟 | — | 75 ns | tc_lvds_delay |
SPI 突发传输时钟数量测试50 Mbps
![spi_50mbps](../assets/spi_50mbps.png)
SPI 突发传输时钟数量测试25 Mbps
![spi_25mbps](../assets/spi_25mbps.png)
LVDS 数据传输速率测试:
![lvds_speed](../assets/lvds_speed.png)
<div class="note">
SPI 时序参数详见 [规格参数](#规格参数)。SYNC_IN 最小脉宽、RST_N 最小脉宽等参数待补充。
</div>
## 数字性能特性
| 参数 | 条件 | 值 | 来源 |
|:-|:-|:-|:-|
| AWG 波形存储容量 | — | 128 KB | seg_define.csv |
| DAQ 采集结果存储容量 | — | 128 KB | seg_define.csv |
| DAQ 解模频点数量 | — | 最多 16 | pin_name.csv (LOC_LVCMOS[31:0]) |
| MCU 指令执行速率 | — | 每 3 个时钟 1 条指令 | 手册 7.3.2 |
| 匹配滤波器系数存储 | ASIC 模式 | 512 KB | seg_define.csv |
| NCO 频率控制字位宽 | — | 32 bit | ChipConfig.py |
<div class="note">
死时间、Pump 脉宽范围、NCO 相位分辨率等参数待补充。
</div>
## 温度特性
片上温度传感器监视结果示例:
![temp_monitor](../assets/temp_monitor.png)
<div class="note">
温度传感器精度、分辨率等参数待补充。
</div>
## 中断与异常处理
### 中断源列表
| 中断源 | 触发条件 | 说明 |
|:-|:-|:-|
| EXIT_IR | MCU 执行退出指令 | MCU 程序正常退出时触发,表明任务执行完毕 |
| FORCE_AWG | 外部强制 AWG 请求 | 外部控制器通过写寄存器强制 AWG 模块进入特定状态 |
| FORCE_DAQ | 外部强制 DAQ 请求 | 外部控制器通过写寄存器强制 DAQ 模块进入特定状态 |
| ILLEGAL_ONE | 非法指令(数据为全 1 | MCU 执行到全 1 指令字 (0xFFFFFFFF) 时触发,表明指令内存异常 |
| ILLEGAL_ZERO | 非法指令(数据为全 0 | MCU 执行到全 0 指令字时触发,常见于未编程的指令空间 |
| UNALIGN_SW | 短字非对齐访问 | 16 位数据访问地址未对齐时触发 |
| UNALIGN_LW | 长字非对齐访问 | 32 位数据访问地址未对齐时触发 |
| LINK_DOWN | LVDS 链路断开 | LVDS 数据接收链路同步丢失时触发,接收端重新进入未同步状态 |
### 典型异常波形
| 异常类型 | 波形图 |
|:-|:-|
| MCU 正常退出 (EXIT_IR) | ![irq_exitir](../assets/irq_exitir.png) |
| 非法指令 (ILLEGAL_ONE) | ![irq_illegal](../assets/irq_illegal.png) |
| LVDS 链路断开 (LINK_DOWN) | ![irq_linkdown](../assets/irq_linkdown.png) |

View File

@ -0,0 +1,35 @@
# 专业术语
| 术语 | 全称 | 说明 |
|:-|:-|:-|
| RBPU | Readout Baseband Processing Unit | 读出基带处理单元 |
| SoC | System on Chip | 片上系统 |
| AWG | Arbitrary Waveform Generator | 任意波形发生器,用于产生读出激励波形 |
| DAQ | Data Acquisition | 数据采集模块,用于采集和处理回波信号 |
| DAC | Digital-to-Analog Converter | 数模转换器 |
| ADC | Analog-to-Digital Converter | 模数转换器 |
| PLL | Phase-Locked Loop | 锁相环,片上时钟管理 |
| NCO | Numerically Controlled Oscillator | 数控振荡器,用于频率合成 |
| DSP | Digital Signal Processing | 数字信号处理 |
| LVDS | Low-Voltage Differential Signaling | 低电压差分信号 |
| SPI | Serial Peripheral Interface | 串行外设接口 |
| MCU | Micro Controller Unit | 微控制器单元AWG/DAQ 内部控制核心 |
| PlsGen | Pulse Generator | 脉冲产生器,用于产生 Pump 使能脉冲 |
| Pump | — | 外部泵浦通道,用于上变频基带信号 |
| POR | Power-On Reset | 上电复位 |
| CRC | Cyclic Redundancy Check | 循环冗余校验 |
| FM | Frequency Modulation | 频率调制 |
| PM | Phase Modulation | 相位调制 |
| AM | Amplitude Modulation | 幅度调制 |
| HB | Half-Band | 半带滤波器DAC 插值滤波器 |
| SFDR | Spurious-Free Dynamic Range | 无杂散动态范围 |
| NSD | Noise Spectral Density | 噪声谱密度 |
| SNR | Signal-to-Noise Ratio | 信噪比 |
| ENOB | Effective Number of Bits | 有效位数 |
| DNL | Differential Nonlinearity | 微分非线性 |
| INL | Integral Nonlinearity | 积分非线性 |
| FCW | Frequency Control Word | 频率控制字 |
| PCW | Phase Control Word | 相位控制字 |
| Qubit | Quantum Bit | 量子比特 |
| RO | Readout Output | 读出激励输出通道 |
| RI | Readout Input | 读出回波输入通道 |

View File

@ -0,0 +1,143 @@
# 操作原理
## 原理及模块划分
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)** | 基带波形直接输出 | 输出频率 DC3 GHz适用于直接产生多音基带信号 |
| **调制模式 (MIX)** | 基带波形与 NCO 混频 | 输出频率 0.32.4 GHz通过 NCO 频率控制精确频点定位 |
| **NCO Only 模式** | 仅 NCO 连续波形 | 方便连接外部仪器进行芯片测试 |
| **半带调制模式 (HBMIX)** | 混频 + 半带插值 | 提升高频输出信号质量 |
<div class="note">
一般情况下,直出模式用于量子实验,通过直接输出包含多个读出频率的波形,可以实现对多个量子比特的并行读出;调制模式用于腔频扫描等应用,通过实时修改 NCO 频率实现扫频功能NCO Only 模式可以输出连续波形,方便连接外部仪器上进行测试。
</div>
**射频直出**:在 NRZ 模式下利用高阶奈奎斯特区输出,可以实现 67 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 GSPSASIC 平台 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 电平拉低两个数据周期启动数据发送。

161
chapters/07_applications.md Normal file
View File

@ -0,0 +1,161 @@
# 应用注意
## 模拟接口
### DAC 输出接口
DAC 输出 012 GHz 信号,内部为 50 Ω 电阻网络,外部差分 270 nH 电感到地,然后经巴伦差分转单端,注意传输线阻抗匹配。
DAC 支持三种输出模式:
* **NRZ 直出模式**:基带波形直接输出,输出频率范围 DC3 GHz。适用于直接产生多音基带信号。
* **混频模式 (MIX)**:基带波形与 NCO 混频后输出,输出频率范围 0.32.4 GHz。通过 NCO 频率控制可实现精确的频点定位。
* **半带混频模式 (MIX-HB)**:在混频模式基础上启用半带插值滤波器,提升输出信号质量,适用于高频输出场景。
各模式输出频谱参考见 [DAC 特性](#dac-特性)。
### ADC 输入接口
ADC 采用差分模拟输入包含两组独立输入通道ADC_VINP1/ADC_VINN1, ADC_VINP2/ADC_VINN2支持最高 6 GSPS 采样率。
* 满量程输入范围:差分 0.7 Vpp
* 输入共模电压0.5 V
* 输入阻抗差分100 Ω
* 输入带宽 (3 dB)3 GHz
ADC 支持内部和外部两种基准电压模式,通过 ADC_REF_SENSE 端口选择:
* 1.8 V 电平:选择内部带隙基准
* 0.52 V 电平:选择外部参考源(需提供 ADC_VR850 和 ADC_VR350
ADC 采集波形示例参考见 [ADC 特性](#adc-特性)。
### 时钟输入接口
参考时钟通过差分端口 CLK_REF_P/CLK_REF_N 输入,支持 AC 耦合。参考时钟频率范围 50250 MHz典型输入为 100 MHz 或 125 MHz 低相噪时钟源。时钟信号经内部 PLL 倍频,产生 DAC 更新时钟612 GHz、ADC 采样时钟36 GHz和数字主时钟250500 MHz
PLL 及 NCO 频率特性参考见 [时钟与 NCO 特性](#时钟与-nco-特性)。
### 环路滤波器
使用内部 PLL 时,需要外接环路滤波器。
PLL 锁相环电荷泵输出电压通过 CP_OUT 端口输出至 VCTRL 端口外接二阶环路滤波器。PLL_VREF520 端口需提供外部 520 mV 参考电压用于 PLL 内部偏置。BIAS_CAP 端口需外接 100 nF 去耦电容RES_2K 端口需外接 2 kΩ 电阻到地。PORT_BIAS_TB 端口需外接 10 μF × 1、1 μF × 1、0.1 μF × 3 滤波电容到地。
<div class="note">
环路滤波器推荐参数(电荷泵电流、环路带宽、阻容值等)待补充。
</div>
### 基准电压输入
此端口的外接电阻决定了基准电流源的大小。其中ADC_VBIAS_IREF_RES 端口要求外接电阻 5.2 kΩ 到地,并联 10 μF 去耦电容。DAC_VBIAS_IREF_RES 端口要求外接电阻 5.2 kΩ 到地,并联 10 μF 去耦电容。
各基准电压端口要求如下:
| 端口 | 电压/配置 | 说明 |
|:-|:-|:-|
| ADC_VR850 | 850 mV | ADC 外部参考电压,需去耦 |
| ADC_VR350 | 350 mV | ADC 外部参考电压,需去耦 |
| ADC_REF_SENSE | 1.8V / 0.52V | ADC 带隙基准内外选择 |
| PLL_VREF520 | 520 mV | PLL 外部参考电压,需去耦 |
| VREF500IN | 500 mV | DAC 外部参考电压,需去耦 |
| DAC_VBIAS_IREF_RES | 外接 5.2 kΩ + 10 μF | DAC 偏置电流基准 |
| ADC_VBIAS_IREF_RES | 外接 5.2 kΩ + 10 μF | ADC 偏置电流基准 |
| BIAS_CAP | 外接 100 nF | PLL 偏置去耦 |
| RES_2K | 外接 2 kΩ | PLL 外接电阻 |
| PORT_BIAS_TB | 外接 10 μF + 1 μF + 0.1 μF × 3 | PLL 滤波电容 |
| PLL_CP_OUT | 电荷泵输出 | 连接至外部环路滤波器后接入 VCTRL |
## 启动顺序
为了确保芯片正常工作,需要满足以下启动顺序要求:
1. 内核供电上电
2. IO 供电上电
3. 时钟配置完毕
4. 芯片复位
## 配置流程
读出芯片在上电后应该校准,校准过程用于完成片上 ADC、DAC、PLL 以及系统同步。校准过程参考附录 [运维操作手册](#运维操作手册)。
在实验中读出芯片的操作遵循**数据配置**、**实验运行**和**数据采集**三个阶段。
### 数据配置阶段
* **RO 通道配置**:外部硬件通过 SPI 接口对读出芯片的寄存器包括输出模式例如直发模式、NCO Only 模式、调制模型)、波形查找表、波形仓库、输出 MCU 控制程序及数据进行配置。
* **RI 通道配置**:外部硬件通过 SPI 接口对读出芯片的寄存器(包括采集模式,例如波形模式、解模模式、态结果模式等)、读出参数、匹配滤波器权重、采集控制程序及数据进行配置。
* **Pump 通道配置**:主要配置 Pump 通道输出的使能信号宽度和相对码字触发的延迟。
<div class="important">
若芯片出现异常,在实验配置前应该通过写寄存器来软复位芯片的状态机和寄存器默认值。数据配置用例参考附录 [历史无关配置集](#历史无关配置集)。
</div>
### 实验运行阶段
读出芯片的运行通过同步触发信号来启动,从而确保多个芯片间具有确定的时序关系。此外考虑到不同类型通信固有延迟不同,同步信号在芯片内部首先经过同步延迟模块,同步延迟模块能够为 DAQ 和 AWG 分别延迟不同的时间,从而确保读出芯片的 DAQ 和 AWG 模块能够协同运行。
同步信号到达 DAQ 和 AWG 模块后DAQ 和 AWG 模块内部的 MCU 分别启动运行MCU 从 0 地址加载指令运行其按照每三个时钟一个指令的速度执行MCU 根据编程指令修改控制寄存器与发出控制码字:
* 对于 AWG控制码字驱动波形输出和 Pump 使能输出。
* 对于 DAQ控制码字驱动数据采集和反馈上报/下发。
MCU 运行到退出指令后,退出运行并进入空闲状态。
### 实验数据采集阶段
实验数据采集与 MCU 运行是同时启动的。如果采集数据量较大,存在 MCU 运行结束但是数据还没采集完成的情况,此时数据继续写入到缓存区,主动数据上报模块继续从缓存中拿取数据并通过数据上报接口推送出去。当缓存中数据推送完毕后结束实验,此时可以通过检测推送数据量与目标数据量是否相等,控制发出读请求信号来指示实验是否完毕。
若不能提前确定采集的数据量,则只能在 MCU 运行结束后通过等待一定的时间,通过检测是否有数据返回来判断实验是否完成。
在为读出芯片设置好采集数据请求阈值后,当采集到的数据大于等于阈值便会触发一次读数据请求。由于读出芯片通过 LVDS 接口回传数据,持续进行实验时,为了避免缓存写满,需要确保数据产生速率和数据回传速率匹配。以获取解模 IQ 数据为例:
*T* 为数据产生时间间隔,*N* 为每次读取的 Qubit 数量,*F* 为 LVDS 的有效速率,触发间隔时间需要满足以下公式:
$$T > \frac{64 \times N}{F}$$
## 异常处理
读出芯片内部集成了中断管理和异常检测机制,通过 INT_STATUS 和 INT_MASK 寄存器进行管理。INT_STATUS 寄存器是 INT_MASK 与对应实际输入状态按位相与再与 INT_STATUS 本身按位或运算的结果,需要通过命令清零。
### 中断源
芯片支持以下中断/异常源:
| 中断源 | 触发条件 | 说明 |
|:-|:-|:-|
| EXIT_IR | MCU 执行退出指令 | MCU 程序正常退出时触发,表明任务执行完毕 |
| FORCE_AWG | 外部强制 AWG 请求 | 外部控制器通过写寄存器强制 AWG 模块进入特定状态 |
| FORCE_DAQ | 外部强制 DAQ 请求 | 外部控制器通过写寄存器强制 DAQ 模块进入特定状态 |
| ILLEGAL_ONE | 非法指令(数据为全 1 | MCU 执行到全 1 指令字 (0xFFFFFFFF) 时触发,表明指令内存异常 |
| ILLEGAL_ZERO | 非法指令(数据为全 0 | MCU 执行到全 0 指令字时触发,常见于未编程的指令空间 |
| UNALIGN_SW | 短字非对齐访问 | 16 位数据访问地址未对齐时触发 |
| UNALIGN_LW | 长字非对齐访问 | 32 位数据访问地址未对齐时触发 |
| LINK_DOWN | LVDS 链路断开 | LVDS 数据接收链路同步丢失时触发,接收端重新进入未同步状态 |
### 中断处理流程
异常发生时,建议按以下流程处理:
1. **读取 INT_STATUS 寄存器**,确认中断源
2. **记录异常信息**(中断类型、发生时间、当前运行状态)
3. **根据中断类型采取对应措施**
- EXIT_IR正常退出无需处理可启动下一轮实验
- ILLEGAL_ONE / ILLEGAL_ZERO检查 MCU 程序是否正确写入指令内存,必要时重新下载程序并软复位 MCU
- UNALIGN_SW / UNALIGN_LW检查 MCU 程序中的内存访问指令,确保 load/store 指令地址对齐
- LINK_DOWN检查 LVDS 物理连接和信号完整性,重新执行 LVDS 同步流程
- FORCE_AWG / FORCE_DAQ根据外部控制器逻辑处理
4. **写 INT_STATUS 寄存器清零中断标志位**
5. **若需恢复运行**:通过软复位(写 SYNC_SOFT 寄存器)复位 MCU 状态机,重新配置后启动
### 异常预防
* MCU 程序写入后应通过回读比对验证写入正确性
* LVDS 数据传输前确保收发双方已完成同步
* 避免在实验运行期间访问运维寄存器
* 建议启用 INT_MASK 中需要关注的中断源,屏蔽不需要的中断源以简化处理逻辑
* MCU 程序末尾务必包含退出指令 (`exit x0, x0, 0`),避免 MCU 从非法内存区域取指
### 典型异常波形
异常波形截图参考见 [中断与异常处理](#中断与异常处理)。

View File

@ -0,0 +1,65 @@
# 寄存器定义
## 寄存器摘要
读出芯片偏移地址空间分配如下所示用户可以通过读写相应地址来控制读出芯片功能和访问芯片状态。读出芯片地址空间包含系统配置状态、模拟配置状态、DAQ 配置状态、AWG 配置状态以及 PLL 配置状态五个部分。
@import "data/seg_define.csv"
<div class="note">
**注 1** DAQ 和 AWG 各自包含一个 MCU 模块MCU 模块仅能够访问模块内部的控制器指令、控制器数据和寄存器配置,访问基地址分别重新映射到了 `0x000000`、`0x100000` 和 `0x200000`
**注 2** MCU 仅能够显示访问控制器数据和对应寄存器配置数据。对于控制器指令空间,控制器自动读取指令并运行,无法显式访问和修改数据。
**注 3** 匹配滤波器参数和匹配滤波器权重分别对应 FPGA 和 ASIC 平台。FPGA 平台受限于计算资源有限,采用系数直接存储的方案,需要额外配置 `0x580000` 地址数据,此时 `0x500000` 地址中仅包络参数有效。
**注 4** 系统状态配置、模拟配置状态、PLL 配置状态属于运维寄存器,实验时禁止修改。实验只需要修改 DAQ 配置状态和 AWG 配置状态。
</div>
## 操作码字定义
### 激励输出控制码字
AWG MCU 发出的控制码字格式13 位):
| Bit | 字段名 | 说明 |
|:-:|:-|:-|
| [12] | PULSE_ONLY | 仅脉冲输出模式。置 1 时仅输出 Pump 脉冲,不输出波形 |
| [11] | PARAMETER_SEL | 参数选择。0: 使用默认参数1: 使用码字携带的参数 |
| [10] | NCO_CLR_EN | NCO 相位清零使能。置 1 时清零 NCO 相位累加器 |
| [9] | MARK_EN | 标记输出使能。置 1 时在当前波形段输出期间使能标记信号 |
| [8] | PUMP_EN | Pump 使能。置 1 时触发 Pump 脉冲输出 |
| [7:0] | WAVE_ID | 波形段 ID。通过波形映射表查找对应的波形段起始地址和长度 |
### 采集处理控制码字
DAQ MCU 发出的控制码字格式32 位):
| Bit | 字段名 | 说明 |
|:-:|:-|:-|
| [31:16] | QUBIT_EN | 16 量子比特使能。每比特对应一个量子比特1 表示使能对应通道 |
| [15] | COUNT_SAVE_EN | 计数统计保存使能 |
| [14] | STATE_SAVE_EN | 态结果保存使能 |
| [13] | IQ_SAVE_EN | IQ 数据保存使能 |
| [12] | WAVE_SAVE_EN | 原始波形保存使能 |
| [11] | MTF_IDX_SEL | 匹配滤波器索引选择 |
| [10] | DDS_FPW_SEL | DDS 频率/相位字选择 |
| [9] | STATE_CLR_VAL | 态统计清零值 |
| [8] | DEMOD_CLR_VAL | 解模累加器清零值 |
| [7] | GLB_FB_VAL | 全局反馈值(下发到外部芯片) |
| [6] | LOC_FB_VAL | 局部反馈值(片上反馈控制) |
| [5] | STATE_STS_VAL | 态统计状态值 |
| [4] | DEMOD_SUM_VAL | 解模求和值 |
| [3:0] | PARA_ID | 读出参数 ID。指向 DAQ_PAR 中的参数组 |
<div class="note">
对于多比特解模DAQ 按每个量子比特通道执行解模运算,运算顺序为 Qubit 0 → Qubit 15。数据存储顺序与解模顺序一致。态判定在解模完成后进行态统计在态判定完成后进行。
</div>
## 寄存器/存储详细定义
读出芯片的详细寄存器/存储定义参考 [读出芯片 IDS 表](../script/读出子系统IDS表.xls)。相应的驱动软件配置文件参考 [读出芯片 IDS 表 JSON](../data/ids.json)。
@import "data/ids.json"

View File

@ -0,0 +1,13 @@
# 芯片尺寸
![chip_size](../assets/chip_size.png)
## 封装参数
| 参数 | 值 |
|:-|:-|
| 焊球中心间距 | 1 mm |
| 焊球大小 | 0.5 mm |
| 焊球数量 | 13 × 13 = 169 个 |
| 基板大小 | 1.4 cm × 1.4 cm |
| 封装类型 | CSP-BGA |

View File

@ -0,0 +1,29 @@
# 附录 A运维操作手册
本章节概述了读出芯片的运维校准流程。完整内容参见 [读出子系统运维操作手册](../../readout_operate/读出子系统运维操作手册.md)。
## 校准流程概要
读出芯片在上电后需要执行以下校准步骤:
1. **通道延迟校准**:校准各通道的模拟和数字延迟,确保多通道间时序对齐
2. **输出同步校准**:校准 AWG 输出通道的同步精度
3. **采集同步校准**:校准 ADC 采样时钟与 DAQ 触发之间的同步
4. **PLL 锁定确认**:验证 PLL 输出频率锁定在目标范围内
## 硬件安装注意事项
* 确认所有供电轨上电顺序正确(内核供电 → IO 供电 → 时钟 → 复位)
* 检查 SPI 和 LVDS 线缆连接
* 确认散热条件满足要求
## 故障诊断
常见故障及排查方向:
| 故障现象 | 可能原因 | 排查步骤 |
|:-|:-|:-|
| SPI 无法通信 | CSN/SCLK 时序异常、CHIP_ID 配置错误 | 检查 SPI 四线连接、上拉电阻、CHIP_ID 跳线 |
| LVDS 无法同步 | 同步码发送不足、信号质量差 | 检查差分线缆、增加同步码发送次数 |
| DAC 无输出 | PLL 未锁定、DAC 配置未完成 | 检查参考时钟、确认 PLL 锁定指示灯、回读 DAC 配置 |
| ADC 采集异常 | 参考电压配置错误、输入信号超量程 | 检查 ADC_REF_SENSE 电平、确认输入信号幅度 |

View File

@ -0,0 +1,71 @@
# 附录 B历史无关配置集
本章节概述了读出芯片的常用寄存器配置用例。完整内容参见 [读出子系统历史无关配置集](../../readout_config_set/读出子系统历史无关配置集.md)。
## 激励通道配置
### 直接波形输出
配置 AWG 以 NRZ 直出模式输出基带波形:
1. 写波形数据到 AWG_WVE 地址空间
2. 配置波形映射表 (AWG_IDX)
3. 编程 MCU 指令 (MCU_INS),在码字中设置 WAVE_ID
4. 设置控制寄存器 (AWG_REG) 选择 NRZ 直出模式
5. 触发同步信号启动
### 调制波形输出
配置 AWG 以 MIX 模式输出调制波形:
1. 同上写入波形数据和映射表
2. 配置 NCO 频率控制字
3. 设置控制寄存器选择 MIX 模式
4. 编程 MCU 指令,触发波形输出
## 采集通道配置
### 波形采集模式
采集 ADC 原始波形数据:
- 设置 DAQ_REG 为波形采集模式
- 配置采集触发参数
- MCU 码字中使能 WAVE_SAVE_EN
### IQ 数据采集模式
解模获取 IQ 复数数据:
- 配置解模参数 (DAQ_PAR)
- 写入匹配滤波器系数 (DAQ_FLT)
- MCU 码字中使能 IQ_SAVE_EN
- 选择对应的 PARA_ID
### 态数据采集模式
获取量子态判定结果:
- 完成 IQ 解模配置
- 配置态判定阈值
- MCU 码字中使能 STATE_SAVE_EN
## Pump 通道配置
* **单次脉冲输出**MCU 码字中 PUMP_EN = 1配置脉宽参数
* **连续脉冲输出**MCU 程序循环发出 PUMP_EN 码字
## 功能项汇总
| 通道 | 配置项 | 说明 |
|:-|:-|:-|
| 激励 | 直接波形输出 | NRZ 直出基带波形 |
| 激励 | 调制波形输出 | MIX 模式混频输出 |
| 采集 | 波形采集 | 原始 ADC 数据 |
| 采集 | IQ 采集 | 解模 IQ 数据 |
| 采集 | 态采集 | 态判定结果 |
| 采集 | 计数采集 | 态统计计数 |
| 采集 | 态反馈 | 读出态反馈控制 |
| Pump | 单次输出 | 单次 Pump 使能 |
| Pump | 连续输出 | 连续 Pump 使能 |
<div class="note">
以上配置用例均为"历史无关"配置,即无论芯片之前处于何种状态,按照用例流程配置后均可保证功能正确。这一特性对于自动化测试和批量实验至关重要。
</div>

View File

@ -0,0 +1,291 @@
/* ============================================================
Datasheet Theme 芯片数据手册风格
============================================================ */
:root {
--bg: #fff;
--text: #1a1a1a;
--text-muted: #555;
--heading: #000;
--accent: #003d7c;
--accent-light: #e8f0f8;
--th-bg: #e9ecf0;
--th-border: #c0c4c8;
--stripe: #f7f8f9;
--cover-bg: #003d7c;
--cover-text: #fff;
--link: #005da0;
--note-bg: #f5f7fa;
--note-border: #003d7c;
--font-body: "Noto Serif CJK SC", "Source Han Serif SC", "SimSun", Georgia, serif;
--font-heading: "Noto Sans CJK SC", "Source Han Sans SC", "Microsoft YaHei", "PingFang SC", sans-serif;
--font-mono: "Cascadia Code", "Fira Code", Consolas, monospace;
--size: 14px;
--line: 1.7;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { font-size: var(--size); }
body {
font-family: var(--font-body);
font-size: 1rem;
line-height: var(--line);
color: var(--text);
background: var(--bg);
max-width: 900px;
margin: 0 auto;
padding: 2em 2.5em;
}
/* ---------- Cover ---------- */
.cover-page {
background: linear-gradient(160deg, var(--cover-bg) 0%, #002244 100%);
color: var(--cover-text);
text-align: center;
padding: 80px 40px;
margin: -2em -2.5em 3em -2.5em;
border-radius: 0 0 8px 8px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
min-height: 95vh;
}
.cover-page .product-family {
font-family: var(--font-heading);
font-size: 0.9rem;
letter-spacing: 0.3em;
text-transform: uppercase;
opacity: 0.7;
margin-bottom: 40px;
}
.cover-page h1 {
font-family: var(--font-heading);
font-size: 2.4rem;
font-weight: 700;
line-height: 1.35;
margin-bottom: 20px;
color: var(--cover-text);
border: none;
padding: 0;
}
.cover-page .subtitle {
font-family: var(--font-heading);
font-size: 1.1rem;
font-weight: 300;
opacity: 0.8;
margin-bottom: 48px;
}
.cover-page .feature-list {
list-style: none;
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
margin: 0 auto 48px;
padding: 0;
}
.cover-page .feature-list li {
font-family: var(--font-heading);
font-size: 0.95rem;
padding: 6px 24px;
border: 1px solid rgba(255,255,255,0.2);
border-radius: 4px;
width: 280px;
}
.cover-page .cover-meta {
margin-top: auto;
font-size: 0.85rem;
opacity: 0.55;
padding-top: 40px;
}
.cover-page .cover-meta p { text-align: center; margin: 4px 0; }
/* ---------- Headings ---------- */
h1 {
font-family: var(--font-heading);
font-size: 1.5rem;
font-weight: 700;
color: var(--heading);
margin: 2em 0 0.8em;
padding-bottom: 6px;
border-bottom: 2px solid var(--accent);
}
h2 {
font-family: var(--font-heading);
font-size: 1.25rem;
font-weight: 700;
color: var(--accent);
margin: 1.5em 0 0.6em;
padding-bottom: 4px;
border-bottom: 1px solid var(--th-border);
}
h3 {
font-family: var(--font-heading);
font-size: 1.1rem;
font-weight: 600;
color: var(--heading);
margin: 1.2em 0 0.5em;
}
h4 {
font-family: var(--font-heading);
font-size: 1rem;
font-weight: 600;
color: var(--text);
margin: 1em 0 0.4em;
}
/* ---------- Body ---------- */
p { margin: 0.6em 0; text-align: justify; }
ul, ol { margin: 0.6em 0; padding-left: 2em; }
li { margin: 2px 0; }
a { color: var(--link); text-decoration: none; }
a:hover { text-decoration: underline; }
/* ---------- Tables ---------- */
table {
width: 100%;
border-collapse: collapse;
margin: 1em 0;
font-size: 0.92rem;
}
thead th {
background-color: var(--th-bg);
font-family: var(--font-heading);
font-weight: 600;
font-size: 0.88rem;
text-align: left;
padding: 6px 10px;
border: 1px solid var(--th-border);
border-bottom: 2px solid var(--accent);
white-space: nowrap;
}
tbody td {
padding: 5px 10px;
border: 1px solid var(--th-border);
vertical-align: top;
}
tbody tr:nth-child(even) { background-color: var(--stripe); }
table.compact { font-size: 0.82rem; }
table.compact thead th { font-size: 0.8rem; padding: 3px 7px; }
table.compact tbody td { padding: 3px 7px; }
td.addr, td.bits, td.reset-val { font-family: var(--font-mono); font-size: 0.85em; white-space: nowrap; }
td.bits { text-align: center; }
/* Permissions */
.perm-rw { color: #1a7a1a; font-weight: 600; }
.perm-ro { color: #b8860b; font-weight: 600; }
.perm-wc { color: #8b0000; font-weight: 600; }
/* ---------- Code ---------- */
code {
font-family: var(--font-mono);
font-size: 0.9em;
background: var(--note-bg);
padding: 1px 5px;
border-radius: 2px;
border: 1px solid var(--th-border);
}
pre {
font-family: var(--font-mono);
font-size: 0.82rem;
background: var(--note-bg);
border: 1px solid var(--th-border);
border-left: 3px solid var(--accent);
padding: 12px;
margin: 1em 0;
overflow-x: auto;
line-height: 1.5;
}
pre code { background: none; padding: 0; border: none; font-size: inherit; }
/* ---------- Figures ---------- */
figure { margin: 1.5em auto; text-align: center; max-width: 100%; }
figure img { max-width: 100%; height: auto; }
figure figcaption {
font-family: var(--font-heading);
font-size: 0.88rem;
color: var(--text-muted);
margin-top: 6px;
}
p img { max-width: 100%; height: auto; display: block; margin: 1em auto; }
/* ---------- Blockquote / Notes ---------- */
blockquote {
margin: 1em 0;
padding: 10px 16px;
border-left: 4px solid var(--note-border);
background: var(--note-bg);
font-size: 0.92rem;
}
/* ---------- TOC ---------- */
.toc { margin-bottom: 2em; }
.toc h2 { font-size: 1.4rem; border-bottom: 2px solid var(--accent); }
.toc-list { list-style: none; padding: 0; }
.toc-list li {
padding: 4px 0;
border-bottom: 1px dotted var(--th-border);
display: flex;
justify-content: space-between;
}
.toc-list li a { flex: 1; }
/* ---------- Sidebar (screen only) ---------- */
@media screen and (min-width: 1200px) {
body { padding-left: 260px; max-width: 1100px; }
.screen-toc {
position: fixed;
left: max(0px, calc((100vw - 1100px) / 2 - 240px));
top: 0;
width: 220px;
height: 100vh;
overflow-y: auto;
background: var(--note-bg);
border-right: 1px solid var(--th-border);
padding: 16px 12px;
font-size: 0.78rem;
z-index: 100;
}
.cover-page { margin-left: calc(-2em - 260px + 2.5em); }
}
@media screen and (max-width: 1199px) {
.screen-toc { display: none; }
}
.screen-toc ul { list-style: none; padding: 0; }
.screen-toc li { margin: 3px 0; line-height: 1.4; }
.screen-toc a { color: var(--text); display: block; padding: 2px 5px; border-radius: 2px; }
.screen-toc a:hover { background: var(--accent-light); text-decoration: none; }
/* ---------- Register summary ---------- */
.reg-summary { font-size: 0.9rem; }
.reg-summary strong { margin-right: 4px; }
.reg-summary code { margin-right: 12px; }
/* ---------- Warning ---------- */
.warning {
background: #fff3cd;
border: 1px solid #ffc107;
padding: 10px;
margin: 10px 0;
border-radius: 3px;
}
/* ---------- Utility ---------- */
.text-center { text-align: center; }
.text-mono { font-family: var(--font-mono); }
.page-break { margin: 2em 0; }
/* ---------- Auto-numbering ---------- */
body.auto-numbering { counter-reset: section; }
body.auto-numbering h1 { counter-increment: section; counter-reset: subsection; }
body.auto-numbering h1::before { content: counter(section) ". "; }
body.auto-numbering h2 { counter-increment: subsection; counter-reset: subsubsection; }
body.auto-numbering h2::before { content: counter(section) "." counter(subsection) " "; }
body.auto-numbering h3 { counter-increment: subsubsection; }
body.auto-numbering h3::before { content: counter(section) "." counter(subsection) "." counter(subsubsection) " "; }

30
project.yaml Normal file
View File

@ -0,0 +1,30 @@
title: RBPU16 读出基带处理芯片
subtitle: 数据手册
author: 郭成
theme: datasheet
features:
- DAC 12 GSPS
- ADC 6 GSPS
- 16 Qubit 并行读出
- AWG 任意波形发生器
- DAQ 数据采集
- 片上 PLL
- LVDS 高速接口
- SPI 配置接口
chapters:
- 00_cover.md
- 01_specifications.md
- 02_absolute_maximum.md
- 03_pin_description.md
- 04_typical_performance.md
- 05_terminology.md
- 06_theory_of_operation.md
- 07_applications.md
- 08_register_map.md
- 09_package_dimensions.md
appendix:
- calibration.md
- config_examples.md

View File

@ -1,2 +1,64 @@
# 读出基带处理芯片数据手册 # RBPU16 读出基带处理芯片 · 数据手册
本项目为读出基带处理芯片的数据手册,本文档可以帮助相关工程师开展芯片性能评估、芯片硬件设计、芯片驱动开发以及芯片使用等工作。
RBPU16 是一款用于超导量子比特态信息读出的 SoC 芯片,最大支持 16 个量子比特并行读出,内部集成 PLL、ADC、DAC、DSP 等模块。
本手册帮助相关工程师开展芯片性能评估、硬件设计、驱动开发及芯片使用。
## 项目结构
```
├── build.ipynb # 构建入口VS Code 打开 → Run All → 生成报告
├── project.yaml # 项目配置(标题、章节列表、作者)
├── chapters/ # 章节源文件Markdown纯文本管理
│ ├── 00_cover.md
│ ├── 01_specifications.md
│ ├── ...
│ └── appendix/
├── data/ # 结构化数据
│ ├── pin_name.csv # 管脚定义(用户直接编辑)
│ ├── pin_loc.csv # 管脚 BGA 位置网格
│ ├── seg_define.csv # 寄存器地址段定义
│ └── ids.json # 寄存器详细定义(由 XLS 生成,供脚本读取)
├── assets/ # 图片PNG/JPG
├── doc_builder/ # 构建工具
│ └── themes/
│ └── datasheet.css
└── output/ # 构建产物gitignore
└── RBPU16_数据手册.html # 自包含单文件,可直接发送
```
## 快速开始
### 生成报告
1. VS Code 打开 `build.ipynb`
2. 点击 **Run All**
3. 报告生成到 `output/` 目录
> 依赖 `markdown` 库,首次运行会自动安装。
### 编辑内容
| 修改什么 | 编辑哪个文件 | 如何重新生成 |
|---------|------------|------------|
| 正文内容 | `chapters/*.md` | Run All |
| 管脚定义 | `data/pin_name.csv` | Run All |
| 地址段 | `data/seg_define.csv` | Run All |
| 寄存器定义 | `script/读出子系统IDS表.xls` | 先运行 `script/ids_import.ipynb`,再 Run All |
| 报告样式 | `doc_builder/themes/datasheet.css` | Run All |
| 封面/标题/章节列表 | `project.yaml` | Run All |
### @import 语法
在章节 Markdown 中使用 `@import` 引用数据文件,构建时自动渲染为表格:
```markdown
@import "data/pin_name.csv" → 管脚定义表
@import "data/pin_loc.csv" → BGA 焊球网格
@import "data/seg_define.csv" → 地址映射总表
@import "data/ids.json" → 寄存器详细定义
```
### 分享报告
`output/` 中的 HTML 是**自包含**的——CSS 和图片全部内嵌,单个文件即可在任何浏览器中打开,无需附带 `assets/` 目录。

View File

@ -1,13 +0,0 @@
|规格项|最小值|典型值|
|:-|:-|:-|
|SPI速率|50 Mbps|-|
|LVDS速率|750 Mbps|-|
|标识|定义|时序ns|
|:-|:-|:-|
|Tc2s|SPI帧开始时CSN下降沿到SCLK下降沿的时间|>3|
|Tms|MOSI数据的建立时间|>3|
|Tmh|MOSI数据的保持时间|>3|
|Tss|MISO数据的保持时间|>3|
|Tsh|MISO数据的保持时间|>3|
|Tc2s|SPI帧结束时SCLK上升沿到CSN上升沿的时间|>3|

View File

@ -1,292 +0,0 @@
---
export_on_save:
html: true
html:
toc: true
embed_local_images: true
embed_svg: true
title: 读出子系统历史无关功能配置项
author: 郭成
date:
---
# 宣传页封面
## 主要特点
* DAC 更新率最高12 GSPS
* ADC采样率最高6 GSPS
* AWG支持直接/调制波形输出
* AWG支持标记脉冲输出
* DAQ支持多种数据采集模式
* DAQ支持低延迟反馈控制
* AWG\DAQ支持指令集的编程
## 简要描述
RBPU16是一款用于量子比特态信息读出的一款SoC芯片
最大支持16个量子比特态信息并行读出。
芯片内部集成了PLL、ADC、DAC和DSP等模块其可以利用高速DAC产生微波信号激发读取腔并通过数字I/O使能外部Pump通道接着利用高速ADC采集处理反射回来的信号并通过DSP计算量子态信息最后将读出的量子态信息通过LVDS接口实时发送出去为量子比特态信息读出提供高集成度解决方案。
## 功能框图
![系统框图](assets/chip_schematic.png)
# 1. 规格参数
@import "specification.md"
# 2. 操作最大值
TODO
# 3. 管脚描述
芯片配置,顶视图
![pin_map](assets/pin_map.png)
芯片管脚描述如下
@import "pin_name.csv"
# 4. 典型性能特点
# 5. 专业术语
# 6. 操作原理
## 6.1 原理及模块划分
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模块用于管理芯片上控制的状态为芯片运维和调试提供支撑。
本章节从读出芯片的原理及模块划分、关键数据路径、接口控制协议几个方面进行介绍。
需要注意到的是读出芯片不仅支持以ASIC芯片模式工作也支持部分核心控制在FPGA内部工作。
这两种工作模式受制于ASIC和FPGA资源以及外部ADC、DAC硬件性能不同
部分功能实现存在差异,后续阅读时需要重点关注。
## 6.2 关键数据路径
### 6.2.1 读出激励输出通道
@import "../readout_program/ri_datapath.md"
一般情况下直出模式用于量子实验通过直接输出包含多个读出频率的波形可以实现对多个量子比特的并行读出调制模式用于腔频扫描等应用通过实时修改NCO频率可以实时改变输出频率配合DAQ进行实时读取可以实现扫频功能。若基带信号包含多个频点还能实现多频点并行扫描功能NCO Only模式可以输出连续波形方便连接外部仪器上进行测试用于芯片本身的测试
### 6.2.2 读出回波信号处理
@import "../readout_program/ro_datapath.md"
## 6.3 接口控制协议
### 6.3.1 SPI配置协议
读出芯片通过SPI来配置内部寄存器和内存SPI采用四线模式。
时钟极性CPOL=1即时钟在空闲时处于高电平状态
时钟相位CPHA=1即在第一个时钟沿输出数据第二个时钟沿采样数据。
SPI的通信数据格式采用自定义协议支持流模式发送接收
SPI的通信协议如下图所示
![spi_prot](assets/spi_prot.png)
协议首先发送1比特读写标识位
然后发送25比特地址位
接着再发送5比特的芯片选择信号
最后再发送/接收数据。
标识控制位含义如下表所示。
数据发送/接收以32比特为单位
以流模式发送,
支持发送/接收N*32位的数据
直到主控端将csn信号拉低后结束通信
这里N为大于等于1的整数。
流模式要求从设备在完成32比特数据接收/发送后自动对地址进行4字节递增。
|字段|RW|ADDR|CHIP_ID|RSV|DATA|
|:-:|:-:|:-:|:-:|:-:|:-:|
|位宽|1|25|5|1|32*N|
|含义|0:读1:写|32 MB寻址空间|总线片选|保留位|数据|
### 6.3.2 LVDS通信协议
从读出芯片到多功能母卡的数据推送接口rslt_push_[p,n],
反馈上报接口glb_tx_[p,n]和从多功能母板到读出芯片的反馈下发接口glb_rx_[p,n]采用了定制的LVDS通信协议
协议帧格式如下图所示:
```ascii
+---------------------------------------+
| LVDS DATA FRAME |
+------+-------------------+------------+
| 4 | 16/32/64/128 | 8 |
+------+-------------------+------------+
| HEAD | Payload | CRC8 |
+-----+--------------------+------------+
MSB LSB
```
帧头包含4比特数据其中最高位比特用于指示是否启动数据传输
次高位置0保留最低两位用于指示本次传输的数据量。
载荷支持16、32、64、128比特四种数据。
最后采用8比特校验码作为结束
校验多项式为: $x^8 + x^2 + x + 1$。
当处于空闲状态不用传输数据时发送端将LVDS信号电平拉高。
当传输数据时发送端将LVDS电平拉低两个数据周期启动数据发送
接着发送两比特数据指示本次载荷数据量,
其中0表示16比特1表示32比特2表示64比特3表示128比特
帧头发送完毕后紧接着将帧头指示的数据量的数据载荷发送;
最后将载荷计算得到的CRC8校验码发送
考虑到接收端可能由于信号亚稳态或者串并转换不能正确采集输入数据,
协议要求接收端在接收数据之前必须先和发送端同步。
发送端通过发送同步码来同步接收端,
当完成设定数量的同步码发送完毕后再发送一个结束码结束同步过程。
同步码为字符串”hfnl”对应的32比特数据
接收码为”exit”对应的32比特数据。
![lvds_prot](assets/lvds_prot.png)
发送和接收的状态机如上图所示,
接收端在启动时会被初始化到未同步状态,
此时必须接收到足够次数的同步码之后才能进入确认状态,
直道接收到确认码之后发送端和接收端会同时进入就绪状态。
接收端后续如果在接收数据过程发现CRC8校验码出错
接收端会再次进入未同步状态。
# 7. 应用注意
## 7.1 模拟接口
### 7.1.1 DAC输出接口
DAC输出0-12 GHz信号内部为50Ω电阻网络
外部差分270 nH电感到地然后经巴伦差分转单端注意传输线阻抗匹配。
参考电路如下图所示:
### 7.1.2 ADC输入接口
### 7.1.3 时钟输入接口
### 7.1.4 环路滤波器
使用内部PLL时外接滤波器结构如图所
### 7.1.5 基准电压输入
此端口的外接电阻决定了基准电流源的大小。其中,
ADC_VBIAS_IREF_RES端口要求外接电阻5.2 K到地
DAC_VBIAS_IREF_RES端口要求外接电阻5 K到地。两者都并接电容0.47uF。
## 7.2 启动顺序
为了确保芯片正常工作,需要满足以下启动顺序要求:
* 内核供电上电
* IO供电上电
* 时钟配置完毕
* 芯片复位
## 7.3 配置流程
读出芯片在上电后应该校准校准过程用于完成片上ADC、DAC、PLL以及系统同步校准过程参考[读出子系统运维操作手册](../readout_operate/读出子系统运维操作手册.md)。
在实验中读出芯片的操作遵循数据配置、实验运行和数据采集三个阶段。
### 7.3.1 数据配置阶段
* RO通道配置外部硬件通过SPI接口对读出芯片的寄存器包括输出模式例如直发模式、NCO Only模式、调制模型、波形查找表、波形仓库、输出MCU控制程序及数据。
* RI通道配置外部硬件通过SPI接口对读出芯片的寄存器包括采集模式例如波形模式、解模模式、态结果模型等、读出参数、匹配滤波器权重、采集控制程序及数据。
* Pump通道配置主要配置Pump通道输出的使能信号宽度和相对码字触发的延迟。
若芯片出现异常,在实验配置前应该通过写寄存器来软复位芯片的状态机和寄存器默认值,数据配置用例参考[读出子系统历史无关配置集](../readout_config_set/读出子系统历史无关配置集.md)
### 7.3.2 实验运行阶段
读出芯片的运行通过同步触发信号来启动,
从而确保多个芯片间具有确定的时序关系。
此外考虑到不同类型通信固有延迟不同,
同步信号在芯片内部首先经过同步延迟模块,
同步延迟模块能够为DAQ和AWG分别延迟不同的时间
从而确保读出芯片的DAQ和AWG模块能够协同运行。
同步信号到达DAQ和AWG模块后DAQ和AWG模块内部的MCU分别启动运行
MCU从0地址加载指令运行其按照每三个时钟一个指令的速度执行
MCU根据编程指令修改控制寄存器与发出控制码字
对于AWG控制码字驱动波形输出和Pump使能输出
对于DAQ控制码字驱动数据采集和反馈上报/下发。
MCU运行到退出指令后退出运行并进入空闲状态。
### 7.3.3 实验数据采集阶段
实验数据采集与MCU运行是同时启动的
如果采集数据量较大存在MCU运行结束但是数据还没采集完成的情况
此时数据继续写入到缓存区,
主动数据上报模块继续从缓存中拿取数据并通过数据上报接口推送出去,
当缓存中数据推送完毕后结束实验,
此时可以通过检测推送数据量与目标数据量是否相等,
控制发出读请求信号来指示实验是否完毕。
若不能提前确定采集的数据量,
则只能在MCU运行结束后通过等待一定的时间
通过检测是否有数据返回来判断实验是否完成。
在为读出芯片设置好采集数据请求阈值后,
当采集到的数据大于等于阈值便会触发一次读数据请求。
由于读出芯片通过LVDS接口回传数据
持续进行实验时,为了避免缓存写满,
需要确保数据产生速率和数据回传速率匹配。
以获取解模IQ数据为例
设T为数据产生时间间隔N为每次读取的Qubit数量
F为LVDS的有效速率触发间隔时间需要满足以下公式
$$T > \frac{64*N}{F}$$
## 7.4 异常处理
INT_STATUS寄存器是INT_MASK与对应实际输入状态按位相与再与INS_STATUS本身按位或运算的结果需要通过命令清零。
# 8. 寄存器定义
## 8.1 寄存器摘要
读出芯片偏移地址空间分配如下所示,
用户可以通过读写相应地址来控制读出芯片功能和访问芯片状态。
读出芯片地址空间包含系统配置状态、模拟配置状态、DAQ配置状态、AWG配置状态以及PLL配置状态五个部分。
@import "seg_define.csv"
* 注1DAQ和AWG各自包含一个MCU模块
MCU模块仅能够访问模块内部的控制器指令、控制器数据和寄存器配置
访问基地址分别重新映射到了0x000000, 0x100000和0x200000;
* 注2MCU仅能够显示访问控制器数据和对应寄存器配置数据。
对于控制器指令空间,控制器自动读取指令并运行,无法显式访问和修改数据。
* 注3匹配滤波器参数和匹配滤波器权重分别对应FPGA和ASIC平台
FPGA平台受限于计算资源有限采用系数直接存储的方案
需要额外配置0x580000地址数据此时0x500000地址中仅包络参数有效。
* 注4系统状态配置、模拟配置状态、PLL配置状态属于运维寄存器实验时禁止修改。实验只需要修改DAQ配置状态和AWG配置状态。
## 8.2 操作码字定义
### 8.2.1 激励输出控制
@import "../readout_program/ri_codeword.md"
### 8.2.2 采集处理控制
@import "../readout_program/ro_codeword.md"
## 8.3 寄存器/存储详细定义
读出芯片的详细寄存器/存储定义参考[读出芯片IDS表](script/读出子系统IDS表.xls)
相应的驱动软件配置文件参考[读出芯片IDS表](ids/读出子系统IDS表.json)。
# 9. 芯片尺寸
![chip_size](assets/chip_size.png)
* 焊球中心间距1mm
* 焊球大小0.5mm
* 焊球数量13*13=196个
* 基板大小1.4cm*1.4cm