So, schönen guten Morgen.
Ich begrüße Sie zur Vorlesung Grundlagen der Informatik II.
Letzte Woche vor Weihnachten, nicht mehr viel Zeit.
Am Montag hatten Sie die Großübungen, die Saalübungen.
Ich hoffe, das war für Sie alle etwas, was hilfreich für Sie war.
Sie konnten Fragen stellen.
Soweit ich das gehört habe von meinen Mitarbeitern, war das alles
recht gut.
Und heute machen wir weiter mit den Themen der physikalischen
Realisierung.
Muss ich hier einmal kurz das ein bisschen kleiner machen, damit ich
hier durchblittern kann.
So, jetzt geht's.
Ich hörte gerade, dass die Aufzeichnung von der vorigen Woche leider
erst heute freigegeben wird.
Da gab es ein technisches Problem in der Bibliothek, im Diva-Bereich.
Das lag nicht an uns, dass das nicht erfolgt war.
Okay, ich muss mal ganz kurz hier noch etwas überprüfen.
Ich hoffe, die Aufzeichnung schon scheint in Ordnung zu sein.
Also mache ich weiter.
Wir hatten uns letztes Mal beschäftigt mit der physikalischen
Realisierung.
Da war ich schon letztes Mal gewesen.
Wir hatten uns verschiedenste Dinge angeschaut.
Ich hatte Ihnen etwas über Transistoren erzählt.
Über NMOS und PMOS Transistoren.
Wir hatten gesehen, dass die genau komplementär arbeiten.
Dass die eben mit 0 oder 1 am Gate entweder einen durchlässigen oder
nicht durchlässigen Kanal produzieren.
Also eine Verbindung zwischen Source und Drain.
Und wir hatten dann als einfaches Beispiel den Inverter genommen, als
sehr einfache CMOS-Schaltung.
Und dann anschließend uns NAND und NOR als weitere einfache
Schaltelemente angeguckt.
In diesem Fall eben einfacher als ein AND oder OR.
AND oder OR konnte man dann durch einen weiteren Inverter, den man
hinten dran nimmt, produzieren.
Wir hatten dann Transfergatter betrachtet.
Gesehen, wie man daraus Verzögerungsglieder bauen kann, die genau
diese Schleusenfunktion haben, die wir brauchten für den
Verzögerungsglied bei der Rückkopplung der Zustandsinformationen in
Schaltwerken.
Ich hatte Ihnen dann gezeigt, wie man Schaltkreise entwirft durch
geometrische Objekte, wie man auf dem Bildschirm einfach diese
Rechtecke zeichnet und entsprechende Regeln einhält für die Abstände
zwischen diesen einzelnen Rechtecken und auch Überlappungsbereiche, um
dann Transistoren, N-Diffusions-, P-Diffusionsbereiche zu produzieren
und Metallbereiche zu produzieren.
Das hier ist ein typisches Bild eines Inverters, bestehend aus einem
PMOS - und NMOS-Transistor, die hier angedeutet sind.
So sieht es also aus, wenn man im Full-Custom-Entwurf Schaltungen
entwirft.
So kann man logische Bauelemente, Schaltnetze, Schaltwerke entwerfen
und dann in Hardware realisieren lassen.
Ich hatte Ihnen erzählt, dass man das auf unterschiedliche Art und
Weise machen kann.
Im Full-Custom-Entwurf, dann im Semi-Custom-Entwurf, wo man nur
Bausteine verwendet, die dann automatisch verbunden werden.
Oder im Silicon-Compiler, wo man nur die Funktion definiert und dann
entsprechend weiterarbeitet.
Das war die letzte Folie beim letzten Mal und da ging es um die
Entwurfsregeln.
Wie gesagt, minimale Leiterbahnbreiten sind wichtig, damit tatsächlich
Strom fließen kann.
Dass damit auch Unregelmäßigkeiten beim Entwurf oder bei der
Herstellung, die hier oben angedeutet sind, damit die tatsächlich
geeignet kompensiert werden können und damit trotzdem noch eine
funktionsfähige Verbindung da ist.
Abstände müssen da sein, damit nicht ungewollte Verbindungen
entstehen.
Und dann Überlappungen von Leiterbahnen, um eben dafür zu sorgen, dass
wenn das hier ein Polysilizium-Bereich ist, also roter Bereich, dass
der eben wirklich vollständig rüberragt über einen Diffusionsbereich
und nicht zu eng oder zu kurz ist, sodass dann ein Kanal entsteht, der
gar nicht da sein soll.
Diese ganzen, wie gesagt, beim Entwurf zeichnet man diese
geometrischen Objekte und die werden dann umgesetzt in eine Reihe von
Masken, die nacheinander aufgebracht werden oder die verwendet werden
für Drucktechnologien im Wesentlichen, das sind lithografieähnliche
Drucktechniken, bei denen man aus dem Material oder in das Material,
wie ich gesagt hatte, zum Beispiel Verätzungen einbringt mit Arsen
oder Indium, um diese N- oder P-Diffusionsbereiche zu erzeugen und
dann Dinge rausätzen und Ähnliches.
Das sind also ganz typische Drucktechniken, die man natürlich hier in
einer sehr, sehr, sehr starken Art verfeinert.
Und Sie wissen, dass man dazu heutzutage eben Reihenräume braucht, in
denen wirklich kein Staubkorn mehr oder keinerlei Verunreinigung da
sein darf, weil diese Leiterbahnen mittlerweile sehr eng sind.
Man kann die Technologie charakterisieren anhand der minimalen
Leiterbahnbreite, hat man manchmal auch Lambda für diese minimale
Leiterbahnbreite und diese minimale Leiterbahnbreite, die war so in
den 80er-Jahren etwa bei einem µ.
Mittlerweile sind wir unten, also im Bereich von wenigen Nanometer,
also ein sehr, sehr großer Unterschied.
Wir haben eine sehr große Entwicklung in der Technologie gehabt.
Zwischendurch gab es mal Veröffentlichungen, wo Leute geschrieben
haben, dass wenn man unter 32 oder 35 Nanometer kommt, dass dann
gewisse Materialien nicht mehr Leiter sind, sondern Isolatoren.
Das war alles nicht wahr.
Oder es gibt Überlegungen, wenn man eben hier in diese Bereiche
reinkommt, dann wäre die Fehleranfälligkeit der Chips, die produziert
werden, so hoch, dass man sehr stark redundante Technologien
entwickeln muss, damit man eben mehrere Bausteine nebeneinander hat,
von denen dann mindestens einer noch funktionsfähig sein soll.
Man braucht also fehlertolerante Strukturen.
Auch das hat man tatsächlich sehr weitgehend hinbekommen können, dass
man immer noch funktionsfähige Schaltungen hat, selbst wenn man diese
sehr starken Maßnahmen für Fehlertoleranz nicht eingebaut hatte.
Man hat trotzdem gewisse Fehlertoleranz-Eigenschaften immer drin, da
werden wir gleich noch drauf kommen im nächsten Kapitel, aber die
Technologie hat sich in einem sehr, sehr erstaunlichen Maß hier
weiterentwickelt, so dass wir hier wirklich eine Entwicklung haben,
die dazu geführt hat, dass wir sehr kleine Komponenten haben, die sehr
viel Logikbauelemente integrieren können und damit kann man eben
Mikroelektronik herstellen, die, wie Sie alle wissen, mittlerweile uns
an allen möglichen Stellen in unserem Leben begegnet.
Man nennt die Integrationsdichte oder belegt die mit verschiedenen
Namen.
Das ging los irgendwann in den 60er Jahren, als man die ersten
integrierten Chips gebaut hat.
Da hatte man Small Scale Integration, weniger als 12 Gatter pro
Logikchip.
Logikchip heißt in der Regel ein Quadratzentimeter, also das ist so
ein Zentimeter zum Quadrat.
Sieht ja nicht wie ein Quadrat aus, soll aber eins sein.
Und das ist so, wenn ich also hier Angaben mache mit Gatter pro
Logikchip, sind das Gatter pro Quadratzentimeter in der Regel.
Dann ging das weiter mit Medium Scale Integration, Large Scale, Very
Large Scale Integration.
Das war so etwa um das Jahr 1980, Very Large Scale Integration.
Und da hat es ein sehr großes Buch gegeben, ein Buch von Mead und
Conway.
Die haben Entwurfsregeln dargestellt, die Technologie dargestellt für
Very Large Scale Integration.
Und insbesondere eine Technologie, mit der man skalierbar
Entwurfsregeln zusammengestellt hat, sodass man einen sehr
systematischen Weg entwickelt hat, wie man durch Very Large Scale
Integrated Circuits entwickeln konnte.
Es führte dazu, dass in den USA damals, das war eine Technologie, die
nannte sich MOSIS, die hatte eine skalierbare Technologie für die
Herstellung integrierter Schaltungen und mit sehr wenigen Regeln.
Führte dazu, dass man an den Universitäten Programme eingerichtet hat,
um Hardware zu entwickeln.
Man hat das bei uns in Deutschland auch gemacht, hat dann staatliche
Programme eingeführt, sodass der Entwurf von hochintegrierten
Schaltungen an Universitäten unterstützt wurde.
Ich war damals an einer Universität, das war da im Norden tätig, und
damals hatten wir uns mit der Technologie beschäftigt, hatten
Schaltkreise entworfen, hatten aber keinen Zugang zu der Technologie,
zum Umsetzen, zum Herstellen von Chips, wir wollten das gerne machen,
haben uns an das entsprechende Projekt gewandt, in Deutschland das
Förderprogramm, in dem diese Fertigungstechnologien bereitgestellt
wurden, und dann sagte man uns, naja, es würden gerade neue
Entwurfsregeln entworfen werden oder zusammengestellt werden, die auf
die aktuelle Technologie abgestellt sind, wir müssen uns da etwas
gedulden.
Dann haben wir das getan, ein Vierteljahr später nochmal nachgefasst,
dachten, ja, das ist noch nicht fertig, es sind noch erst die anderen
Projekte dran, und wir wären ja nicht in dem Programm drin, und das
wäre alles ganz schwierig, und man müsste halt, das wären halt
komplexe Regeln.
Dann hatte ich Kontakt zu einem Wissenschaftler aus Dänemark, also ich
war damals in Kiel, oben im Norden, aus Dänemark, und habe mich mit
dem darüber unterhalten, er sagte, ach, Sie haben in Norwegen, oder
nicht in Norwegen, in Skandinavien, ein Programm, das nannte sich
Nordchip, und in diesem Programm, ein Programm für Universitäten, in
denen die auf sehr einfache Art und Weise Chips produzieren können, da
hätten Sie einen einfachen Satz von Regeln entwickelt, mit denen man
wöchentlich jede Schaltung entwerfen kann, wir könnten uns das
anschauen, könnten über die auch dann entsprechend fertigen, wir haben
innerhalb von 14 Tagen unseren Entwurf umsetzen können, in einen
Entwurf für hochrelegierte Schaltungen, haben einen Chip fertigen
lassen über die skandinavische Organisation zur Fertigung von
Multiproject -Chips, und hatten funktionsfähige Schaltkreise
anschließend, die unsere Funktion dann tatsächlich realisiert haben,
das waren Sortierfunktionen, wir konnten also sortieren auf einem
kleinen Chip, und wir haben dann das anderen gezeigt, die in
Deutschland in dem Programm gefördert wurden, um zu lernen, wie man
hochintegrierte Schaltungen entwirft, die konnten das gar nicht
fassen, dass wir als ein Lehrstuhl aus der theoretischen Informatik in
der Lage waren, mit diesen einfachen Regeln funktionsfähige Chips zu
bauen, während in Deutschland, wo man versuchte, sehr komplexe Regeln
zu entwerfen, die halt die Technologie ausreizen, damit jetzt Chips zu
produzieren, da waren leider keine funktionsfähigen Chips
herausgekommen, weil die zu anfällig waren.
Ich erzähle das aus einem ganz bestimmten Grund.
Sie werden später als Wirtschaftsingenieure ja auch damit zu tun
haben, wie man Technologien entwickelt.
Und es ist manchmal so, dass wir in Deutschland die Tendenz haben,
Technologien bestmöglich auszureizen, und wirklich an der vordersten
Front der Technologie zu sein, und dann hat man mit allen möglichen
Schwierigkeiten zu tun, die einen technologischen Fortschritt manchmal
eben behindern und es behindern, dass man Erfahrung sammeln kann.
Die Skandinavier haben das anders gemacht.
Die haben gesagt, wir machen ganz konservative, einfachen Satz von
Regeln, mit denen man Chips entwerfen kann, in der Art, die ich hier
angesprochen habe, Abstände von Leiterbahnen, Abstände zwischen
Leiterbahnen, Überlappungsregeln und ähnliches, und damit konnte man
relativ gut funktionsfähige Chips produzieren, und dadurch konnten
viele Studenten zu der Zeit damals Erfahrungen sammeln damit, wie man
hochreinigierte Schaltungen entwirft, wie man sie testet und
ähnliches.
Und das war sehr erfolgreich.
Da sind Firmen entstanden wie Nokia und ähnliches, die auf diesen
Erfahrungen aufgebaut haben.
Und bei uns hat man auf ganz andere Technologien gesetzt und hat genau
diese Sachen eigentlich verschlafen.
Und das ist aber so ein bisschen unsere Mentalität, dass wir sagen,
wir wollen alles ganz toll machen und Technologien ausreizen und
vergessen dabei, dass man erstmal Erfahrung sammeln muss und
vielleicht ein bisschen vorsichtiger ist und einfache Wege geht, damit
aber Erfahrung sammelt und dann in der Lage ist, auch das zu
verfeinern und bessere Dinge zu machen, die die Technologie dann
wirklich besser ausreizen.
Also das ist so ein bisschen Technologieerfahrung, die ich an dieser
Stelle einfach ansprechen wollte.
Sie werden Wirtschaftsingenieure und müssen später über technologische
Entwicklungen oder werden die auch beeinflussen.
Und dann muss man sich über solche Dinge auch im Klagen sein.
Und ein weiterer Punkt, als Mead Conway ihr Buch geschrieben haben,
das sehr einflussreich war, über Fowler's Ehrentwurf oder Wieler's
Eredesign, da gab es ein Kapitel drin, in dem etwas stand über die
physikalischen Grenzen der Hochradikation von Schaltungen.
Welche Grenzen es geben wird für optische Technologien, also optische
Lithographie, wie man damit Schaltungen produzieren kann.
Und das war physikalisch begründet, warum es bestimmte Grenzen gibt
für die Hochintegration.
Wir sind heute weit unterhalb dieser Grenzen, die damals physikalisch
begründet wurden.
Und das ist ein Punkt, der Ihnen auch immer wieder begegnen wird, dass
Sie Informationen lesen darüber, dass irgendwelche Grenzen der
Technologie nicht überschritten werden können.
Und diese Überlegungen basieren häufig auf irgendwelchen
Modellannahmen oder Annahmen über Eigenschaften von Technologien.
Und sobald sich diese Annahmen ändern, sobald sie von anderen Annahmen
ausgehen, kann es sein, dass Sie auf einmal in völlig andere Regionen
der Technologie vorstoßen können, an die vorher keiner gedacht hat.
Das sieht man an einer ganzen Reihe von Technologien.
Hier im Bereich der Mikroelektronik ist das sehr deutlich gewesen, hat
es mehrfach solche Belege gegeben für Grenzen, die man nicht
überschreiten kann und dann gab es geniale Leute, die Ideen hatten,
wie man mit völlig anderen Ansätzen eben doch darüber hinaus konnte.
Genauso gab es das bei Kommunikationstechnologien bezüglich der
Übertragungswandbreiten von Telefonleitungen, wo man auch sagte, das
geht über ein paar tausend Bits pro Sekunde nicht hinaus.
Mittlerweile können wir im Megabit-Bereich, weil man eine völlig
andere Art der Informationscodierung entwickelt hat, mit der man
darüber hinausgehen kann.
Das möchte ich einfach ansprechen, solche Dinge.
Bei Technologieentwicklungen kommt es darauf an, einfach kreativ zu
sein und sich nicht irre machen zu lassen, durch Dinge, wenn es also
heißt, physikalisch kann man über bestimmte Dinge nicht hinaus oder
bestimmte Probleme kann man in einer gewissen Art nur lösen und anders
nicht.
Ich habe Ihnen etwas erzählt über Addition und ähnliche Dinge,
Addition, Multiplikation.
Da habe ich Ihnen gezeigt, wie man von einem Linearzeit-Addierer auf
einen logarithmischen Zeit-Addierer kommen kann und mit einer anderen
Codierung, nicht mehr die normale binäre Codierung, sondern eine
andere Art Codierung, dadurch die Carry-Safe-Codierung vorgestellt,
auf einmal auf konstante Zeit.
Und das sind alles Dinge, die man sich überlegen muss, wie stelle ich
mein Problem dar?
Welche Auswirkungen hat das darauf, wie ich das Problem lösen kann?
Okay, das sei dazu genug und ich möchte Ihnen dann einfach kurz
darstellen, wie man beim Hardwareentwurf vorgeht.
Es gibt also viele Hardwarebausteine, die man entwerfen kann.
Auch das ist ein wichtiger Teil, warum ich Wert darauf lege, dass Sie
als Wirtschaftsingenieure auch etwas lernen über diese Art, wie man
Hardware entwickelt.
Informationsverarbeitung besteht nicht nur daraus, dass man Programme
schreibt in Java, sondern Informationsverarbeitung besteht auch darin,
dass man Systeme entwirft, die Informationen verarbeiten können und
das ist auch Hardware und Hardware kann man auch entwerfen, so wie das
gebraucht wird, in verschiedensten Bereichen, zum Beispiel in der
Kraftfahrzeugelektronik, heutzutage bestehen die zu über 50 Prozent
aus Elektronik, Chipkarten ähnliches, intelligente Produkte aus
eingebetteten Systemen.
Lassen Sie mich hier ganz kurz nur zur Illustration auf ein paar
Bilder kommen, wo man so darstellt, was alles uns umgibt.
Das hier habe ich seit langem in dieser Vorlesung drin.
Das war so eine Vision, die ist entwickelt worden von verschiedensten
Personen hier im Bereich Hausautomatisierung.
Eine Vision, die heute schon weitgehend Realität ist, dass man an
allen möglichen Stellen im Gebäude Sensorik hat, die es einem erlaubt,
Informationen zu bekommen darüber, was gerade im Haus passiert.
Also hier dargestellt, dass man etwas weiß darüber, was unten im
Keller passiert mit Heiztechnologie, dass man Temperaturinformationen
hat, dass man Telefonkommunikation, dass man darauf jederzeit Zugriff
hat, Lichtsteuerung und so weiter.
Also eine integrierte Steuerung von vielen Funktionen innerhalb eines
Gebäudes oder auch im Hinblick auf Dienstleistungen, die wir bekommen,
eine Vielzahl von, hier damals dargestellt, für das Jahr 2020, wie ein
Roboter, der Tennis spielt oder ein Roboter, der Rasen mäht.
Sie wissen, heutzutage fahren bei uns rasenmähende Roboter rum,
selbsttätig, autonom und können genau das umsetzen, was damals für das
Jahr 2020 projiziert worden war.
Also ein starker Einfluss auf die Art, wie wir unsere Welt erleben und
wie wir Dienstleistungen in Anspruch nehmen können, um uns das Leben
einfacher zu machen und auch um zum Beispiel für ältere Leute eine
Umgebung zu schaffen, in der sie viel länger in der Lage sind,
selbstständig zu leben, als das früher der Fall war.
Hier ist dargestellt, für das Jahr 2015, Sie sehen, das ist schon
relativ alt, diese Projektion oder diese Vision, das ist etwa zehn
Jahre alt oder so, da hat man also gemeint, im Jahr 2015, und können
wir sehen, stimmt das, ist man in der Lage, über große Bildschirme mit
Personen zu kommunizieren und zum Beispiel darüber zu diskutieren,
durch geteilte Informationen, in dem Fall über Bauzeichnungen, hier
wird darüber diskutiert, wie man ein Haus bauen möchte.
Und das heißt, wir haben eine Möglichkeit, an verschiedensten Orten
virtuell präsent zu sein und Informationen auszutauschen, gemeinsam
Dinge zu planen, durch Technologien, die nur ermöglicht werden
dadurch, dass wir Mikroelektronik in einer großen Menge mittlerweile
in unsere Umwelt integriert haben.
Ich muss hier einmal kurz sehen, dass ich da wieder raufkomme.
Er mag mich heute nicht.
So, ich muss nämlich hier auf, ich muss bald wieder zurück, darauf.
Ich wollte nur darstellen, wir haben heutzutage halt unsere Welt
durchdrungen mit Mikroelektronik.
Und das nicht nur, weil wir Software entwerfen können, sondern weil
wir Hardware entwerfen können.
Weil wir kleine Bausteine bauen können in verschiedensten Bereichen,
um Funktionen zu berechnen, um Signalfolgen sinnvoll aufzunehmen, zu
transformieren, weiterzugeben.
Es werden große Datenmengen aufgenommen, Sie kennen alle das Stichwort
Big Data, mit dem wir charakterisieren, dass wir heutzutage eine
Unmenge von Daten erheben können über das, was in unserer Umwelt
passiert.
Wir können das verwenden, um technische Geräte und Prozesse zu
steuern.
Wir können alle möglichen Prozessoren, kleine Prozessoren realisieren.
Das hat unsere Welt wirklich verändert.
Und es hat auch dazu geführt, dass man neue Ansätze für den Entwurf
solcher Systeme entwickelt hat.
Das sogenannte Ubiquitous Computing, also das überall verfügbare
Rechnen.
Pervasive Computing bezieht sich darauf, dass man eine alles
durchdringende Technologie hat, die Informationsverarbeitung macht.
Organic Computing haben wir hier in Deutschland entwickelt als
Technologie, die anpassungsfähige, informationsverarbeitende Geräte
produziert.
Cyber Physical Systems soll darstellen, soll adressieren die Thematik,
dass wir heutzutage viele physikalisch operierende Systeme haben, zum
Beispiel Roboter, die durch Informationsverarbeitung, durch digitale
Geräte gesteuert sind.
Und das Problem ist, dass sie bei der digitalen Steuerung, bei der
Informationsverarbeitung zur Steuerung eines physikalischen Gerätes
immer nur ein gewisses, approximatives Abbild der physikalischen
Umwelt haben.
Wenn sie zum Beispiel einen Roboter bauen, der in der Lage sein soll,
meinetwegen in eine bestimmte Richtung zu fahren, dann können sie das
in der Simulation perfekt alles modellieren und sagen, der dreht halt
jetzt hier zwei Räder, die ich jetzt sehr schlecht gezeichnet habe,
die brauche ich ja nur zu drehen in der gleichen Geschwindigkeit und
der Roboter wird geradeaus fahren.
In der Realität werden dort aber ab und zu mal kleine Unebenheiten
sein auf dem Weg, den der Roboter fährt.
Und dann fährt er nicht geradeaus, sondern dann fährt er halt
irgendwie mal so oder so.
Und dann muss man dafür sorgen, dass er auch bei Abweichungen immer
noch einigermaßen geradeaus fährt.
Da ist also die Realität, die physikalische Realität, die
physikalische Einsatzumgebung eines Gerätes anders als das, was man in
der Simulation vorher zur Überprüfung der Funktionsfähigkeit einer
Steuerung tatsächlich ausprobiert hat.
Und damit umzugehen, dieses Zusammenspiel zwischen einer
physikalischen Umgebung mit allen möglichen Randbedingungen, die man
in der Simulation eben nicht alle drin hat.
Damit also so umzugehen, dass man immer noch funktionsfähige, robuste
Systeme dabei bekommt, ist ein ganz wichtiges Problem.
Sie kennen alle heutzutage die Entwicklungen im Bereich autonomes
Fahren.
Wir reden davon, dass wir in wenigen Jahren, und das ist realistisch,
tatsächlich selbstfahrende Autos haben werden.
Und die müssen dann in der Lage sein, genau solche Probleme alle zu
kompensieren.
Also wenn irgendein Hindernis auf einmal auftaucht, darauf richtig zu
reagieren.
Und sie wissen, was da für Probleme mit verbunden sind.
Wenn wir von autonomen Fahren reden zum Beispiel, kommen auf einmal
Probleme dann auch dazu, dass sie entscheiden müssen, wenn ein
Hindernis sich auf einmal in den Weg stellt eines autonom fahrenden
Autos, und sie können nicht rechtzeitig bremsen.
Und sie haben die Wahl zwischen zwei Hindernissen, einem kleinen, das
wegen einem Kind entspricht, und einem größeren Hindernis, das einen
alten Menschen darstellt.
Wie entscheiden sie, welches Hindernis sie überfahren?
Nach welchen Kriterien machen sie das, wenn sie die Auswahl haben?
Irgendeine Auswahl müssen sie treffen.
Wenn sie die Auswahl nicht treffen, dann kann ihnen vorgeworfen
werden, dass sie einfach beliebig irgendjemanden töten oder einen
Verlust in Kauf nehmen.
Und sie hätten ja eine sinnvolle Entscheidung treffen können.
In dem Augenblick, wo sie sich entscheiden zwischen dem Leben eines
jungen und eines alten Menschen, dann entscheiden sie auf einmal über
das Leben von Menschen.
Und solche Entscheidungen treffen sie, wenn sie über autonomes Fahren
reden.
Wenn sie darüber reden, dass die vernünftig, verlässlich im Verkehr
fahren sollen.
Genau solche Dinge sind Entwurfsentscheidungen, mit denen man auch zu
tun hat, wenn es um technische Systeme heutzutage geht.
Einfach dadurch, dass unsere gesamte Welt mittlerweile durch
Mikroelektronik, durch Strom genutzt wird.
Es gibt viele Vorlesungen dazu, wir machen hier in Karlsruhe auch
einiges in dem Bereich.
Wir haben zum Beispiel am FZI ein autonom fahrendes Fahrzeug, das auch
eine Straßenzulassung hat, mit dem man also hier in Karlsruhe auf der
Straße fahren kann.
Da muss dann immer noch jemand daneben sitzen, aber es fährt im
normalen Straßenverkehr.
Also solche Dinge sind mittlerweile bereits real und wenn sie an
solchen Themen Interesse haben, dann können sie sich gerne an uns
wenden im FZI oder auch bei uns im KIT an verschiedensten Stellen in
der Informatik, in den Wirtschaftswissenschaften, im Maschinenbau, in
der Elektrotechnik.
Also, es ist völlig klar, dass diese Hardwarebausteine, die man dann
baut, natürlich hohen Anforderungen an Qualität und Zuverlässigkeit
genügen müssen.
Wenn Sie ein Bremssystem bauen im Fahrzeug oder ein System im Bereich,
wenn Sie sagen, Sie machen jetzt meinetwegen Drive-by-Wire oder die
Steuerung eines...
Was ist denn hier heute los?
Wenn Sie die Steuerung, das Lenken nicht direkt mechanisch umsetzen,
sondern durch Software und elektronische Geräte, dann müssen Sie dafür
sorgen, dass das alles verlässlich ist, denn wenn Sie ein
intelligentes Produkt entwerfen, mit eingebetteten Systemen, dann hat
das Gerät, in dem ein solches System eingebettet ist, das hat gewisse
Gewährleistungen oder ist mit Gewährleistungen verbunden.
Sie müssen mit unabweisbaren Schadenersatzansprüchen rechnen, wenn Sie
Systeme oder Produkte ausliefern, deren Qualität nicht ausreichend
gesichert ist.
Da können Sie nicht einfach sagen, naja, da habe ich einen
Softwarefehler, dann kommt das nächste Patch und beim nächsten Mal
wird das Auto schon bremsen.
Das geht nicht.
Sie sind verantwortlich dafür, dass das, was Sie ausliefern, korrekt
ist.
Ein Thema, das wir leider in der Informatikausbildung hier in unserem
Zyklus Wirtschaftsingenieure nur am Rande behandeln.
Da wird nur über Testen geredet, bei Grundlagen Informatik I, leider
nicht über Verifikation.
Wenn Sie Hardware entwerfen, wenn Sie in diese Bereiche reingehen,
müssen Sie beweisen, Sie brauchen qualitätsgesicherte Produkte, bei
denen Sie beweisen können, dass Sie bestimmte funktionelle
Anforderungen tatsächlich erfüllen.
Weil das System, das Sie bauen, für das sind Sie verantwortlich als
Entwerfer und Sie müssen die Konsequenzen tragen, wenn dort irgendein
Fehler auftritt.
Ganz anders, als wenn Sie ein Textverarbeitungsprogramm schreiben, bei
dem da mal irgendwie ein Zeichen falsch ist.
Das ist nicht so schlimm.
Oder wenn bei der Telekommunikation irgendwann eine Verbindung nicht
klappt.
Das ist nicht so schlimm, dann macht man die Software besser beim
nächsten Mal.
Hier haben Sie konkrete Ansprüche an die Qualität dieser Systeme.
Also, man muss dafür sorgen, dass solche Hardware gut entworfen wird.
Und es geht darum, dass man nicht nur Software entwirft, sondern
Hardware und Software.
Es ist die Frage, welcher Teile sind denn eigentlich, oder wie
entscheidet man eigentlich, was man in Hardware, in Mikroelektronik
realisiert und was man durch Software realisiert, durch Programme.
Und da ist es eben so, dass es in Hardware möglich ist, gewisse
Anforderungen an maximale Zeiten zu garantieren.
Das heißt, wenn Sie eine Funktion ausführen wollen, können Sie
garantieren, dass auch im schlechtesten Fall die Zeit dafür eine
bestimmte Dauer nicht überschreitet.
Sie brauchen einen hohen garantierten Durchsatz.
Aber bei einigen Anwendungen reicht es nicht zu sagen, wie ich das
dargestellt hatte beim Adderer, dass Sie mit Pipelining den Durchsatz
erhöhen können.
Da kommt es dann manchmal eben auch darauf an, dass die Zeitspanne für
eine Ausführung einer Funktion gering ist.
Latenz ist dann auch wichtig.
Also nicht nur Pipelining, auch die Parallelität im einzelnen System
muss die Parallelität hoch sein, die Zeit kurz sein.
Und das heißt, wenn Sie Echtzeitanforderungen haben.
Echtzeitanforderungen heißt, es gibt gewisse Grenzen.
Die Dauer Ihrer Ausführung für eine Funktion muss eine bestimmte
Zeitdauer nicht überschreiten.
Wenn Sie das garantieren müssen, dann müssen Sie Dinge in Hardware
realisieren.
Da können Sie zum Beispiel keinen Rechner nehmen, der einen Cache hat
oder bei dem Prozesse unterbrochen werden können, weil Sie garantieren
müssen, dass bestimmte Funktionen durchgeführt werden.
Also, für Echtzeitanforderungen baut man möglichst viel in Hardware.
Für Softwareanforderungen, Quatsch, für weiche Anforderungen, bei
denen es nicht so sehr auf die Zeit ankommt, nimmt man dann Software.
Und die Qualitätsanforderungen gelten aber im technischen System
natürlich für beides.
Was sind das für Qualitätsanforderungen?
Natürlich Korrektheit, die richtige Funktion.
Aber auch, wenn irgendwelche Fehler auftreten, wenn
Hardwarekomponenten ausfallen, muss ich auch noch in der Lage sein,
eine Funktion korrekt auszuführen, selbst wenn eine Komponente
ausfällt.
Also, deswegen hatte ich Ihnen schon mal gesagt, dreifache Redundanz.
Sie bauen, nehmen drei identische Komponenten, machen ein Voting und
haben dann die Möglichkeit, mit einer Mehrheitsentscheidung einfach
Fehler immer noch zu kompensieren.
Wenn also nur eine von drei Komponenten ausfällt, die gleichartig
arbeiten sollen, dann können Sie über die Mehrheitsentscheidung der
anderen beiden immer noch die richtige Funktion ausführen.
Es gibt viele Ansätze für Fehlertoleranz.
Testbarkeit ist wichtig.
Sie müssen in der Lage sein, Komponenten zu testen.
Wenn Sie Chips haben mit Millionen von Transistoren drauf, müssen Sie
in der Lage sein zu testen, ob die alle funktionsfähig sind.
Große Aufgabe.
Entsprechend muss man dafür sorgen, dass der Entwurf so ist, dass die
Komponenten testbar sind.
Und ohne den Einsatz formaler Methoden für sowohl Spezifikationen als
auch Entwurf als auch Realisierung kann man solche
Qualitätsanforderungen nicht erfüllen.
Das heißt, wenn Sie verantwortlich sind irgendwann mal für den Entwurf
von informationsverarbeitenden Systemen und Sie dafür verantwortlich
sind, dass das, was dabei herauskommt, korrekt ist, müssen Sie dafür
sorgen, dass Sie einen systematischen Entwurfsprozess haben.
Implementierungsprozess.
Qualitätssicherungsprozess.
Da gibt es viele systematische Ansätze und die muss man kennen.
Wenn man die nicht kennt, macht man Unsinn.
Leider gibt es viele Leute, die in den Bereich
Informationsverarbeitung hineingekommen sind und gemeint haben, naja,
das ist alles ganz einfach, so ein paar Programme zu schreiben.
Das ist eben nicht so einfach.
Man muss in der Lage sein, qualitätsgesichert sowas zu tun und dafür
braucht man einfach gewisse weitere Kompetenzen.
Man muss etwas wissen über die adäquate formale Modellierung aller
Systeme.
Kleine Grundlagen dafür habe ich Ihnen bereits vorgestellt.
Automaten, Grammatiken, Ontologien.
Was sind Ontologien?
Da geht es darum, zu argumentieren über die Bedeutung von
Begriffsgebilde, um meinetwegen einen Bereich zu charakterisieren, in
dem man Software für Fahrzeuge herstellt.
Da muss man dafür sorgen, dass das, was man dort über die Bedeutung
von bestimmten Begriffen festlegt, wie eine Bremse zu spezifizieren
ist, dass das auch in anderen Sprachen richtig gemacht wird.
Das hat was zu tun, Begriffsgebilde ineinander zu übersetzen und
ähnliches.
Da spielt der Bereich Semantic Web eine große Rolle.
Dann braucht man systematische formale Methoden beim Systementwurf.
Da sind wir weniger darauf eingegangen bisher.
Und Sie müssen eben in der Lage sein, die Eigenschaften von Systemen
bezüglich Korrektheit, Fehlertoleranz, Testbarkeit und Effizienz
gründlich zu analysieren.
Die Kosten für ein solches System spielen natürlich auch eine Rolle.
Okay, dazu, welche Anforderungen wir haben.
Dann gibt es gewisse Vorgehensweisen, dass ich zunächst mal abstrakt
spezifiziere, wie Hardware tatsächlich gebaut werden soll, welche
Eigenschaften ein System haben soll.
Ich habe hier irgendeine Blackbox, die hat gewisse Eingänge.
Sie erinnern sich an unser Bild von den Schaltnetzen, Schaltwerken.
Da sage ich nur, was ich für Eingabevariablen habe, was für
Ausgabevariablen.
Also hier meine Eingaben, da die Ausgaben, hier habe ich den
Zustandsraum und das Übergangsverhalten.
Das wäre ein Automatenentwurf von eingebändeten Systemen.
Es besteht ganz oft darin, dass man endliche Automaten entwirft,
finest state machines, um gewisse technische Komponenten sinnvoll
steuern zu können.
Und dann muss man genau reinschauen und sehen, wie sieht denn
eigentlich hier dieses Ding da drinnen aus.
Da kann ja sein, dass man da viele verschiedene Komponenten hat, die
irgendwie miteinander verbunden sind.
Wie baut man das eigentlich geeignet auf, sodass daraus ein
effizientes System wird.
Dann kommt die sogenannte Register-Transfer-Ebene.
Sie haben ein System, wenn Sie da genau reingucken, ich hatte hier
eine Reihe von Komponenten jetzt hier reingemalt und das sind
vielleicht alles kleinere Teilschaltnetze.
Schaltnetze, da legen Sie Eingaben an und es kommen am Ende die
Ausgaben raus.
Sie wollen vielleicht irgendetwas machen wie gewisses Pipelining.
Dann müssen Sie hier drin, an solchen Stellen, wenn wir uns das
genauer angucken, dann heißt es, Sie haben hier den Ausgang von einem
Schaltnetz, da irgendein neues.
Dann müssen Sie hier erstmal zwischendrin ein Register einbauen,
sodass Sie Zwischenwerte zwischenspeichern können und dann
weitermachen mit dem nächsten Schaltnetz.
Sie brauchen Register, wir hatten uns Register angeschaut, brauchen
also Parallelregister, das ist also hier ein solches Register, um eben
Werte erstmal zwischenzuspeichern und dann weiterzugeben an
nachfolgende Komponenten.
Das ist die sogenannte Register-Transfer-Ebene.
Sie haben Zwischenwerte, also Eingaben, Zwischenwerte kommen in solche
Register und werden dann weitergegeben an nachfolgende Komponenten.
Das ist die Register-Transfer-Ebene.
Sie haben eine Kombination von Schaltnetzen und Registern zur
Zwischenspeicherung von Zwischenergebnissen.
Und dann geht es darum, diese Schaltnetze zu übersetzen in Gatter,
logische Gatter, da kommt ein logischer Entwurf, Sie haben eine
Schaltfunktion, die beschreiben Sie durch buddhische Ausdrücke und
dann können Sie aus den buddhischen Ausdrücken entsprechend
systematisch die Gatterebene entwerfen, wie die Schaltnetze aus
elementaren Gattern aufgebaut sind.
Und dann kommt die Transistorebene.
Wie realisieren Sie tatsächlich diese Schaltung, wobei ich Ihnen schon
gesagt hatte, dieser Weg von Register-Transfer-Ebene auf
Transistorebene, beim Entwurf von Schaltnetzen kann es sein, dass man
Dinge eigentlich direkt in Transistoren realisiert und nicht den Weg
über die Gatter nimmt, weil man eben manchmal bei der Realisierung von
Gattern, wenn man das als Gatter-Schaltbild sich anschaut, auf einmal
viel mehr Transistoren brauchen würde, als wenn man direkt die
Funktion durch ein Transistorschaltbild realisiert.
Das hatten wir gesehen am Beispiel des Verzögerungsneeds, des Master
-Slave -Flip-Flops, dass wir mit wenigen Transistoren realisieren
konnten, wenn man das realisiert hätte über die Gatter-Schaltbilder
der RS-Flip-Flops, der beiden Hauptspeicher-Flip-Flops innerhalb eines
solchen Master-Slave-Flip-Flops, hätte man eine deutlich größere
Schaltung gehabt.
Und dann kommt danach die Layout-Ebene, dann werden die CMOS-Layouts
entworfen, hatte ich Ihnen gesagt, Full-Custom-Entwurf, Semi-Custom
-Entwurf oder wie immer man das macht, und anschließend die Fertigung.
Viele Masken, das sind also Prozesse, bei denen man so
Größenordnungen, mehrere Dutzend Masken übereinanderlegen muss, und
Sie können sich vorstellen, wenn Sie hier irgendeine Struktur haben,
da müsste hier ein Komponente sein, da eine sein, da eine Leiterbahn
oder ähnliches, und Sie machen jetzt, da kommt jetzt die nächste Maske
oben drüber, und erst wenn Sie diese vielen Masken alle verwendet
haben, um Ihre Schaltung zu erzeugen, ist die fertige Schaltung da.
Dann müssen Sie dafür sorgen, dass die alle 100% aufeinander passen,
dass Sie keine Abweichungen haben in der Positionierung dieser Masken,
dass Sie eben bei jedem Prozess sehr kleine Fehlerwahrscheinlichkeiten
haben und ähnliches.
Sehr hohe Qualitätsanforderungen.
Und all das muss systematisch, qualitätsgesichert funktionieren
können.
So, das war zum Prozess.
Und jetzt müssen wir uns überlegen, wie man, wenn ich sage, wir wollen
systematisch Hardware entwerfen, wie macht man das denn?
Wie beschreibt man denn eigentlich eine Hardwarekomponente?
Und dafür gibt es Programmiersprachen.
Nicht Programmiersprachen, sondern Hardwarebeschreibungssprachen.
Ich möchte Hardware entwerfen und beschreibe die Hardware in einer
sprachlichen Form.
Also ich schreibe nicht nur die Eingaben für einen Universalrechner in
einer sprachlichen Form, die wir normalerweise Programme nennen,
sondern wir können genauso gut Hardware entwerfen, in einer
sprachlichen Form.
Das sind dann sogenannte Very High Speed Integrated Circuit Hardware
Description Languages.
Da gibt es auch unterschiedlichste Ansätze für, VHDL ist ein Standard,
der sich entwickelt hat.
Der wurde durchgesetzt vom amerikanischen Verteidigungsministerium
gegen Entwicklungen, die es in Europa gab, die eigentlich funktional
besser waren, aber sie wurden halt durchgesetzt dadurch, dass
Spezifikationen für elektronische Komponenten in VHDL beschrieben
werden mussten.
Und da hat man sich halt darauf verständigt.
Es gibt mittlerweile auch noch weitere Dinge, weitere Sprachen, die
das weiterentwickelt haben.
So Sprachen System C zum Beispiel.
Also System C ist eine Sprache, die einfach C angelehnt ist und dann
für den Systementwurf geeignet ist.
Oder es gibt eine Sprache Handle C.
Also unterschiedlichste Sprachen, nur dass Sie sehen, es gibt da auch
eine Bandbreite von verschiedenen Sprachen.
Ich möchte Ihnen ganz kurz etwas darstellen, wie man mit VHDL eine
einfache Komponente entwerfen kann.
Nur dass Sie einen Eindruck davon gewinnen, wie sieht es aus, wenn man
jetzt ein Stück Hardware entwerfen möchte.
Und was muss ich dafür machen?
Ich muss eine Komponente entwerfen.
Und so eine Komponente, wie gesagt, die hat irgendwelche Eingaben,
irgendwelche Ausgaben, die hat hier drin irgendeine Struktur.
Das ist die Systemstruktur.
Und ich habe ein Systemverhalten.
Ich muss mir anschauen können, wenn ich hier irgendeine Eingabe E
mache, was kommt dort für eine Ausgabe raus und wann kommt sie raus.
Also welche Funktion muss realisiert werden und wie sieht das
zeitliche Verhalten aus, das dabei entstehen soll.
Das wäre das Systemverhalten.
Und wie man das macht, beschreibe ich Ihnen hier am Beispiel eines
Halbadierers.
Das wäre so eine typische Komponente, die Sie schon mal kennengelernt
haben.
Wir haben zwei Eingänge, zwei Bits und wir haben zwei Ausgänge und
eine Funktion, die realisiert werden soll.
Das deklariert man als ein Objekt bzw.
als eine Entity.
Halbadierer und dieser Halbadierer soll jetzt im Prinzip genau dieses
Bild, was hier steht, durch das jetzt einfach nur charakterisiert
werden.
Das heißt, ich habe zwei Eingänge, x und y.
Das sind Eingänge in und zwar Bits, also binäre Werte, binäre
Variablen.
Keine Bytes, sondern Bits in dem Fall.
Und ich habe Summe und Übertrag, das sind Ausgänge dieser Komponente.
Und das ist schon alles.
Ich nenne das Ding Halbadierer, ich habe zwei Eingänge und zwei
Ausgänge.
Damit habe ich einen schwarzen Kasten definiert, Halbadierer.
Wie der innen drin aussieht, könnte ich auch definieren, wenn ich
weitere Objekte definiere, wie die Komponenten, die ich dafür brauche,
XOR und so weiter, um die Summe und den Übertrag zu realisieren.
Das haben wir uns alles angeschaut, will ich es aber von abstrahieren.
Und ich muss das Verhalten darstellen.
Wenn ich also einen solchen Kasten definiert habe, sage ich, wie ist
das Verhalten.
Das ist eine Beschreibung der Architektur und zwar bezogen auf das
Verhalten dieser Komponente.
Dann sage ich, ich habe hier einen Prozess, der ablaufen soll, das ist
das Verhalten.
Und es soll der Wert Summe, soll entsprechen dem XXORY nach 5
Nanosekunden, soll dieser Wert vorliegen.
Und der Wert Übertrag, das ist X und Y, soll ebenfalls nach 5
Nanosekunden vorliegen.
Also 5 Nanosekunden, nachdem die Eingaben an dieser schwarzen Kasten
vorlagen.
Und man soll also warten auf XY, also dass sich bei den Eingängen
irgendetwas verändert.
Und dann nach 5 Nanosekunden sollen die entsprechenden Werte XXORY und
XANDY an den Ausgängen Summe und Übertrag verfügbar sein.
Das wäre dieser Prozess.
Jetzt wird also dadurch beschrieben, welche Funktion realisiert werden
soll, welche Schaltfunktionen da drin sind und wie das zeitliche
Verhalten sein soll.
Und jetzt betrachte ich einen Volladierer.
Ein Volladierer ist ja mehr als ein Halbadierer.
Und ich möchte gerne den Volladierer dann aufbauen und Ihnen da
zeigen, wie man eine Struktur darstellen kann.
Hier habe ich wieder eine Entity, also eine Komponente.
Entity, Volladierer, in dem Fall haben wir drei Eingänge, A, B und
Carry In.
Und wir haben zwei Ausgänge, Summe und Carry Out.
Bisschen anders beschrieben, man kann sich also variablen wählen, wie
man möchte.
Der Kasten heißt jetzt Volladierer.
Das ist genau entsprechend zu dem, was ich Ihnen für Halbadierer
dargestellt habe.
Und jetzt kommt die Strukturdefinition.
Die Struktur eines Volladierers kann ich so darstellen, dass ich hier
einen Halbadierer habe, in den die beiden Bits A und B reingehen.
Dann kommt dort eine Summe und einen Übertrag raus.
Und ich muss dann natürlich noch den Übertrag aus der vorhergehenden
Position mit dazu addieren.
Deswegen geht die Summe nochmal in den zweiten Halbadierer rein.
Und ich muss die Überträge aus den beiden Halbadierern jetzt
destruktiv verknüpfen, um daraus den Gesamtübertrag zu bekommen.
Und dann habe ich also das Gesamtsummen-Bit und das Carry-In und Carry
-Out.
Da kann man sich überlegen, dass genau diese Struktur ein Volladierer
tatsächlich richtig realisiert.
Und jetzt kann ich diese Struktur beschreiben in VHDL, indem ich sage,
der Architekturaspektstruktur dieses Volladierers wird jetzt so
definiert, dass ich bestimmte Signale habe.
Interne Signale, TempSum, TempCarry1, TempCarry2.
Das sind Signale, die ich brauche, intern, um Komponenten miteinander
zu verbinden.
Ich brauche gewisse Komponenten.
Ich brauche eine Komponente Halbadierer, ich brauche eine Komponente
Odergatter.
Da sehen Sie, das ist ein Odergatter.
So, die habe ich jetzt hier deklariert oder definiert oder
spezifiziert, wie die aussehen sollen.
Und jetzt instanziiere ich die Komponenten.
Ich brauche also einen Halbadierer K0, das ist der hier.
Der Halbadierer K0 ist also jetzt ein Halbadierer, eine Instanz dieser
Entity oder dieser Komponente Halbadierer.
Und jetzt muss ich dafür sorgen, dass die Parameter richtig übergeben
werden.
Das heißt, bei der Definition des Halbadierers habe ich gesagt, ich
habe Eingänge x und y.
Jetzt mache ich eine Abbildung, ein Mapping dieser Eingangsvariablen x
und y auf die Eingänge a und b, die mein Volladierer hat.
Die werden also abgebildet auf a und b.
Und die Summe, also Summe und Übertrag meines Halbadierers, die werden
abgebildet auf Tempsum und TempCarry1.
Diese internen Variablen, Tempsum und TempCarry1.
Oder Tempsum und TempCarry1.
Und dann brauche ich noch einen zweiten Halbadierer, das ist der
Halbadierer K1, das ist der hier.
Und der bekommt halt als, da muss ich halt diese Variablen x und y,
die müssen, Entschuldigung, abgebildet werden auf Tempsum und Carry1.
Das ist hier, das ist der eine Eingang und Carry1, das ist der Eingang
von, oder die Variable, die Eingabe von außen.
Die beiden gehen hier rein in K1.
Und die Ausgangsvariablen Summe und Übertrag dieses Halbadierers K1
werden dann abgebildet auf unsere Ausgangsvariable Summ und auf ein
TempCarry2.
Und bei dem OderGatter, das ich dann brauche, da habe ich dann
schließlich noch das In1 und In2, das waren hier die beiden
Eingabevariablen, muss ich abbilden auf TempCarry1, TempCarry2 und die
Ausgabe ist dann das Carryout.
Jetzt habe ich eine Struktur beschrieben, in einer sprachlichen Form,
gemäß den Regeln von VHDL.
Und aus einer solchen Struktur kann man jetzt die Hardware tatsächlich
entwerfen.
Ich habe jetzt die Bausteine, ich muss dafür sorgen, dass ich durch
Bausteine in der Lage bin, das, was vorher auf der Vorbefolge beim
Verhalten beschrieben war, das XxorY und das XendY, dass ich das durch
Bausteine entsprechend umsetzen kann, also durch XorGatter und
EndGatter.
Das ist dann etwas, was zur Übersetzung dieses Programms in Hardware
gehört.
Und ich muss die Struktur entsprechend auch realisieren.
Das ist hier alles entsprechend dargestellt.
Also, was erwarte ich von Ihnen jetzt, wenn es darum geht, welche
Dinge Sie eigentlich wissen sollten, wenn Sie mal irgendwann in die
Situation kommen, dass Sie Ihr Wissen wiedergeben sollen.
Dann kann ich nicht von Ihnen erwarten, dass Sie in der Lage sind,
einen komplexen Baustein zu entwerfen in VHDL.
Aber ich kann von Ihnen erwarten, dass Sie zum Beispiel in der Lage
sind, eine VHDL-Beschreibung von einer Komponente geeignet zu
interpretieren und zu sagen, was damit wohl gemeint ist.
Und ich kann auch erwarten, dass Sie wissen, dass man Struktur und
Verhalten solcher Komponenten programmiersprachlich beschreiben kann.
Aber ich kann natürlich nicht erwarten, dass Sie in der Lage sind,
eine korrekte VHDL-Beschreibung eines komplexen Bausteins zu
entwerfen.
Aber es liegt mir daran, dass Sie wissen, dass man Hardware entwerfen
kann in einer systematischen Art und Weise und dass man dazu
eigentlich nur wissen muss, wie man die Funktionen, die realisiert
werden sollen, die Schaltfunktionen und die Strukturen geeignet,
sprachlich formuliert.
Und diese Erkenntnis ist mir wichtig, dass Sie das mitnehmen.
Man entwirft bei den informationsverarbeitenden Prozessen nicht nur
Software, sondern man entwirft Hardware und Software.
Und beim Hardware-Entwurf kann man Dinge genauso systematisch machen,
sprachlich formulieren, wie man das bei Software eben auch macht.
Und kann dann entsprechende Qualitätssicherung darauf anwenden, um
dafür zu sorgen, dass das auch alles richtig funktioniert.
Dann gibt es viele verschiedene Varianten des Hardware-Entwurfs.
Es gibt die sogenannten ASICs, die Application Specific Integrated
Circuits.
Also anwendungsspezifische Schaltkreise.
Ich hatte Ihnen gesagt, wir haben einen Sortierer entworfen oder auch
einen speziellen Addierer.
Das sind anwendungsspezifische Schaltkreise, die eine Funktion
ausführen.
Das heißt aber auch, ich baue Hardware und dieser Hardware-Baustein
kann dann nur diese Funktion ausführen.
Die kann nur sortieren oder nur addieren oder nur irgendeine
Signalverarbeitung machen.
Ich kann es aber nicht ändern nach der Fertigung eines ASICs.
Und wenn auf so einem Chip dann irgendwie ein Fehler auftritt, dann
kann ich den wegwerfen.
Wenn ich feststelle, ich habe dort einen Entwurfsfehler gehabt, muss
ich die ganze Serie Chips wegwerfen.
Das ist teuer.
Also sagt man, ich entwerfe lieber ein Stück Hardware und darauf habe
ich eine Reihe von Komponenten draufgelegt, die ich, nachdem ich sie
gefertigt habe in Hardware, noch durch Software verändern kann.
Sogenannte Field Programmable Gate Arrays, FPGAs.
Diese FPGAs haben den Vorteil, dass sie die Eigenschaften von Hardware
haben.
Sie können also Schaltnetze darauf realisieren, die in immer der
gleichen Zeit eine Funktion bereitstellen.
Aber sie können die noch, nachdem das FPGA gefertigt ist, noch
konfigurieren, auch für andere Funktionen.
Sie können ihre Funktionen verändern.
Und das hat einen Vorteil, hat aber auch einen Nachteil, dass sie
nicht ganz so effizient sind bezüglich bestimmter Anforderungen.
Sie können das Zeitverhalten nicht so hinbekommen wie bei einem
Application -Specific Integrated Circuit.
Die sind hervorragend geeignet für Prototypen, auch für relativ kleine
Stückzahlen.
Wenn Sie ein ASIC machen, wollen Sie eine Riesenauflage haben, damit
es sich lohnt, genau diesen Chip zu haben.
Wenn Sie keine so große Auflage brauchen, nehmen Sie ein FPGA.
Die sind mittlerweile sehr weit entwickelt und kommen nahe dran an
das, was Sie mit ASICs erreichen können.
Also das ist eine Entscheidung, die man treffen muss, gehe ich auf
FPGAs oder gehe ich auf ASICs, wenn ich Hardwarebausteine brauche.
Also die ganzen Schalttechnologien heutzutage, also Cisco zum Beispiel
ist ein Hersteller von Kommunikationstechnologien.
Die ganzen Schalttechnologien sind alle auf FPGA-Basis gebaut oder
weitgehend auf FPGA-Basis gebaut.
Die wirtschaftliche Entwicklung dieser ganzen Bereiche ist riesig
groß.
Wir wissen, dass Informationsverarbeitung überwiegend in technischen
Systemen abläuft und nur zum kleinen Teil in unseren Laptops,
Smartphones und ähnlichen.
Der überwiegende Teil der Informationsverarbeitung läuft in
technischen Prozessen, in allen möglichen Geräten, in solchen ASICs
und FPGAs.
Was ist ein FPGA, um das nochmal kurz darzustellen?
Was heißt das?
Ich habe das kurz mit Punkten auf dem Rechteck dargestellt.
So sieht vereinfacht ein FPGA aus.
Sie haben einen solchen Chip, da sind eine Reihe von Komponenten
drauf.
Und zwar haben Sie dort am Rand sogenannte I.O.-Blöcke, mit denen Sie
also jetzt Eingaben machen können und Ausgaben rausgeben können.
Können Sie entsprechend programmieren.
Und da sind dann halt eine Reihe von Komponenten drauf, Multiplexer
und auch Logikelemente und Verzögerungselemente, das müssen ja
Register sein, da müssen sie wieder drauf gespeichert werden können
und dann irgendwann rausgegeben.
Das sind I.O.-Blöcke, vorgefertigte Strukturen, um Ein- und Ausgaben
zu machen.
Dann haben Sie Leitungen, Verbindungen zwischen den einzelnen
Komponenten.
Jetzt sehen Sie hier so viele Leitungen übereinander und hier in der
Mitte so einen kleinen Kasten.
Wenn ich diesen Kasten versuche mal größer darzustellen, stellen Sie
sich vor, Sie haben hier drei Leitungen, ich male die jetzt mal durch,
hier durchlaufen und hier auch drei Leitungen.
Was heißt das, die zu programmieren?
An diesen Schnittstellen geben Sie an, ob die verbunden sein sollen
oder nicht.
Und in welcher Art die verbunden sein sollen.
Sie können also sagen zum Beispiel, dass Sie diese Verbindung haben
wollen, dass der hier direkt durchgehen soll und der hier meinetwegen
über diese Leitung nach unten gehen soll.
Dann hätten Sie diese Verbindung hier.
Sie können also in diesem Kasten darlegen, welche Komponenten oder
welche Eingänge und Ausgänge von diesem Switch hier, diesem Schalter
miteinander verbunden sein sollen.
Das ist eine Konfiguration dieses Verbindungskastens dort.
Und dadurch können Sie also festlegen, wie Informationen zwischen den
einzelnen Komponenten laufen sollen.
Hier ist es dargelegt, das Beispiel hier, so eine Verbindung.
Und so können Sie also diese kleinen Bausteine dort drin verbinden.
Was sind das für Bausteine?
Das sind sogenannte Configurable Logic Blocks.
Das ist mehr als ein einfaches Gutter.
Das sind eine Reihe von Funktionsgeneratoren, nennen wir sie Function
Generators.
Das sind im Prinzip Wertetabellen für Schaltfunktionen.
In der Regel so haben die 4 bis 8 Eingänge.
Wenn Sie 8 Eingänge haben, können Sie sich vorstellen, wie groß dann,
also 2 hoch 8 Einträge brauchen Sie dann, um die Funktion tatsächlich
zu spezifizieren.
Und dann können Sie eine Schaltfunktion durch die Wertetabelle
spezifizieren.
Dann haben Sie entsprechend hier ein Bauelement, das eine bestimmte
Funktion realisiert.
Dann haben Sie dort noch Multiplexer drin, Verzögerungselemente und
ähnliches.
Und dann ist das ein Configurable Logic Block, ein konfigurierbarer
Logic Block.
Und daraus können Sie dann größere Schaltnetze bauen.
Es gibt auch gewisse vorgefertigte Elemente, die ein bisschen
aufwendiger sind.
Es gibt zum Beispiel Multiplizierer da drauf, in einigen, oder
irgendwelche spezielle Eigenschaften.
Also Multiplizierer sind so Dinge, die man halt braucht für bestimmte
Anwendungen.
Die sind dann schon vorgefertigt.
Und die kann man dann eben mit einbauen.
Oder ich kann das Ganze dynamisch rekonfigurierbar machen.
Das heißt, zur Laufzeit kann ich gewisse Funktionen umschalten.
Kann ich solche Verbindungen umschalten, kann Logikblöcke umschalten
in neue Funktionen.
Und kann dann auf einmal, kann also zur Laufzeit die Funktion noch
ändern.
Dann wird das Ding immer weicher.
Geht immer mehr weg von Hardware hin zu Software.
Aber es ist, das was da rauskommt, ist immer noch ein
Hardwarebauelement, das bestimmte Echtzeitanforderungen erfüllen kann.
Also eine wichtige Technologie, um dafür zu sorgen, dass man in der
Lage ist, anpassungsfähig Hardware zu bauen, die eben zur Laufzeit
noch anpassungsfähig ist und trotzdem gewisse Echtzeitanforderungen
erfüllt.
Also eine wichtige Technologie, der Entwurf von Hardware über FPGAs.
Viele unserer Bauelemente heutzutage bestehen aus einer Kombination
von FPGAs und anderen Bauelementen.
Okay, Sie programmieren also dann die Konfiguration, oder Sie
programmieren das Ganze, wenn man sagt feel programmable, dann heißt
das eben, Sie programmieren durch Konfiguration der Configurable Logic
Blocks und der Verbindungen.
Dann haben Sie daraus ein bestimmtes Funktionselement gemacht.
Wie setzt man sowas ein?
In verschiedensten Bereichen, das ist nur eine kurze Übersicht, glaube
ich auch seit Jahren hier drin, da ändert sich auch nicht viel.
Sie haben natürlich einen großen Anwendungsbereich im Bereich Militär,
hier steht nur 10%.
Militär braucht aber auch vieles von den anderen Dingen.
Industrie und Instrumentierung dürfte mittlerweile eher gewachsen
sein.
Kommunikation plus Informationsverarbeitung und Peripherie von
Rechnern und so weiter, das sind die wesentlichen Teile hier drin.
Das ist ein großer wirtschaftlicher Faktor heutzutage.
Sie kennen Firmen wie Infineon und ähnlich.
Infineon ist eine Firma, die genau in dem Bereich aktiv ist.
Und es ist völlig klar, dass das, was wir technologisch heutzutage
machen können, ganz stark beeinflusst ist durch solche Technologien.
Deswegen ist es also durchaus sinnvoll, sich darüber auszukennen.
Und ich halte es deswegen für wichtig, diese Dinge auch in meiner
Vorlesung drin zu haben, über Grundlagen Informatik, damit Sie eben
nicht den Eindruck gewinnen, ein Wirtschaftsingenieur, der braucht
sich nur zu kümmern darum, dass man weiß, man kann
informationsverarbeitende Geräte programmieren durch irgendwie Java
und ähnliches.
Da ist viel mehr drin, technologisch kann man viel mehr machen, wenn
man weiß, welche Möglichkeiten die Informationsverwaltung hat, sowohl
auf Software-Ebene als auch auf Hardware-Ebene.
Okay, das ist dazu genug.
Nochmal ein Hinweis, Bonus-Klausur, Anmeldung bis Ende des Jahres.
Bis dahin haben Sie noch Zeit.
Machen Sie das bitte.
Wenn Sie sich nicht anmelden, können Sie auch nicht teilnehmen an der
Bonus -Klausur.
Und der Stoff geht bis CMOS, also das, was wir jetzt hier gemacht
haben, das ist das, was in der Bonus-Klausur im Januar dann abgefragt
werden kann.
Wobei Sie wissen, die Bonus-Klausur bezieht sich im Wesentlichen auf
Aufgaben, die in den Übungen auch schon dran gewesen sind, wo Sie
schon mal Gelegenheit hatten, sich mit typischen solchen Aufgaben zu
beschäftigen und dann können Sie eben dort, wenn Sie dort gut
mitgearbeitet haben in den Übungen, die Klausur auch relativ einfach
bestehen.
Okay, das habe ich hier schon Ihnen alles gezeigt.
Dann sind wir damit mit dem Kapitel durch und kommen dann zum nächsten
Kapitel.
Vielleicht eine ganz kurze Pause, wo wir schon relativ weit
fortgeschritten sind.
Ganz kurze Pause, damit Sie einmal verschnaufen können.
Dann gehe ich hier zum nächsten Kapitel über.
So, Pause etwas kurz heute.
Ich mache weiter.
Nächster Kapitel ist also Codierung, Zahlendarstellungen.
Hardware haben wir jetzt angeguckt.
Wir wissen, wie man Bausteine für Rechner, wie man Rechner aufbaut.
Jetzt müssen wir uns damit beschäftigen, wie man die Informationen
tatsächlich in den Rechner bringt.
Was für Informationen, also es gibt hier eine ganze Reihe von Themen,
die wir betrachten müssen, siebenteilig.
Ich hoffe, dass ich das in der nächsten Woche, Montag, Mittwoch, dann
insgesamt Ihnen präsentieren kann.
Eine ganze Reihe Themen, wie man codiert, geht um Fehlererkennung,
geht um häufigkeitsabhängige Codierung, Darstellung von Zeichen,
Ziffern, insbesondere von Zahlen.
Die Darstellung von reellen Zahlen ist ein ganz wichtiger Teil, da
müssen Sie auch einige wesentliche Erkenntnisse gewinnen und
Einsichten haben, um zu verstehen, was das damit auf sich hat, reelle
Zahlen im Rechner darzustellen.
Das Problem ist, dass wir heutzutage sehr viel machen, was eigentlich
Operationen auf reellen Zahlen sind.
Alle möglichen Simulationen, die wir machen, wir wissen, dass das mit
sehr viel Ungenauigkeit verbunden ist.
Und deswegen muss man sich bewusst sein.
Dann gibt es hier noch das Kapitel 7.7 oder den Abschnitt 7.7,
Codierung zu Geheimhaltung.
Ist ganz wichtig für Dinge der Kryptographie, also sichere
Kommunikation, vertrauliche Kommunikation und ähnliches.
Hat mich drin in den Foliensatz, aber ich werde das nicht in der
Vorlesung behandeln.
Das zählt auch nicht zu den Dingen, die wir abfragen.
Ich will es aber als Information drin lassen in der Vorlesung, dass
Sie sich damit beschäftigen können.
Also, worum geht es?
Wir wollen alle möglichen Dinge darstellen im Rechner.
Alle möglichen Objekte der realen Welt, die wir irgendwie darstellen
müssen.
Zum Beispiel eine Ziffer 2 oder eine Zeichenfolge wie Otto.
Und wie kann man das darstellen im Rechner?
Man kann das Dual darstellen, also die 2 zum Beispiel darstellen über
eine 4-Bit-Darstellung.
Es reichen 2 Bits dafür für die 2.
Aber wenn ich 4 Bits habe, kann ich 16 verschiedene solche Ziffern
darstellen.
Das ist vielleicht ein bisschen besser.
Ich kann das als Extended Binary Coded Decimal Information oder
Interchange Code darstellen.
Da habe ich jetzt auf einmal eine andere Darstellung.
Da habe ich insgesamt 8 Bits, also 1 Byte.
Und habe damit die 2 hier hinten.
Die letzten 4 Bits stehen für die 2.
Und das sind hier eben noch weitere Informationen, die ich brauche, um
das im EPSID-Code darzustellen.
Die werden wir später noch genauer kennenlernen.
Oder der XS3-Code.
Beim XS3-Code, da wird einfach, wenn wir hier Zahlen darstellen, wir
haben hier die 0.
Wir wollten hier die Zahl 2 darstellen.
Dann wird es beim XS3-Code einfach verschoben um 3.
Und dann wird daraus die Darstellung der 5.
Das heißt, hier haben Sie dual eine 5 stehen.
Und die nehmen Sie, um die 2 darzustellen.
Wir werden später sehen, dass das durchaus relevant ist.
Interessant ist es insbesondere, wenn es darum geht, dass Sie Zahlen,
meinetwegen zwischen minus 3 und 3 darstellen wollen.
Schieben Sie alles nach rechts und dann ist auf einmal die 0
entspricht der minus 3, die 1 der minus 1 und so weiter.
Dann haben Sie Ihre Zahlen tatsächlich dargestellt.
Alles in einem Zahlenbereich, der hier liegt.
Zwischen 0 und 6.
Und diese linke Hälfte, das sind aber negative Zahlen und das sind
positive Zahlen.
Man muss sich damit beschäftigen, wie kann ich negative und positive
Zahlen darstellen.
Nur, dass Sie sehen, es gibt unterschiedlichste Darstellungen für
Ziffern, für eine 2.
Und auch für Zeichen, also für Zeichen des lateinischen Alphabets,
gibt es unterschiedlichste Arten, die darzustellen.
Zum Beispiel den ASCII-Code.
American Standard Code for Information Interchange.
Das ist unsere Standarddarstellung von Zeichen im Rechner
mittlerweile, den Sie in Breitform jeweils darstellen.
Sie haben jeweils 8 Bit dafür.
Und das sind also die Darstellungen von dem Fall, das ist das O, das
ist das T, kommt hier zweimal vor und dann steht wieder das O.
Ja, damit stellen Sie dann diese 4 Zeichen O, T, T, O dar im ASCII
-Code.
Und dafür gibt es halt bestimmte systematische Arten, das zu machen.
Das werden wir uns genauer angucken.
Dann will ich Zahlen darstellen, nicht nur Ziffern, sondern Zahlen.
Was sind Zahlen?
Zahlen können natürliche Zahlen sein, ganze Zahlen, rationale Zahlen
oder reelle Zahlen.
Welche kann ich eigentlich darstellen im Rechner?
Kann ich die alle darstellen?
Alle unsere Überlegungen zu Statistik, Simulation und ähnliches
brauchen selbstverständlich reelle Zahlen.
Die kann ich gar nicht darstellen.
Ich kann eigentlich nur rationale Zahlen darstellen.
Irrationale Zahlen kann ich im Rechner nicht darstellen.
Das schränkt schon das, was wir machen können, sehr, sehr stark ein.
Trotzdem reden wir davon, dass wir reelle Zahlen darstellen.
Und darüber müssen wir uns unterhalten, wie man das macht.
Ich kann Wahrheitswerte darstellen, ich kann Texte darstellen.
Ich zeichne mir beim Festen Alphabet, ich kann Sprache, Bilder, Videos
darstellen.
Ich zeichne die Vorlesung auf, Sie können die abspielen auf Ihrem
Rechner.
Da habe ich Videos, Bildinformationen und Audio-Informationen, kodiert
intern in einem Format, sodass man das wieder reproduzieren kann,
darauf wieder Töne und Bilder herstellen kann.
Allgemein alle möglichen Datentypen.
Und all das zählt dazu, wie ich Informationen darstelle, wie ich etwas
kodiere.
Wie gesagt, alle möglichen Datentypen, Binärworte nimmt man
üblicherweise, das ist, wenn ich nur zwei Symbole habe, das ist die
effizienteste Art, Informationen in einem Rechner darzustellen.
Sie können aber durchaus auch andere Realisierungen nehmen.
Mit zwei Symbolen kann man aber etwas sehr gut darstellen, weil ich
dann nämlich eben über Schaltalgebra etwas sehr schön machen kann,
dass ich sage, ich habe zwei Zustände, hohes Potenzial, niedriges
Potenzial, eine Verbindung ist da oder ist nicht da und ähnliches.
Und alle Objekte werden also bei dieser Binärdarstellung durch Folgen
von Binärwerten dargestellt und dann muss ich nur dafür sorgen, dass
ich die geeignet, dass ich also die realen Objekte, die ich in der
realen Welt darstelle, die geeignet effizient überführen kann in eine
binäre Darstellung.
Also in der Telegrafie, Telefon, Datenfernübertragung und so weiter,
DSL und was immer wir heute machen, Bildsignalübertragung, High
Definition Television.
Wie mache ich das eigentlich, dass ich Bilder übertragen kann in einer
hohen Qualität?
Es ist völlig klar, die muss ich geeignet kodieren.
An der Kodierung hängt sehr viel davon, wie hoch die Bandbreite
tatsächlich sein kann bei der Signalübertragung.
Geheimhaltung ist ein ganz wichtiges Element.
Früher militärische Anwendungen, heutzutage ganz stark zivile
Anwendungen im elektronischen Handel.
In der Kommunikation wollen wir vertraulich kommunizieren können,
wollen wir Träge abschließen können und ähnliches.
Dazu brauchen sie Dinge wie digitale Signaturen und ähnliches.
Sie wollen Sprachen übersetzen können.
Bei uns hier in der Fakultät für Informatik, der ASFUR und der Weibel,
die haben Systeme entwickelt zur automatischen Übersetzung von
Vorlesungen.
Da gibt es einen Dienst, dass sie sich reinsetzen in eine
deutschsprachige Vorlesung und sie können auf ihrem Bildschirm die in
Echtzeit dann englischsprachig sehen.
Das heißt, die wird nicht in gesprochene Sprache übersetzt, sondern in
Texte, aber sie können die Bedeutung der deutschen Sprache dann dort
auf Englisch sehen und das wird online direkt während der Vorlesung
übersetzt.
Also, Übersetzung natürlicher Sprache, ein sehr schwieriges Problem,
da ist sehr viel Forschungsarbeit reingesteckt worden und da sind wir
hier in Karlsruhe eigentlich recht gut.
Ich möchte also Informationen kodieren können.
Muss ich wissen, was heißt das etwas zu kodieren?
Ich muss dafür die mathematischen Zusammenhänge mir genauer anschauen,
ich muss es formal modellieren können.
Mathematische Zusammenhänge beziehen mir Zug auf Entschlüsselung,
Verschlüsselung, Entschlüsselung, also Kodierung, Dekodierung.
Wie sieht das aus, wenn ich Fehler habe, kann ich die entdecken oder
korrigieren?
Wie sieht das aus mit Redundanz, die ich einbaue, oder anderswo mit
Kompression?
Wenn Sie eine große Datei haben, eine große Textdatei, dann überführen
Sie die in eine ZIP-Datei, Sie komprimieren die und können dadurch den
Umfang an Bits, die Sie brauchen, um das darzustellen, deutlich
reduzieren und können die Originalversion später wiederherstellen.
Wieso ist das möglich?
Was macht man da eigentlich?
Darauf werde ich in ganz paar Dingen genauer eingehen.
So, dann kommen wir zum Begriff der Kodierung.
Also, was ist eine Kodierung?
Ich habe zwei Alphabete, A und B, und eine Kodierung gibt an, dass ich
irgendein Zeichen meines Alphabets A durch eine Folge von Zeichen über
dem Alphabet B darstelle.
Also ich hätte gesagt, die 2 stelle ich da durch 0,1 zum Beispiel,
Quatsch, natürlich nicht durch 0,1, oder machen wir das so, 0,1,0 mit
3 Bit.
Ja, das wäre die 2.
So, und das wäre eine Kodierung der 2 durch eine Zeichenfolge 0,1,0.
So könnte ich alle Ziffern von 0 bis 9 entsprechend kodieren.
Natürlich nicht mit 3 Bit, sondern 4 Bit.
Ich kann also nur von 0 bis 7 mit 3 Bit kodieren.
Aber das wäre eine solche Kodierung.
Und die entsprechenden Kodwörter, die ich hier habe, die Bilder meiner
Zeichen, das sind Kodwörter und das Ganze ist ein Code.
Also die Menge dieser Kodwörter ist ein Code.
Beispiel, einfaches Beispiel, vielleicht kennen Sie noch solche
Telefone mit einer Wählscheibe.
Diese Wählscheibe, bei der man hier irgendwo Finger reingesteckt hat
und dann so rumgedreht hat.
Beim Loslassen werden solche Signalfolgen erzeugt.
Das heißt mit der 1 einmal L und dann ein O dahinter.
Bei einer 0 halt entsprechend 10 mal ein L und dann ein O.
Also zwei verschiedene Signale.
Das heißt es wird praktisch gezählt, da wird mechanisch über irgendein
Element rübergegangen und dann werden Signale erzeugt.
Die Kodierung ist hier also eine unnähere Kodierung, bei der Sie die
Ziffern durch die Anzahl dieser Ls darstellen.
Und was Sie auch sehen ist, dass Sie an dieser Zeichenfolge jeweils
sofort sehen können, welche Zahl dargestellt ist.
Es ist zum Beispiel kein Kodwort-Präfix eines anderen Kodwortes.
Wenn Sie eine Folge haben, wenn ich hinschreibe hier L-O-L-O, wissen
Sie sofort, naja, das ist eine 1-1.
Ich sage das, weil wir aber auf der nächsten Folie sehen werden, dass
das nicht immer so ist.
Bei der Morse-Kodierung zum Beispiel sieht das anders aus.
Morse-Kodierung, auch eine Kodierung, die klassisch ist.
Sie haben Zeichen, also Buchstaben des Alphabets, Ziffern, Sie haben
Sonderzeichen, Umlaute.
Und die werden alle dargestellt durch zwei Symbole, die wir hier in
Punkt und Strich nennen.
Punkt-Strich-Kodierung.
Und diese Tabelle kennen Sie vielleicht.
Wer von Ihnen kann Morse-Kode?
Niemand, war keiner bei der Bundeswehr, wobei man heute wahrscheinlich
nicht mehr mit Morse-Kode arbeitet.
Aber Sie kennen alle SOS, klassische Kodierung, Punkt-Punkt-Punkt.
Also Dit-Dit-Dit, Dat-Dat-Dat, Dit-Dit-Dit.
Das ist also SOS.
Dreimal kurz, dreimal lang, dreimal kurz.
Könnte aber auch, also das ist natürlich genau die Kodierung von S, O
und S.
Könnte aber auch zum Beispiel sein, dieses hier könnte auch ein A
sein, dieses Punkt und Strich.
Und hier vorne die beiden Punkte, das könnte ein I sein, könnte also
auch genauso ein IA heißen dort.
Und dann haben Sie hier zwei Striche, zwei Striche, können wir mal
gucken, wo die auftauchen, das könnte ein M sein.
Ja, diese beiden Striche hier könnte auch ein M sein.
Das heißt, woher weiß ich überhaupt, dass das SOS ist?
Entsprechend dieser Tabelle könnte es auch was ganz anderes sein.
Wenn ich die Tabelle anders darstelle, dann habe ich hier einen
Kotbaum.
Und so sind die Zeichen abgebildet auf die Knoten des Kotbaumes.
Hier habe ich also genau das, was ich vorher gesagt habe bei der
Zählkodierung beim Telefon, gerade nicht.
Da habe ich einen Baum, in dem ich an jedem Knoten ein Zeichen habe.
Also hier das I, da ist ein Punkt im Prinzip dran, da ist auch ein
Punkt dran.
Das heißt, das I ist ein Präfix von der I-Kodierung, von der S
-Kodierung, von der H-Kodierung, von der 5-Kodierung.
Dann ist die Frage, wie kann ich denn dann irgendwelche Folgen von
solchen Punkten dekodieren und wissen, was damit eigentlich gemeint
war.
Das heißt, irgendwas geht da verloren und das darf natürlich nicht
sein.
Also diese Kodierung so einer Folge von Punkten hat viele mögliche
Urbilder.
Ich möchte aber eindeutig dekodieren können.
Das funktioniert ja.
Das heißt, da wird schon noch durch gewisse Pausen dazwischen
gewährleistet, dass man weiß, welches Zeichen dargestellt ist.
Das muss man lernen, sowas umzusetzen.
Entschuldigung.
Wir gehen darauf gleich nochmal genauer ein.
Es gibt spezielle Klassen von Kodierungen.
Es kann sein, dass ich ein Zeichen nur durch ein anderes Zeichen
ersetze.
Das ist dann eine Chiffre.
Substitution eines Zeichens durch ein anderes Zeichen.
Es kann sein, dass ich ein Zeichen durch Wörter fester Länge
darstelle.
Das ist eine Blockkodierung.
Jedes Zeichen meines Alphabets A wird durch eine Folge von Zeichen,
wenn ich mein Alphabet B darstelle, die alle die gleiche Länge N
haben.
Und wenn ich das Ganze auf Nullen und Einzen beziehe, dann wäre also
das eine Binärkodierung oder eine N-Bit-Kodierung.
Also eine 4-Bit-Kodierung, oder 3-Bit-Kodierung, 4-Bit-Kodierung von
Dezimalziffern kann man also machen.
4-Bit-Kodierung, um alle Dezimalziffern darzustellen.
Dann hätten Sie immer 4 Bits dafür.
Und wenn Sie jetzt die einzelnen Bits kodiert oder die einzelnen
Zeichen kodiert haben, dann wollen Sie das Ganze natürlich fortsetzen
auf Wörter über dem Alphabet.
Ich habe gesagt, SOS wird dargestellt als eine bestimmte Zeichenfolge.
Das ist eine Fortsetzung der Kodierung auf ein Wort.
Das kennen Sie natürlich alles schon von dem vorderen Teil, als wir
uns auch öfter mit solchen Fortsetzungen beschäftigt haben.
Also aus dem leeren Wort wird das leere Wort.
Hier ist das leere Wort jetzt mit Epsilon bezeichnet.
Hätte ich genauso gut mit Lambda bezeichnen können, um konsistent zu
sein mit dem, was wir vorher gemacht hatten.
Also das sollte ich eigentlich ändern in C von Lambda gleich...
Also C-Stern von Lambda ist C von Lambda.
Das leere Wort.
Und wenn Sie eben ein Wort abbilden wollen, wie A, dann machen Sie die
Fortsetzung der Abbildung auf dem Wort wie und wenden das also an auf
dieses Zeichen A.
Rekursive Definition.
Das kennen Sie alles.
Und das braucht nicht lange darauf einzugehen.
Und typische Beispiele sind halt, dass Sie eben, wenn Sie die
Ziffernfolge 214 mit der Zählkodierung darstellen wollen, dann kommt
daraus diese Ziffernfolge und Sie sehen sofort an der Zeichenfolge,
welche Zahlen damit dargestellt wurden.
Wenn Sie das Wort Esel übersetzen und das Wort Seine, dann bekommen
Sie jedes Mal die gleiche Folge von Ziffern.
Hier können Sie nicht eindeutig dekodieren.
Da könnte man sagen, Morse-Kodierung ist Unsinn, ich kann keine Wörter
dekodieren.
Geht trotzdem.
Das macht man dann aber...
Da müsste eigentlich auf dieser Folie noch drauf sein, genau.
Zu diesem Beispiel, das wollte ich Ihnen nämlich dann sofort
darstellen.
Man ergänzt das einfach durch ein besonderes Zeichen.
Durch ein, zum Beispiel, irgendein Zeichen, das nicht drin ist in
dieser Kodierung.
Und dann kann ich die einzelnen Wörter voneinander trennen.
Dann wird also hier aus dem Esel diese Zeichenfolge und aus Seine wird
die Zeichenfolge darunter.
Die kann ich unterscheiden, da habe ich die Grenzen zwischen den
einzelnen Kodwörtern markiert und kann das dann dekodieren.
Allgemein beschreibt man das, also die Möglichkeit, etwas zu
dekodieren, auf die Art und Weise, die hier oben dargestellt ist.
Ich fordere eine sogenannte Fano-Bedingung und um die formulieren zu
können, muss ich diese Dinge hier kurz darstellen.
Ich habe eine Funktion, die eine Funktion Indjektiv ist, das wissen
Sie.
Unterschiedliche Argumente werden auf unterschiedliche Bilder
abgebildet.
Und für ein indjektives F existiert natürlich die Umkehrabbildung.
Können Sie dann jedem Bild eindeutig das Urbild zuordnen.
Und wenn Sie eine indjektive Kodierung haben, dann ist also das C-,
das soll dann die Dekodierung sein.
Und eine solche Kodierung, das ist jetzt die Fano-Bedingung, erfüllt
also die Fano-Bedingung, wenn kein Kodwort Anfang eines anderen
Kodwortes ist.
Das heißt, wenn Sie zwei Kodworte, U und W, haben, also das ist hier
U, das ist...
Ich habe hier zwei Wörter und ich schreibe hier rein UV und da oben
schreibe ich W rein.
Und ich sage, wenn die beiden gleich sind, dann muss daraus folgen,
dass V gleich Lambda ist.
Das heißt, wenn U ein Kodwort ist, für alle Kodwörter, U und W, muss
gelten, dass kein Kodwort Anfangsstück eines anderen Kodwortes sein
kann.
Es sind niemals Präfixe eines anderen Kodwortes.
Bei der Morse-Kodierung war das inhärent der Fall.
Da waren ganz viele Kodwörter Präfixe von anderen Kodwörtern.
Deswegen nicht eindeutig dekodierbar.
So, das ist das, was ich Ihnen heute darstellen wollte.
Danach kommen hier noch ein ganz paar Bemerkungen.
Die kann ich noch kurz machen.
Die Bemerkungen sind völlig klar.
Wenn die Fortsetzung injektiv ist, dann ist die Funktion selber
injektiv.
Die Umkehrung natürlich nicht.
Das wissen wir von der Morse-Kodierung.
Und wenn die Kodierung injektiv ist und die Kodierung die
Fahndungsbedingungen erfüllt, dann ist diese Fortsetzung injektiv.
Weil wir dann eben die Wörter, die entstehen bei der Abbildung durch
10 Stern, eindeutig dekodieren können.
Okay, das war es für heute.
Ich danke Ihnen für die Aufmerksamkeit.