Frage
Ich versuche, eine BCD Adder in Verilog zu schreiben, aber ich habe Probleme mit einem der Module. Genauer gesagt, der Addierer, die zwei Ziffern BCD nimmt und addiert sie. So ist die Idee, wenn die Summe der beiden Ziffern kleiner als oder gleich neun, dann ist es richtig ist. Allerdings, wenn es größer ist, dann hat ein Offset von 6 hinzugefügt werden. Hier ist mein Verilog-Code so weit:
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
Wie auch immer, wenn ich versuche, es in Xilinx zu synthetisieren, ich folgende Fehlermeldungen erhalten:
ERROR: HDLCompilers: 247 - "DIGITADD.v" Linie 33 Verweis auf skalare Draht 'c2' ist keine juristische reg oder variable L-Wert
ERROR: HDLCompilers: 247 - "DIGITADD.v" Linie 33 Verweis auf skalare Draht 's2' ist keine juristische reg oder variable L-Wert
ERROR: HDLCompilers: 42 - "DIGITADD.v" -Leitung 33 Illegal linke Seite der prozeduralen assign
Ich habe versucht, einige Dinge zu ändern, wie Draht zu reg zu ändern, aber ich kann es immer noch nicht an der Arbeit. Jede Hilfe ist willkommen.
Lösung
Okay, I figured it out, the correct code is below. Basically, see the comment I made on my question for some tips to remember. Its funny how much simpler this is compared to the mess I had earlier.
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
Andere Tipps
In plain text, do not have a continuous assignment like "assign" statement in a procedural block i.e. always or initial.
Remember the rule and life is good :-)