基于 ALINX VD100 的 Simulink 图像处理实践

原文作者:Adam Taylor
原文标题:MicroZed Chronicles: Creating Image Processing with Simulink
原文链接:https://www.adiuvoengineering.com/post/microzed-chronicles-creating-image-processing-with-simulink
Github 链接:https://github.com/ATaylorCEngFIET/mz629

FPGA 大神、Ardiuvo & Hackster.IO 知名博主 Adam Taylor 此前 基于 ALINX VD100(AMD Versal AI Edge VE2302)开发平台实现 LCD 测试图案显示

最近,他对这个项目进行了升级:增加 ALINX 摄像头模块,并构建完整的图像处理流水线,实现实时视频采集与显示

由于 LCD 显示输出链路已经搭建完成,本次升级的重点主要集中在视频采集和图像处理部分。


项目硬件清单

本项目基于 ALINX VD100 Versal AI Edge 开发平台搭建,实现了从摄像头采集、图像处理到显示输出的完整视频处理链路。

类别 硬件型号 作用
主开发平台 ALINX VD100 项目开发与验证平台
核心器件 AMD Versal AI Edge VE2302 图像采集、处理及系统控制
摄像头 ALINX MIPI Camera Module 图像采集输入
显示设备 1280×720 LVDS LCD Panel 图像显示输出
存储器 板载 4GB DDR4 视频帧缓存
非易失存储 8GB eMMC、512Mb QSPI Flash 系统启动与程序存储

image
(AMD Versal自适应计算加速平台开发板VD100)


系统架构

ALINX MIPI Camera
        ↓
MIPI CSI-2 RX
        ↓
Sensor Demosaic
       ↓
VDMA Write
        ↓
DDR4 Frame Buffer
        ↓
VDMA Read
        ↓
Sobel Edge Detection IP
        ↓
LVDS LCD Display

构建视频采集链路

要实现摄像头视频采集,需要在设计中加入以下 IP 核:

MIPI CSI-2 RX Subsystem

配置参数如下:

  • 4 Lane 输入
  • RAW10 图像格式
  • 每个时钟周期输出 4 个像素

该模块负责接收来自 MIPI 摄像头的数据流。

Sensor Demosaic

配置参数:

  • 4 Pixels Per Clock
  • RAW10 输入

该模块用于完成 Bayer 图像的去马赛克处理,将图像传感器输出转换为标准 RGB 图像。

Video DMA(VDMA)

通过 NoC(Network on Chip)连接 DDRMC,实现:

  • 视频帧写入 DDR
  • 视频帧读取 DDR

从而完成帧缓存管理。

CIPS I2C(EMIO)

启用 EMIO 方式的 I2C 接口,用于:

  • 摄像头初始化
  • 摄像头参数配置

例如曝光、增益、分辨率等参数设置。

完成上述模块连接后,就建立起了一条完整的视频链路:

MIPI Camera → Demosaic → DDR Buffer → LCD Display

与此同时,还需要 Vitis 软件完成:

  • 摄像头配置
  • 图像处理 IP 配置
  • VDMA 控制

image

整个系统设计已发布在 Adam Taylor 的 GitHub 中,点击文末阅读原文即可跳转。


原始图像存在的问题

系统运行后,摄像头采集的画面已经能够正常显示到 LCD 上。

不过从显示效果来看,仍然存在两个比较明显的问题:

  • Gamma 校正不足
  • 白平衡未优化

因此图像质量还有进一步优化空间。

image


使用 Simulink 实现 Sobel 边缘检测

在完成视频采集与显示后,希望快速验证一个能够插入现有视频流水线的图像处理算法。

最终选择的是:

Sobel Edge Detection(Sobel 边缘检测)

并通过 MathWorks Simulink HDL Coder 自动生成 FPGA IP。


创建 HDL 子系统

首先在 Simulink 中建立一个新的 Subsystem,后续通过 HDL Coder 转换为 Vivado IP。

由于 Sobel 算法需要灰度图像作为输入,因此第一步需要实现:
RGB 转灰度

RGB Image
    ↓
Grayscale Conversion
    ↓
Sobel Processing

即把彩色图像转换为灰度图像后,再进行边缘检测处理。


AXI4-Stream 视频接口设计

整个模块采用标准 AXI4-Stream Video 接口。

输入数据包括

tData

24bit 像素数据:

  • R:8bit
  • G:8bit
  • B:8bit

组成一个 RGB888 像素。

控制信号

  • tUser
  • tLast

用于表示帧起始行结束等视频时序信息。


Sobel 算法处理流程

完成灰度转换后,图像进入 Sobel 运算模块。

Sobel 算法会输出边缘检测结果。

通过 Switch 模块完成二值化:

  • 检测到边缘 → 输出 255
  • 非边缘区域 → 输出 0

最终生成黑白边缘图像。

image


Simulink 仿真验证

为了在 FPGA 实现之前验证算法效果,可以先在 Simulink 进行视频仿真。

输入端采用 From Multimedia File 读取视频文件。

随后利用 Frame To Pixels 将视频帧转换为:

  • 像素流
  • 视频同步信号

模拟真实视频接口的数据格式。

输出端通过 Pixels To Frame 重新组合图像帧。

重新组装视频帧。

并利用 Video Viewer 查看处理结果。


AXI4-Stream 数据格式转换

这里遇到一个比较典型的问题。

Frame To Pixels 输出格式为uint8[1×3][R G B]三个独立的 8bit 数据。

而 AXI4-Stream 接口要求输入格式为uint32 单一数据输入。

因此需要增加一个 MATLAB Function:将 RGB 数据打包为单个 32 位数据(uint8[1x3]→uint32)。由于 MATLAB 不支持 24bit 数据类型,因此只能采用 uint32 作为替代方案。

在 HDL 模块入口处,再执行相反操作:uint32 → uint8[1x3] 恢复RGB数据。

image

image


自动生成 Vivado IP

完成仿真验证后,通过 HDL Coder 直接生成 Vivado IP。

生成内容包括:

  • RTL HDL
  • AXI4-Stream 接口
  • Vivado IP Packager 文件
  • 工程支持文件

开发者可以直接导入 Vivado 使用。

image


集成到 VD100 视频流水线

生成的 Sobel IP 被加入到 Vivado 工程中。

由于该模块采用:

单像素处理(1 Pixel Per Clock)

因此放置在 VDMA 输出端之后


资源占用情况

资源类型 使用量
DSP 5
LUT 941
Flip-Flop 1606

工作频率:200 MHz

在 Versal AI Edge VE2302 上实现时序收敛没有任何问题。

image


实际运行效果

修改 Vitis 软件,使其能够配置 Sobel 模块后,系统成功运行。

实时摄像头画面经过 FPGA 处理后实现了完整的实时边缘检测演示系统:

  • 实时摄像头采集
  • FPGA 边缘检测处理
  • LCD 实时显示

显示刷新率达到 60Hz

image

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐