窗口缓存模块win_buf
本模块不做任何算法上的处理,只是负责将当前输入像素的二维窗口元素缓存并组成一个一维的向量输出。
模块的构建非常简单,对图像分别做行列方向的延迟即可。对于行方向上的延迟,可以用行缓存来实现,对于列方向上的延迟,则采用寄存器实现。
设定需要缓存的窗口尺寸为KSZ,则需要KSZ-1行缓存,以及KSZxKSZ个寄存器来实现。以7x7窗口缓存快为例:
`timescale 1ns / 1ps
module win_buf(
rst_n,
clk,
din_valid,
din,
dout,
dout_valid,
dout_org,
vsync,
vsync_out,
is_boarder
);
parameter DW =14;
parameter KSZ = 15;
parameter IH = 512;
parameter IW =640;
input rst_n;
input clk;
input din_valid;
input vsync;
input [DW-1:0] din;
output [DW*KSZ*KSZ-1:0] dout; //输出为KSZ*KSZ向量
output [DW-1:0] dout_org; //输出中心点像素
output vsync_out;
output is_boarder;
output dout_valid;
localparam num_all = KSZ*KSZ;//窗口数据总数
//窗口寄存器
reg [DW-1:0] p [0:num_all-1];
//例化KSZ-1个行缓存
generate
begin : line_buf
genvar i;
for(i=0;i<=KSZ-2;i=i+1)
begin
line_buffer line_buf_inst (
.clk(clk),
.rst(rst_n),
.din(line_din[i][DW-1:0]),
.wr_en(line_wren[i]),
.rd_en(line_rden[i]),
.dout(line_din[i][DW-1:0]),
.full(line_full[i]),
.empty(line_empty[i])
);
end
end
endgenerate
//将输入接入延时电路
always @(posedge clk)
begin
if(valid)
p[0] <= din;
//列延迟电路
for(k=0;k<=KSZ-1;k=k+1)
for(j=1;j<=KSZ-1;j=j+1)
if(line_valid[k*KSZ+j-1])
p[k*KSZ+j] <= p[k*KSZ+j-1];
//行延迟电路
for(k=1;k<=KSZ-1;k=k+1)
if(line_rden[k-1])
p[k*KSZ] <= line_dout[k-1];
end
//输出窗口缓存
generate
begin : xhdl2
genvar i;
for(i=1;i<=num_all;i=i+1)
begin : out_data_gen
assign dout[i*DW -1 :(i-1)*DW] = p[i-1];
end
end
endgenerate
//输出中心像素
assign dout_org = p[med_idx];
endmodule