首页 > 技术 > 内容

基于FPGA的Sobel边缘检测工作原理

时间:2025-12-03  作者:Diven  阅读:0

本方案利用 HLS 功能创建图像处理解决方案,在可编程逻辑中实现边缘检测 (Sobel)。

介绍

高级综合 (HLS) 允许我们在开发 FPGA 应用程序时在更高的抽象级别上工作,如果是商业项目,有望节省时间并降低非经常性成本。

HLS 的一个重要应用是图像或信号处理,我们可能已经用 C 或 C++ 创建了一个高级模型,或者我们希望使用开源行业标准框架,例如 OpenCV。

在本项目中,我们将研究如何使用 HLS 构建 Sobel 边缘检测 IP 核,然后将其包含在我们选择的 Xilinx FPGA 中。

所选器件可以是传统的 FPGA,例如 Spartan Seven 或 Artix,或者也可以在异构 SoC 的可编程逻辑中实现,例如 Zynq 7000 或 Zynq MPSoC。

理论

在我们进入应用程序之前,我应该先简单介绍一下 Sobel 算法的工作原理。Sobel 算法通过识别图像中的边缘并强调以便可以轻松识别来有着作用。通常这将创建一个灰度图像,其中边缘被识别为灰色/白色阴影。

Sobel 边缘检测的工作原理是检测图像在水平和垂直方向上的梯度变化。为此,将两个卷积滤波器应用于原始图像,然后组合这些卷积滤波器的结果以确定梯度的大小。

执行
如果我们使用传统的 VHDL / Verilog RTL 方法在 FPGA 中实现这一点,那么开发时间将不会很短。因为我们需要为卷积创建行缓冲区,然后实现幅度计算。我们还需要创建一个测试平台,以确保我们的代码在进行实施之前按预期工作。

幸运的是,当我们使用 HLS 时,我们真的可以跳过很多繁重的工作,让 Vivado HLS 实现较低级别的 Verilog/VHDL RTL 实现。

为了在这个更高的抽象级别上工作,我们将使用 Vivado HLS 及其 HLS_OpenCV 和 HLS_Video 库。

第一个库 HLS_OpenCV 允许我们使用非常流行的 OpenCV 框架。而 HLS 视频库提供了许多可以加速为可编程逻辑的图像处理功能。

而是有益的HLS视频库包括我们需要创建一个索贝尔IP核心,内容包括:-

HLS::CvtColor - 这将根据其配置在颜色和灰度之间转换颜色方案。

HLS::Gaussian - 这将对图像执行高斯模糊以减少图像中存在的噪声。

HLS::Sobel - 根据其配置在垂直或水平方向执行 Sobel 卷积。我们将需要在我们的 IP 核中使用这两个实现。

HLS::AddWeighted - 这允许我们使用来自垂直和水平 Sobel 算子的结果来执行结果幅度计算。

这些不是我们将使用的所有 HLS 函数,因为我们需要使用其函数。我们需要包含这些附加功能,以便更轻松地使用 HLS 优化和与 Vivado 设计的接口。

界面
在可编程逻辑内部移动图像数据的最佳方法是使用 AXI 流。

这允许创建高性能图像处理路径,其中元素可以根据需要轻松添加或创建。

Vivado IP 库中存在多个 IP 模块,可实现视频输入和输出与 AXI 流之间的转换。以及其图像处理功能,例如混合器和色彩空间转换器

我们希望我们的 Sobel IP 核能够接受 AXI Stream 输入并以相同的 AXI Stream 格式生成其输出。为此,我们使用以下函数允许在 AXI 流和 HLS 函数使用的 HLS::Mat 格式之间进行转换。

HLS::AXIvideo2Mat - 从 AXI 流转换为用于 AXI 流输入的 HLS::Mat 格式。

HLS::Mat2AXIvideo - 从 HLS::Mat 格式转换为 AXI Stream 格式,用于 AXI Stream 输出。

C 综合和优化
与 Verilog 和 VHDL 设计不同,我们用来描述设计的高级语言是不定时的。这意味着当 HLS 工具将 C 转换为 Verilog 或 VHDL 时,必须经过多个阶段才能创建输出 RTL

调度 - 确定操作及其发生的顺序。

绑定 - 将操作分配给设备内可用的逻辑资源。

控制逻辑提取 - 提取控制逻辑并创建控制结构,例如状态机以控制模块的行为。

由于 HLS 工具在运行综合时必须在性能和逻辑资源之间进行权衡,因此在实现过程中将遵循许多规则。这些可能会影响生成的 IP 核的性能,例如循环(HLS 编码中的常见结构)保持滚动。

当然,我们可能希望更改 HLS 工具在 C 综合期间做出的决定以获得更好的性能。我们可以在我们的 C 中使用 #pragmas 来做到这一点,我们可以使用几个。

对于这个实现,我们将使用 Dataflow pragma 来确保我们可以达到最高的帧速率。

为了能够使用此编译指示,我们需要确保 HLS 综合工具并行执行两个 Sobel 操作。这将允许我们在 HLS C 综合期间指定数据流优化,从而优化通过函数的数据流。实际上,数据流优化是粗粒度流水线。

如果我们先执行一个 Sobel 操作,然后按顺序执行另一个操作,我们将无法应用此优化。

我们需要将高斯模糊的结果分成两条平行路径,然后在 AddWeighted 阶段重新组合。为此,我们使用函数

HLS::DuplICate - 这将输入图像复制到两个单独的输出图像中,我们可以并行处理这些图像。

软件
了解所有这些之后,我们就可以编写用于 Sobel IP 核的代码

#include "cvt_colour.hpp"
void image_filter(AXI_STREAM& INPUT_STREAM, AXI_STREAM& OUTPUT_STREAM)//, int rows, int cols)
{
#pragma HLS INTERFACE axis port=INPUT_STREAM
#pragma HLS INTERFACE axis port=OUTPUT_STREAM
RGB_IMAGE  img_0(MAX_HEIGHT, MAX_WIDTH);
GRAY_IMAGE img_1(MAX_HEIGHT, MAX_WIDTH);
GRAY_IMAGE  img_2(MAX_HEIGHT, MAX_WIDTH);
GRAY_IMAGE  img_2a(MAX_HEIGHT, MAX_WIDTH);
GRAY_IMAGE  img_2b(MAX_HEIGHT, MAX_WIDTH);
GRAY_IMAGE  img_3(MAX_HEIGHT, MAX_WIDTH);
GRAY_IMAGE  img_4(MAX_HEIGHT, MAX_WIDTH);
GRAY_IMAGE  img_5(MAX_HEIGHT, MAX_WIDTH);
RGB_IMAGE  img_6(MAX_HEIGHT, MAX_WIDTH);
;
#pragma HLS dataflow
hls::AXIvideo2Mat(INPUT_STREAM, img_0);
hls::CvtColor(img_0, img_1);
hls::GaussianBlur<3,3>(img_1,img_2);
hls::DuplICate(img_2,img_2a,img_2b);
hls::Sobel<1,0,3>(img_2a, img_3);
hls::Sobel<0,1,3>(img_2b, img_4);
hls::AddWeighted(img_4,0.5,img_3,0.5,0.0,img_5);
hls::CvtColor(img_5, img_6);
hls::Mat2AXIvideo(img_6, OUTPUT_STREAM);
}
#include  "hls_video.h"
#include
#define MAX_WIDTH  1280
#define MAX_HEIGHT 720
typedef hls::stream >           AXI_STREAM;
typedef hls::Mat RGB_IMAGE;
typedef hls::Mat GRAY_IMAGE;
void image_filter(AXI_STREAM& INPUT_STREAM, AXI_STREAM& OUTPUT_STREAM);//int rows, int cols);

当然,我们希望能够同时运行 C Simulation 和 Co Simulation,因此我们需要一个可以用来测试算法的测试台。

当我们运行 C Simulation 时,我们可以看到测试输入图像的结果如下。

有了 C 仿真和 Co 仿真结果,我们可以导出内核并将其添加到 Vivado 硬件设计中。

但是,在我们执行此操作之前,您可能需要检查分析、在 Vivado HLS 中查看并确认两个 Sobel 函数并行运行。

我们可以使用 Vivado HLS 中的导出 RTL 选项导出 IP 核,如果我们希望我们可以进一步配置 IP 核参数

实现核心
导出核心后,您将在 /solutionX/imp 目录下找到一个 zip 文件。该目录包含将新创建的 Sobel IP 核添加到 Vivado 设计所需的所有必要信息。

该文件可以添加到我们的 Vivado IP 存储库中,然后包含在 Vivado 框图中

有了这一切集成,您可以构建应用程序和目标到您选择的开发板

编辑:黄飞

 

猜您喜欢


电子元器件中,贴片电阻体积小、功耗低而应用于各种电子产品中。E96系列是抵抗器的一种标准系列,常用于精密电路中。了解E96贴片电阻型号对照表,可以帮助电子工程师...
2025-03-17 11:00:35
测温仪是应用于医疗、工业和家庭等领域的重要设备,其规格尺寸直接影响到使用的便捷性和准确性。一般而言,市面上常见的测温仪尺寸大约在15厘米到30厘米之间,重量通常...
2020-09-21 00:00:00
贴片电阻是电子电路中常见的元器件,其额定电压是选择和使用电阻时需要考虑的重要参数。额定电压是指电阻能够长期稳定工作的最大直流电压或交流电压的有效值。超过这个电压...
2024-11-29 10:26:20
第一部分 设计概述1.1 设计目的我们设计了一款基于 FPGA 的SEA开发板 的飞机大战游戏。飞机大战游戏是一款休闲益智类游戏,既简单又耐玩。在初始界面,...
2022-10-10 14:47:00
电磁学中,我们经常会遇到电流元这个概念,通常被表示为 idl。很多初学者可能会疑惑,为什么电流元是idl,而不是其的形式呢?1. 电流的微观理解:电流本质上是电...
2024-03-29 00:00:00
PTC热敏电阻作为重要的过流保护元件,受到了越来越多工程师和设计师的关注。顺络(Sunlord)作为知名的电子元器件制造品牌,其生产的PTC热敏电阻因品质稳定、...
2020-03-05 02:35:46
贴片电阻上的标注R300代表其阻值为300Ω(欧姆)。 字母R在这里是小数点的替代,数字300代表有效数字。所以,R300 等同于 300R,也就是 300 欧...
2024-11-29 10:26:27
电子世界中,不起眼的元器件往往是很重要的配件。大功率贴片电阻就是其中之一,负责将电流转化为热能,在电路保护和稳定性方面发挥着关键作用。选择合适尺寸的大功率贴片电...
2024-11-29 10:26:08
电流采样电阻作为电路中关键的检测元件,应用于电流监测和保护电路中。ASJ(新加坡)作为知名的电阻制造品牌,其电流采样电阻凭借优异的性能和可靠的质量,受到了众多电...
2023-05-29 22:35:26
想快速了解贴片电阻的各种尺寸?这张最新的贴片电阻封装尺寸大全照片就是您的最佳选择!图片清晰地展示了从01005到2512等常用封装尺寸的电阻,并标注了相应的长宽...
2025-04-14 15:02:35