问题很简单,我听说assign out = (a>b)?a:b
错了。这是错的吗?如果是,是否有其他方法可以找到MAX?
答案 0 :(得分:3)
当且仅当out
是wire
时才是正确的。如果它是一个寄存器,那么你必须做这样的事情:
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
答案 3 :(得分:-1)
您可以使用减法器来完成此操作。使用减法器的面积成本更低且更快 - 如果fpga具有子/添加组件或算术子/添加操作支持并且没有使用comperator组件。
http://teahlab.com/4-Bit_Signed_Comparator/
最后检查布尔函数。你只检查3位。
抱歉我的英文。