Ich werde von der untersten Ebene beginnen, die relevant sein könnte (ich kann von einer noch niedrigeren Ebene aus beginnen, aber sie sind wahrscheinlich viel zu irrelevant), angefangen von Atom über Elektrizität zu Transistoren zu Logikgattern zu integrierten Schaltkreisen (Chip / CPU) ) und endet bei der Vollversammlung (ich nehme an, dass Sie mit den höheren Ebenen vertraut sind).
Am Anfang
Atom
Atom ist eine Struktur aus Elektronen, Protonen und Neutronen (die selbst aus Elementarteilchen bestehen ). Der interessanteste Teil des Atoms für Computer und Elektronik sind die Elektronen, da Elektronen beweglich sind (dh sie können sich im Gegensatz zu schwer zu bewegenden Protonen und Neutronen relativ leicht bewegen) und sich von selbst frei bewegen können, ohne im Inneren festgehalten zu werden ein Atom.
Normalerweise hat jedes Atom die gleiche Anzahl von Protonen und Elektronen, wir nennen diesen "neutralen" Zustand. Es ist möglich, dass ein Atom zusätzliche Elektronen verliert oder gewinnt. Atome in diesem unausgeglichenen Zustand sollen "positiv geladene" Atome (mehr Protonen als Elektronen) bzw. "negativ geladene" Atome (mehr Elektronen als Protonen) sein.
Elektronen sind unkonstruierbar und unzerstörbar (nicht so in der Quantenmechanik, aber das ist für unseren Zweck irrelevant); Wenn also ein Atom ein Elektron verliert, muss ein anderes Atom in der Nähe die zusätzlichen Elektronen aufnehmen oder das Elektron muss in ein frei schwebendes Elektron freigesetzt werden. Da das Elektron unkonstruierbar ist, muss es von einem Atom abgesaugt werden, um zusätzliche Elektronen zu gewinnen oder von einem frei schwebenden Elektron. Die Mechanik der Elektronen ist so, dass, wenn sich ein negativ geladenes Atom in der Nähe eines positiv geladenen Atoms befindet, einige Elektronen wandern, bis beide Atome die gleiche Ladung haben.
Elektrizität
Elektrizität ist nur ein Elektronenfluss von einem Gebiet mit sehr vielen negativ geladenen Atomen zu einem Gebiet mit sehr vielen positiv geladenen Atomen. Bestimmte chemische Reaktionen können dazu führen, dass wir einen Knoten mit vielen negativ geladenen Atomen (als "Anode" bezeichnet) und einen anderen Knoten mit vielen positiv geladenen Atomen (als "Kathode" bezeichnet) haben. Wenn wir zwei entgegengesetzt geladene Knoten mit einem Draht verbinden, fließen Elektronenmassen von der Anode zur Kathode, und dieser Fluss wird als "elektrischer Strom" bezeichnet.
Nicht alle Drähte können Elektronen gleich leicht übertragen, Elektronen fließen viel leichter in "leitenden" Materialien als in "resistenten" Materialien. Ein "leitendes" Material hat einen geringen elektrischen Widerstand (z. B. Kupferdrähte in Kabeln) und ein "widerstandsfähiges" Material einen hohen elektrischen Widerstand (z. B. Gummikabelisolierung). Einige interessante Materialien werden als Halbleiter (z. B. Silikone) bezeichnet, da sie ihren Widerstand leicht ändern können. Unter bestimmten Bedingungen kann ein Halbleiter als Leiter fungieren und unter anderen Bedingungen kann er sich in einen Widerstand verwandeln.
Elektrizität zieht es immer vor, das Material mit dem geringsten Widerstand zu durchfließen. Wenn also eine Kathode und eine Anode mit zwei Drähten verbunden sind, von denen einer einen sehr hohen Widerstand und der andere einen sehr geringen Widerstand aufweist, fließt der größte Teil der Elektronen durch das Kabel mit geringem Widerstand und nahezu Keiner fließt durch das hochohmige Material.
Das Mittelalter
Schalter und Transistoren
Schalter / Flip-Flops sind wie normale Lichtschalter, ein Schalter kann zwischen zwei Drahtstücken platziert werden, um den Stromfluss zu unterbrechen und / oder wiederherzustellen. Transistoren funktionieren genauso wie Lichtschalter, mit dem Unterschied, dass ein Transistor anstelle des physischen Verbindens und Trennens von Drähten den Stromfluss verbindet / trennt, indem er seinen Widerstand ändert, abhängig davon, ob sich im Basisknoten Strom befindet, und wie Sie vielleicht bereits vermutet haben Ich weiß, Transistoren bestehen aus Halbleitern, weil wir den Halbleiter entweder in einen Widerstand oder in einen Leiter umwandeln können, um elektrische Ströme zu verbinden oder zu trennen.
Ein üblicher Transistortyp, der NPN Bipolar Junction Transistor (BJT), hat drei Knoten: "Basis", "Kollektor" und "Emitter". In einem NPN-BJT kann Elektrizität nur dann vom "Emitter" -Knoten zum "Kollektor" -Knoten fließen, wenn der "Basis" -Knoten aufgeladen ist. Wenn der Basisknoten nicht geladen ist, kann praktisch kein Elektron durchfließen, und wenn der Basisknoten geladen ist, können Elektronen zwischen dem Emitter und dem Kollektor fließen.
Das Verhalten eines Transistors
(Ich schlage vor , Sie sehr durch lesen diese , bevor Sie fortfahren, da es besser ist als ich mit interaktiven Grafiken erklären kann)
Nehmen wir an, wir haben einen Transistor an der Basis und am Kollektor an eine Stromquelle angeschlossen und verdrahten dann ein Ausgangskabel in der Nähe des Kollektors (siehe Abbildung 3 in http://www.spsu.edu/cs/faculty/bbrown/web_lectures) / transistoren / ).
Wenn wir weder Basis noch Kollektor mit Elektrizität versorgen, kann überhaupt keine Elektrizität fließen, da es keine Elektrizität gibt, über die man sprechen kann:
B C | E O
0 0 | 0 0
Wenn wir den Kollektor mit Strom versorgen, aber nicht die Basis, kann der Strom nicht zum Emitter fließen, da die Basis zu einem Material mit hohem Widerstand wird, sodass der Strom zum Ausgangsdraht entweicht:
B C | E O
0 1 | 0 1
Wenn wir den Sockel mit Strom versorgen, aber nicht den Kollektor, kann auch kein Strom fließen, da kein Ladungsunterschied zwischen Kollektor und Emitter besteht:
B C | E O
1 0 | 0 0
Wenn wir sowohl die Basis als auch den Kollektor mit Elektrizität versorgen, fließt Elektrizität durch den Transistor. Da der Transistor jetzt einen niedrigeren Widerstand als das Ausgangskabel hat, fließt nahezu keine Elektrizität durch das Ausgangskabel:
B C | E O
1 1 | 1 O
Logikgatter
Wenn wir den Emitter eines Transistors (E1) mit dem Kollektor eines anderen Transistors (C2) verbinden und dann einen Ausgang in der Nähe der Basis des ersten Transistors (O) anschließen (siehe Abbildung 4 in http://www.spsu.edu) / cs / faculty / bbrown / web_lectures / transistoren / ), dann passiert etwas Interessantes. Nehmen wir auch an, wir legen immer Strom an den Kollektor des ersten Transistors (C1) und spielen nur mit den Basisknoten der Transistoren (B1, B2) herum:
B1 B2 C1 E1/C2 | E2 O
----------------------+----------
0 0 1 0 | 0 1
0 1 1 0 | 0 1
1 0 1 0 | 0 1
1 1 1 1 | 1 0
Fassen wir die Tabelle so zusammen, dass nur B1, B2 und O angezeigt werden:
B1 B2 | O
---------+-----
0 0 | 1
0 1 | 1
1 0 | 1
1 1 | 0
Und siehe da , wenn du mit Boolesche Logik und / oder Logikgatter vertraut sind, sollten Sie feststellen , dass dies genau das NAND - Gatter ist. Und wenn Sie mit Boolescher Logik und / oder Logikgattern vertraut sind, wissen Sie möglicherweise auch, dass ein NAND (und auch ein NOR) funktional vollständig ist , dh wenn Sie nur NAND verwenden, können Sie alle anderen Logikgatter und den Rest der Wahrheit konstruieren Tabellen. Mit anderen Worten, Sie können einen ganzen Computerchip nur mit NAND-Gattern entwerfen.
Tatsächlich werden die meisten CPUs (oder wurde es früher verwendet?) Nur mit NAND entwickelt, da die Herstellung billiger ist als die Verwendung einer Kombination aus NAND, NOR, AND, OR usw.
Ableiten der anderen Booleschen Operatoren von NAND
Ich würde nicht beschreiben, wie man alle booleschen Operatoren, nur das NOT- und das AND-Gatter macht, den Rest findet man woanders.
Wenn ein NAND-Operator gegeben ist, können wir ein NOT-Gatter konstruieren:
Given one input B
O = NAND(B, B)
Output O
Wenn ein NAND- und ein NOT-Operator gegeben sind, können wir ein AND-Gatter konstruieren:
Given two inputs B1, B2
C = NAND(B1, B2)
O = NOT(C) // or NAND(C,C)
Output O
Wir können andere Logikgatter auf ähnliche Weise konstruieren. Da das NAND-Gatter funktional vollständig ist , ist es auch möglich, Logikgatter mit mehr als 2 Eingängen und mehr als 1 Ausgang zu konstruieren. Ich werde hier nicht diskutieren, wie solche Logikgatter konstruiert werden.
Aufklärungszeitalter
Aufbau einer Turingmaschine aus Booleschen Toren
Eine CPU ist nur eine kompliziertere Version einer Turing-Maschine. Die CPU-Register sind der interne Zustand der Turing-Maschine, und der RAM ist ein Band der Turing-Maschine.
Eine Turing-Maschine (CPU) kann drei Dinge tun:
- lese eine 0 oder 1 vom Band (lese eine Speicherzelle aus dem RAM)
- seinen internen Zustand ändern (seine Register ändern)
- nach links oder rechts bewegen (mehrere Positionen aus dem RAM lesen)
- Schreibe eine 0 oder 1 auf das Band (schreibe in eine Speicherzelle in den RAM)
Für unseren Zweck bauen wir Wolframs 2-Zustands-3-Symbol-Turing-Maschine mit kombinatorischer Logik (moderne CPUs würden Mikrocode verwenden, aber sie sind komplexer als für unseren Zweck erforderlich).
Die Zustandstabelle der Wolfram (2,3) Turingmaschine lautet wie folgt:
A B
0 P1,R,B P2,L,A
1 P2,L,A P2,R,B
2 P1,L,A P0,R,A
Wir wollen die obige Zustandstabelle als Wahrheitstabelle umcodieren:
Let I1,I2 be the input from the tape reader (0 = (0,0), 1 = (0,1), 2 = (1,0))
Let O1,O2 be the tape writer (symbol encoding same as I1,I2)
Let M be connected to the machine's motor (0 = move left, 1 = move right)
Let R be the machine's internal state (A = 0, B = 1)
(R(t) is the machine's internal state at timestep t, R(t+1) at timestep t+1)
(Note that we used two input and two outputs since this is a 3-symbol Turing machine.)
R 0 1
I1,I2
(0,0) (0,1),1,1 (1,0),0,0
(0,1) (1,0),0,0 (1,0),1,1
(1,0) (0,1),0,0 (0,0),1,0
The truth table for the state table above:
I1 I2 R(t) | O1 O2 M R(t+1)
-------------+--------------------
0 0 0 | 0 1 1 1
0 0 1 | 1 0 0 0
0 1 0 | 1 0 0 0
0 1 1 | 1 0 1 1
1 0 0 | 0 1 0 0
1 0 1 | 0 0 1 0
Ich werde ein solches Logikgatter nicht wirklich konstruieren (ich bin mir nicht sicher, wie ich es in SE zeichnen soll, und es wird wahrscheinlich ziemlich umfangreich sein), aber da wir wissen, dass das NAND-Gatter funktionsfähig ist , haben wir einen Weg um eine Reihe von NAND-Gattern zu finden, die diese Wahrheitstabelle implementieren.
Eine wichtige Eigenschaft von Turing Machine ist, dass es möglich ist, einen Computer mit gespeicherten Programmen unter Verwendung einer Turing-Maschine zu emulieren , die nur eine Tabelle mit festen Zuständen aufweist. Daher kann jede Universal Turing-Maschine ihr Programm vom Band (RAM) lesen, anstatt ihre Anweisung in die interne Statustabelle fest einprogrammieren zu müssen. Mit anderen Worten, unsere (2,3) Turing-Maschine kann ihre Anweisungen von den I1-, I2-Pins (als Software) lesen, anstatt in der Logikgatter-Implementierung (als Hardware) fest codiert zu sein.
Mikrocodes
Aufgrund der zunehmenden Komplexität moderner CPUs wird es unerschwinglich schwierig, die kombinatorische Logik allein zum Entwerfen einer gesamten CPU zu verwenden. Moderne CPUs sind in der Regel als Interpreter für Mikrocodebefehle konzipiert. Ein Mikrocode ist ein kleines Programm, das in die CPU eingebettet ist und von der CPU zur Interpretation des tatsächlichen Maschinencodes verwendet wird. Diese Mikrocode-Interpreter selbst werden im Allgemeinen mit kombinatorischer Logik entworfen.
Registrieren, Cache und RAM
Wir haben oben etwas vergessen. Wie erinnern wir uns an etwas? Wie implementieren wir das Band und den RAM? Die Antwort liegt in einer elektronischen Komponente namens Kondensator. Ein Kondensator ist wie eine wiederaufladbare Batterie. Wenn ein Kondensator aufgeladen wird, werden zusätzliche Elektronen gespeichert und es können auch Elektronen an die Schaltung zurückgegeben werden.
Um in einen Kondensator zu schreiben, füllen wir den Kondensator mit Elektronen (schreibe 1) oder entleeren alle Elektronen im Kondensator, bis er leer ist (schreibe 0). Um den Wert eines Kondensators abzulesen, versuchen wir ihn zu entladen. Wenn beim Entladen kein Strom fließt, ist der Kondensator leer (Anzeige 0). Wenn jedoch Strom erkannt wird, muss der Kondensator aufgeladen werden (Anzeige 1). Sie werden vielleicht bemerken, dass das Lesen eines Kondensators seinen Elektronenspeicher entleert. Moderne RAMs verfügen über die Schaltung, um den Kondensator regelmäßig aufzuladen, so dass sie ihren Speicher behalten können, solange Strom vorhanden ist.
In einer CPU werden mehrere Kondensatortypen verwendet, die CPU-Register und die übergeordneten CPU-Caches werden mit sehr schnellen "Kondensatoren" erstellt, die eigentlich aus Transistoren bestehen (daher gibt es fast keine "Verzögerung" zum Lesen / Schreiben diese werden statisches RAM (SRAM) genannt; Während der Hauptspeicher RAM mit geringerer Leistung, aber langsameren und viel billigeren Kondensatoren hergestellt wird, werden diese als dynamischer RAM (DRAM) bezeichnet.
Uhr
Ein sehr wichtiger Bestandteil einer CPU ist die Uhr. Eine Uhr ist eine Komponente, die regelmäßig "tickt", um die Verarbeitung zu synchronisieren. Eine Uhr enthält typischerweise einen Quarz oder andere Materialien mit bekannter und relativ konstanter Schwingungsperiode, und die Uhrschaltung hält diese Schwingung aufrecht und mißt sie, um ihren Zeitsinn aufrechtzuerhalten.
CPU-Operationen werden zwischen Takt-Ticks ausgeführt und Lese- / Schreibvorgänge werden in den Ticks ausgeführt, um sicherzustellen, dass sich alle Komponenten synchron bewegen und nicht ineinander treten, während sie sich in Zwischenzuständen befinden. In unserer (2,3) Turing-Maschine fließt zwischen den Takten Elektrizität durch die Logikgatter, um die Ausgabe von der Eingabe (I1, I2, R (t)) zu berechnen. und in den Takt-Ticks schreibt der Bandschreiber O1, O2 auf das Band, der Motor bewegt sich abhängig vom Wert von M und das interne Register wird vom Wert von R (t + 1) und dann vom Bandleser geschrieben liest das aktuelle Band und lädt es in I1, I2 und das interne Register wird auf R (t) zurückgelesen.
Mit Peripheriegeräten sprechen
Beachten Sie, wie die (2,3) Turing-Maschine mit ihrem Motor verbunden ist. Dies ist eine sehr vereinfachte Ansicht, wie eine CPU mit einer beliebigen Hardware verbunden werden kann. Beliebige Hardware kann eine bestimmte Leitung für Ein- / Ausgänge abhören oder beschreiben. Bei der (2,3) Turing-Maschine besteht die Schnittstelle zum Motor nur aus einem einzigen Draht, der den Motor anweist, sich im oder gegen den Uhrzeigersinn zu drehen.
Was bei dieser Maschine nicht gesagt wird, ist, dass der Motor eine andere "Uhr" haben muss, die synchron mit der internen "Uhr" der Maschine läuft, um zu wissen, wann der Betrieb gestartet und gestoppt werden muss. Dies ist also ein Beispiel für eine synchrone Datenübertragung . Die andere häufig verwendete alternative asynchrone Übertragung verwendet eine andere Leitung, die als Interrupt-Leitung bezeichnet wird, um Synchronisationspunkte zwischen der CPU und dem asynchronen Gerät zu kommunizieren.
Digitales Zeitalter
Maschinencode und Montage
Assemblersprache ist eine vom Menschen lesbare Mnemonik für Maschinencodes. Im einfachsten Fall gibt es eine Eins-zu-Eins-Zuordnung zwischen Assembly und Maschinencode. Obwohl in modernen Assemblersprachen einige Anweisungen möglicherweise mehreren Opcodes zugeordnet sind.
Programmiersprache
Das ist uns allen bekannt, nicht wahr?
Puh, endlich fertig, ich habe das alles in nur 4 Stunden getippt, also bin ich sicher, dass es irgendwo einen Fehler gibt (ich bin in erster Linie ein Programmierer, kein Elektrotechniker oder Physiker, also gibt es möglicherweise einige Dinge, die offensichtlich falsch sind). Wenn Sie einen Fehler gefunden haben, zögern Sie bitte nicht, ein @yell zu geben oder es selbst zu beheben, wenn Sie den Repräsentanten haben oder eine ergänzende Antwort erstellen.