hallo an alle, ich habe nun bereits einige Erfahrungen mit dem Programmieren von Mikrocontrollern gemacht und kann nun LEDs zum Leuchten und Summer zum Piepsen bringen. Allerdings habe ich eine Verständnislücke. Was ich physikalisch noch verstehe, ist die Funktionsweise eines (4bit) Volladdierers, der aus diversen Gattern zusammen gesetzt ist. Ändert man jetzt durch ein Programm die Art der Gatter oder wie läuft das? ich hoffe, ich konnte mein Problem verständlich machen, wenn nicht, antworte ich gern auf Nachfragen. viele Grüsse trunx
:
Verschoben durch User
Physikalisch ist ein Programm (und ein Datensatz) eine Sammlung von Spannungswerten an verschiedensten Orten (meist auf einem Chip, manchmal stat dessen auch Magnetisierung auf einer rotierenden Platte, oder Lichtimpulse). Ein laufendes Programm heißt, dass sich die Spannungswerte über die Zeit ändern. Manche dieser Spannungen bringen einen Halbleiterbereich zum Leuchten und dann sieht man die LED. Oder eine Membran schwingt und eine Schallwelle pflanzt sich fort. Alles folgt bestimmten Regeln der (Quanten)elektrodynamik, die wir der Einfachheit Diode, Widerstand, Transistor, LED, Gatter, Addierer, Steuerwerk, Speicher, Oszillator, Microcnotroller usw. nennen. Diese sind konstant (außer man baut den Computer um). Daher ändert ein Programm nicht die Gatter, sondern bestimmte Spannungspegel die in Gatter geschickt werden. Gespeichert werden sie in Flip-Flops, also über Kreuz verkoppelte Transistoren oder Kondensatoren. Also: Du änderst an der Physik und dem Aufbau des Chips nichts, sondern nur Daten und Programme.
Hier musst du dich mit der von-Neumann und Harvard-Architektur befassen. Der Mikrocontroller hat einen festen Core und überhaupt im Gegensatz zu einem frei konfigurierbaren FPGA, der die von dir erwähnten Gatter hat, nur feste Strukturen, also ein permanent konfigurierter FPGA in Silizium gegossen, der aber sequenziell arbeitet statt parallel, obwohl aber auch auf einem FPGA ein Mikrocontroller-Soft-Core geladen werden kann, vornehmlich ARM-Cortex-M oder MicroBlaze von Xilinx, Nios bei Intel. In den FPGAs wird häufig jetzt bei komplexen Designs Blockdesign angewandt, dass heißt es werden Elemente Block-RAMs, Buffers, Mux, um die einfachsten zu nennen, zu einem funktionierenden Prozessor zusammengesetzt, der einfache Aufgaben meist ein Echtzeit erledigen soll. Hier wird im Gegensatz zum Mikrocontroller FPGA-Fläche verbraucht statt wie im Mikrocontroller Laufzeit, Flash und SRAM. Auf jeden Fall ist der Mikrocontroller eine statische Struktur, die schon fertig konfiguriert ist für die meisten Aufgaben, bei der sie eben eingesetzt wird und ist völlig ausreichend bei den Zeitanforderungen der sequenziellen Abarbeitung von Befehlen. Die Peripherie, die speziell ist für Kommunikation, Timer und ADC, wird auch immer umfangreicher.
Jens K. schrieb: > Ändert man jetzt durch ein Programm die Art der Gatter Nein. Ein Prozessor besitzt ein Rechenwerk mit einem Volladdierer, und kann ihn in einem Befehl benutzen oder auch nicht. Es hat neben dem Volladdierer der im Zweierkomplement auch subtrahieren kann und damit Vergleiche berechnen kann auch noch UND und ODER und XOR und INVERTER und Barrel-Shifter und manchmal Multiplizierer und Dividierer, die dann durch andere Befehle benutzt werden können. Hardware ändert man durch Programmierung nur in FPGA, normalerweise nicht Bestandteil eines Prozessors. Prozessoren lassen sich modifizieren durch anderen Mikrocode, der aber bei den üblichen kleinen Prozessoren nicht umänderbar ist. Bei Intel&Co aber schon. So funktioniert ein Prozessor: http://www.megaprocessor.com/ oder auch so http://www.homebrewcpu.com/
:
Bearbeitet durch User
Mikrocontroller und Prozessoren besitzen eine sogenannte ALU die arithmetische und logische Operationen ausführt. Ich bin mir sicher, dass dir das beim Verständnis hilft. https://de.wikipedia.org/wiki/Arithmetisch-logische_Einheit?wprov=sfti1
Hier noch ein Tipp. Wenn dich das Thema interessiert, bist du damit goldrichtig: http://nandgame.com/ Das ist ein "Spiel", bei dem das Spielziel ist, aus NAND-Gattern einen Prozessor zu bauen. Ich habe das nur bis zum Multi-Bit-Adder gespielt, dann war die Mittagspause rum. Die Anleitung ist ziemlich gut. Die Lernkurve ist schon steil, aber machbar. Und da soll mal jemand sagen, bei PC-Spielen kann man nichts lernen ;-)
Könnte auch interesannt sein: www.nand2tetris.org
:
Bearbeitet durch User
"Mikrocode" ist ein gutes Stichwort, um da weiter zu lernen.
Michael B. schrieb: > Hardware ändert man durch Programmierung nur in FPGA Das ist nicht richtig. Und zwar auf ziemlich viele Arten und Weisen. Auch ein fpga ist ein festes Stück Silizium das konfiguriert wird und dabei nicht verändert wird. Ganz ähnlich wie ein Register beschrieben wird.
Karl schrieb: > Michael B. schrieb: >> Hardware ändert man durch Programmierung nur in FPGA > > Das ist nicht richtig. Und zwar auf ziemlich viele Arten und Weisen. > > Auch ein fpga ist ein festes Stück Silizium das konfiguriert wird und > dabei nicht verändert wird. Ganz ähnlich wie ein Register beschrieben > wird. Wenn du Elektronen als Hardware definierst passt es schon.
Stefanus F. schrieb: > "Mikrocode" ist ein gutes Stichwort, um da weiter zu lernen. Definitiv. Ist zwar heute eher out, aber es ist eine strukturierte Herangehensweise, die Schritte der Ausführung eines Befehls nochmal weiter zu unterteilen und ähnlich einer Modelleisenbahn alle Weichen und Signale im zeitlichen Verlauf so zu stellen, dass viele Züge/Daten gleichzeitig ohne Kollision aber trotzdem möglichst schnell von ihrer Quelle zum Ziel finden...
Jens K. schrieb: > hallo an alle, > > ich habe nun bereits einige Erfahrungen mit dem Programmieren von > Mikrocontrollern gemacht und kann nun LEDs zum Leuchten und Summer zum > Piepsen bringen. > > Allerdings habe ich eine Verständnislücke. Was ich physikalisch noch > verstehe, ist die Funktionsweise eines (4bit) Volladdierers, der aus > diversen Gattern zusammen gesetzt ist. Ändert man jetzt durch ein > Programm die Art der Gatter oder wie läuft das? > Nein. Im Prinzip wird durch die Programmierung dafür gesorgt, dass die passenden Daten an den Eingang der Addierers gebracht werden und das Ergebnis irgendwohin. Ganz vereinfacht: Der Objektcode, den der Compiler erzeugt, schaltet die Pfade im Prozessor. Also z. B. besteht ein Objektcode aus 8 Bit, davon ergeben die ersten 5 Bit den Befehl und die letzten 3 Bit geben die Quelle der Daten für den Addierer an. Sind das z. B. alles Nullen, werden die Daten aus Register 0 zum Addierer geschaltet (der andere Wert ist üblicherweise immer ein festes Register, der Akkumulator) geschaltet, sind das 001, werden die Daten aus Register 1 zum Addierer geschaltet, usw. Das wird über ganz normale Multiplexer gemacht, die wiederum aus Transistoren bestehen. Und genauso kann das dann mit dem Ergebnis gemacht werden, dann wird das Ergebnis an das entsprechende Register durchgeschaltet. Dafür müssen natürlich noch die anderen 5 Bit passen, die also z. B. 00001 für Addition sind (das Ergebis des Addierers wird an die Register in den unteren drei Bits durchgeschaltet, 00010 für Subtraktion, 00011 für Shift, 00100 für die Ausgabe des Wertes in dem Register an die Ports usw. usf. Diese Codes werden mit simplen UND/ODER Gattern dekodiert und entsprechend die Multiplexer geschaltet. Der Objektcode liegt üblicherweise in einem Speicher/Flash. Das Flash bekommt die Adresse/Nummer an den Eingang und gibt den Objektcode raus, der an der entprechenden Adresse/Nummer liegt. Die Adresse wird vom Programzähler erzeugt, der bei 0 anfängt und im Prinzip immer nur hochzählt, es sei denn, es wird ein Objectcode ausgewählt, der das ändert. Es gibt natürlich beliebige Abweichungen von diesem Schema. Gruß Axel
Ne andere Art und Weise sich das vorzustellen ist, dass der uC sozusagen ein winziges Programm fest in Hardware gegossen hat. Dieses Programm tut nichts anderes als Befehle aus dem Speicher zu lesen, die Befehle zu interpretieren und die Komponenten der CPU (ALUs etc.) entsprechend anzusprechen. Bei aufwendigeren CPUs, wie sie für Desktops zum Einsatz kommen, ist das Ganze dann zweistufig aufgebaut: Die Hardware führt erstmal den Microcode aus, welcher wiederum die Befehle aus dem Speicher ausführt.
:
Bearbeitet durch User
Hier eine mögliche Umsetzung: Bis zur Ebene der Maschinenbefehle sollte es klar sein, als Beispiel "Addiere Register1 mit Register2", das ist ein bestimmter Befehlscode, z.B. 0b1001101000010010 (natürlich prozessorabhängig). Die Maschinenbefehle werden einer nach dem anderen in das Instruction-Register geladen, wo sie abgearbeitet werden. Für die Abarbeitung hängt an dem Instruction-Register ein Dekoder, für jeden Maschinenbefehl hat der Dekoder einen Ausgang. Der Dekoder ist aus Gattern leicht aufzubauen. Für unseren Additionsbefehl schällt also genau einer der vielen Dekoderausgang auf High. Dieser ist mit dem Additionsblock verbunden und fungiert als Enable-Signal. Bei der nächsten Taktflanke führt der Additionsblock dann seine Logikverknüpfungen zwischen den beteiligten Registern durch. Sowohl die Eingänge, als auch die Ausgänge des Additionsblocks liegen direkt auf den Registerbits. Alle anderen Dekoderausgänge sind gleichzeitig low, die anderen Befehlsblöcke (Subtraktion, Sprungbefehle, Verzweigungen usw.) haben also keine Freigabe. Ihre Ausgänge, die ebenfalls mit den Registerbits verdrahtet sind, werden durch Transistoren getrennt, um bei fehlender Freigabe die Register nicht zu verändern. So lauern praktisch alle Befehlsblöcke (aus Gattern verschalten) an den Prozessorregistern und warten nur darauf, dass sie durch das Instruction-Register die Freigabe bekommen. Der Prozessortakt sorgt dafür, dass die Befehle nacheinander in das Instruction-Register geladen werden, und dass die Befehlsblöcke im richtigen Zeitpunkt ihre Verknüpfungen durchführen.
Ein Programm ist eine Ansammlung von Bytes, bestehend aus Befehlen und Daten. Jedes Byte hat eine Adresse im Speicher. Nach dem Reset beginnt der Prozessor bei Adresse 0 und lädt somit das erste Byte, das wird als Befehl interpretiert. Nun gibt es eine große Matrix in der alle Befehle drin stehen und die wird verglichen mit dem geladen Befehl, entsprechend dem einen gefunden werden die Gatter gestellt und ausgeführt. Danach wird automatisch die Adresse um eins erhöht und es wird der nächste Befehl geladen. Nun gibt es Befehle die Daten benötigen, dann wird ebenfalls die Adresse um eins erhöht und es werden die zum Befehl gehörigen Daten gelesen. Daten können entweder Zahlen zur Rechen Operation sein oder eine Adresse für einen Sprung an eine andere Adresse im Speicher oder eine Adresse auf der die Daten gelesen / geschrieben werden sollen. *1) Es gibt Prozessoren die nicht ab Adresse 0 den ersten Befehl erwarten *2) Je nach Bitbreite vom Prozessor 8/16/32 erhöht sich die Adresse um eins = 1/2/4 Byte. *3) Diese Erklärung ist recht einfach gehalten, tatsächlich gibt es Kombination aus Befehlen und Daten damit Zeit beim Lesen des Speichers gespart wird. Auch gib es Befehl die aus 2 Speicherstellen bestehen.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.