使用 Arm Cortex-M1 实现低成本图像处理系统 的 FPGA 方案详解

本项目介绍了如何在 Xilinx Spartan-7 FPGA 上 使用 Arm Cortex-M1 软核处理器 构建一个低成本的嵌入式图像处理方案。

项目简介

该项目的目标是利用 Xilinx Spartan 7 SP701 开发板 以及一只 MIPI 摄像头实现图像采集、处理并输出到 HDMI 显示器。系统采用 Arm Cortex-M1 作为控制核,用于配置和控制图像处理链路,而真正的数据流图像处理则由 FPGA 内部通过一系列图像处理模块完成。

使用 FPGA 进行图像处理的好处之一是能够实现图像处理流水线,从而提供高帧率、低延迟和确定性路径。

这种流水线可以很容易地在像 Spartan 7 这样的小型 FPGA 中实现,更令人兴奋的是,Spartan IO 结构可以支持 HMDI、MIPI CSI-2 和 DSI 接口。

当然,要配置和控制图像处理流程,我们需要定制的IP模块或小型处理器。这时,Arm Cortex-M1处理器就能派上用场了。

Arm Cortext-M1 占用空间非常小,可以在 Spartan 7 FPGA 中实现,并且可以控制图像处理链。

图像处理链路构成

设计中使用了多个 IP 核,每个模块各司其职:

  • MIPI CSI-2 RX 子系统

接收来自 MIPI 摄像头的数据,并转换成 AXI Stream 格式。

  • DeMosaic 模块

将 RAW 数据转换成 RGB 像素格式。

  • VDMA

用于将图像帧缓冲到外部 DDR 内存。

  • MIG(内存接口生成器)

实现 FPGA 与 DDR3 外部存储的物理接口。

  • VTC视频时序控制器

生成输出 HDMI 所需的同步信号。

  • RGB2YCRCB

将 RGB 颜色空间转换为适合 HDMI 输出的 YUV 信号。

  • AXI IIC & AXI GPIO & AXI UART

分别用于摄像头配置、模块控制(如使能摄像头)和串口输出调试信息。

  • ILA(Integrated Logic Analyzer)

用于现场调试与信号观察。

  • Arm Cortex-M1 软核处理器

配置为没有调试功能,但带有 128KB 指令和数据内存。

M1下载地址:

https://developer.arm.com/downloads/view/AT472

通过网盘分享的文件:Cortex-Mx系列资源 链接: https://pan.baidu.com/s/1idn-HyHl9ghd9lcb8s1-vA?pwd=6dv3 提取码: 6dv3

然后可以添加下载的 M1 示例中的 Vivado 目录下提供的处理器。

可以使用项目设置将 IPI 存储库添加到项目中,添加完成后,就可以在设计中使用该处理器了。

完成后整体框图如下:

以上模块集成在一个 Vivado 工程中,通过约束文件设置引脚与时序条件,然后生成整个系统的 bitstream。

将用于 Arm Cortex-M1 编程的流程是更新比特流。

因此,从 Arm DesignStart FPGA 网站下载的示例项目中,还需要以下文件和批处理程序。

  • make_mmi_file.tcl - 此命令将生成一个 MMI 文件,其中显示指令存储器块 RAM 的位置。

  • 执行 make _prog_files.tcl 命令------这将把生成的 ELF 文件与比特流合并,生成一个包含我们创建的程序的新比特流。

  • make_prog_files.bat - 用于使用上述 tcl 文件创建更新后的位的批处理文件

  • make_hex_s7.bat - 将 elf 文件转换为必要的格式。

设计方案实施后,我们需要对这些文件进行一些修改。

第一个是 make_mmi_file.tcl,在这里我们需要将设备目标部分更新为我们选择的部分,还要确保我们搜索正确的 BRAM 输出,它可以是 DOADO 或 DOBDO。

这可以通过打开详细视图来确定,一旦知道使用了哪个视图,就可以相应地更新 MMI 文件。

设置部件名称

go 复制代码
# Set MMI output file name
set mmi_file "m1.mmi"
set part     "xc7s100fgga676-2" # SET PART HERE

更新 BRAM 输出端口

go 复制代码
# puts $itcm_ram_reordered

    # For each entry display the location
    foreach ram $new_list {
        # Get the RAM location
        set loc_val [get_property LOC [get_cells $ram]]
        regexp -- {(RAMB36_)([0-9XY]+)} $loc_val full ram_name loc_xy

        # Get the nets driven by the D0 pins
        set data_bus [get_nets -of_objects [get_pins -filter {REF_PIN_NAME =~ DOBDO*} -of [get_cells $ram]]]
        
        # Check number of bits is the same as that expected
        if { [llength $data_bus] != $mem_bits } {
            puts "Error - Number of data pins read, [llength $data_bus], does not equal expected memory bits, $mem_bits"
            return -1
        }

        # Number of pins connected to the memory sets the memory depth.
        set memory_depth [expr {(32768/[llength $data_bus])-1}]
        
        set idx_list [list]
        foreach entry $data_bus {
            # Filter the data_bus down to just the two index numbers
            set index [regexp -inline -- {[0-9]+} [regexp -inline -- {\[.*} [lindex $entry 0]]]
            lappend idx_list $index
        }
        
        # Sort the index list from highest to lowest
        set idx_list [lsort -decreasing -integer $idx_list]
        
        # Assign the highest and lowest bits for the range variables
        set index_low  [lindex $idx_list end]
        set index_high [lindex $idx_list 0]
        
        # Debug
        # puts $data_bus
        # puts $idx_list
        # puts "$index_high downto $index_low pos $loc_val"

        array set mem_array [list $index_high $loc_xy]
    }; # foreach
}; # for

完成此操作后,我们可以打开已实现的设计并运行 make_mmi_file.tcl 来创建新的 MMI 文件。

在 Vivado TCL 窗口中使用以下命令运行脚本。

go 复制代码
source make_mmi_file.tcl

接下来开发我们的软件。

软件部分设计流程

在 Vivado 设计完成后,工程导出 XSA 文件并在 Vitis 中创建基于该平台的 BSP(板级支持包)。由于 Arm DesignStart 的 Cortex-M1 BSP 只支持旧版 Xilinx BSP(6.6/6.7),因此需要复制该版本并重命名为 Vitis 当前版本(如 7.1),并在相关配置文件中更新版本号以兼容。

完成平台构建后,就可以使用该 BSP 为 Arm Cortex-M1 编写控制应用程序。

Keil 开发与应用实现

在 Keil MDK 中创建一个针对 Cortex-M1 的项目,对项目进行如下设置:

  • 配置内部及外部 DDR 内存基址与大小

  • 设置编译后自动执行脚本合并 bitstream

  • 添加 Vitis 生成的 BSP include 路径与源文件

应用程序将实现以下动作流程:

  • 使能并检测 MIPI 摄像头

  • 配置摄像头参数

  • 配置 HDMI 输出模块

  • 设置视频时序控制器

  • 配置 DeMosaic 与 RGB2YCRCB 模块

  • 启动 VDMA 进行图像读写

编程目标板与测试

在完成 bitstream 与应用程序合并后,通过 Vivado Hardware Manager 下载到 Spartan-7 FPGA。下载成功并运行后,可以在串口终端看到:

同时利用 FPGA 内部的 ILA 可以观察时序控制器与 CSI-2 接收器的实际信号行为。

最后在 HDMI 显示器上可以见到摄像头采集的实时图像。

可用链接

https://www.hackster.io/adam-taylor/image-processing-with-arm-cortex-m1-2f2b8c
通过网盘分享的文件:Cortex-Mx系列资源 链接: https://pan.baidu.com/s/1idn-HyHl9ghd9lcb8s1-vA?pwd=6dv3 提取码: 6dv3

总结

这个项目展示了两大核心内容:

  • 如何在 Vivado 和 Vitis 中集成 Arm Cortex-M1 内核用作软处理器控制 FPGA 图像处理管线。

  • 如何使用 Cortex-M1 控制一条完整的实时图像处理链,包括摄像头、图像转换、帧存储和 HDMI 显示。

项目还表明,使用 Cortex-M1 这样的轻量级核心能够有效地管理高性能图像处理数据流,而不必使用更大的软处理器或复杂架构。在未来,可将 Cortex-M1 替换为 Cortex-M3 或结合 TinyML 推理来扩展功能。

相关推荐
QYR_112 小时前
汽车 ABS 和 ESC 系统市场全景调研报告(2026-2032):规模、技术迭代与竞争格局
大数据·人工智能
liu****2 小时前
神经网络基础
人工智能·深度学习·神经网络·算法·数据挖掘·回归
Aaron15882 小时前
基于RFSOC 49DR+VU13P的64通道VPX架构波束成形技术分析
c语言·人工智能·算法·架构·信息与通信·信号处理·基带工程
得一录2 小时前
大模型的基本概念及主要功能
人工智能·aigc
雨大王5122 小时前
如何利用工业制造智能体实现汽车生产的全链路协同优化?
大数据·人工智能·汽车·制造
xinxiangwangzhi_2 小时前
多视图几何--密集匹配SURE(tsgm)
图像处理·计算机视觉
雨大王5122 小时前
实时质量监控如何通过数据驱动优化汽车生产质量?
大数据·人工智能·汽车·制造
筱昕~呀2 小时前
“烷”域天观——甲烷监测系统
人工智能·python·深度学习·豆包
行业探路者2 小时前
如何通过音频二维码生成提升信息分享效率?
大数据·人工智能·学习·二维码·产品介绍