我正在尝试用Verilog编写BCD加法器,但是我遇到了其中一个模块的麻烦。具体来说,加法器采用两个BCD数字并将其相加。因此,这个想法是,如果两位数的总和小于或等于9,那么它是正确的。但是,如果更大,则必须添加偏移量6。到目前为止,这是我的Verilog代码:

module DIGITADD(
    input [3:0] IN_A,
    input [3:0] IN_B,
    input CIN,
    output reg COUT,
    output reg [3:0] SUM
);

wire s2, c2;

always @ ( * )
begin
 assign {c2, s2} = IN_A + IN_B + CIN;

 if(s2 <= 9 && c2 == 0) begin
  assign {COUT, SUM} = {c2, s2};
 end
 else if({c2, s2} > 9) begin
  assign {COUT, SUM} = {c2, s2 + 6};
 end
end
endmodule

无论如何,当我尝试在Xilinx中进行合成时,出现以下错误:

ERROR:HDLCompilers:247-“DIGITADD.v”行33对标量导线'c2'的引用不是合法的reg或变量lvalue

ERROR:HDLCompilers:247-“DIGITADD.v”行33对标量导线's2'的引用不是合法的reg或变量lvalue

错误:HDLCompilers:42-“DIGITADD.v”行33程序分配的左手侧非法

我尝试更改某些内容,例如将电线更改为reg,但仍然无法正常工作。任何帮助表示赞赏。

最佳答案

好的,我知道了,下面是正确的代码。基本上,请参阅我对问题的评论,以记住一些提示。有趣的是,与我之前的困惑相比,这要简单得多。

module DIGITADD(
    input [3:0] IN_A,
    input [3:0] IN_B,
    input CIN,
    output COUT,
    output [3:0] SUM
    );

reg [4:0] s2;

assign SUM = s2[3:0];
assign COUT = s2[4];

always @ ( * )
begin
    s2 = IN_A + IN_B + CIN;
    if (s2 > 9)
    begin
        s2 = s2 + 6;
    end
end
endmodule

10-04 16:00