2010-11-14 10 views
5

Ich versuche, einen BCD-Addierer in Verilog schreiben, aber ich habe Probleme mit einem der Module. Genauer gesagt, der Addierer, der zwei BCD-Ziffern aufnimmt und hinzufügt. Also, die Idee ist, wenn die Summe der zwei Ziffern kleiner oder gleich neun ist, dann ist es richtig. Wenn es jedoch größer ist, muss ein Offset von 6 hinzugefügt werden. Hier ist mein Verilog-Code so weit:BCD Adder in 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 

Auch immer, wenn ich versuche, es in Xilinx zu synthetisieren, bekomme ich folgende Fehler:

ERROR: HDLCompilers: 247 - "DIGITADD.v" Linie 33 Referenz skalare Draht 'c2' ist keine juristische reg oder variable lvalue

ERROR: HDLCompilers: 247 - "DIGITADD.v" Linie 33 Verweis auf skalare Draht 's2' ist keine juristische reg oder variable lvalue

FEHLER: HDLCompilers: 42 - "DIGITADD.v" Zeile 33 Illegale linke Seite des Verfahrens assi gn

Ich habe versucht, einige Dinge wie Ändern von Draht zu reg ändern, aber ich kann immer noch nicht zur Arbeit. Jede Hilfe wird geschätzt.

+1

Es ist okay, habe ich jetzt herausgefunden. Es ist im Grunde nur Verilog nervig, aber ein paar Tipps nur für den Fall, dass jemand dies findet und das gleiche Problem hat. 1. Setzen Sie keine Assign-Anweisungen in immer Blöcke 2. In diesem Fall sollte Draht sein reg 3. Grundsätzlich deklarieren Sie reg [4: 0] s2 und zuweisen SUM = s2 [3: 0] und COUT s2 [4] 4. Dann ist es viel einfacher, die Logik zu tun – DemonicImpact

+0

Sie können Ihre eigene Antwort hinzufügen und dann akzeptieren. Auf diese Weise wird diese Frage nicht in der Liste der unbeantworteten Fragen angezeigt. – George

+0

Okay danke. Ich wusste das nicht, für den Fall, dass es nicht offensichtlich ist, bin ich immer noch etwas neu. – DemonicImpact

Antwort

10

Okay, ich habe es herausgefunden, der richtige Code ist unten. Sehen Sie sich den Kommentar zu meiner Frage an, um einige Tipps zu erhalten. Es ist witzig, wie viel einfacher das ist verglichen mit dem Durcheinander, das ich früher hatte.

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