MIPI 测试框架
面向 Xilinx VU13P + IMX298 的 MIPI CSI-2 相机采集与验证框架:传感器 I2C 配置、2-Lane RAW10 接收、URAM 帧缓冲、纯 RTL 系统控制与 PySide6 上位机联调。
Vivado Block Design: mipi_platform · 系统控制: mipi_sys_ctrl(RTL,无 MicroBlaze/Vitis)
本仓库为开源 FPGA 验证参考实现。不含板级原理图或未公开的硬件资料。引脚约束需结合具体板卡自行准备(参考 fpga/constraints/vu13p_pins.template.xdc),clone 后不能直接综合上板。
许可证:MIT(第三方模块见 THIRD_PARTY_NOTICES.md)
姊妹项目
同一 VU13P + IMX298 MIPI CSI-2 验证平台的两套实现,共享 Vivado Block Design(mipi_platform)与 PySide6 上位机(tools/ UART 协议兼容):
功能亮点
| 方向 |
内容 |
| 端到端采集 |
init mem BRAM 初始化 → CSI-2 RAW10 接收 → URAM 缓存 → UART 回传 → PC 解码显示 |
| CSI-2 / D-PHY |
2 数据 Lane + 1 时钟 Lane,800 Mbps/Lane;ECC/CRC 链路状态可读 |
| 纯 RTL 控制 |
UART 921600 协议、mipi_sys_ctrl 硬件 I2C/CSI/抓图,无软核 |
| init mem |
上电从 BRAM 预载 IMX298 默认表(1076 条);主机可 UART 覆写(CMD_MEM_*) |
| 主机工具 |
PySide6 GUI 串口联调 + download_regs.py 寄存器批量下发 |
| 工程化 |
create_project.tcl 一键重建 BD;build_all.tcl 综合→实现→bitstream |
传感器输出: 2016×1512 RAW10 @ ~21 fps(2-Lane)。
UART 抓图: 支持 2016×128 快速条带、2016×512、2016×1512 全幅(高度可截断以缩短传输)。
仓库结构
sensor-test-framework-pure-rtl/
├── fpga/
│ ├── rtl/ # 纯 RTL(mipi_sys_ctrl、axis_uram_framebuf 等)
│ ├── data/ # imx298_init.mem / .coe / .h
│ ├── constraints/ # vu13p_pins.template.xdc(需复制为 vu13p_pins.xdc)
│ ├── scripts/ # create_project.tcl、build_all.tcl、gen_init_coe.py
│ ├── sim/ # 模块级 testbench + run_sims.ps1
│ └── vivado/ # 生成工程目录(.gitignore,本地构建产物)
├── tools/ # PySide6 上位机 + UART 协议库 + CLI
├── docs/
│ ├── mipi_platform_v0.0.1.png
│ ├── python_gui.png
│ └── bd_design/ # Block Design PDF
└── README.md
架构总览

传感器 (I2C) MIPI CSI-2 RX URAM 帧缓冲 UART 921600 上位机
─────────── → D-PHY + 协议解析 → AXIS 写缓存 → 分块传输 → RAW10 解码 / GUI
mipi_platform (BD)
├── clk_wiz_0 19.2 MHz → 100 MHz AXI + 200 MHz D-PHY ref
├── u_sys_ctrl mipi_sys_ctrl(UART / I2C / AXI master / init mem)
├── mipi_csi2_rx_0 MIPI CSI-2 RX Subsystem(2-Lane RAW10, Bank 62)
├── u_framebuf axis_uram_framebuf(4 MiB,容纳全幅单帧)
├── axi_ic sys_ctrl → CSI RX + framebuf 寄存器访问
├── u_cam_gpio 相机 GPIO 三态缓冲(XCLR / PWDN / I2C)
├── u_vsync_probe VSYNC 同步探针
└── system_ila_0 联调 ILA(AXIS / AXI / 状态探针)
RTL 模块(fpga/rtl/): mipi_sys_ctrl · uart_921600 · protocol_parser · i2c_master · sensor_sequencer · init_mem_bram · axi_lite_master · axis_uram_framebuf · cam_gpio_iobuf · sync_probe · led_heartbeat
上位机工具

PySide6 图形界面提供串口连接、链路状态(速率 / ECC / CRC)、多档抓图分辨率、RAW10 解码预览,以及 PNG / RAW 保存。详见 tools/README.md。
| 功能 |
说明 |
| 串口 |
921600 8N1,自动枚举 COM 口 |
读状态 0x03 |
MIPI 端口、速率、ECC/CRC 计数、链路状态 |
抓图 0x04 |
指定宽×高,512 B/chunk + 信用窗口流控回传 |
| 暗黑模式 |
亮色 / 暗色主题切换 |
快速上手
环境: Vivado 2024.2 · Python 3.10+
-
复制引脚模板,按实际原理图填写 PIN_* 变量:
cp fpga/constraints/vu13p_pins.template.xdc fpga/constraints/vu13p_pins.xdc
Windows CMD:copy fpga\constraints\vu13p_pins.template.xdc fpga\constraints\vu13p_pins.xdc
-
生成 init mem(可选,仓库已含预生成文件):
python fpga/scripts/gen_init_coe.py
-
生成 Vivado 工程:
vivado -mode batch -source fpga/scripts/create_project.tcl
或一键综合到 bitstream:
vivado -mode batch -notrace -source fpga/scripts/build_all.tcl
-
Vivado 中(或 batch 完成后)下载比特流至板卡。
-
安装主机工具并启动 GUI:
cd tools
pip install -r config/requirements.txt
./run_gui.sh # Linux / macOS
run_gui.bat # Windows
-
连接串口 → 读状态 确认链路已建立 → 抓图 验证出图。
文档索引
传感器数据手册请从厂商官网获取:
UART 命令摘要
帧格式:AA 55 | CMD | LEN[15:8] | LEN[7:0] | PAYLOAD | XOR 校验
| 命令 |
码 |
用途 |
| 写寄存器 |
0x01 |
单条 I2C 写(16-bit 地址 + 8-bit 数据) |
| 读寄存器 |
0x02 |
单条 I2C 读 |
| 读状态 |
0x03 |
链路速率 / ECC / CRC / link_up |
| 抓图 |
0x04 |
ARM 帧缓冲 + UART 分包回传 |
| MEM 写入 |
0x10 |
写入 init mem 条目 |
| MEM 执行 |
0x11 |
从 mem 完整初始化传感器 |
| ACK |
0x80 |
命令成功 |
| ERR |
0x81 |
错误码(I2C NACK、忙、校验失败等) |
图像流:BB 66 数据块(512 B + XOR)→ 主机回 A5 ACK → BB 99 EOT。完整定义见 tools/lib/protocol.py 与 fpga/rtl/hw_defs.vh。
备注
- 目标器件:
xcvu13p-fhga2104-2-i(请按实际板卡调整)。
- 系统时钟:板载 19.2 MHz 单端输入(
pad_clk_19m2)。
- UART 速率:921600 8N1(FPGA 与上位机须一致)。
- 帧缓冲:4 MiB URAM(2016×1512 RAW10 ≈ 3.81 MB)。
- 传感器初始化表见
fpga/data/imx298_init_regs.h,仅为参考配置。
- RTL 仿真:
fpga/sim/run_sims.ps1(需本地 Vivado simulator)。
- 不含板级原理图、真实管脚约束或未公开的硬件资料。
- 芯片厂商寄存器表、数据手册等受版权约束的文件未包含或未跟踪;初始化表仅为参考配置,不代表厂商推荐设置。
评论