Addierer/Subtrahierer

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Addierer/Subtrahierer
Hi,

kann mir jemand den Satz aus der Vorbereitungsaufgabe 2.5 für das Praktikum erklären?
“bei Subtraktion soll c = 1 eine zusätzliche Subtraktion von 1 auslösen”

Bei Subtraktion bedeutet ja x = 1, richtig?
Ich kann aber sonst nicht wirklich was mit dem Satz anfangen. Und ich denke auch, dass es an dem Satz liegt, dass
ich mit der gesamten Aufgabe nicht so zurecht komme.

Das x bestimmt, ob subtrahiert oder addiert wird (also XOR-Gatter mit den Eingängen b und x). Gleichzeitig ist
das x aber doch auch das Übertragsbit c, da ich beim Zweierkomplement ja noch 1 dazu addieren muss.
Muss ich dann alle Zeilen aus der Wahrheitstabelle streichen, in denen x und c verschieden sind, weil der Zustand
ja eigentlich nicht vorkommt?


ich weiß nicht ob dass hilft aber:

  1. Das carry bei der Subtraktion funktioniert so wie das Carry bei der addition, da ja +(-Zahl) gerechnet wird
  2. Der Satz hat mich auch verwirrt. denn eine zusätzliche subtraktion ist hier ja eigentlich eine addition
  3. Das mit dem x hast du glaube ich falsch verstanden:
    wenn du dir folie 34 von Vorlesung 24 (Arithmetik) ansiehst. Ist hier “k” nur auf den ersten C als eingang gelegt
    => k != c kann nicht vorkommen - da alle weitern c berechnet werden und nichtmehr von “k” direkt bestimmt werden.

Die 1 wird bei invertieren ja nur auf das LSB gesetzt, deswegen musst du auch die erste “1” die von k and c übertragen wird nicht auch direkt von k an weitere c übertragen

am besten du machst nochmal eine einfache Rechnung
Vorlesung 11 Folie 8

Alles oben ohne Gewähr…vielleicht sollte nochmal jemand anderes was dazu sagen.


Hi,

Man soll ja eine Add/sub zelle bauen, die dann in einem CarryRipple Addierer verwendet werden kann.
(a,b,c,x) --x=0–> a+b+c (2Komplement)
(a,b,c,x) --x=1–> a-(b+c) (2Komplement)

(hoffentlich ist die benennung richtig, hab das blatt grad nicht da)

Stell dir Schriftliche Addition vor: der übertrag wird aufs nächste mit draufgezählt.
Bei Subtraktion wird bei übertrag bei der nächsten stelle eins mehr abgezogen. c ist der übertrag aus der letzten addition.

(ain,bin,cin,x) | (cout, sout)
(1,0,1,0) | (1,0) # addition: 1+0+1 = 10
(1,0,1,1) | (0,0) # subtraktion: 1-0-1 = 00
(1,1,1,1) | (1,1) # subtraktion 1-1, ein alter übertrag=> 1-1-1 = -1 => eine neuer uebertrag -2 + 1 = -10 + 1
(0,1,1,1) | (1,0) # subtraktion 0-1, ein alter übertrarg => 0-1-1 = -2 => ein neuer übertrag = -2 + 0 = -10 + 0


@ the jonny

kann ich hier nicht einfach bin gedanklich invertieren und dann die addition normal ausführen?
D.h.

aus 1111 mache ich 1011
=> 1 + 1 = 0 => c = 1

  • 1 = 1
    => s = 1, c = 1

bzw. aus 1011 mache ich 1111
=> 1 + 1 = 0 => c = 1

  • 1 + 1 = 0 => c = 1
    1 + 1 = 0

=> s = 0, c = 0

2 HA → 1 VA
Ich hab hier auch noch ne Frage zur Aufgabe 2.2:

Ich stehe hier auf dem Schlauch. Ok, ich kann mt einem HA anfangen, da leg ich dann a und b an und bekomme ein vorläufiges s und c+1.
Das vorläufige s kann ich dann mit Hilfe des zweiten HA mit c-1 ver-exklusiv-odern, dann hab ich das richtige s.
Aber wie bekomme ich dann noch das richtige c+1 ?


Im Prinzip gibt’s da das passende Bild direkt in der Wikipedia:

1 Like

Gerade dachte ich, dass ich das mal durch ne Suchmaschine jagen muss, da ist mir siccegge wohl zuvor gekommen =)
Aha, aber man braucht dann wohl doch noch ein ODER-Gatter, das wars auch, was mich so sehr aus dem Konzept gebracht hatte…

NACHTRAG:
Meine Funktionstabelle ist beim subtrahieren jetzt genau identisch mit der beim addieren. Ich dachte das gehört sich so beim Zweier-Komplement oder ist das jetz falsch?


Sorry, ich hab schon wieder meinen eigenen Thread vergessen :slight_smile:
Danke erstmal an euch :slight_smile:

Sehe ich es also richtig, dass ich bei der Subtraktion genau dann einen Übertrag
habe, wenn ich ins Negative komme?

1-1 → S:0 C:0
0-1 → S:1 C:1
1-1-1 → S:1 C:1
0-1-1 → S:0 C:1

passt das so?


Also, macht mich jetzt nicht schwach, ich dachte man legt einfach das Zweier-Komplement an und addiert normal durch, wenn das nicht richtig ist, bitte ich hier dringend um Aufklärung !


Schaut mal auf Seite 34 GTI Folie 25 (Arithmetik) da ist die Lösung für die Aufgabe und wenn man weiß wie das Ding aussehen muss, dann kann man die Gatter auch einmal nacheinander abklappern und schauen ob seine Tabelle dafür passt.

Edit:
Exakt identisch sollte sie jedoch nicht sein.
Vergess das XOR-Gatter vor x und bi nicht!

Edit2:
Meine Tabelle (auf Basis der GTI-Folie) sieht so aus:


Also, was mich noch stört, ist der Eingang c i-1.

Wenn man den einfach wie auf Folie 34 gezeigt, an die x-Leitung (auf den Folien k)
anschließt, so ist c i-1 bei einer Addition immer gleich 0.

Ich dachte man beabsichtigt, einen vorherigen Übertrag zu berücksichtigen.

Deshalb, habe ich c i-1 noch mit x verodert.

Bei einer Addition entscheidet dann c i-1, ob eine 0 oder 1 am c-Eingang
anliegt. Bei einer Subtraktion liegt automatisch immer eine 1 an.

Ob das so gewollt ist? Ich bin mir auf jeden Fall unsicher.


das ist, glaube ich zumindest, so nicht richtig.

Wenn ich zwei Zahlen addiere fange ich immer mit dem LSB an und mein Carry-In ist ja per Definition “0”, weil ich noch nichts addiert habe.

Beispiel:

 0101   5
  • 0001 1
    0110 6

und bei einem Standard volladdierer addiert man ja nur zwei zahlen d.h. es wird kein LSB carry- In berücksichtigt.

die “1” bei der Subtraktion kommt auch nicht daher, dass man ein LSB Carry-in berücksichtigt, sondern daher, dass man beim zweier Komplement alle bits invertiert und dann + 1 rechnet und dann die zahlen addiert.

siehe auch: (Vorlesung 10 - Folie 16)


Wenn man 1 bit addiert, hat man isoliert betrachtet eigentlich keinen vorherigen Übertrag, dass war mir bewusst.
Und bei der Subtraktion stellt man so das Zweierkomplement her; das hatte ich mir auch so überlegt.

Bloß kann man trotzdem definieren, dass es einen vorherigen Übertrag gab, der eben nicht als expliziter Übertrag angesehen wird, sondern eher als Art zusätzliche Addition.
Ich dachte mir, wenn schon extra ci-1 als vorheriger Übertrag angegeben wird, dann soll man diesen wohl in der Addition benutzen.

Wahrscheinlich liegst du aber komplett richtig und das ist eher so eine Fangangabe, weil der Übertrag isoliert betrachtet, immer eine 0 ist.
:slight_smile: Das wäre dann auch konform der Vorlesungsfolien.


Mich hat die Aufgabenstellung auch leicht verwirrt, vor allem das mit dem vorherigen Übertrag bzw. Borrow. Ich hab mir das jetzt so gedacht:

Bei Addition (also x = 0) wird einfach ganz normal die Summe und das Carry-out aus der Addition von den beiden Summanden und dem Carry-In mit einem Volladdierer berechnet.

Jetzt zur Subtraktion (x = 1):
Eine 1 am Eingang c_i-1 soll jetzt eine Subtraktion von 1 bewirken. Also:

a_i - b_i - c_i-1

Da angenommen wird, dass beide Summanden im Zweierkomplement codiert sind und eine Subtraktion im Zweierkomplement nichts anderes ist als die Addition des Komplements des Subtrahenden gilt:

(der waagrechte Strich steht für das Invertierte einer Zahl)

Im Prinzip muss man bei der Subtraktion also nur den Carry-In-Eingang und b_i invertieren und dann ganz normal die Addition mit einem Volladdierer durchführen. Zum Invertieren kann man wie lemur schon richtig gesagt hat, einfach XOR-Gatter verwenden.
Ich hoffe, ich hab das so richtig verstanden.


Also, jetzt weiß ich ja gar nicht mehr was richtig ist=)
Aber wenn man den Übertrag plötzlich anders behandelt, ist es doch auch nicht mehr so, dass man einfach das Zweierkomplement durchaddiert.
Wenn man den Übertrag ganhz anders behandelt, macht man ja auch irgendwas ganz andres (denke ich zumindest).
Es steht doch extra als Hinweise da
A-B = A+(-B).
Wenn man den Übertrag anders behandelt, ist doch keine normale Addition mehr, oder ?


zwierkomplement auf 1 bit? also das tut nicht viel


Schon wahr, aber man schaltet dann diese Dinger doch für ne n bit zahl n mal hintereinander.


Das ist schon richtig. Das Summenbit ist auch genau das gleiche wie bei der Addition. Der Unterschied zeigt sich nur beim Carry-Bit:
c_i = 1, wenn a_i <= b_i + c_(i-1)

Das ist genau wie im Dezimalsystem:
7-6 = 1, Übertrag 0
7-7 = 0, Übertrag 0
7-8 = 9, Übertrag 1
Bei der letzten Rechnung wird’s komplizierter, aber das haben wir uns ja schon gedacht. Eigentlich ist 7-8 ja -1. Wir können (oder wollen) aber keine negativen Zahlen darstellen, darum speichern wir sie im Zweierkomplement. Das Einserkomplement im Dezimalsystem von 1 ist 8 (Basis-1-n), das Zweierkomplement ist 9.
Da wir jetzt aber von der höherwertigen Stelle noch 1 abziehen müssen, haben wir einen Übertrag. Das ist auch in der Aufgabenstellung gemeint. Wenn ein Übertrag von vorher da ist, löst der eine Subtraktion von 1 aus.

Darum nochmal zur Veranschaulichung als Ziffern-Array:
[1|7]-[0|8] = [1|-1] = [1|9] -[1|0] = [0|9] (Übertrag)