使用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
);

    // define
    wire 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 @(*) 
    begin
        if (!a_ge_b && !b_ge_c &&  c_ge_a)      // A < B < C
            abc_median = B;
        else if ( a_ge_b &&  b_ge_c && !c_ge_a) // C < B < A
            abc_median = B;
        else if ( a_ge_b && !b_ge_c && !c_ge_a) // B < C < A
            abc_median = C;
        else if (!a_ge_b &&  b_ge_c &&  c_ge_a) // A < C < B
            abc_median = C;
        else
            abc_median = A;
    end

    // 输出寄存器:时序逻辑
    always @(posedge clk) begin
        Median_of_abc <= abc_median;
    end

endmodule

此外:1)在实际项目中,如果允许两级流水线延迟,可在a_ge_b, b_ge_c, c_ge_a处插入一级寄存器,增加性能;
2)修改多路选择器的逻辑关系,可变为求三个数的最大值,也可变为求三个数的最小值,消耗的资源和时序性能不变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值