FPGA视频图像增强系统的设计与调试
做视频图像增强时,FPGA 的优势很直接:流水线好搭,延迟也能压得很低。这个场景里,最常用的思路还是把采集、处理、输出拆开,各模块各做各的,接口尽量简单,后面调起来会省很多时间。
中值滤波的实现
图像增强不一定都要上复杂算法,先把椒盐噪声压下去,画面就会干净很多。中值滤波在 FPGA 上算是比较稳妥的一类方案,代价不高,效果也直观。这里的实现方式是维护一个 9 点缓存,收到新像素后更新缓存,再做排序取中间值。
module median_filter (
input wire clk,
input wire rst,
input wire [7:0] pixel_in,
output reg [7:0] pixel_out
);
reg [7:0] buffer [0:8];
integer i;
always @(posedge clk or posedge rst) begin
if (rst) begin
for (i = 0; i < 9; i = i + 1) begin
buffer[i] <= 8'b0;
end
end else begin
for (i = 0; i < 8; i = i + 1) begin
buffer[i] <= buffer[i + 1];
end
buffer[8] <= pixel_in;
end
end
always @(*) begin
reg [7:0] sorted [0:8];
integer j, k;
for (j = 0; j < 9; j = j + 1) begin
sorted[j] = buffer[j];
end
for (j = 0; j < 8; j = j + 1) begin
for (k = j + 1; k < 9; k = k + 1) begin
if (sorted[j] > sorted[k]) begin
reg [7:0] temp;
temp = sorted[j];
sorted[j] = sorted[k];
sorted[k] = temp;
end
end
end
pixel_out = sorted[4];
end
endmodule
这段代码里,clk 和 rst 负责同步和初始化,buffer 保存最近 9 个像素。复位后数组清零,运行时每个时钟沿推进一次数据。排序后取第 5 个值作为输出,这就是中值滤波的核心。
顶层架构和模块接口
顶层设计没必要搞得太复杂,关键是把链路理顺:采集进来,算法处理,再送到显示端。接口部分最容易出问题的是位宽和时序,不对齐的话,后面很难靠'调一下'解决。
假设采集端输出 8 位像素,顶层模块可以这样连:
module top_module (
input wire clk,
input wire rst,
input wire [7:0] pixel_from_capture,
output wire [7:0] pixel_to_display
);
wire [7:0] processed_pixel;
median_filter u1 (
.clk(clk),
.rst(rst),
.pixel_in(pixel_from_capture),
.pixel_out(processed_pixel)
);
assign pixel_to_display = processed_pixel;
endmodule
这里顶层只做连接,不掺杂额外逻辑。这样有个好处:后面无论是换算法,还是加亮度调整、边缘增强,都不用先动整个系统骨架。
仿真与调试
模块集成后,先跑仿真比直接上板子更省事。ModelSim 里看波形,能很快确认复位、缓存更新和输出是否按预期走。测试平台可以用下面这份:
module tb_median_filter;
reg clk;
reg rst;
reg [7:0] pixel_in;
wire [7:0] pixel_out;
median_filter uut (
.clk(clk),
.rst(rst),
.pixel_in(pixel_in),
.pixel_out(pixel_out)
);
initial begin
clk = 0;
forever #5 clk = ~clk;
end
initial begin
rst = 1;
pixel_in = 8'b0;
#10;
rst = 0;
pixel_in = 8'd10;
#10;
pixel_in = 8'd20;
#100;
$stop;
end
endmodule


