如何在Verilog编码中找到MAX或MIN?

时间:2013-12-15 20:41:00

标签: max verilog

问题很简单,我听说assign out = (a>b)?a:b错了。这是错的吗?如果是,是否有其他方法可以找到MAX?

4 个答案:

答案 0 :(得分:3)

当且仅当outwire时才是正确的。如果它是一个寄存器,那么你必须做这样的事情:

always @* begin
  if (a>b)
    out = a;
  else
    out = b;
end

考虑到在Verilog中,reg类型的变量可以推断出一个线或一个锁存器,或一个真正的寄存器。这取决于您如何指定使用该reg的模块的行为:

组合(out实现为wire,尽管它是reg

module max (input [7:0] a, 
            input [7:0] b, 
            output reg [7:0] out);
  always @* begin
    if (a>b)
      out = a;
    else
      out = b;
  end
endmodule

组合(out实施为wire,并将其定义为wire

module max (input [7:0] a, 
            input [7:0] b, 
            output [7:0] out);
  assign out = (a>b)? a : b;
endmodule

Latch(out是一个reg,并且它被实现为一个锁存器,如果条件没有改变,它存储最后生成的结果,即a==b,btw,在这种情况下可能无法提供正确的输出)

module max (input [7:0] a, 
            input [7:0] b, 
            output reg [7:0] out);
  always @* begin
    if (a>b)
      out = a;
    else if (a<b)
      out = b;
  end
endmodule

寄存器(out实现为真正的寄存器,时钟边沿触发)

module max (input clk,
            input [7:0] a, 
            input [7:0] b, 
            output reg [7:0] out);
  always @(posedge clk) begin
    if (a>b)
      out <= a;
    else if (a<=b)
      out <= b;
  end
endmodule

答案 1 :(得分:0)

你在那里看到的对我来说是正确的。没有其他办法可以做到。

答案 2 :(得分:0)

这可用于3个输入值

module max(
    input [7:0] v1,
    input [71:0] v2,
    input [7:0] v3,
    output [7:0] max
    );

wire [7:0] v12;
wire [7:0] v23;

assign v12 = v1>=v2 ? v1 : v2;
assign v23 = v2>=v3 ? v2 : v3;

assign m = v12>=v23 ? v12 : v23;

endmodule

Synthesized

答案 3 :(得分:-1)

您可以使用减法器来完成此操作。使用减法器的面积成本更低且更快 - 如果fpga具有子/添加组件或算术子/添加操作支持并且没有使用comperator组件。

http://teahlab.com/4-Bit_Signed_Comparator/

最后检查布尔函数。你只检查3位。

抱歉我的英文。