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.
Wir definieren den Vektor 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 |
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:
(
meint das Element mit Index 0 des Vektors)
Damit wird also der Ausgangsvektor z zu:
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.
erfährt keine Änderung, ist also direkt
.
Betrachten wir nun : Man sieht, dass
ab 10 invertiert wird. Hier würde also ein steuerbarer Inverter helfen, der sobald
gesetzt ist
invertiert. Und genau sowas lässt sich mit einem XOR realisieren:
ist etwas schwieriger zu Realisieren. Genau betrachtet ist
entweder
für x < 10 oder nur 1 wenn
. Um nun
aus zu blenden, sobald wir über 10 sind, UND-verknüpfen wir es mit
und ODERn alles zusammen:
muss nur noch ausgeblendet werden, sobald wir über 10 kommen:
Der gesamte Ausgabevektor y ist daher:
Hier nun die Implementation, getestet mit dem Programm „LogicCircuit“:
Und so sieht eine mögliche Anwendung innerhalb der selben Software aus: