Forum: Offtopic wie funktioniert physikal. ein programm?


von Jens K. (trunx)


Lesenswert?

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
von guest (Gast)


Lesenswert?

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.

von HBich (Gast)


Lesenswert?

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.

von Michael B. (laberkopp)


Lesenswert?

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
von Jens K. (trunx)


Lesenswert?

danke an alle :)

von Hannoveraner (Gast)


Lesenswert?

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

von soso... (Gast)


Lesenswert?

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 ;-)

von Sigint 112 (sigint)


Lesenswert?

Könnte auch interesannt sein: www.nand2tetris.org

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

"Mikrocode" ist ein gutes Stichwort, um da weiter zu lernen.

von Karl (Gast)


Lesenswert?

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.

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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.

von Georg A. (georga)


Lesenswert?

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...

von Axel L. (axel_5)


Lesenswert?

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

von Alex G. (dragongamer)


Lesenswert?

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
von Thorsten M. (pappkamerad)


Lesenswert?

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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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
Noch kein Account? Hier anmelden.