5

我正在尝试在 Verilog 中编写 BCD 加法器,但其中一个模块遇到了问题。具体来说,加法器采用两个 BCD 数字并将它们相加。所以,这个想法是,如果两位数之和小于或等于九,那么它是正确的。但是,如果它更大,则必须添加 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”的引用不是合法的 reg 或变量左值

错误:HDLCompilers:247 - “DIGITADD.v”第 33 行对标量线“s2”的引用不是合法的 reg 或变量左值

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

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

4

2 回答 2

11

好的,我想通了,正确的代码如下。基本上,请参阅我对我的问题所做的评论,以获取一些要记住的提示。有趣的是,与我之前的混乱相比,这要简单得多。

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 
于 2010-11-17T11:24:52.757 回答
0

在纯文本中,不要在程序块中使用类似“assign”语句的连续赋值,即始终或初始。

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

于 2018-03-30T02:43:59.140 回答