Verilog:接受两个4位输入并输出4位输出的模块 接受两个名为i_a和i_b的四位输入 输出一个名为o_sum的四位数字 如果总和大于1111,则输出名为o_err的一位数字 使用always@块连续添加两个输入,并将结果总和和错误位分配给输出
刚接触verilog,有人能告诉我我做得对吗Verilog:接受两个4位输入并输出4位输出的模块 接受两个名为i_a和i_b的四位输入 输出一个名为o_sum的四位数字 如果总和大于1111,则输出名为o_err的一位数字 使用always@块连续添加两个输入,并将结果总和和错误位分配给输出,verilog,Verilog,刚接触verilog,有人能告诉我我做得对吗 module add4 ( o_sum, // Sum out o_err, // Error out i_a, // Addend A i_b, // Addend B ); output reg [3:0] o_sum; output reg [1:0] o_err; input [3:0] i_a, i_b; always@( * ) begin if ( o_sum = i_a + i_b
module add4 (
o_sum, // Sum out
o_err, // Error out
i_a, // Addend A
i_b, // Addend B
);
output reg [3:0] o_sum;
output reg [1:0] o_err;
input [3:0] i_a, i_b;
always@( * )
begin
if ( o_sum = i_a + i_b >1111 )
o_sum = o_err;
else
o_sum = i_a + i_b;
end
endmodule
你的代码中有很多错误
output reg[1:0]o_err代码>你说o_err是1位,它应该是输出reg o_err
o_sum=o_err代码>您的o_和将不会是4位
if(o_sum=i_a+i_b>1111)
由于o_sum为4位,因此无法计算o_sum是否大于1111。此外,它应该是4'b1111,否则它是一个十进制数module add4 (
o_sum, // Sum out
o_err, // Error out
i_a, // Addend A
i_b, // Addend B
);
output reg [3:0] o_sum;
output wire o_err;
input [3:0] i_a, i_b;
reg carry;
always@( * )
{carry, o_sum} = i_a + i_b;
assign o_err = (carry == 1)?1'b1:1'b0;
endmodule
另外,请尝试使用testbench测试您的设计的正确性。成员们会更好地理解这一点。您的“o_err”是一个2位信号,而不是描述中的一位,
1111
是一个十进制数,您可能指的是二进制数。不要将作业置于“如果”状态。没有必要将o_err分配给o_sum。我看到了?1:0
反模式足够了,我发誓一定有人在教它。三元结构是完全冗余的。只要让测试保持原样,它就会等效地工作。在这种情况下,我会更进一步,直接在add的进位处出错。你是对的。这本可以做到的。我这样做是为了让它看起来更简单