Forum: FPGA, VHDL & Co. ripple carry addierer


von Bob H. (Firma: hinter den 7 bergen) (bob128)


Angehängte Dateien:

Lesenswert?

Hi,

ich versuche gerade eine vhdl übungsaufgabe nachzuvollziehen code ist 
angehängt ich kapier das Synthese ergebnis net ganz (siehe screenshot)
wie man darauf sieht kommt bei dieser Operation:

      0011  (A)
exor  1001  (B)
-----------------
exor  0000  (C)

=>    1100  raus

ich habs mal von hand gemacht aber ich krieg das hier raus:

      0011  (A)
exor  1001  (B)
-----------------
      1010
exor  0000  (C)

=>    1010

wenn ich die zeile richtig verstehe :
"return AIN xor BIN xor CIN;"
muss man erst A und B xor machen und dann das ergebnis xor mit C

Das ganze kommt mir vor wie ein halbaddierer aber wo in meiner rechnung 
is der denkfehler?

auch aus dem übertrag werde ich net schlau diese operation z.b.:

      0011  (A)
      1001  (B)
      0001  (C)

"return(AIN and BIN) or (AIN and CIN) or (BIN and CIN);"

A & B => 0001 => dann würde doch diese bedingung hier "(AIN and BIN)" 
richtig sein oder nicht? also müsste carry_out eine 1 ausgeben bleibt 
aber auf 0 hoffe jemand weiß rat

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> ich kapier das Synthese ergebnis net ganz (siehe screenshot)
Das ist die Waveform einer Simulation, aber kein Syntheseergebnis.
Das Ergebnis der Synthese heißt RTL-Schaltplan.

> muss man erst A und B xor machen und dann das ergebnis xor mit C
Die Reihenfolge ist egal... :-o

> dann würde doch diese bedingung hier "(AIN and BIN)"
> richtig sein oder nicht?
Diese Funktionen bearbeiten über die for-Schleife jeweils nur 1 Bit, das 
ist dir bewusst?

Der Addierer funktioniert auf jeden Fall, die Simulation passt... ;-)

von Bob H. (Firma: hinter den 7 bergen) (bob128)


Lesenswert?

hi,

ich weiß schon das die simulation passt aber mir gehts um das 
nachvollziehen wie es dazu kommt was stimmt nicht mit meiner rechung von 
hand? wieso krieg ich was anderes raus

von bobhulu (Gast)


Lesenswert?

ok kein kopfzerbrechen mehr habs raus diese zeilen hier hätte ich mir 
genauer ansehen sollen:

 SUM_VAR(I) := SUM_FUNC(A(I),B(I),CARRY_VAR(I));
 CARRY_VAR(I+1) := CARRY_FUNC(A(I),B(I),CARRY_VAR(I));

z.b. beim ersten durchlauf

 SUM_VAR(0) := SUM_FUNC(A(0),B(0),CARRY_VAR(0));
                          1    1            0
=>  AIN xor BIN xor CIN = 0

 CARRY_VAR(1) := CARRY_FUNC(A(0),B(0),CARRY_VAR(0));
                              1    1            0
=> (AIN and BIN) or (AIN and CIN) or (BIN and CIN)
    gibt 1 zurück weil AIN and BIN = 1 ergibt und damit steht für

den nächsten durchlauf in Carry_var(1)
     SUM_VAR(1) := SUM_FUNC(A(1),B(1),CARRY_VAR(1));
                              1    0            1
eine 1 drin die operation:
     =>  AIN xor BIN xor CIN = 1 xor 0 xor 1 ergibt dann 0

ich hätte mir das mit dem übertrag genauer ansehen sollen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.