====== 4-Bit Binärzahl zu 2 stellig BCD ======
BCD Zahlen, oder auch Binary Coded Decimals, kodieren die Zahlen 0-9 in 4-Bit. Das ist nützlich, da man so etwas Redundanz hat für sicherheitskritische Anwendungen, aber auch, weil man nette BCD zu 7-Segment Anzeigen Konverter bauen kann. Leider gibt es den Nachteil, dass man nicht ohne weiteres eine 4-Bit Binärzahl, wie sie z.B aus einem Volladdierer kommt, anzeigen kann, da diese einen Zahlenbereich von 0 bis 15 hat.\\
Um das zu lösen wird hier eine kleine Schaltung vorgestellt, die eine 4-Bit Zahl entgegen nimmt und zwei BCD Zahlen ausgibt, jeweils eine für die beiden Stellen der dezimalen Darstellung.
===== Theorie =====
Wir definieren den [[theory:math:vectors|Vektor]] x = (matrix{4}{1}{x_0 x_1 x_2 x_3}) als Eingabe in das System und die Vektoren y und z als Ausgabe. Der Vektor y ist dabei die einer-Stelle der resultierenden Dezimal Zahl, z die Zehner-Stelle(x = zy).\\
Um die Funktionsweise zu verstehen schauen wir uns zuerst die Wahrheitstabelle an:\\
^ Dezimal ^ Binär ^ ^ z ^ y ^
| 0 | 0000 | | 0000 | 0000 |
| 1 | 0001 | | 0000 | 0001 |
| 2 | 0010 | | 0000 | 0010 |
| 3 | 0011 | | 0000 | 0011 |
| 4 | 0100 | | 0000 | 0100 |
| 5 | 0101 | | 0000 | 0101 |
| 6 | 0110 | | 0000 | 0110 |
| 7 | 0111 | | 0000 | 0111 |
| 8 | 1000 | | 0000 | 1000 |
| 9 | 1001 | | 0000 | 1001 |
| 10 | 1010 | | 0001 | 0000 |
| 11 | 1011 | | 0001 | 0001 |
| 12 | 1100 | | 0001 | 0010 |
| 13 | 1101 | | 0001 | 0011 |
| 14 | 1110 | | 0001 | 0100 |
| 15 | 1111 | | 0001 | 0101 |
===== Übertragungsfunktion für z =====
Man sieht, dass z als Zahl entweder 0 oder 1 ist, daher generell nur das niederwertigste Bit verändert wird. Die Bedingung für den Wechsel auf 1 ist relativ einfach und direkt ablesbar:\\
z_0 = (x_3 ∧ x_1) ∨ (x_3 ∧ x_2) (z_0 meint das Element mit Index 0 des Vektors)\\ \\
\\
Damit wird also der Ausgangsvektor z zu:\\
z = (matrix{4}{1}{{(x_3 ∧ x_1) ∨ (x_3 ∧ x_2)} 0 0 0})\\
===== Übertragungsfunktion für y =====
Betrachten wir nun y. Hier wird es etwas schwieriger, da ab einer Eingabe von 10 wieder bei 0 angefangen werden muss zu zählen. Was aber auch bedeutet, dass man erst ab 10 etwas an den Bits ändern muss!\\
Schauen wir uns y nun mal Bit für Bit in der Wahrheitstabelle an.\\
y_0 erfährt keine Änderung, ist also direkt x_0.\\
Betrachten wir nun y_1: Man sieht, dass y_1 ab 10 invertiert wird. Hier würde also ein steuerbarer Inverter helfen, der sobald z_0 gesetzt ist x_1 invertiert. Und genau sowas lässt sich mit einem XOR realisieren:\\
y_1 = x_1 ⊕ z_0\\
\\
y_2 ist etwas schwieriger zu Realisieren. Genau betrachtet ist y_2 entweder x_2 für x < 10 oder nur 1 wenn x_3 ∧ x_2 ∧ x_1. Um nun x_2 aus zu blenden, sobald wir über 10 sind, UND-verknüpfen wir es mit overline{z_0} und ODERn alles zusammen:\\
y_2 = (x_2 ∧ z_0) ∨ (x_3 ∧ x_2 ∧ x_1) \\ \\
y_3 muss nur noch ausgeblendet werden, sobald wir über 10 kommen:\\
y_3 = x_3 ∧ overline{z_0}\\ \\
Der gesamte Ausgabevektor y ist daher:\\
y = (matrix{4}{1}{{x_0} {x_1 ⊕ z_0} {(x_2 ∧ z_0) ∨ (x_3 ∧ x_2 ∧ x_1)} {x_3 ∧ overline{z_0}}})
===== Implementation =====
Hier nun die Implementation, getestet mit dem Programm "LogicCircuit":\\
{{:theory:circuits:schaltungs-projekt.binary2bcd.png?800|Implementation des 4-Bit Binär zu BCD Konverter}}\\ \\
Und so sieht eine mögliche Anwendung innerhalb der selben Software aus:\\
{{:theory:circuits:schaltungs-projekt.4-bit-volladdierer-test.png?800|4-Bit2BCD im Einsatz}}
===== Weiterführendes =====
[[http://www.proggen.org/forum/viewtopic.php?f=39&t=5923|Diskussionsthread im Forum]]