【Vivado2024.2】纯PL端128×128 Sobel边缘检测IP封装 | 单AXI4-Stream接口设计与仿真验证

文章标题

纯PL逻辑实现128×128 Sobel算子IP,AXI4-Stream标准接口封装,独立仿真通过

前言

本次设计不结合PS端DMA、不做软硬件联动,仅基于纯FPGA PL硬件逻辑 ,完成固定尺寸128×128灰度图像Sobel边缘检测算法开发。

采用行业通用AXI4-Stream数据流接口封装自定义IP,完成模块功能设计、代码编写、时序仿真,验证算法边缘提取效果,可独立作为图像处理基础IP,后续可按需挂载到Zynq总线工程使用。

一、设计整体概述

1.1 设计规格

  • 处理图像规格:固定128×128 8bit灰度图像
  • 算法:经典Sobel梯度边缘检测
  • 接口类型:单组标准AXI4-Stream Slave+Master数据流接口
  • 实现方式:纯Verilog硬件逻辑,无CPU、无软核参与
  • 验证方式:Vivado自带仿真器功能仿真,仿真结果合格

1.2 Sobel算法原理

采用3×3卷积核计算横竖梯度,合成图像边缘幅值

水平梯度核Gx

复制代码
-1  0  1
-2  0  2
-1  0  1

垂直梯度核Gy

复制代码
-1 -2 -1
 0  0  0
 1  2  1

梯度合模:G=∣Gx∣+∣Gy∣G=|Gx|+|Gy|G=∣Gx∣+∣Gy∣,设定阈值判定像素是否为边缘。

1.3 IP接口架构

仅保留AXI4-Stream流式收发接口,时钟、全局复位为基础控制信号

  • 输入Stream:接收原始128×128图像像素流
  • 输出Stream:输出边缘检测后二值化像素流
  • 全局时钟、低电平复位

二、自定义Sobel IP Verilog源码

文件名:sobel_pl_128x128.v

verilog 复制代码
module sobel_pl_128x128
(
    input               aclk,
    input               aresetn,

    //AXI4-Stream输入图像
    input       [7:0]   s_axis_tdata,
    input               s_axis_tvalid,
    output reg          s_axis_tready,
    input               s_axis_tlast,

    //AXI4-Stream输出边缘图像
    output reg  [7:0]   m_axis_tdata,
    output reg          m_axis_tvalid,
    input               m_axis_tready,
    output reg          m_axis_tlast
);

//图像尺寸参数
parameter IMG_W    = 128;
parameter IMG_H    = 128;
parameter THRESHOLD= 50;

//行缓存寄存器组,存储三行图像数据
reg [7:0] row_buf0[IMG_W-1:0];
reg [7:0] row_buf1[IMG_W-1:0];
reg [7:0] row_buf2[IMG_W-1:0];

//行列计数
reg [6:0] col_cnt;
reg [6:0] row_cnt;

//行列计数逻辑
always @(posedge aclk or negedge aresetn) begin
    if(!aresetn) begin
        col_cnt <= 7'd0;
        row_cnt <= 7'd0;
    end
    else if(s_axis_tvalid && s_axis_tready) begin
        if(col_cnt == IMG_W - 1'd1) begin
            col_cnt <= 7'd0;
            row_cnt <= row_cnt + 1'd1;
        end
        else begin
            col_cnt <= col_cnt + 1'd1;
        end
    end
end

//移位缓存三行像素
integer i;
always @(posedge aclk) begin
    if(s_axis_tvalid && s_axis_tready) begin
        for(i = 0; i < IMG_W-1; i = i+1) begin
            row_buf0[i] <= row_buf0[i+1];
            row_buf1[i] <= row_buf1[i+1];
            row_buf2[i] <= row_buf2[i+1];
        end
        row_buf0[IMG_W-1] <= row_buf1[IMG_W-1];
        row_buf1[IMG_W-1] <= row_buf2[IMG_W-1];
        row_buf2[IMG_W-1] <= s_axis_tdata;
    end
end

//Sobel梯度计算
reg signed [9:0] gx,gy;
reg [10:0] grad_total;

always @(*) begin
    gx  = row_buf2[0] + (row_buf1[0]<<1) + row_buf0[0]
         - row_buf2[2] - (row_buf1[2]<<1) - row_buf0[2];
    gy  = row_buf0[0] + (row_buf0[1]<<1) + row_buf0[2]
         - row_buf2[0] - (row_buf2[1]<<1) - row_buf2[2];
    grad_total = (gx[9] ? -gx : gx) + (gy[9] ? -gy : gy);
end

//输出二值化像素与Stream信号
always @(posedge aclk or negedge aresetn) begin
    if(!aresetn) begin
        s_axis_tready <= 1'b1;
        m_axis_tdata  <= 8'd0;
        m_axis_tvalid <= 1'b0;
        m_axis_tlast  <= 1'b0;
    end
    else begin
        m_axis_tvalid <= (row_cnt >= 2'd2) ? s_axis_tvalid : 1'b0;
        m_axis_tlast  <= s_axis_tlast;
        if(grad_total > THRESHOLD)
            m_axis_tdata <= 8'hff;
        else
            m_axis_tdata <= 8'h00;
    end
end

endmodule

三、Vivado自定义AXI4-Stream IP封装步骤

  1. 打开Vivado2024.2工程,选择Create and Package New IP
  2. 新建自定义IP,命名为sobel_pl_128x128
  3. 添加上述Verilog源码至IP工程,语法检查无报错
  4. 配置接口:自动识别生成标准AXI4-Stream Slave、Master接口
  5. 校验端口映射,时钟复位信号关联全局引脚
  6. 执行Synthesize综合,无时序、语法报错
  7. 打包生成可调用自定义IP,存入本地IP仓库

四、模块功能仿真设计与结果

4.1 仿真激励思路

  1. 生成128×128梯度递增测试像素流,按照AXI4-Stream时序送入IP输入端
  2. 观测输出端口像素数据、有效信号、帧结束信号
  3. 对比输出数据,验证边缘像素二值化效果

4.2 仿真结论

  1. 接口时序符合AXI4-Stream协议规范,valid、ready、tlast握手正常
  2. 行列缓存数据移位稳定,3×3卷积窗口正常滑动
  3. 梯度计算准确,图像边缘位置输出高电平255,背景输出0
  4. 整帧128×128图像完整处理无丢像素、无错位,纯PL逻辑功能验证通过

五、IP使用说明

  1. 本IP为纯硬件逻辑模块,无需依赖处理器、DMA控制器
  2. 仅对外提供标准AXI4-Stream数据流接口,通用性强
  3. 固定适配128×128分辨率图像,修改参数可适配其他尺寸
  4. 仿真验证完成,可直接在Vivado块设计中调用、级联其他Stream类IP

六、总结

本次设计完成纯PL端硬件实现128×128尺寸Sobel边缘检测算法,基于标准AXI4-Stream总线接口完成IP封装。全程无软硬件交互、无PS端程序参与,仅依靠FPGA逻辑资源完成图像卷积运算。

模块时序仿真顺利通过,边缘检测效果符合预期,封装后的标准化IP可独立使用,也可后续接入Zynq系统总线做拓展开发,适用于FPGA图像预处理基础工程。

附件(后续上传)

  1. sobel_pl_128x128.v 源码文件
  2. IP封装配置截图
  3. 功能仿真波形图
相关推荐
文心快码BaiduComate5 分钟前
从“提示词工程”到“技能工程”:Comate 创建Agent Skills 实战
人工智能
星栈12 分钟前
MCP 从 stdio 迁到 SSE,踩了 5 个传输层坑
人工智能·后端·架构
林泽毅22 分钟前
PyTRIO快速入门(二):Datum构建
人工智能·算法·产品
金斗潼关23 分钟前
使用MLP神经网络模型预测质数
人工智能·深度学习·神经网络
吴佳浩40 分钟前
一文讲透AI算力单位:TFLOPS、PFLOPS、TOPS、稀疏算力,到底怎么算、怎么比?
人工智能·ai编程·gpu
guoyuhan1 小时前
用 OpenAI SDK 一行代码接入国产大模型:DeepSeek/Qwen/GLM 实战指南
人工智能
维基框架1 小时前
GitHub重构漏洞赏金计划 向AI批量报告说不
人工智能·重构·github
不加辣椒1 小时前
第5章:智能检索系统——从 Naive RAG 到 Agentic RAG
人工智能
程序员cxuan1 小时前
白嫖 Claude Max 20x 漏洞完整事件始末
人工智能·后端·程序员
猫头虎1 小时前
什么是ZCode for GLM-5.2?
开发语言·人工智能·python·科技·算法·ai编程·ai写作