文章标题
纯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封装步骤
- 打开Vivado2024.2工程,选择Create and Package New IP
- 新建自定义IP,命名为
sobel_pl_128x128 - 添加上述Verilog源码至IP工程,语法检查无报错
- 配置接口:自动识别生成标准AXI4-Stream Slave、Master接口
- 校验端口映射,时钟复位信号关联全局引脚
- 执行Synthesize综合,无时序、语法报错
- 打包生成可调用自定义IP,存入本地IP仓库
四、模块功能仿真设计与结果
4.1 仿真激励思路
- 生成128×128梯度递增测试像素流,按照AXI4-Stream时序送入IP输入端
- 观测输出端口像素数据、有效信号、帧结束信号
- 对比输出数据,验证边缘像素二值化效果
4.2 仿真结论
- 接口时序符合AXI4-Stream协议规范,valid、ready、tlast握手正常
- 行列缓存数据移位稳定,3×3卷积窗口正常滑动
- 梯度计算准确,图像边缘位置输出高电平255,背景输出0
- 整帧128×128图像完整处理无丢像素、无错位,纯PL逻辑功能验证通过
五、IP使用说明
- 本IP为纯硬件逻辑模块,无需依赖处理器、DMA控制器
- 仅对外提供标准AXI4-Stream数据流接口,通用性强
- 固定适配128×128分辨率图像,修改参数可适配其他尺寸
- 仿真验证完成,可直接在Vivado块设计中调用、级联其他Stream类IP
六、总结
本次设计完成纯PL端硬件实现128×128尺寸Sobel边缘检测算法,基于标准AXI4-Stream总线接口完成IP封装。全程无软硬件交互、无PS端程序参与,仅依靠FPGA逻辑资源完成图像卷积运算。
模块时序仿真顺利通过,边缘检测效果符合预期,封装后的标准化IP可独立使用,也可后续接入Zynq系统总线做拓展开发,适用于FPGA图像预处理基础工程。
附件(后续上传)
- sobel_pl_128x128.v 源码文件
- IP封装配置截图
- 功能仿真波形图