面向 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 协议兼容):
| 仓库 | 说明 |
|---|---|
| sensor-test-framework-soft-core | 姊妹项目 — MicroBlaze 固件 + Vitis;D-PHY / Lane 深度联调、HS_SETTLE 扫描 |
| sensor-test-framework-pure-rtl | 本仓库 — 纯 RTL mipi_sys_ctrl,无 MicroBlaze / Vitis;init mem BRAM 上电初始化 |
| 方向 | 内容 |
|---|---|
| 端到端采集 | 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
-
连接串口 → 读状态 确认链路已建立 → 抓图 验证出图。
| 文档 | 说明 |
|---|---|
tools/README.md |
Python 上位机、CLI 与单元测试 |
fpga/scripts/create_project.tcl |
Vivado 工程 / BD 一键生成 |
fpga/scripts/build_all.tcl |
综合 + 实现 + bitstream |
fpga/rtl/mipi_sys_ctrl.v |
纯 RTL 系统控制器顶层 |
fpga/rtl/hw_defs.vh |
协议常量、地址映射(与 Python 同步) |
tools/lib/protocol.py |
UART 协议实现 |
docs/bd_design/mipi_platform_v0.0.1.pdf |
Block Design 导出 PDF |
传感器数据手册请从厂商官网获取:
| 器件 | 官网 |
|---|---|
| IMX298 | sony-semicon.com |
帧格式: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)。 - 不含板级原理图、真实管脚约束或未公开的硬件资料。
- 芯片厂商寄存器表、数据手册等受版权约束的文件未包含或未跟踪;初始化表仅为参考配置,不代表厂商推荐设置。

