使用Verilog设计模块输出中位数,尽可能较少资源使用
在海康的FPGA设计岗面试中,有一道代码题,如下:
使用Verilog设计一个模块:输入3个无符号8bit数据,设计模块输出中位数,尽可能较少资源使用。
代码如下:
module median_of_3 #(parameter WIDTH = 8
)(input clk ,input [WIDTH-1:0] A ,input [WIDTH-1:0] B ,input [WIDTH-1:0] C ,output reg [WIDTH-1:0] Median_of_abc
);// definewire a_ge_b, b_ge_c, c_ge_a;reg [WIDTH-1:0] abc_median;// 比较逻辑assign a_ge_b = (A >= B) ? 1'b1 : 1'b0;assign b_ge_c = (B >= C) ? 1'b1 : 1'b0;assign c_ge_a = (C >= A) ? 1'b1 : 1'b0;// 多路选择器逻辑,不用进行全比较,节省资源always @(*) beginif (!a_ge_b && !b_ge_c && c_ge_a) // A < B < Cabc_median = B;else if ( a_ge_b && b_ge_c && !c_ge_a) // C < B < Aabc_median = B;else if ( a_ge_b && !b_ge_c && !c_ge_a) // B < C < Aabc_median = C;else if (!a_ge_b && b_ge_c && c_ge_a) // A < C < Babc_median = C;elseabc_median = A;end// 输出寄存器:时序逻辑always @(posedge clk) beginMedian_of_abc <= abc_median;endendmodule
此外:1)在实际项目中,如果允许两级流水线延迟,可在a_ge_b, b_ge_c, c_ge_a处插入一级寄存器,增加性能;
2)修改多路选择器的逻辑关系,可变为求三个数的最大值,也可变为求三个数的最小值,消耗的资源和时序性能不变。