Digitale Logik selbst entwickeln – Von 0 und 1 zum FPGA
Autor: Vincent Himpe
Kapitel 1: Es war einmal... Boolesche Algebra
1.1: Die Operatoren
1.2: Die grundlegenden Gesetze
1.2.1: Die Basisregeln
1.2.2: Beweisführung
1.3: Erweiterte Regeln
1.3.1: Kommutativgesetz
1.3.2: Assoziativgesetz
1.3.3: Distributivgesetz
1.3.4: Absorptionsgesetz
1.4: Die Gesetze von De Morgan
1.5: Übersicht der Rechenregeln
1.5.1: AND mit einer Konstante
1.5.2: OR mit Konstante
1.5.3: Inverter
1.5.4: Operationen mit der eigenen Inversen
1.5.5: Kommutativgesetz
1.5.6: Assoziativgesetz
1.5.7: Distributivgesetz
1.5.8: Absorptionsgesetz
1.5.9: De Morgan
Kapitel 2: Die Zahlensysteme
2.1: Das binäre System
2.1.1: Binäre Notationen
2.1.2: Zählen in binär
2.1.3: Spezielle binäre Codes
2.2: Das hexadezimale Zahlensystem
2.2.1: Zählen in HEX
2.3: Konvertierung von Zahlensystemen
2.3.1: Konvertierung von und nach Binär
2.3.2: Konvertierung von und nach HEX
2.3.3: Konvertierung zwischen HEX und Binär
2.3.4: Oktal und andere Zahlensysteme
2.4: Notation der Basis
Kapitel 3: Logische Gleichungen
3.1: Einfache Gleichungen
3.2: Wahrheitstabellen
3.2.1: Aufstellen der Eingangskombinationen
3.2.2: Das Ausfüllen der Ausgangszustände
Kapitel 4: Optimierung logischer Gleichungen
4.1: Boolesche Algebra und De Morgan
4.2: Karnaugh-Diagramme
4.2.1: Aufbau des Diagramms
4.2.2: Ausfüllen des Diagramms
4.2.3: Lösen eines KV-Diagramms
4.2.4: Karnaugh für Nullterme
4.3: Quine-McCluskey
4.3.1: Der QM-Algorithmus
4.3.2: Zusammenfassung
Kapitel 5: Die Basisgatter
5.1: Die grundlegenden Gatter
5.1.1: NOT
5.1.2: AND
5.1.3: OR
5.2: Abgeleitete Gatter
5.2.1: NAND
5.2.2: NOR
5.2.3: XOR
5.2.4: XNOR
5.2.5: Majority-Gatter
5.3: Transponieren von Gattern
5.3.1: Zusammenfügen und Aufteilen von Gattern
5.4: Positive Logik gegen negative Logik
5.5: Übersicht über die Basisgatter
Kapitel 6: Kombinatorische Systeme
6.1: Encoder und Dekoder
6.1.1: Encoder
6.1.2: Priority Encoder
6.1.3: Dekoder
6.1.4: Transcoder
6.1.5: Praktische Methode, um schnell Transcoder zu erzeugen
6.1.6: Zusammenfassung
6.2: Multiplexer und Demultiplexer
6.2.1: Multiplexer
6.2.2: Demultiplexer
6.3: Arithmetische Schaltungen
6.3.1: Adder-Schaltungen (Addierer)
6.3.2: Look Ahead Adder
6.3.3: Subtractors (Subtrahierer)
6.3.4: Multiplier (Multiplizierer)
6.3.5: Andere Arten von Multipliern
6.3.6: Divider (Teiler)
6.4: Code Konverter
6.5: Komparatoren
6.5.1: Der einfache Komparator
6.5.2: Der Magnitude-Komparator
6.6: Parity und Paritygeneratoren
6.6.1: Odd/Even Detector
6.6.2: Bytewise Parity
6.6.3: Parity Correction
6.7: Lookup Tables
6.7.1: Implementierung von Logik durch LUTs
6.8: Spezielle Gatter
6.8.1: Tristate-Gatter
6.8.2: Bus Multiplexing
6.8.3: Bus Switches
6.8.4: Analoge Switches
6.8.5: Erweiterbare Gatter
6.8.6: Open Collector / Drain / Emitter / Source
6.8.7: Wired Logik
Kapitel 7: Speicherelemente
7.1: Das RS-Flipflop
7.1.1: Umsetzung mit identischen Gattern
7.2: Das RST-Flipflop
7.3: Das Latch
7.4: Fehlerfreies RS-Flipflop
7.5: Erweiterte Flipflops
7.5.1: Master-Slave-Flipflops
7.6 Das JK-Flipflop
7.6.1: Abweichende JK-Flipflops
7.6.2: Fehlerzustände des JK-Flipflop
7.7: Flipflops mit asynchronen Set- und Reset-Eingängen
7.8: Das JK-Flipflop als universeller Baustein
7.9: Spezielle Flipflops
7.9.1: Doppelt getaktete Flipflops
7.9.2: NOT-Ketten-Flipflops
7.10: Flipflop Symbole
7.10.1: Praktische Flipflops
7.10.2: Anwendungen
Kapitel 8: Schaltungen mit Speicherelementen
8.1: Register
8.1.1: Transparente Register
8.1.2: Edge getriggerte Register
8.1.3: Erhältliche Register
8.2: Schieberegister
8.2.1: Serial In / Parallel Out
8.2.2: Parallel In / Serial Out
8.2.3: First In, First Out / FIFO
8.2.4: Last in, First out / LIFO
8.2.5: Praktische Anwendungen von Schieberegistern
8.2.6: Schiebregister – anders aufgebaut
8.3: Zähler
8.3.1: Zähler-Definitionen
8.3.2: Asynchrone Zähler
8.3.3: Synchrone Zähler
8.3.4: State-Counter
8.3.5: Marktübliche Zähler
8.4: Teiler
8.5: Binary-Rate-Multipliers
8.5.2: Warum BRM besser sind als PWM
8.6: LFS-Register und PRBS-Erzeuger
8.7: State-Machines
8.7.1: Das Bubble- oder State-Diagramm
8.7.2: Moore-Automaten
8.7.3: Mealy-Automaten
8.7.4: Implementierung von Automaten
8.8: Multiphase-Generatoren
8.8.1: Non-overlapping Generatoren
8.8.2: Overlapping Generatoren
8.8.3: Aufbau von Multiphase-Generatoren
8.9: PLL-Schaltungen
8.9.1: Der Phasenkomparator
8.9.2: Der Teiler
8.9.3: Der Referenzoszillator
8.9.4: Typische PLLs: 4046 und 7046
8.9.5: PLL in FPGA
8.10: Synchronisierer
8.10.1: Synchronisieren von Signalen
8.10.2: Gefahren des Synchronisierens
8.10.3: Clock-Synchroniser
8.11: Debouncer
8.11.1: RS-Flipflop als Debouncer
8.11.2: Shifter Loop
8.11.3: Counter Loop
8.11.4: Analoge Debouncer
8.12: Edge-Detector
8.12.1: Stabiler Edge-Detector
8.12.2: Erkennen beider Flanken
8.13: Speicherelemente
8.13.1: RAM
8.13.2: ROM
8.13.3: Non Volatile RAM
8.13.4: Multiport
8.13.5: Dual Port
Kapitel 9: Fixed Logic Familien
9.1: RTL und DTL
9.1.1: RTL
9.1.2: DTL
9.2: TTL
9.3: ECL
9.4: NMOS
9.5: CMOS
9.6: I2L
9.7: GTL / BTL
9.8: Übersicht der gebräuchlichen Familien
9.9: Gehäuse
9.9.1: DIL / DIP
9.9.2: PGA – Pin Grid Array
9.9.3: LCC / PLCC
9.9.4: SOJ
9.9.5: SO / SOP / TSSOP
9.9.6: QFP / TQFP
9.9.7: BGA – Ball Grid Array
9.9.8: QFN – Quad Flat No Leads
9.9.9: Chipscale Gehäuse (Flipchip)
Kapitel 10: Entwürfe mit echter Logik
10.1: Logische Niveaus und die verbotene Zone
10.1.1: Die Ausgangsniveaus
10.1.2: Die Eingangsniveaus
10.1.3: Die verbotene Zone
10.1.4: Der Ausgangsstrom
10.2: Rise- und Falltime von Signalen
10.3: Fan-In und Fan-Out
10.3.1: Fan-Out
10.3.2: Fan-In
10.3.3: Was tun damit?
10.4: Statischer und dynamischer Stromverbrauch
10.4.1: Bipolare Technik (TTL)
10.4.2: CMOS
10.5: Propagation-Delay
10.6: Setup- and Hold-Time
10.7: Race-Conditions
10.7.1: Das EXOR-Drama
10.7.2: Glitch freies EXOR
10.8: Metastabilität
10.9: Ground-Bounce
10.10: Ringing, Overshoot und Undershoot
10.10.1: Terminationswiderstände
10.10.2: Serienwiderstände
10.11: Board-Layout
10.12: Spannungsversorgung
10.12.1: Grundprinzip einer Regelung
10.12.2: Impulsverhalten
10.12.3: Derating von Kondensatoren
10.12.4: Faustregeln
10.12.5: Schutz des Reglers
10.13: Bord-Layout für Spannungsverteilung
10.13.1: Trennen kritischer Spannungen
10.13.2: Digital gegen Analog Domäne
Kapitel 11: Lesen eines Datenblattes
11.1: Die „Marketing“ Information
11.2: Das richtige Datenblatt
11.2.1: Die elektrischen Parameter
11.2.2: Funktionale Parameter
11.2.3: Pinbelegung
11.2.4: Betriebstemperatur
11.2.5: Operating Conditions
11.2.6: Absolute maximum ratings
11.2.7: Typical performance characteristics
11.2.8: Thermische Informationen
11.2.9: DC-Parameter
11.2.10: AC oder switching parameters
11.2.11: Package Information
11.3: Application Information
11.3.1: Board Layout Information
11.3.2: Software Beispiele
Kapitel 12: Logische Schaltungen aus klassischen Bausteinen
12.1: Übersicht der wichtigsten 74xx Bausteine
12.1.1: Inverter
12.1.2: Basisgatter
12.1.3: XOR und Komparatoren
12.1.4: Dekoder
12.1.5: Buffer
12.1.6: Flipflops
12.1.7: Schieberegister
12.1.8: Counter
12.1.9: Display Treiber
12.1.10: Bus Register
12.1.11: Bus Treiber
12.1.12: Monoshots
12.2: Übersicht der wichtigsten 4xxx Bausteine
12.2.1: Inverter
12.2.2: Basisgatter
12.2.3: Analoge Multiplexer
12.2.4: Display-Driver
12.2.5: Flipflops
12.2.6: CMOS-Zähler
12.3: Tipps und Tricks
12.3.1: Bessere Display-Driver
12.3.2: Pin-kompatible Schmitt-Trigger
12.3.3: Alternativer Puffer
12.3.4: Singlegate Logik
12.3.5: Bündeln von Bussen
12.3.6: Mischen von Familien
12.3.7: Einzelne Transistoren
12.3.8: Pull-up / Pull-down
12.3.8: Unbenutzte Ausgänge
Kapitel 13: Kontakt mit der Außenwelt
13.1: Eingangsschaltungen
13.1.1: Level-Shifting
13.1.2: Debouncing (Entprellung) und Filterung
13.1.3: Sichern von Eingängen
13.2: Ausgangsschaltungen
13.2.1: Spannungsanpassung (level-shifting)
13.2.2: Stromanpassung
13.2.3: Sichern von Ausgangsstufen
13.3: Galvanisch Isolieren
13.3.1: Optokoppler
13.3.2: Kapazitive Koppler
13.3.3: Induktive Koppler
13.4: Sicheres Boardlayout
13.4.1: Trennen von gefährlichen und sicheren Signalen
13.4.2: Komponenten Auswahl
13.4.3: Beispiel
Kapitel 14: Analoge Schaltungen
14.1 Schmitt-Trigger
14.2: Delay- und Impuls-Erzeuger
14.2.1: Monoshot
14.2.2: Restartbare Monoshots
14.2.3: RC-Netzwerke
14.2.4: Digitale Lösungen
14.3: Oszillatoren
14.3.1: Ringoszillator
14.3.2: RC-Oszillator
14.3.3: Kristalloszillator
14.4: NE555 Universelle Timing-Komponente
14.4.1: 555 als Monoshot
14.4.2: 555 als Monoshot (restartbar)
14.4.3: 555 als Oszillator
14.5: Analog-Digital-Wandler
14.5.1: Flash-Konverter
14.5.2: Sukzessive Approximation
14.5.3: Integrating ADC
14.5.4: Sigma-Delta
14.6: Digital-Analog-Wandler
14.6.1: Thermometer-DAC
14.6.2: R-2R-DAC / Widerstandsleiter-DAC
14.6.3: Binary weighted DAC
14.6.4: PWM und BRM DAC
Kapitel 15: Programmierbare Logik
15.1: Geschichte
15.2: Typen
15.2.1: FPLA
15.2.2: PAL
15.2.3: GAL
15.2.4: EPLD
15.2.5: CPLD
15.2.6: Gate-Array
15.2.7: FPGA
15.2.8: Hybride Komponenten
Kapitel 16: Entwerfen mit PLDs und FPGAs
16.1: Versorgung
16.1.1: Multivoltage I/O Circuits
16.2: Busanschlüsse
16.3: Programmierung
16.3.1: Programmieranschlüsse von Altera Komponente
16.3.2: Altera Programmieradapter
16.4: Clock-Anschlüsse
16.4.1: Oscillator-Module
16.4.2: Selbstbau Oszillatoren
Kapitel 17: Synthesesprachen
17.1: Geschichte der Synthesesprachen
17.1.1: PALASM
17.1.2: ABEL
17.1.3: CUPL
17.1.4: AHDL
17.1.5: Verilog
17.1.6: VHDL
17.2: Arbeitsweise eines Synthesizers
17.3: Synthese-Probleme
17.4: Entwicklungssysteme
Kapitel 18: Quartus Tutorial
18.1: Installation
18.1.1: Installieren
18.1.2: Lizenz Installation
18.1.3: Firewall Einstellungen
18.2: Starten
18.2.1: Der erste Start
18.3: Erstellen eines Projektes
18.3.1: Projektverwaltung
18.4: Die Designumgebung
18.5: Erstellen des ersten Blocks
18.5.1: Design File Typen
18.5.2: Andere Dateien
18.6: Entwurfsmethodologie
18.6.1: Top-down hierarchischer Entwurf mit Toplevel Schema
18.7: Erstellen des Toplevels
18.8: Zeichnen eines Schemas (Schaltbild)
18.8.1: Komponenten platzieren und verschieben
18.8.2: Verbinden von Komponenten
Erstellen von Unterschaltungen
18.9: Erstellen einer HDL Datei
18.9.1: Schreiben von Code
18.10: Device Assignment
18.11: Die erste Kompilation
18.11.1: Pin-Assignment
18.12: Simulation
18.12.1: Erstellen der Simulationsdatei
18.12.2: Hinzufügen von Signalen
18.12.3: Beobachten interner Knoten
18.12.4: Erstellen von Signalverläufen
18.13: Spezielle Funktionsblöcke
18.13.1: Counter-Megafunction
18.14: Konfigurieren eines PLL
Kapitel 19: Verilog in aller Kürze
19.1: Verilog Module
19.2: Whitespaces und Kommentare
19.3: Logische Niveaus
19.3.1: Logisches x
19.3.2: Logisches z
19.4: Signale
19.4.1: Einzelne Signale
19.4.2: Signal-Vektoren
19.4.3: Praktische Verwendung von Reg und Wire
19.5: Definieren von Ein- und Ausgängen
19.5.1: Reg und Wire
19.5.2: inout
19.6: Basisoperatoren in Verilog
19.6.1: Logische Operationen
19.6.2: Reduktionsoperatoren
19.6.3: Abgeleitete Reduktionsoperatoren
19.6.4: Relationale Operatoren
19.7: Mathematische Operationen
19.7.1: Notation von Zahlen
19.7.2: Addieren und Subtrahieren
19.7.3: Dividieren und Multiplizieren
19.8: Andere Manipulationen von Vektoren
19.8.1: Schiebeoperationen
19.8.2: Erstellen von Teilvektoren
19.8.3: Gruppieren von Signalen
19.8.4: Wiederholung von Signalen
19.8.5: Konditionaler Operator
19.9: Basiskonstruktionen in Verilog
19.9.1: Assign
19.9.2: Blocking und Non-blocking Assignments
19.9.3: Always
19.9.4: Sensitivity Lists
19.9.5: Sensitivity für asynchrone Signale in synchronen Block
19.10: Entscheidungslogik
19.10.1: If-then-else
19.10.2: Case-Statement
19.11: Scheduling
19.12: Defines
19.13: Verilog 2001
19.13.1: Arrays und multidimensionale Arrays
19.13.2: Signed Zahlen
19.13.3: Modul-Definition
19.13.4: Automatisches Erstellen von Netzen
19.13.5: Andere Elemente
19.14: Verilog 2005
19.14.1: Always_ff
19.14.2: Always_comb
19.14.3: Always_latch
19.15: Instanziieren von Teilschaltungen
19.15.1: Eingebaute Primitives
19.15.2: Instanziieren eines Primitives
19.15.3: Instanziierung eines eigenen Primitives
19.15.4: Verbinden mit symbolischen Namen
19.16: Praktische Systeme in Verilog
19.16.1: Kombinatorischer Block
19.16.2: Sequenzielle Logik
19.16.3: Ein Read/Write Schieberegister mit Ausgangsregister
19.16.4: State-Machine
Kapitel 20: VHDL in aller Kürze
20.1: VHDL Module
20.2: Whitespaces und Kommentare
20.3: Die Standardbibliotheken
20.4: Logische Niveaus
20.4.1: Logisches x
20.4.2: Logisches z
20.5: Signale
20.5.1: Signal-Vektoren
20.6: Variablen
20.7: Das Erzeugen einer Entity
20.7.1: Die Ports einer Entity
20.8: Basisoperatoren in VHDL
20.8.1: Logische Operationen
20.8.2: Abgeleitete Operatoren
20.8.3: Relationale Operatoren
20.9: Mathematische Operationen
20.9.1: Notation von Zahlen
20.9.2: Umwandlung von Zahlen
20.9.3: Addieren und Subtrahieren
20.9.4: Dividieren und Multiplizieren
20.9.5: Modulo und Remainder
20.10: Andere Manipulationen von Vektoren
20.10.1: Schiebeoperationen
20.10.2: Rotieren von Vektoren
20.10.3: Erstellen von Teilvektoren
20.10.4: Gruppieren von Signalen
20.10.5: Konstanten und Aliase
20.11: Basiskonstruktionen in VHDL
20.11.1: When
20.11.2: With-select
20.12: Prozess
20.13: Entscheidungslogik
20.13.1: If-then-else
20.13.2: Case Statement
20.14: Latches
20.15: Flankengesteuerte Prozesse
20.16: Scheduling
20.17: Instanziieren von Teilmodulen in VHDL
20.17.1: Instanziieren von Teilmodulen
20.18: Praktische Systeme in VHDL
20.18.1: Kombinatorischer Block
20.18.2: Sequenzielle Logik
20.18.3: Ein Read/Write Schieberegister, mit Ausgangsregister
20.18.4: State-Machine
Kapitel 21: Implementierung von Logik in PLDs
21.1: Das Projekt
21.2: Schematischer Entwurf
21.2.1: Displaysteuerung
21.2.2: Der Teiler
21.2.3: Die Zähler
21.2.4: Die Alarmfunktion
21.2.5: Toplevel
21.2.6: Verifikation
21.3: Verilog Entwurf
21.3.1: Display-Steuerung
21.3.2: Der Teiler
21.3.3: Die Zähler
21.3.4: Die Alarmfunktion
21.3.5: Toplevel
21.4: VHDL-Entwurf
21.4.1: Displaysteuerung
21.4.2: Der Teiler
21.4.3: Die Zähler
21.4.4: Die Alarmfunktion
Kapitel 22: Fusemap und Programmierung
22.1: Endgültige Device-Auswahl
22.2: Pin-Zuweisung
22.3: Fusemap erzeugen
22.4: Programmierung
Kapitel 23: Experimentierplattformen
23.1: Terasic Max II Mikro Kit
23.2: Elektor-FPGA-Board
23.3: Andere Plattformen