形态学滤波(四)
之比较子模块设计
考虑到代码维护性和移植性,将基本比较单元设计为单独的子模块。这个子模块需实现以下功能:
(1)输出两个数据的较大值。
(2)输出两个数据的较小值。
考虑到系统鲁棒性,将比较结果打一拍之后输出。根据设计要求,本模块需要一个比较器、两个mux和两个reg。如下图所示:
很明显,本模块开销为1个始终。
设在某时刻连续10个输入数据流为:
代码语言:js复制Din_a = 3,8,5,9,7,1,2,6,0,4,x;
Din_a = x,3,8,5,9,7,1,2,6,0,4;
则din_a,din_b,min_tmp,max_tmp,dout_max,dout_min连续10个始终的数据如表9-1所示:
代码语言:js复制module minmax(
clk,
valid,
din_a,
din_b,
dout_min,
dout_max
);
parameter DW =14;
parameter use_reg =1; //是否将数据缓存打一拍
input clk;
input valid;
input [DW-1:0] din_a;
input [DW-1:0] din_b;
output [DW-1:0] dout_min;
output [DW-1:0] dout_max;
reg [DW-1:0] dout_min;
reg [DW-1:0] dout_max;
reg [DW-1:0] min_reg;
reg [DW-1:0] max_reg;
assign min_tmp = (din_a > din_b) ? din_b : din_a;
assign max_tmp = (din_a > din_b) ? din_a : din_b;
generate
if(use_reg)
begin : map0
always @(posedge clk)
begin
if(valid)
begin
max_reg <= max_tmp;
min_reg <= min_tmp;
end
end
assign dout_min = min_reg;
assign dout_max = max_reg;
end
endgenerate
generate
if(~use_reg)
begin : map1
assign dout_min = min_tmp;
assign dout_max = max_tmp;
end
endgenerate
endmodule