Verilog中的BCD加法器

时间:2010-11-14 19:48:52

标签: sum verilog hdl bcd

我正在尝试在Verilog中编写BCD Adder,但我遇到了其中一个模块的问题。具体来说,加法器采用两个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中进行综合时,我会遇到以下错误:

错误:HDLCompilers:247 - “DIGITADD.v”第33行参考标量线'c2'不是合法的注册或变量左值

错误:HDLC编译器:247 - “DIGITADD.v”第33行参考标量线's2'不是合法的注册或变量左值

错误:HDLCompilers:42 - “DIGITADD.v”第33行程序转让的非法左侧

我尝试改变一些事情,例如将电线换成reg,但我仍然无法让它工作。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:10)

好的,我弄清楚了,正确的代码如下。基本上,请参阅我在问题上提出的评论,以便记住一些提示。有趣的是,这与我之前的混乱相比有多简单。

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 :(得分:0)

在纯文本中,在程序块中没有像“assign”语句那样的连续赋值,即始终或初始。

记住规则和生活是好的: - )