【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. 功能仿真波形图
相关推荐
m沐沐10 小时前
机器学习零基础吃透混淆矩阵!准确率 / 精确率 / 召回率 / F1 分数
人工智能·深度学习·机器学习·矩阵·pycharm
weixin_4462608511 小时前
自动化程序验证中的智能体证明能力
人工智能
Leo.yuan11 小时前
数据挖掘是什么?数据分析、数据挖掘、数据统计三者的区别是什么
人工智能·数据挖掘·数据分析
AI服务老曹11 小时前
基于 Docker 与 GB28181/RTSP 协议栈的异构边缘计算平台:解耦 AI 视频流媒体的架构演进与源码交付实践
人工智能·docker·边缘计算
GateWorld11 小时前
LCD显示技术完全指南:原理·制造·驱动·FPGA实现之驱动四
fpga开发·lcd显示·fpga点亮屏幕·minilvds·fpga点屏
Nayxxu11 小时前
企业多模型接入架构:Claude、GPT、Gemini 的统一调用方式
人工智能·gpt·架构
这是谁的博客?11 小时前
RAG 技术原理深度解析:检索增强生成架构与实践
人工智能·ai·架构·大模型·架构设计·向量检索·rag
Rauser Mack11 小时前
编程零基础五分钟用AI做了个贪吃蛇(附prompt)
人工智能·python·html·prompt·ai编程
名不经传的养虾人11 小时前
从0到1:企业级AI项目迭代日记 Vol.32|企业AI的隐形工程:登录、接管、发布、资产——一个都不能少
大数据·人工智能·ai编程·企业ai·多agent协作