5

Verilog で BCD Adder を作成しようとしていますが、モジュールの 1 つに問題があります。具体的には、2 つの BCD 桁を取得して加算する加算器です。つまり、2 桁の合計が 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

とにかく、ザイリンクスで合成しようとすると、次のエラーが発生します。

ERROR:HDLCompilers:247 - "DIGITADD.v" 行 33 スカラー ワイヤ 'c2' への参照は、正当な reg または変数左辺値ではありません

ERROR:HDLCompilers:247 - "DIGITADD.v" 行 33 スカラー ワイヤ 's2' への参照は、正当な reg または変数左辺値ではありません

ERROR: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 に答える