← Zurück zum BlogKombinatorische Logik

Decoder und Encoder: Eine 7-Segment-Anzeige ansteuern

Decoder übersetzen Binärwerte in One-Hot- oder Segmentausgänge, Encoder führen die Umkehrung aus. Bauen Sie einen BCD-zu-7-Segment-Treiber und lernen Sie Prioritätsencoder kennen.

DennyDenny
10 Min. Lesezeit
Chalkboard feature illustration for “Decoder und Encoder: Eine 7-Segment-Anzeige ansteuern”

Kurz gesagt: Ein aktiv-high-Binärdecoder mit Enable ordnet einen nn-Bit-Code einem von 2n2^n gesetzten Ausgängen zu; aktiv-low-Varianten kehren diese Konvention um. Ein einfacher Encoder erwartet einen One-Hot-Eingang, während ein Prioritätsencoder bei mehreren aktiven Eingängen einen Gewinner definiert. Ein BCD-zu-7-Segment-Block ist ein Codewandler und kein One-Hot-Decoder, weil mehrere Segmentausgänge gleichzeitig aktiv sein können.

Decoder und Encoder übersetzen zwischen kompakten Binärindizes und breiteren Signalgruppen. Sie erscheinen bei Adressauswahl, Instruktionssteuerung, Ereigniscodierung, Anzeige-Logik und vielen anderen Schnittstellen. Ihre Namen beschreiben die logische Richtung, aber eine vollständige Schnittstelle braucht auch Polarität, Enable-Verhalten und eine Regel für ungültige oder gleichzeitige Eingänge.

In diesem Leitfaden bauen wir einen funktionierenden BCD-zu-7-Segment-Anzeigetreiber aus booleschen Ausdrücken, unterscheiden Anzeigen mit gemeinsamer Anode und gemeinsamer Kathode, untersuchen Prioritätsencoder für Interrupts und erstellen die Schaltungen in DigiSim.

Was ist ein Decoder?

Ein Binärdecoder ist eine kombinatorische Schaltung, die einen nn-Bit-Eingang auf einen ausgewählten Ausgang aus bis zu 2n2^n Ausgängen abbildet. Im aktiv-high-Beispiel unten ist der gewählte Ausgang HIGH und alle anderen LOW. Reale Decoder-ICs besitzen oft Enable-Eingänge und können aktiv-low-Ausgänge verwenden; dann ist die ausgewählte Leitung LOW.

2-zu-4-Decoder-Lektion

Ein 2-zu-4-Decoder: Der 2-Bit-Eingang wählt einen von vier Ausgängen. Der Eingang 10 (binär 2) aktiviert Y2Y_2.

Der 2-zu-4-Decoder: Wahrheitstabelle und boolesche Ausdrücke

A1A_1A0A_0Y0Y_0Y1Y_1Y2Y_2Y3Y_3
001000
010100
100010
110001

Jeder Ausgang ist eine eindeutige UND-Kombination der Eingangsvariablen, jeweils invertiert oder nicht:

Y0=A1‾⋅A0‾Y_0 = \overline{A_1} \cdot \overline{A_0} Y1=A1‾⋅A0Y_1 = \overline{A_1} \cdot A_0 Y2=A1⋅A0‾Y_2 = A_1 \cdot \overline{A_0} Y3=A1⋅A0Y_3 = A_1 \cdot A_0

Die kanonische SOP-Schaltung verwendet zwei Inverter und vier UND-Terme mit je zwei Eingängen. Ein synthetisierter ASIC oder FPGA kann dieselbe Funktion auf andere Zellen oder Lookup-Tabellen abbilden.

Auf größere Decoder skalieren

Ein 3-zu-8-Decoder folgt demselben booleschen Muster mit acht Mintermen. Allgemein enthält eine direkte SOP-Form pro Ausgang einen Minterm. Das ist eine Lehrkonstruktion und keine universelle Vorgabe für die physische Gatterzahl; größere Decoder werden meist hierarchisch aufgebaut.

Die 7-Segment-Anzeige

Eine 7-Segment-Anzeige stellt Dezimalziffern mit sieben LEDs in einer Achtform dar. Jedes Segment heißt a bis g:

 ━━━━━ (a)
│     │
(f)   (b)
│     │
 ━━━━━ (g)
│     │
(e)   (c)
│     │
 ━━━━━ (d)

Um eine Ziffer von 0 bis 9 anzuzeigen, beleuchten wir die passende Segmentkombination. Die Ziffer „7“ benötigt beispielsweise die Segmente a, b und c; d, e, f und g bleiben aus.

Gemeinsame Kathode und gemeinsame Anode

7-Segment-Anzeigen gibt es in zwei physischen Konfigurationen. Der Unterschied ist für den Treiber entscheidend:

  • Gemeinsame Kathode: Alle LEDs teilen einen gemeinsamen Masseanschluss (Kathode). Ein Segment leuchtet, wenn seine Anode HIGH angesteuert wird. Die Decoder-Ausgänge sind aktiv-high: Eine logische 1 schaltet das Segment ein.
  • Gemeinsame Anode: Alle LEDs teilen eine gemeinsame positive Versorgung (Anode). Ein Segment leuchtet, wenn seine Kathode LOW gezogen wird. Die Decoder-Ausgänge müssen aktiv-low sein: Eine logische 0 schaltet das Segment ein.

Die logische 7-Segment-Komponente von DigiSim verwendet aktiv-high-Segmentbefehle. Bei einer physischen Anzeige ist die Ausgangspolarität nur ein Teil der Schnittstelle: Verwenden Sie Strombegrenzung, prüfen Sie, ob der Treiber den nötigen Strom liefern oder senken kann, und beachten Sie die Leistungsgrenzen pro Segment und Gehäuse.

Wichtige Erkenntnis: Dies ist KEIN einfacher Decoder

Ein 7-Segment-Decoder unterscheidet sich grundsätzlich von einem Standard-Binärdecoder. Ein 4-zu-16-Decoder aktiviert genau EINEN Ausgang. Ein 7-Segment-Decoder aktiviert mehrere Segmente gleichzeitig – bei der Ziffer „8“ alle sieben. Es handelt sich um eine kombinatorische Schaltung mit sieben unabhängigen Ausgangsfunktionen, die jeweils aus demselben 4-Bit-BCD-Eingang abgeleitet werden.

BCD-zu-7-Segment: Wahrheitstabelle

BCD (Binary Coded Decimal) verwendet vier Bit für die Ziffern 0 bis 9. Der Decoder bildet jede Ziffer auf das passende Segmentmuster ab:

ZifferDDCCBBAAabcdefg
000001111110
100010110000
200101101101
300111111001
401000110011
501011011011
601101011111
701111110000
810001111111
910011111011

BCD-Werte 10 bis 15 gehören nicht zum Dezimalzifferncode. Ihre Anzeigemuster sind eine Systementscheidung: Definieren Sie eine leere Anzeige, ein Fehlersymbol, Hexadezimalzeichen A–F oder Don’t-Care-Verhalten entsprechend dem Vertrag.

Boolesche Ausdrücke für Segmentausgänge herleiten

Jedes der sieben Segmente besitzt eine eigene boolesche Funktion der vier BCD-Eingänge DD, CC, BB, AA. Ermitteln Sie, bei welchen Ziffern ein Segment leuchtet, schreiben Sie die Summe der Produkte oder minimieren Sie sie mit Karnaugh-Diagrammen.

Segment a (oben waagerecht)

Segment a leuchtet bei 0, 2, 3, 5, 6, 7, 8 und 9 und bleibt bei 1 und 4 aus. Die Minterme mit a=1a=1 sind:

a=D‾ C‾ B‾ A‾+D‾ C‾ B A‾+D‾ C‾ B A+D‾ C B‾ A+D‾ C B A‾+D‾ C B A+D C‾ B‾ A‾+D C‾ B‾ Aa = \overline{D}\,\overline{C}\,\overline{B}\,\overline{A} + \overline{D}\,\overline{C}\,B\,\overline{A} + \overline{D}\,\overline{C}\,B\,A + \overline{D}\,C\,\overline{B}\,A + \overline{D}\,C\,B\,\overline{A} + \overline{D}\,C\,B\,A + D\,\overline{C}\,\overline{B}\,\overline{A} + D\,\overline{C}\,\overline{B}\,A

Nach Minimierung mit einem Karnaugh-Diagramm (BCD-Eingänge 10–15 als Don’t-Cares) ergibt sich:

a=D+B+(A⋅C)+(A‾⋅C‾)a = D + B + (A \cdot C) + (\overline{A} \cdot \overline{C})

Äquivalent gilt a=D+B+A⊕C‾a = D + B + \overline{A \oplus C}, also XNOR von AA und CC.

Segment g (Mitte waagerecht)

Segment g leuchtet bei 2, 3, 4, 5, 6, 8 und 9 und bleibt bei 0, 1 und 7 aus. Der minimierte Ausdruck ist:

g=D+(B⊕C)+(B⋅A‾)g = D + (B \oplus C) + (B \cdot \overline{A})

Ausgeschrieben: g=D+(B⋅C‾)+(B‾⋅C)+(B⋅A‾)g = D + (B \cdot \overline{C}) + (\overline{B} \cdot C) + (B \cdot \overline{A}).

Segment d (unten waagerecht)

Segment d leuchtet bei 0, 2, 3, 5, 6, 8 und 9 und bleibt bei 1, 4 und 7 aus. Der minimierte Ausdruck ist:

d=D+(C‾⋅A‾)+(C‾⋅B)+(B⋅A‾)+(C⋅B‾⋅A)d = D + (\overline{C} \cdot \overline{A}) + (\overline{C} \cdot B) + (B \cdot \overline{A}) + (C \cdot \overline{B} \cdot A)

Die übrigen vier Segmente (b, c, e, f) werden genauso hergeleitet: Minterme auflisten, die Policy für ungültige Eingänge festlegen, das Ergebnis auf einem Karnaugh-Diagramm eintragen und einen minimierten Ausdruck ablesen. Kommerzielle Treiber der 74x47/48-Familie implementieren festgelegtes BCD-zu-Segment-Verhalten; ihre internen Netze müssen diesen Gleichungen nicht entsprechen.

Ungültige BCD-Eingänge behandeln

BCD verwendet nur 0 bis 9, ein 4-Bit-Eingang kann aber 10 bis 15 darstellen. Was soll die Anzeige für solche Werte zeigen?

  1. Anzeige leeren: Alle Segmente aus. Das Ergebnis ist definiert, kann aber einen Upstream-Fehler verbergen, wenn kein Diagnosepfad existiert.
  2. Don’t-Care behandeln: 10–15 als Optimierungsfreiheiten verwenden. Das kann die Logik vereinfachen, ist aber nur sicher, wenn diese Eingänge für die Anzeige nicht relevant werden können.
  3. Hexadezimal anzeigen: Für eine Hex-Anzeige bilden 10–15 auf A bis F ab; dafür werden zusätzliche Segmentmuster benötigt.

Die obigen Ausdrücke verwenden die Don’t-Care-Variante. Der spezielle BCD-zu-7-Segment-Leitfaden leitet alle sieben Funktionen her und erklärt, wann diese Annahme sicher ist.

Einen 7-Segment-Treiber in DigiSim bauen

Folgen Sie diesen Schritten für einen funktionierenden Anzeigetreiber:

  1. BCD-Eingänge platzieren: Fügen Sie vier INPUT_SWITCH-Komponenten hinzu und beschriften Sie sie mit DD, CC, BB und AA.
  2. Komplemente erzeugen: Platzieren Sie vier NICHT-Gatter für D‾\overline{D}, C‾\overline{C}, B‾\overline{B} und A‾\overline{A}.
  3. Segmentlogik bauen: Implementieren Sie für jedes Segment (a bis g) den booleschen Ausdruck mit UND- und ODER-Gattern. Beginnen Sie mit Segment a und dem minimierten Ausdruck oben.
  4. Anzeige anschließen: Platzieren Sie SEVEN_SEGMENT_DISPLAY und verbinden Sie jeden Segmentausgang mit dem passenden Eingang.
  5. Systematisch testen: Schalten Sie alle gültigen BCD-Werte 0000 bis 1001 durch und prüfen Sie jede angezeigte Ziffer.

Als Abkürzung können Sie die Komponente DIGIT_DISPLAY verwenden. Beim Gatteraufbau sollten Sie alle zehn gültigen Ziffern und alle sechs ungültigen Codes prüfen, statt bei einem sichtbaren Beispiel aufzuhören.

Was ist ein Encoder?

Ein Encoder führt die inverse Operation eines Decoders aus. Er nimmt 2n2^n Eingangsleitungen (von denen höchstens eine aktiv sein sollte) und erzeugt einen nn-Bit-Binärwert, der den aktiven Eingang identifiziert.

FunktionDecoderEncoder
RichtungBinärcode zu One-HotOne-Hot zu Binärcode
Eingangnn Bit2n2^n Leitungen
Ausgang2n2^n Leitungennn Bit
BeispielAdresse zu Speicher-Chip-SelectTastaturtaste zu Scan-Code

Einfacher 4-zu-2-Encoder

Ein einfacher 4-zu-2-Encoder besitzt vier Eingänge (D3D_3, D2D_2, D1D_1, D0D_0) und zwei Ausgänge (Y1Y_1, Y0Y_0). Die booleschen Ausdrücke sind:

Y1=D2+D3Y_1 = D_2 + D_3 Y0=D1+D3Y_0 = D_1 + D_3

Das funktioniert nur, wenn zu jeder Zeit genau ein Eingang aktiv ist. Sind mehrere aktiv, wird der Ausgang mehrdeutig.

Prioritätsencoder

In realen Systemen können mehrere Eingänge gleichzeitig aktiv sein. Ein Prioritätsencoder löst diese Mehrdeutigkeit, indem er nur den aktiven Eingang mit der höchsten Priorität codiert (typischerweise den höchsten Index).

D3D_3D2D_2D1D_1D0D_0Y1Y_1Y0Y_0GültigCodierter Eingang
0000XX0keiner
0001001D0D_0
001X011D1D_1
01XX101D2D_2
1XXX111D3D_3 (höchste Priorität)

Die X-Einträge bedeuten „Don’t-Care“. Eingänge mit niedrigerer Priorität werden ignoriert, sobald ein höherer aktiv ist. Der Gültig-Ausgang zeigt, ob überhaupt ein Eingang aktiv ist – wichtig, wenn die nachgelagerte Logik „Eingang 0 aktiv“ von „kein Eingang aktiv“ unterscheiden muss.

Prioritätsencoder in der Interrupt-Behandlung

Eine wichtige Anwendung sind Interrupt-Controller. In einem Mikroprozessorsystem können mehrere Geräte (Tastatur, Netzwerkkarte, Timer, Laufwerk) gleichzeitig über Interruptleitungen die CPU anfordern.

Ein Prioritätsencoder kann die höchste zulässige Anfrage bestimmen und ihren Index ausgeben. Ein vollständiger Interrupt-Controller speichert zusätzlich wartende Ereignisse, wendet Masken und Prioritätszustand an, liefert eine protokolldefinierte Interrupt-ID oder einen Vektor, verfolgt die Bearbeitung und bewahrt nicht ausgewählte Anfragen. Ein zustandsloser Encoder kann Anfragen niedriger Priorität allein nicht halten.

Der Intel 8259A ist ein historisches Beispiel für einen Controller, der Anfrage, Maske, In-Service-Zustand, Prioritätsauflösung und Vektorerzeugung verbindet. Das gesamte Gerät auf einen 8-Eingangs-Encoder zu reduzieren, würde seine Zustandsfunktionen verfehlen.

Einen 3-zu-8-Decoder in DigiSim bauen

So entsteht ein vollständiger 3-zu-8-Decoder:

  1. Eingänge platzieren: Fügen Sie drei INPUT_SWITCH-Komponenten mit den Bezeichnungen A2A_2, A1A_1 und A0A_0 hinzu.
  2. Komplemente erzeugen: Platzieren Sie drei NICHT-Gatter für A2‾\overline{A_2}, A1‾\overline{A_1} und A0‾\overline{A_0}.
  3. UND-Array bauen: Platzieren Sie acht 3-Eingangs-UND-Gatter. Jedes erhält eine eindeutige Kombination aus ursprünglichen und invertierten Eingängen:
    • Y0=A2‾⋅A1‾⋅A0‾Y_0 = \overline{A_2} \cdot \overline{A_1} \cdot \overline{A_0}
    • Y1=A2‾⋅A1‾⋅A0Y_1 = \overline{A_2} \cdot \overline{A_1} \cdot A_0
    • Y2=A2‾⋅A1⋅A0‾Y_2 = \overline{A_2} \cdot A_1 \cdot \overline{A_0}
    • … und so weiter bis …
    • Y7=A2⋅A1⋅A0Y_7 = A_2 \cdot A_1 \cdot A_0
  4. Ausgänge hinzufügen: Verbinden Sie jeden UND-Ausgang mit einer OUTPUT_LIGHT. Beim Umschalten der Eingänge sollte immer genau eine Lampe leuchten.
  5. Enable ergänzen (optional): Verknüpfen Sie jeden Ausgang mit einem Enable-Signal, um einen aktivierbaren Decoder für die Speicheradressierung zu erhalten.

Anwendungen

Speicheradressdecodierung

In Prozessorsystemen helfen Decoder bei der Auswahl des Speicher- oder I/O-Ziels für eine Adresse. Ein 2-zu-4-Decoder an zwei oberen Adressbits kann einen Bereich in vier gleich große Zweierpotenz-Regionen teilen. Weitere Adressbits und Zugriffsqualifikationen sind für zusätzliche Abbildungen nötig. Teilen Ziele einen Tristate-Bus, muss die Bussteuerung höchstens einen aktivierten Ausgang sicherstellen; viele moderne On-Chip-Verbindungen verwenden statt interner Tristate-Leitungen multiplexierte Antworten.

Tastaturcodierung

Eine gescannte Tastenmatrix liefert Zeilen- und Spaltenbeobachtungen. Ein Prioritätsencoder kann mehrere aktive Spalten absichtlich auf einen Index reduzieren, verliert dann aber andere gleichzeitig gedrückte Tasten. Für echtes Multi-Key-Rollover muss der vollständige Matrixzustand bewahrt und verarbeitet werden. Elektrisches Ghosting, Entprellung, Scan-Code-Erzeugung und Priorität sind getrennte Probleme.

Anzeigesysteme

BCD-zu-7-Segment-Wandlung kommt in Uhren, Messgeräten, Haushaltsgeräten und Anzeigetafeln vor. Bei einer multiplexierten Anzeige teilen sich mehrere Stellen den Segmenttreiber. Der Controller präsentiert ein Muster, aktiviert die passende Stelle und fährt dann fort. Wählen Sie Bild- und Stellenfrequenzen nach Flimmern, Kamera, Helligkeit, Tastgrad und Gerätegrenzen; es gibt keine universelle 1-kHz-Schwelle. Fügen Sie Blankings ein, wenn Treiber- und Stellenverzögerungen sonst Geistersegmente erzeugen.

Instruktionsdecodierung in CPUs

In einer kleinen Lehr-CPU kann ein 4-Bit-Opcode einen 4-zu-16-Decoder speisen, dessen ausgewählte Leitung während des Fetch-Decode-Execute-Zyklus zu ALU-, Register- und Speichersteuerung beiträgt. Reale Instruktionsdecoder können hierarchisch, tabellengesteuert, mikroprogrammiert oder verteilt sein; Steuersignale verbinden Opcodeinformationen normalerweise mit Zeit- und weiteren Instruktionsfeldern.

Timing und Hazards

Kombinatorische Ausgänge ändern sich nicht gleichzeitig. Wenn mehrere Eingangsbits wechseln, kann ein Mintermdecoder wegen unterschiedlicher Verzögerungen kurz den alten Ausgang, keinen Ausgang oder in physischer Hardware einen unbeabsichtigten Ausgang auswählen. Ein 7-Segment-Netz kann vorübergehend ein Übergangsmuster anzeigen.

Verwenden Sie registrierte Ein- oder Ausgänge, wenn der Verbraucher synchron abtastet. Blanken Sie bei einer multiplexierten Anzeige während des Wechsels von Stelle und Muster, falls Ghosting relevant ist. Bei Chip-Selects und Write-Enables analysieren Sie Hazards und erfüllen die Timing-Anforderungen des Zielgeräts; verlassen Sie sich nicht allein auf eine statische Wahrheitstabelle.

Selbst ausprobieren

  1. 2-zu-4-Decoder bauen: Verwenden Sie vier UND-Terme mit passenden Invertern. Prüfen Sie, dass jede aktivierte Eingabekombination genau einen HIGH-Ausgang erzeugt und im deaktivierten Zustand keiner aktiv ist.
  2. 7-Segment-Anzeige verdrahten: Implementieren Sie die booleschen Ausdrücke mindestens für a und g selbst und verbinden Sie sie mit SEVEN_SEGMENT_DISPLAY.
  3. 4-zu-2-Encoder erstellen: Codieren Sie, welche von vier Tasten gedrückt wird, in einen 2-Bit-Binärwert.
  4. Prioritätslogik ergänzen: Lassen Sie bei zwei gleichzeitig gedrückten Tasten die Taste mit der höheren Nummer gewinnen.
  5. BCD-Zähler mit Anzeige bauen: Verbinden Sie einen COUNTER mit dem 7-Segment-Decoder und beobachten Sie die automatische Folge 0 bis 9.

Fahren Sie mit Zählern und Zustandsautomaten fort, um den Decoder mit einem Zählsignal zu speisen, oder öffnen Sie die UND-Gatterreferenz – das Grundelement für jeden Decoderausgang. Multiplexer lösen das inverse Routingproblem; siehe der Multiplexer-Leitfaden.

Referenzen

Machen Sie aus der Idee eine funktionierende Schaltung.