1. 项目概述
在数字图像处理领域,中值滤波是一种经典的非线性滤波技术,特别适用于消除椒盐噪声。与传统的均值滤波不同,中值滤波能更好地保留图像边缘细节。本次项目我们将在Xilinx FPGA平台上用Verilog HDL实现一个完整的3×3中值滤波器,并与Matlab的标准实现进行效果对比验证。
选择FPGA实现主要基于三个考量:首先是实时性需求,硬件流水线处理比软件实现快几个数量级;其次是并行计算优势,FPGA可以同时处理多个像素窗口;最后是能效比,专用硬件比通用处理器更节能。测试使用经典的512×512 Lena图像(实际裁剪为500×500),这是图像处理领域的标准测试图,便于结果对比。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 整体数据流
系统采用典型的流水线结构,数据流依次为:
- 图像输入接口(AXI-Stream)
- 三行缓存模块
- 3×3窗口生成器
- 排序网络
- 中值选择器
- 输出接口
时钟域全部采用单时钟同步设计,输入输出采用valid-ready握手协议。特别要注意的是行缓存模块需要与图像宽度严格匹配,我们使用500个像素的行缓存深度。
2.2 关键模块实现
2.2.1 行缓存设计
行缓存采用三重寄存器阵列实现,代码优化后综合为Block RAM:
verilog复制reg [7:0] line_buffer[0:2][0:499]; // 三行×500像素
always @(posedge clk) begin
if (valid_in) begin
line_buffer[0] <= {pixel_in, line_buffer[0][0:498]}; // 新像素移入
line_buffer[1] <= line_buffer[0]; // 行移位
line_buffer[2] <= line_buffer[1];
end
end
注意:Vivado综合时可能将二维数组映射为分布式RAM而非Block RAM,建议添加(* ram_style = "block" *)属性强制使用BRAM资源。
2.2.2 窗口生成器
窗口生成器从三行缓存中提取3×3像素矩阵:
veril复制
