質問

私はVerilogでBCD加算器を書き込もうとしていますが、モジュールの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

とにかく、Xilinxで合成しようとすると、次のエラーが発生します。

エラー:hdlcompilers:247- "digitadd.v" line 33スカラーワイヤへの参照 'c2'は法的regまたは可変lvalueではありません

エラー:hdlcompilers:247- "digitadd.v" line 33スカラーワイヤへの参照 'S2'は法的regまたは可変lvalueではありません

エラー:hdlcompilers:42- "digitadd.v" line 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 

他のヒント

プレーンテキストでは、常に手続きブロック、つまり常にまたは初期化する「割り当て」ステートメントのような継続的な割り当てがありません。

ルールと人生が良いことを忘れないでください:-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top