Verilog中的BCD加法器

6

我正在尝试用Verilog编写BCD加法器,但是其中一个模块出了问题。具体来说,这个加法器需要将两个BCD数字相加。如果这两个数字的和小于或等于9,则正确。但是,如果它大于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'不是合法的寄存器或变量lvalue ERROR:HDLCompilers:247 - "DIGITADD.v" 第33行 引用标量线路's2'不是合法的寄存器或变量lvalue ERROR:HDLCompilers:42 - "DIGITADD.v" 第33行 过程分配的左侧不合法
我尝试了一些更改,例如将wire更改为reg,但仍无法使其正常工作。任何帮助都将不胜感激。

1
没关系,我现在弄明白了。基本上只是verilog很烦人,但是如果有人遇到同样的问题,这里有几个提示。 1.不要将assign语句放在always块中 2.在这种情况下,wire应该是reg 3.基本上,你声明reg [4:0] s2并分配SUM = s2[3:0]和COUT s2[4] 4.然后逻辑就容易多了 - DemonicImpact
2个回答

12

好的,我弄明白了,正确的代码如下。基本上,查看我在问题中提到的评论以获取一些记忆提示。真有趣,与我之前的混乱相比,这简单多了。

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 

-1

在普通文本中,不要像过程块中的“assign”语句一样有连续的赋值,例如always或initial。

记住这个规则,生活会更美好:-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接