Fangen wir an.
Herzlich willkommen zur fünften Übung Technische Informatik,
Digitaltechnik.
Wir werden heute über das Todzeitmodell nochmal drüber schauen,
Übergänge und Hazardfehler in Schaltnetzen analysieren, unterscheiden
zwischen Funktionshazards und Strukturhazards.
Wir werden schauen, wie wir Hazards erkennen können und wie wir
Hazardfehler beheben können.
Und wir werden das Ganze nochmal ein bisschen zusammenfassen.
Was solltet ihr bis jetzt können?
Ihr solltet Schaltfunktionen aus einem Schaltnetz ablesen und ins KV
-Diagramm eintragen können.
Ihr solltet wissen, wie ein KV-Diagramm für drei, vier, eventuell
sogar für fünf Variablen aussieht.
Ihr solltet unterscheiden können zwischen Primimplikanten und
Primimplikaten und natürlich auch den Unterschied kennen.
Ihr solltet wissen, was ein Eingabewechsel ist und was ein Übergang
ist.
Ihr solltet auch wissen, was ein Hazard ist und was ein Hazardfehler
ist.
Das werden wir aber nochmal wiederholen heute, dass es auch richtig
sitzt dann.
Und eventuell solltet ihr vielleicht schon ein bisschen können, wie
man analysiert, Hazardfehler sucht und Hazardfehler behebt.
Todzeitmodell soll euch ein Begriff sein.
Hier nochmal ein kleines Beispiel, wie so ein Todzeitmodell aussieht.
Wir haben Schaltglieder und Leitungsstücke eines realen Schaltnetzes.
Das seht ihr hier unten.
Wir modellieren das jetzt ein bisschen anders.
Und zwar sagen wir, dass diese Schaltglieder alle ideal sind.
Das heißt, sie haben keinerlei Verzögerungszeiten, modellieren die
Verzögerungszeiten aber separat durch so ein Todzeitglied, das wir
davor stellen oder danach stellen.
Letztendlich, da die Schaltelemente ideal sind, spielt es keine Rolle,
ob jetzt die Todzeiten davor oder danach auftreten.
Wir werden heute betrachten, was zum Beispiel passiert, wenn ihr so
eine Schaltung habt.
Ihr seht, dass dieses Schaltglied eine Verzögerung von Tau 4 hat,
dieses von Tau 2 und von Tau 3.
Wenn wir jetzt hier durchrechnen, wie lange der Weg von hier nach hier
ist, haben wir eine Verzögerung von Tau 3 plus Tau 4.
Hier oben kommen wir auf Tau 2 plus Tau 4.
Das heißt, hier an dieser Ecke hätten wir einen Widerspruch.
Weil wir das hier nicht mehr vorziehen können vor das Tau 1.
Weil wir hier unterschiedliche Werte von unterschiedlichen Zweigen der
Schaltung bekommen.
Um solche Konflikte aufzulösen, muss man dann das eine Schaltglied
hier, das ideale Schaltglied, kopieren in zwei identische
Schaltglieder.
Und dann kann man hier ganz normal wieder die Todzeiten mit der
gleichen Todzeit hier anlegen.
Und hier hat man auch die Möglichkeit, dann das Ganze nach vorne zu
ziehen.
Letztendlich wird genau das gemacht im Todzeitmodell.
Da wir davon ausgehen, dass die Schaltglieder hier ideal sind, können
wir die Zeiten, also diese Verzögerungszeiten nach vorne ziehen und
zusammenrechnen.
Wir hatten hier hinten Tau 4, das heißt hier vorne kommt dann Tau 2
plus Tau 4 an.
Wenn wir noch einen Schritt vorgehen, addieren wir hier Tau 1, Tau 2,
Tau 4.
Für diesen Zweig hier, an diesem Zweig kommt Tau 2, Tau 4 an.
An diesem Zweig haben wir Tau 1, Tau 3, Tau 4, das seht ihr hier.
Und Tau 3, Tau 4 an diesem Zweig.
Und wenn wir jetzt noch einen Schritt weitergehen, können wir es ganz
nach vorne ziehen.
Dann haben wir es hier direkt hinter den Eingabevariablen.
Was man hier dann generell macht nochmal, ist, einen Pfad zu
definieren.
In diesem Pfad haben wir hier Pfadvariablen, die wir hier virtuell
ansetzen können nach den Verzögerungsgliedern.
Und diesen Vektor, der sich aus diesen Pfadvariablen zusammensetzt,
nennen wir Pfadvektor.
So, wie bildet man diese Pfadvariablen?
Man nimmt die gleichen Eingangsvariablen und versieht die mit Indizes,
und zwar nach der Häufigkeit des Auftretens.
Das heißt, wenn ich hier das erste Mal A habe, habe ich hier ein A1.
Wenn ich das zweite Mal A habe, habe ich hier ein A2.
Wenn ich das dritte Mal ein A habe, habe ich hier ein A4.
B1, B2, B3.
Ganz einfach.
So, Hazardfehler und Hazard.
Wir sagen ein Hazardfehler, oder in der Vorlesung wurde es, glaube
ich, schon definiert, dass ein Hazardfehler eine mehrmalige Änderung
der Ausgangsvariablen ist während eines Übergangs.
Das heißt, am Eingang einer Schaltung ändere ich meine
Eingangsvariable einmal und am Ausgang tritt eine mehrmalige Änderung
auf.
Das ist ein Hazardfehler.
Und ein Hazard ist durch ein Schaltnetz gegebene logisch-strukturelle
Vorbedingungen für einen Hazardfehler, ohne Berücksichtigung der
konkreten Verzögerungswerte.
Das heißt, wenn wir jetzt die ganzen Betrachtungen machen mit
Hazardfehler und Hazard, werden wir erstmal die Verzögerungszeiten
nicht betrachten.
Logischerweise heißt das natürlich auch, dass ein Hazard eine
Eigenschaft eines bestimmten Übergangs ist.
Das heißt, es ist nicht die Eigenschaft einer Schaltfunktion oder
eines gesamten Schaltnetzes, sondern wir betrachten nur Übergänge.
Und um zu gucken, ob dieser Übergang Hazard-behaftet ist, das heißt,
ob ein Hazard da ist für diesen Übergang, brauchen wir nur die
logische Funktion, die das Schaltnetz realisiert und wir brauchen die
Struktur des Schaltnetzes, also die konkrete Implementierung.
Was wir nicht brauchen, sind die tatsächlichen Verzögerungswerte der
verwendeten Gatter.
Die brauchen wir nicht zur Betrachtung, aber die brauchen wir dann
nachher, um auch diese Hazardfehler aufzuheben zum Beispiel.
Tritt in einem konkreten Schaltnetz bei einem bestimmten Übergang ein
Hazardfehler auf, so ist dieser Übergang Hazard-behaftet.
Das heißt, wenn ein Hazardfehler da ist, dann wissen wir, dass ein
Hazard da ist.
Wir können aber nicht den Umkehrschluss treffen und sagen, wenn ein
Hazard da ist, tritt auf alle Fälle ein Hazardfehler auf, weil zum
Auftreten des Hazardfehlers brauchen wir noch die Vorbedingungen, dass
wir ungünstige Verzögerungswerte haben.
Das heißt, nur mit ungünstigen Verzögerungswerten und einem
bestehenden Hazard tritt dann auch ein Hazardfehler auf.
Erstmal klassifizieren wir unsere Übergänge.
Das heißt, wir betrachten die Ausgabewerte unserer Funktion.
Wenn die Ausgabewerte statisch sind, das heißt, von einem bestimmten
Übergang Anfangswert der Eingabevariablen zu einem Endwert der
Eingabevariablen, ändert sich der Ausgabewert nicht.
Das heißt, wir sind statisch, wir haben einen statischen Übergang.
Oder die Ausgabewerte ändern sich, dann haben wir dynamische
Übergänge.
Hier unterscheiden wir nochmal bei statisch, wenn das Ausgabeergebnis
0 war, also wir statisch auf einer 0 bleiben wollten, dann haben wir
einen statischen 0-Übergang oder einen statischen 1-Übergang, wenn es
eine 1 war.
Genauso beim dynamischen unterscheiden wir zwischen einem dynamischen
0 -1-Übergang und einem dynamischen 1-0-Übergang.
Die gleiche Klassifizierung können wir jetzt auch anwenden für
Hazards.
Dafür setzen wir einfach den Übergang durch einen Hazard und sagen,
wir reden von statischen 0-Hazards, statischen 1-Hazards oder mit
dynamischen 0-1- oder 1-0-Hazards.
Zusammengefasst können wir sagen, ein Übergang ist genau dann mit
einem Funktionshazard behaftet, wenn es mindestens einen Weg von
Anfangs zur Endbelegung gibt, für den die Folgen der zugehörigen
Funktionswerte nicht monoton sind.
Nicht monoton heißt in unserem Fall mindestens zweimal ändern.
Das heißt, wenn eine Ausgabevariable sich zweimal ändert.
Also wir haben einen Sprung von 0-1, 1-0, das wäre zum Beispiel
zweimal.
Einen Sprung von 0 auf 1, das wäre nur einmal.
Und infolge unserer Definition von monoton wäre das monoton.
Nicht monoton ab zweimal.
Das Gleiche gilt für Strukturhazards.
Ersetze den Funktionshazard durch Strukturhazards und ersetze die
zugehörigen Funktionswerte durch die Werte des Strukturausdrucks.
Wir müssen nochmal klassifizieren für Funktionshazards, dass die
Ursache tatsächlich in der Schaltfunktion liegt und dass dieser
Funktionshazard selber nicht behoben werden kann.
Wir können aber die Verzögerungszeiten unserer Implementierung so
wählen, dass dieser Funktionshazard Fehler vermieden wird.
Das sehen wir gleich an ein paar Beispielen.
Für den Strukturhazard gilt, dass die Ursache in der Struktur des
Schaltnetzes liegt.
Das heißt, bei einer konkreten Implementierung Behebungsmöglichkeiten
sind auch hier vorhanden.
Die sind jedoch implementierungstechnisch teuer.
Und wir werden auch sehen, was für Probleme es zusätzlich noch mit
sich bringt.
Aufgabe 1, wo ist die Frage?
Kommt gleich.
Erstmal betrachten wir nur dieses Schaltnetz.
Das ist jetzt eine konkrete Implementierung, also eine Struktur von
einer Funktion.
Wenn wir jetzt hier Todzeiten haben und die nach vorne ziehen, nehmen
wir mal an, das war hier schon gemacht.
Dann haben wir hier die Tau C1 für die Pfadvariable C1, Tau A1 für die
Pfadvariable A1, Tau A2 und Tau B1.
Und wir haben hier die Todzeiten vorgezogen.
Nehmen wir mal an, das ist jetzt alles schon ausgerechnet für uns.
Die konkreten Werte sind erstmal nicht wichtig.
Wir müssen nur wissen, dass jetzt diese Verzögerungszeiten hier
jeweils für diese einzelnen Pfade gelten.
Was ist unsere Schaltfunktion?
Schauen wir nochmal zurück.
Wir haben hier C und A, die werden genendet.
Wir haben hier unten A nicht, B, die werden genendet.
Und das Ergebnis wird auch nochmal genendet.
Das heißt, unsere Schaltfunktion besteht aus C A genendet mit B A
nicht.
Sieht das jeder, wo das nennt ist?
Das kann man jetzt schallalgebraisch umformen und wir kommen dann auf
den Ausdruck C A oder B A nicht.
Dafür muss man einfach nur die Negation runterziehen auf dieses und,
daraus wird ein oder.
Und man muss die einzelnen Terme links und rechts negieren.
Das heißt, die ersten Striche über den zwei Termen verschwinden und
wir bleiben dann zurück mit diesem einfacher handhabbaren Term.
Haben wir ein KV-Diagramm und tragen jetzt diese Funktion hier ein.
Sehen wir, dass wir einmal C A haben.
Das ist der gelbe Block hier.
Und wir haben einmal B A nicht.
Das wäre hier der blaue Block.
Betrachten wir jetzt den Strukturausdruck.
Sieht er so aus.
Der Strukturausdruck bezieht sich also auf das hier.
Funktionsausdruck auf das obere.
Wir haben hier dieselbe Implementierung wie da oben, nur dass wir
jetzt hier statt A zweimal als Eingang oben das A1 haben, unten das
A2.
Das heißt, wir haben hier ein genanntes C1 mit A1 und ein genanntes A2
mit B1.
Demzufolge sieht auch unsere Implementierung so aus, dass wir hier C1
genannt mit A1, und B1 genannt mit A2 nicht haben.
Effektiv heißt es natürlich auch, dass meine Funktion so aussieht.
Genauso wie links habe ich hier C1 A1 oder B1 A2 nicht.
Und diese Blöcke kann ich jetzt hier wieder eintragen.
Ich habe C1 A1, das ist der gelbe Block, und ich habe B1 A2 nicht, das
ist hier die rechte Seite, und A2 nicht ist oben drunten, das heißt
der grüne Block rechts.
Immer noch keine Frage für Aufgabe 1?
Es werden jetzt mehrere Fragen.
Was wir jetzt betrachten, sind verschiedene Übergänge in dieser
Funktion.
Und zwar fangen wir hier bei der Belegung 3 an, gehen auf Belegung 0,
auf Belegung 1, Belegung 6, Belegung 7, anschließend auf Belegung 4
und betrachten jetzt jeden dieser Übergänge.
Hier nochmal visuell dargestellt, wie die Belegungen aussehen mit
Indizis.
Und hier rechts nochmal das Schaubild.
Wir betrachten jetzt jeden dieser Übergänge.
Okay, meine Fragefolie kommt immer noch nicht.
Also, das sind meine Übergänge.
Hier kann man natürlich die ideale Ausgabe direkt ablesen aus dem
Schaltnetz.
Bei Belegung 3 habe ich eine Ausgabe 0, Belegung 0 ist meine Ausgabe
0, Belegung 1 ist meine Ausgabe 0, Belegung 6 müsste meine Ausgabe
eine 1 sein, Belegung 7 ist meine Ausgabe eine 1 und Belegung 4 ist
meine Ausgabe wieder eine 0.
Kann ich direkt ablesen.
Meine reale Ausgabe sieht ein bisschen anders aus.
Hier müssen wir ein bisschen vorgreifen.
So würde die Ausgabe aussehen.
Und wir sehen, das ist natürlich nicht genau das, was wir uns
vorgestellt hatten.
So wollten wir es ja eigentlich nicht.
Eigentlich wollen wir genau diese ideale Kurve haben.
Aber realerweise sieht man dann natürlich, in der Realität hat man
hier nochmal Sprünge, wo die Ausgabe kurzfristig wechselt.
Und eigentlich soll sie das nicht machen.
Warum treten die jetzt auf?
Genau jetzt müsste meine Frage kommen.
Wir sehen, die idealen und die realen Verläufe unterscheiden sich.
Und wir wollen jetzt die auftretenden Fehler klassifizieren nach ihrer
Ursache.
Also warum treten diese Fehler auf?
Welche Fehler haben das gleiche Problem?
Also welche gehören in die gleiche Gruppe?
Was für eine Art von Fehler treten hier auf?
Und unter welchen Zeitbedingungen treten diese Fehler auf?
Können wir diese Fehler beheben?
Gibt es Behebungsmöglichkeiten?
Falls ja, wie machen wir das?
Das ist jetzt unsere Aufgabe.
Das heißt, wir betrachten jetzt nochmal unsere Funktion und den
Verlauf unserer Übergänge und die idealen Ausgänge und die realen
Ausgänge.
Dafür betrachten wir jetzt erstmal unseren ersten Übergang.
Das heißt, wir gehen von Belegung 3 auf Belegung 0.
Und das Erste, was man jetzt macht, ist man guckt, was für
Eingabevariablen habe ich denn?
Und welche ändern sich?
Wir definieren jetzt die Variablenreihenfolge CBA und sagen, für CBA
habe ich eine Eingabereihenfolge von 0, 1, 1.
Das heißt, für diesen Term 3, für die Belegung 3, habe ich jetzt ein
gesetztes A, ein gesetztes B und ein nicht gesetztes C.
Das heißt 1, 1, 0 von rechts gelesen.
Und ich will auf die Belegung 0 und die sieht aus wie rechts und zwar
0, 0, 0.
Ich unterscheide jetzt, welche Eingabevariablen sich ändern.
Und wenn ich jetzt darauf gucke, dann sehe ich, dass es genau zwei
Stück sind und zwar A und B.
Und wir wissen aus der Vorlesung, dass bei einer Eingabe, bei einem
Übergang, bei N Variablen, die sich ändern, dass die Anzahl der Wege,
um vom Start zum Ziel zu kommen, N Fakultät ist.
Das heißt, ich habe zwei Eingabevariablen, die sich ändern.
Ich habe also zwei Fakultätwege, also 1 mal 2 Wege, gleich zwei Wege,
um vom Start zum Ziel zu kommen.
Wenn wir diese zwei Wege jetzt einmal einzeichnen, haben wir einmal
den grünen Verlauf hier.
Das heißt, ich kann zuerst die Variable B wechseln.
Wenn ich B wechsle, dann spiegle ich an der Kante von B mein KV
-Diagramm.
Das heißt, ich starte hier, spiegle auf die andere Seite und bin jetzt
bei der Belegung 1.
Anschließend spiegle ich an der Kante von A und ihr merkt, dass ich
dann von der Belegung 1 auf Belegung 0 komme.
Das ist mein erster Weg.
Wenn ich jetzt meine Ausgaben angucke, dann habe ich hier die Ausgabe
0, 0, 0.
Das heißt, es ist eine monotone Folge, da ändert sich nichts, hier
hätte ich kein Problem.
Betrachte ich den zweiten Pfad, wechsle ich zuerst meine Variable A,
springe also auf die Belegung 2 und anschließend auf die Belegung 0,
indem ich B ändere.
In diesem Fall habe ich einen Ausgabenverlauf von 0, 1, 0.
Das heißt, hier habe ich eine nicht-monotone Folge.
Folglich habe ich hier ein kleines Problem.
Schon vorgegriffen.
Grün haben wir gesagt, ist 0, 0, 0.
Rot haben wir gesagt, ist 0, 1, 0.
0, 1, 0 ist nicht-monoton.
Und da ich jetzt einen Startwert von 0 habe und einen Endwert von 0,
kann es sich nur um einen statischen Hazard handeln.
Und wir reden von einem statischen Null-Hazard.
Und da wir jetzt nur die Funktion betrachtet haben, bisher kann es
auch nur ein statischer Null-Funktions-Hazard sein.
Das war das, was ich vorhin gemeint habe, das Problem eines Funktions
-Hazards liegt selber in der Funktion und die Funktion sieht nun mal
so aus, da können wir nichts daran ändern.
Also, wir haben einen statischen Null-Funktions-Hazard.
Wann tritt dieser Funktions-Hazard-Fehler auf?
Der Hazard-Fehler tritt immer dann auf, wenn wir zuerst A wechseln und
dann B.
Das heißt, die Todzeiten von A sind kleiner als die Todzeiten von B.
Können wir jetzt natürlich nicht so schreiben, weil es ja die Funktion
ist und nicht die Struktur.
Wollen wir jetzt die Struktur betrachten, betrachten wir die konkrete
Implementierung.
Das heißt, wir haben wieder unsere Pfadvariablen hier A1, A2, B1, C1
und wir wechseln... wir tragen jetzt diese...
Fokuswechsel.
Wir betrachten jetzt die Variablen, die sich jetzt ändern und wir
merken, dass es diesmal nicht zwei sind, sondern diesmal sind es drei
Variablen, die sich ändern.
Drei Variablen heißt drei Fakultät, also 1 mal 2 mal 3.
Das heißt, wir haben sechs verschiedene Möglichkeiten, um von unserer
Startbelegung auf die Endbelegung zu kommen.
Wenn wir das in unserem KV-Diagramm eintragen oder wenn wir unser KV
-Diagramm einzeichnen in dieser Art und Weise, dann sieht unsere
Startbelegung so aus, dass wir bei B7 starten und auf B0 wollen und
die verschiedenen Pfade kann man auch einzeichnen.
Die ändern sich jetzt natürlich immer.
Also die Pfade hängt jetzt immer davon ab, welche Variablen ich zuerst
ändere.
Ich muss ändern B1, A2 und A1.
Das heißt, wenn ich jetzt hier anfange mit B1 zu ändern zuerst, dann
springe ich zuerst von B7 auf B3.
Wenn ich anschließend A2 ändere, springe ich auf B1 und wenn ich
danach A1 ändere, auf die 0.
Wenn ich eine andere Reihenfolge wähle, dann wechsle ich zuerst von
der 3 auf die 2 und dann auf die 0 oder 5, 4, 0 und 5, 4, 1, 0.
Oder nochmal in blau, wenn ich zuerst anfange mit A1 zu ändern, komme
ich von 7 auf 6, 6 auf 4, 4 auf 0 oder ich kann von 6 auf 2 und dann
auf die 0 kommen.
Das sind meine verschiedenen Pfade.
Das sind die sechs verschiedenen Pfade, die ich sechs verschiedene
Möglichkeiten, wie diese Funktion sich ändern kann.
Wenn wir jetzt die grünen Pfade betrachten, haben wir hier eine Folge
von 0, 0, 0, 0, 0, 0, 0, 0.
Das heißt, jedes Mal ist es eine monotone Folge.
Hier hätte ich kein Problem.
Wenn ich die erste blaue betrachte mit 0 auf 2, 0 auf 0, ist auch eine
0, auch monoton.
Erst wenn ich hier schaue von 7 auf 6, 6 auf 4 und von 4 auf 0, habe
ich eine Folge von 0, 0, 1, 0.
Zwei Änderungen, also nicht monoton.
Folglich ist es nicht das, was ich will und der Hazardfehler tritt
hier auf.
Genauso beim Roten sieht man direkt auch schon, direkt wenn er zuerst
auf die 1 kommt, habe ich hier immer dieses Problem, dass ich nicht
monotone Folgen produziere.
Was ist jetzt die Zeitbedingung für den Fehler?
Die Zeitbedingung ist, immer wenn A2 vor B1 sich ändert, dann habe ich
eine 1-Folge noch mit drin.
A2 ändern heißt, ich spiegle an dieser Achse
und wenn diese Spiegelung vor dieser Spiegelung kommt, dann tritt
jedes Mal dieser Fehler auf.
Soweit klar?
Ich sehe nicken, also mache ich weiter.
Hat jemand dazu Fragen?
Obere Etage auch zufrieden?
Gut.
Also, wie können wir jetzt diesen Fehler beheben, wenn wir jetzt genau
wissen, das führt zu einem Fehler, also ein Wechsel von A2 vor B1
führt zu einem Fehler.
Also wähle ich meine Todzeiten einfach anders.
Ich sage B1 muss vor A2 wechseln und wenn ich mir das hier in meinem
Grafen angucke, das heißt, ich wechsle zuerst B1, würde Spiegel nach
links heißen, also zuerst B1 und dann A2, ist die komplette linke
Seite, beschließe einmal diese grünen ein, schließe aber auch ein,
dass ich A1, weil über A1 habe ich jetzt keine Aussage getroffen, dass
ich zuerst an A1 spiegle und dann an B1 und anschließend an A2.
Wichtig ist tatsächlich immer nur B1 vor A2 zu ändern und in dem Fall
hätte ich durch eine richtige Wahl oder eine günstige Wahl von
Verzögerungszeiten, hätte ich vermieden, dass dieser Hazardfehler
auftritt.
Wir betrachten den nächsten Übergang.
B0 nach B1.
Hier.
Und wir sehen,
wenn wir es jetzt aufschreiben, sind die Belegungen, sehen so aus.
Also C, B, A.
C ist 0, B ist 0, A ist 1.
Entschuldigung, A ist 0 zuerst.
Wechselt nach 0, 0, 1.
Das heißt, es ändert sich nur eine Eingabevariable und wir wissen,
dass wenn bei einem Übergang sich nur eine Eingangsvariable ändert,
dass sie frei ist erstmal von Funktionshazards.
Strukturhazards muss man trotzdem nochmal kontrollieren.
Das heißt, wir gucken uns die konkrete Struktur nochmal an.
Wir zeichnen den Übergang in unser erweitertes KV-Diagramm ein mit den
Pfadvariablen.
Und wir sehen, dass sich hier zwei Variablen ändern.
Also habe ich auch wieder zwei Fakultäten, also zwei Pfade, um vom
Start zum Ziel zu kommen.
Das geht einmal über die Belegung 1 und einmal über die Belegung 2.
Betrachte ich den Weg von B2 nach B3, sehe ich, dass hier die Ausgaben
immer 0 sind.
Genauso von 1 nach 3.
Das heißt, ich habe hier monotone Folgen und folglich habe ich dann
auch kein Strukturhazard.
Nächster Fall, B1 nach B6.
So, sieht schon ein bisschen komplizierter aus.
Ich schaue mir die Belegungen an.
Ich merke tatsächlich, es sind drei Eingabevariablen, die sich ändern.
Und wir betrachten jetzt nicht alle Pfade, sondern wir betrachten
jetzt erstmal den grünen Pfad, der von 0 auf 0 wechselt, der von 0
startet, bei 0 bleibt, einmal auf die 1 wechselt, 1 und bei der 1
bleibt.
Wenn wir den roten Pfad betrachten, haben wir einen Wechsel nach 1, 0,
1.
Das heißt, der grüne Pfad liefert mir eine monotone Folge, der Ausgabe
und der rote Pfad liefert mir eine nicht monotone Folge.
Und bei der nicht monotonen Folge haben wir gesagt, wir betrachten
immer den Startausgabewert und den Endausgabewert, da sich der ändert,
also von 0 auf 1, wenn er ändert, kann es sich nur um einen
dynamischen Hazard handeln, einen dynamischen 0,1 Hazard.
Und wir betrachten die Funktion momentan, das heißt, es handelt sich
hier um einen Funktionshazard.
Also zusammengefasst komme ich auf einen dynamischen 0,1
Funktionshazard.
Betrachte ich die Struktur, wird es nochmal ein bisschen
komplizierter, weil ich jetzt hier merke, hier erinnern sich nicht nur
3, sondern hier erinnern sich tatsächlich 4 Variablen.
Und mit 4 Fakultät bin ich schon bei 1 mal 2 mal 3 mal 4 bei 24.
Und die 24 Pfade, die wollen wir eigentlich nicht einzeichnen, sondern
wir wollen jetzt nur auch hier ein konkretes Beispiel finden, wo der
Fehler auftritt.
Und es wäre hier schon der rote, wäre ich bei 1, 0, 0, 1.
Wenn ich jetzt diesen Pfad nehme, wäre ich bei 1, 1, 0, 1.
Das heißt, beide roten Pfade führen zu nicht-monotonen Folgen.
Für die Zeitbedingungen des Fehlers nehmen wir beispielhaft jetzt
einfach den einen Pfad, den wir gefunden haben und wir sagen, wir
fangen mit dem Wechsel bei C1 an.
Also hier merken wir ja, dass dieser zweite Wechsel hier egal ist.
Das heißt, eine Variable fällt hier weg.
Ich muss definitiv zuerst C1 wechseln.
Das heißt, die Spiegelung an dieser Achse.
Das heißt, ich komme von Belegung 3 auf Belegung 11.
Danach muss ich A1 wechseln.
Das heißt, ich spiegle an dieser Achse.
Ich komme darüber und danach B1.
Also hier dieser Übergang spielt dann keine Rolle, weil beide Pfade
hier führen zum gleichen Ergebnis.
Wenn ich dann bei der 8 bin, habe ich hier eine Spiegelung an der
mittleren Achse hier.
Das heißt, das ist ein Wechsel von B1.
Und mit der Bedingung, dass die Todzeiten von C1 kleiner sind als die
Todzeiten von A1 und kleiner sind als die Todzeiten von B1, habe ich
definitiv einen Fehler.
In dem Fall wäre A2 beliebig.
Man könnte jetzt hier auch andere Formulierungen noch finden, die auch
dazu führen, dass hier der Fehler auftritt.
Ein konkreter Übergang, bei dem jetzt kein Fehler auftritt, wäre zum
Beispiel der grüne hier, dass ich zuerst C1 ändere, anschließend A2
und danach B1.
Das heißt, hier diesem Pfadenlanglaufe.
Und hier kann man ganz konkret natürlich sagen, Tau C1 kleiner Tau A2,
kleiner Tau B1, kleiner Tau A1.
Das heißt, hier habe ich ganz genau meinen Pfad beschrieben, also
diesen Wechsel ganz genau beschrieben.
Und für genau diesen Wechsel weiß ich, dass hier kein Problem
auftritt, also dass der Hazardfehler nicht auftritt.
Und das wäre zum Beispiel eine Möglichkeit, den Fehler zu vermeiden.
Nächster Übergang, B6 nach B7.
Auch hier gilt, es ändert sich nur eine Eingangsvariable.
Wir kommen von 0, 1, 1 müsste es sein.
Also wir haben C auf alle Fälle gesetzt, wir haben B auf alle Fälle
gesetzt und A nicht.
Und wir gehen auf die 7, was einer 1, 1, 1 entspricht.
Das heißt, hier sehen wir, dass nur eine Eingangsvariable sich ändert
und wir wissen nochmal zur Wiederholung, dass bei einer Änderung einer
einzelnen Eingangsvariable kein Funktionshazard auftreten kann oder
kein Funktionshazard existiert.
Schauen wir uns die Struktur nochmal an.
Sehen wir, dass hier eine Änderung von zwei Variablen stattfindet.
Einmal von A1 und einmal von A2.
Also konkret hier wieder die zwei Pfade, wobei wir einen grünen Pfad
haben, der eine monotone Folge produziert, die nicht zu dem Fehler
führt und die rote, die dann tatsächlich wieder zu einem Fehler führt.
Hier wissen wir jetzt, die Ausgabe ist immer 1.
Das heißt, es kann sich nur um einen statischen Hazard handeln.
Wir haben die Struktur betrachtet, also es ist ein Strukturhazard und
es handelt sich hier also um einen statischen 1-Strukturhazard.
Zeitbedingung ist hier einfach definiert, weil wir tatsächlich nur
einen Pfad haben, der zu diesem Fehler führt und zwar, wenn wir zuerst
A2 ändern.
Das heißt, Änderung an A2 nochmal ist Spiegelung an diese Achse hier.
Das heißt, wenn wir das hier zuerst machen, dann führt es zu einem
Fehler.
Konkret ausgedrückt, Tau A2 muss kleiner sein als Tau A1.
Das lässt sich natürlich auch einfach beheben, wenn wir sagen, Tau A2
soll größer sein als A1.
Wir wechseln zuerst A1 und dann A2.
Was wir natürlich auch machen können ist, den Satz von Eichelberger
anwenden.
Der da besagt, dass alle statischen Strukturhazards beseitigt werden
können, wenn wir das Schaltnetz als Disjunktion aller
Prämieimplikanten der Funktion realisieren.
Wenn wir jetzt hier nochmal gucken, wie sieht unsere Funktion aus,
fassen wir erstmal unsere Prämieimplikanten zusammen.
Dafür haben wir einmal hier den Block CA und einmal den Block BA
nicht.
Und wir fügen den fehlenden Prämieimplikanten und zwar CB nochmal
hinzu, was darin resultiert, dass wir hier drei Prämieimplikanten
haben.
Und bei einer Implementierung, die dann so aussieht, dass alle
Prämieimplikanten tatsächlich disjunktiv zusammengefügt werden, heißt
das, dass dieser Strukturhazard nicht auftreten kann.
Der Satz von Eichelberger geht noch ein bisschen weiter.
Er betrifft auch dynamische Hazards, Strukturhazards.
Das sehen wir dann aber gleich nochmal beim nächsten Übergang, glaube
ich.
Okay, soweit schon Fragen.
Ist es jedem klar bisher?
Alles verständlich?
Wer hat es verstanden?
Wer hat es nicht verstanden?
Wer enthält sich?
Die üblichen statistischen zwei.
So, nächster Übergang.
B7 nach B4.
Unser letzter Übergang, den wir jetzt für diese Aufgabe betrachten
wollen, geht von B7 nach B4.
Das heißt, ich habe hier einen dynamischen Übergang von 1,0.
Jetzt muss ich nur noch rauskriegen, ob es einen Hazard gibt.
Wenn ja, was für ein Hazard?
Und nochmal analysieren, wie ich den beheben kann.
Der Wechsel hier sind wieder zwei Variablen.
Das heißt, zwei Fakultät Pfade und die zwei Wege gucke ich mir jetzt
an und ich sehe tatsächlich, hier sind beide Pfade monoton.
Das heißt, ich kann meinen Funktionshazard schon mal ausschließen.
Ich betrachte jetzt nochmal die Struktur und sage, wie sieht denn da
meine Änderung aus?
Und hier merke ich, es sind jetzt nicht zwei, sondern diesmal sind es
wieder drei Variablenänderungen.
Und in diesem KV-Diagramm entspricht es der Wechsel von Belegung 15
auf Belegung 8.
Wir haben gesagt, drei Variablen, drei Fakultät, gleich sechs Wege, um
ans Ziel zu kommen.
Ich finde hier sofort wieder den roten Weg.
Wenn ich zuerst A1 wechsle, komme ich auf die 14.
Wenn ich anschließend A2 wechsle, komme ich auf die 12.
Und nochmal eine Spiegelung an B1 führt dazu, dass ich dann bei 8
lande.
Das heißt, ich habe hier eine Folge von 1, 0, 1, 0.
Damit bin ich nicht monoton.
Und ich kann sagen, es ist ein Strukturhazard, weil ich hier die
Struktur betrachtet habe.
Ich weiß, es ist ein 1, 0 Übergang, also kann es nur ein 1, 0.
Und 1, 0 ist halt dynamisch, weil es sich ändert, heißt es dynamisch.
Also handelt es sich hier um einen dynamischen 1, 0 Strukturhazard.
Zeitbedingungen für den Fehler kann ich konkret definieren, indem ich
einfach den Pfad, den ich hier gefunden habe, aufschreibe.
Ich sage Tau A1 muss kleiner sein als A2 und dann kleiner sein als B1.
Entspricht genau diesem Pfad hier.
Und zur Lösung meines Problems brauche ich natürlich noch einen Pfad,
der funktioniert, also eine monotone Folge produziert.
Und dafür habe ich den Übergang von 15 auf 13 auf 9 auf 8.
Das heißt, zuerst eine Spiegelung an A2, dann eine Spiegelung an B1
und dann eine Spiegelung an A1.
Und es ist genau die Reihenfolge A2, B1, A1, mit der ich dann hier ans
Ziel komme.
Wir haben ja gesagt, es gibt zwei Komponenten für den Satz von
Eichelberger.
Einer betrifft statische Strukturhassads und der andere dynamische
Strukturhassads.
Die Frage wäre jetzt, kann man diesen Strukturhassad, diesen
dynamischen, können wir den jetzt mit dem Satz von Eichelberger,
können wir den jetzt hier beheben?
Wer ist dafür?
Wer ist dagegen?
Wow.
0 zu 0.
Unentschieden.
Okay, wer kennt den Satz von Eichelberger?
Einer, zwei.
Okay, ihr müsst euch im Skript nachschlagen.
Hausaufgabe, im Skript Satz von Eichelberger nachschlagen.
Also, wir können den Satz von Eichelberger hier nicht anwenden.
Und der Grund ist, dass der Satz von Eichelberger zwar sagt, wir
können alle dynamischen Strukturhassads auch beseitigen, allerdings
nur, wenn nur eine Eingangsvariable sich ändert.
Hier in unserem Fall haben wir eine Änderung von zwei
Eingabenvariablen, das heißt, hier findet dieser Satz keine Anwendung.
Sieht man da unten, genau.
Also, ich habe einen Wechsel von zwei Eingabenvariablen und hier kann
ich diesen Satz nicht anwenden.
Es gibt aber ein anderes Verfahren, mit dem wir diesen Strukturhassad
loswerden, für diesen einen Übergang.
Der ist allerdings ein bisschen komplizierter.
Funktioniert so, dass wir genau dann hassadfrei sind für diesen
Übergang, wenn kein Primimplikant in den Übergangsbereich hineinragt,
ohne die Einsbelegung des Übergangs zu überdecken.
Da wir von dynamischen Hassads reden, haben wir immer eine
Einsbelegung.
Manchmal ist es beim 0,1 Übergang wäre es die Endbelegung, beim 1,0
Übergang ist die Anfangsbelegung.
Da wir hier einen 1,0 Übergang haben, ist es hier in unserem Fall die
Anfangsbelegung.
Wie genau ist das jetzt zu verstehen?
Erstmal, wir haben den Übergangsbereich.
Das ist hier das grau schraffierte.
Da ich von 7 auf 4 wechsle, habe ich hier diesen 4er Block als mein
Übergangsbereich.
Jetzt darf kein Primimplikant in diesen Übergangsbereich hineinragen,
ohne die Einsbelegung des Übergangs zu überdecken.
Das heißt, wenn ich jetzt hier dieses Beispiel angucke, habe ich einen
Primimplikanten, der die Belegung 7 und 6 überdeckt.
Das heißt, dieser Primimplikant ragt in diesen Übergangsbereich
hinein, beinhaltet aber nicht meine Einsbelegung, also meine
Startbelegung.
Das heißt, dieser Primimplikant ist derjenige, der das Problem
verursacht.
Durch eine geschickte Umordnung meiner Funktion kann ich jetzt
natürlich dafür sorgen, dass es nicht auftritt und funktioniert
folgendermaßen.
Ich nehme meinen ersten Primimplikanten, der die 5 und die 7
beinhaltet.
Den nehme ich mit, weil der verursacht ja keine Probleme.
Der ist zwar in meinem Übergangsbereich drin, aber er beinhaltet den
Startwert.
Den zweiten, ich nehme jetzt hier den alternativen Primimplikanten,
der die 7 und die 6 überdeckt.
Allerdings den Primimplikanten, der die 6 und die 2 überdeckt, den
spalte ich auf.
Den benutze ich nicht mehr, sondern ich benutze die 2 als separate
Einsbelegung.
Meine Funktion würde dann so aussehen, ich habe einmal CA, das ist
mein gelber Block, ich habe einmal CB, das ist mein roter Block und
ich habe einmal C nicht, BA nicht, das ist mein türkisener Kreis.
Und für diesen Übergang hätte ich diese zweistufige hazardfreie
Realisierung.
Allerdings sieht man natürlich sofort, dass wir hier verzichten
müssen, und zwar auf die Minimalität.
Ein zweites Problem, was jetzt durch dieses Verfahren noch erzeugt
wird, ist, dass ich jetzt zusätzlich noch ein Hazard geschaffen habe.
Und zwar, wenn ich jetzt von 6 auf 7 einen Übergang hätte, befindet
der sich nicht mehr in einem Primimplikanten.
Und dieser Primimplikant ist jetzt nicht mehr hier drin.
Das heißt, dieser statische Eins-Übergang von 6 nach 5 würde hier
wieder ein Hazard erzeugen in meiner Struktur.
Soweit so klar.
Zusammengefasst, Behebung eines dynamischen Strukturhazards, das ist
diese erweiterte Funktion.
Das ist ein bisschen schwieriger als die Behebung von statischem
Strukturhazard, weil da kann ich ja den Satz vom Eichelberg anwenden.
Ich kann das Ganze für disjunktive oder für konjunktive Formen
ausführen.
Dafür müsst ihr einfach das Blaue durch das Rote ersetzen, wenn ihr
den Satz hier lest.
Und zwar kann man das genau dann machen, wenn jeder Eins-Block beim
Disjunktiven und jeder Null-Block beim Konjunktiven, der in den
Übergangsbereich hineinragt, die Eins-Belegung des Übergangs
umschließt.
Dass wir einen neuen Strukturhazard erzeugen, das habe ich auch schon
gesagt.
Die Definierung ist natürlich je nachdem, was für einen Eins-Block ich
jetzt erzeuge.
Erzeuge ich einen Eins-Strukturhazard oder einen Null-Strukturhazard?
Das habe ich schon erzählt.
Zusammengefasst nochmal, diese Folge hatten wir schon am Anfang.
Wir reden genau dann von einem Funktionshazard oder ein Übergang ist
genau dann mit einem Funktionshazard behaftet, wenn es mindestens
einen Weg vom Anfang zur Endbelegung gibt, für den die Folge der
zugehörigen Funktionswerte nicht monoton ist.
Das ist das gleiche für Strukturhazards, wenn die Werte des
Strukturaustauschs nicht monoton sind.
Haben wir jetzt gezeigt, glaube ich.
Und soweit sollte das jetzt jeder verstanden haben.
Hat jetzt irgendjemand noch dazu Fragen?
Keine Fragen?
Ich mache weiter.
Aufgabe 2.
Wir modifizieren jetzt unser Todzeitmodell ein bisschen.
Und zwar sagen wir, wir haben in diesem Beispiel jetzt zwei Inverter,
die negieren meinen Eingang, haben aber je nachdem, ob der Inverter
von 1 nach 0 wechselt oder von 0 nach 1 wechselt, verschiedene
Todzeiten.
Kann ja sein, dass die Dinge anders implementiert sind.
Das heißt, ein Wechsel von 1 nach 0 im Inverter braucht hier 20
Nanosekunden und von 0 nach 1 braucht 12 Nanosekunden.
Zwei Inverter hintereinander geschaltet, heißt normalerweise, meine
Ausgabefunktion sollte meiner Eingabefunktion entsprechen.
Dadurch, dass ich Todzeiten habe, sollte natürlich noch eine
Verzögerung drin sein.
Wenn ich jetzt hier eine 0 ansetze, kommt hier eine 1 raus.
Wenn ich hier eine 1 habe, kommt hier eine 0 raus.
Das Eingang ist gleich Ausgang.
Wenn ich meine Todzeiten angucke, wenn ich hier eine 0 reingebe, dann
habe ich bzw.
angenommen, hier war eine 1 und ich wechsle auf 0.
Dann ändert sich der Inverter intern von 1 nach 0.
Also nochmal, ich gebe eine 0 rein, Inverter produziert eine 1.
Um eine 1 zu produzieren, muss er von 0 nach 1 wechseln.
Das heißt, ich habe hier 12 Nanosekunden.
Hier steht eine 1 an, er muss von 1 auf 0 wechseln, braucht hier 20
Nanosekunden.
Wenn ich hier eine 1 habe, brauche ich 20 Nanosekunden hier und 12
Nanosekunden da.
Das heißt, insgesamt komme ich auf 32 Nanosekunden Verzögerung.
Mein Eingangssignal sähe so aus.
In der Zeitachse in Nanosekunden von 10, 16, 38, 73, 78, wo jeweils
diese Übergänge entstehen.
Und wir wollen jetzt den Verlauf des Ausgangssignals Y von T
herleiten.
Hier nehmen wir zuerst diesen Zwischenwert betrachten und anschließend
den Ausgabewert betrachten.
Und wir betrachten es anhalt dieses Todzeitmodells und dann schauen
wir mal, was dabei rauskommt.
Also, Eingabepegel, Ausgabepegel.
Was passiert jetzt?
Wir haben jetzt hier einen Eingang von 1, der wechselt auf 0.
Das heißt, bis hierhin war mein Zwischenwert immer auf 0.
Er wechselt dann mit einer Verzögerung auf 1 und die Verzögerung
beträgt 12 Nanosekunden.
Das heißt, ich bin von 10 plus 12, ich bin auf der Zeitachse bei 22
und wechsle dann auf 1.
Mein Eingangssignal geht weiter bis zum Zeitpunkt 16, bis zum
Zeitindex 16, wechselt dann von 0 auf 1.
Das heißt, mein Inverter war auf 1, muss auf 0 wechseln.
Von 1 auf 0, der Wechsel benötigt 20 Nanosekunden.
Das heißt, ich bin bei 16 plus 20, bin bei der Zeitachse bei 36 und
dieser Wechsel findet erst bei 36 statt.
Es geht weiter bis 38, dann wechselt mein Eingangssignal von 1 auf 0.
Der Inverter muss von 0 auf 1 gehen, das heißt, der Wechsel von 0 auf
1 benötigt 12.
38 plus 12 sind wir bei 50.
Anschließend geht es ziemlich lange weiter mit 0, das heißt, hier geht
es ziemlich lange weiter mit 1.
Erst bei 73 würde jetzt ein Wechsel von 1 auf 0 stattfinden.
1 auf 0 braucht 20 Nanosekunden, das heißt, 73 plus 20 bin ich bei 93.
Und ihr seht schon, dass es hier gestrichelt eingezeichnet ist.
Und zwar des folgenden Grunds.
Bevor dieser Wechsel hier stattfindet, wechselt mein Eingangssignal
von 1 auf 0.
Inverter muss von 0 auf 1 theoretisch und dieser Wechsel dauert 12
Nanosekunden.
12 Nanosekunden bin ich bei 90, das heißt, vor der 93 wechselt mein
Signal schon von 0 auf 1 wieder.
Das heißt, dieser Doppelinverter produziert in diesem Fall eine
Monotone 1.
Oder mein Zwischenwert ist jetzt erstmal eine Monotone 1.
Also, diese Auftaktflanke hier produziert den Wechsel von 1 auf 0 und
diese Abwärtsflanke produziert den Wechsel von 0 auf 1, der dann aber
das andere überschreibt.
Ich betrachte jetzt meinen Gesamtausgang.
Das heißt, ich wechsle jetzt von Z von T nach YT, interpretiere diesen
blauen Verlauf als mein Eingangssignal und invertiere den in den
gleichen Totzeiten wie hier.
Das heißt, ich bin hier die ganze Zeit auf 0, das heißt, mein
Ausgabesignal ist erstmal eine 1 bis zur Zeitachse 22.
Bei 22 wechselt mein Eingangssignal auf eine 1, das heißt, mein
Inverter wechselt von 1 auf 0.
1 auf 0 sind 20 Nanosekunden, ich bin bei 42.
42 wechselt also mein Ausgangssignal auf 0.
Bei 36 geht es dann wieder von 1 nach 0, das heißt, mein Inverter geht
von 0 nach 1.
0 nach 1 sind 12 Nanosekunden.
Ich addiere 36 plus 12, bin bei 48.
Bei 48 gibt es einen Auftakt.
So, dann das nächste Event ist bei 50.
Bei 50 wechselt mein Eingangssignal von 0 auf 1.
Also mein Inverter produziert einen Wechsel von 1 nach 0 mit einer 20
Nanosekunden Verzögerung.
Das heißt, bei 70 geht es dann wieder runter.
Und danach habe ich nur noch eine stetige 1 als Eingangssignal.
Das heißt, hier beim Verlauf bleibt hier ständig eine 0 bestehen.
Was würden wir erwarten, wenn wir die Todzeiten nach vorne ziehen?
Wie wir das gemacht haben mit unserem anderen Todzeitmodell.
Wir würden hier sagen, der Wechsel von 1, 0 und 0, 1 würde man
zusammen addieren.
Von 1, 0 und 0, 1 hier würde man zusammen addieren, würde es nach
vorne ziehen.
Und ich hätte dann einen Wechsel von 1, 0 mit 32 Nanosekunden und
einen Wechsel von 0, 1 mit 32 Nanosekunden.
Das wäre das, was man jetzt erwarten könnte.
Ich hätte dann zwei ideale Inverter, die natürlich das Signal ganz
normal invertieren.
Und ich hätte dann bei diesem Eingangssignal ein erwartetes
Ausgangssignal von sowas hier.
Wir haben aber gesehen vorhin, dass das nicht der Fall ist.
Also wir können bis hierhin haben wir das gleiche Ausgangssignal bei
42, 48, 70.
Wir sehen aber hier fehlt eigentlich etwas.
Und zwar würde hier die 73 nach diesem Modell hier mit 32 Nanosekunden
bei 105 einen Auftakt erzeugen.
Bei 78 würde es wieder runter gehen, das heißt bei 110 müsste es
eigentlich wieder runter gehen.
Aber im realen Verlauf sehen wir dieses Auf und Ab, dieses letzte Auf
und Ab sehen wir nicht.
Die Frage wäre jetzt natürlich, woran liegt das?
Auf diese Art und Weise können wir kein Todzeitenmodell modellieren,
weil sie hier versagt.
Und zwar liegt eigentlich der Grund darin, dass dadurch, dass wir hier
verschiedene Todzeiten für verschiedene Übergänge haben, dass Impulse
von weniger als acht Nanosekunden einfach absorbiert werden.
Das System schluckt quasi diese Verläufe.
Dadurch, dass sich dann das Auf und Ab überlagern, findet statt einem
dynamischen Übergang, zwei dynamischen Übergänge, gibt es dann einen
statischen Verlauf.
Und dadurch werden diese Impulse einfach absorbiert.
Das heißt, die Durchstellbarkeit bei solchen Verzögerungsgliedern ist
nicht möglich.
So, Aufgabe 3.
Bis hierhin noch Fragen?
Keine Fragen, machen wir weiter.
Aufgabe 3, letzte Aufgabe für heute.
Gegeben ist das folgende Schaltnetz.
Wir gehen davon aus, dass jedes Gatter eine Todzeit von fünf
Nanosekunden hat.
Wir gehen davon aus, dass zu Beginn alle Signale stabil anliegen.
Wir haben die Eingangssignale D0 und S.
Die wechseln gleichzeitig von 0 auf 1.
D1 bleibt stabil auf 0.
Und die Verläufe haben wir gleich im Zeitdiagramm gegeben.
Also hier D0 genendet mit S nicht.
Hier D0 genendet mit D1.
Und hier nochmal S genendet mit D1.
Und das Ergebnis zusammen nochmal genendet.
So, wir wollen jetzt die Verläufe wiedergeben.
Für B, C und Y.
A und D sind schon eingetragen.
Das heißt, wir betrachten jetzt erstmal B.
Und wenn wir jetzt B betrachten, sehen wir, dass B von A und von D0
abhängt.
Das heißt, wir betrachten erstmal die beiden hier.
Und diese beiden Eingangsvariablen müssen einfach genendet werden.
Das heißt, wir unten die zusammen und negieren sie nochmal.
Also, A ist bei 1.
D0 ist bei 0 erstmal.
Also, wir haben hier 0 und wir haben hier eine 1.
Das heißt, geundet gibt es eine 0.
Invertiert heißt es 1.
Und da wir 5 nanosekunden Verzögerung haben, haben wir hier erstmal
die stabile 1 liegen.
Im nächsten Zeitschritt haben wir hier eine 1 und hier eine 1.
Das heißt, geundet sind wir bei 1.
Negiert sind wir bei 0.
Das heißt, im nächsten Schritt mit 5 nanosekunden Verzögerung sind wir
hier bei einer 0.
Dann habe ich im nächsten Schritt eine 0 und hier eine 1.
Wieder geundet bin ich bei 0.
Negiert komme ich auf eine 1.
Und danach ändert sich das Eingangssignal nicht mehr.
Das heißt, ich bin hier stabil auf eine 1.
Als nächstes betrachten wir in einer anderen Farbe C.
C hängt ab von S und von D1.
Und auch hier muss ich einfach nur diese zwei Eingangsvariablen unden.
Das heißt, ich schaue mir hier an.
S ist bei 0.
D1 ist bei 0.
Geundet gibt es 0.
Negiert ist es eine 1.
Das heißt, hier kann ich meine 1 eintragen.
Dann habe ich hier eine 0 und eine 1.
Und wir wissen, dass alles geundet mit 0 gibt immer eine 0.
Einmal negiert 1.
Das heißt, ich kann für den gesamten restlichen Verlauf sagen, dass
mein C auf der 1 bleibt.
Nächste Farbe Y.
Y hängt ab von B, D und C.
Das heißt, ich betrachte hier diese drei Werte, verknüpfe die mit UND
und negiere sie einmal.
Ich habe hier eine 1, 1 und eine 1.
Geundet macht es 1 und negiert ist es eine 0.
Ich habe hier eine 1, 1, 1.
Geundet ist es eine 1, negiert ist es eine 0.
Ich bleibe wieder bei 0.
Jetzt habe ich hier einen kleinen Impuls, wo B auf 0 wechselt.
Dieses 0 sorgt dafür, dass es UND aller drei Variablen auf 0 reduziert
wird.
Negiert macht es eine 1.
Diesen Impuls kann ich direkt so übertragen und ich weiß, dass für den
restlichen Verlauf wieder hier eine 0 anliegt.
Bei Y habe ich einen kleinen Impuls, wo das Ergebnis kurzfristig auf 1
wechselt und dann wieder zurück auf 0.
Da ich aber weiß, dass meine Eingabevariablen sich hier nur einmal
geändert haben, also dass nur eine Änderung anliegt, dürfen hier keine
zwei Änderungen am Ausgang entstehen.
Das heißt, ich weiß, dass es hier einen Hazardfehler gibt.
Hier nochmal ein bisschen schöner aufgezeichnet die Verläufe.
Und wir wollen jetzt gucken, um welchen Typ von Hazard es sich hierbei
handelt und mit einer ausführlichen Analyse begründen, warum es sich
um diesen Hazard handelt.
Also hier nochmal das Schaltnetz und hier mein KV-Diagramm, wo wir
jetzt die Funktion eintragen wollen.
Dafür muss man natürlich erstmal die Funktion aufstellen.
Spickzettel gucken...
Also, wir wissen, dass Y geundet wird mit einem Zusammenschluss, ein
Is von B, D und C.
So werden die mit und verknüpft, mit dem Nend verknüpft.
Wir wissen, dass B ein Nend ist von A und D0.
Das heißt, ich kann hier D0 und A negieren, das ist mein Nend.
Ich weiß, dass D ein Nend ist von D0 und D1.
Ich weiß, dass C ein Nend ist von S und D1.
Und das Ganze natürlich nochmal nicht von dem oberen übernommen.
Wenn ich das jetzt auflöse, löse ich diese Negation auf, indem ich
hier die und zu oders transformiere und jeden einzelnen Term hier
nochmal negiere.
Das trifft sich natürlich gut, dass ich hier Nends habe, dann kann ich
nämlich direkt schreiben D0A oder D0D1 oder SD1.
Und ich weiß natürlich, dass ich hier statt A S nicht schreiben kann.
So macht es mir natürlich einfacher, es im KV-Diagramm einzutragen.
Ich weiß, dass D0 S nicht ist.
S nicht ist dieser linke Block und D0 zusammengeschlossen mit S nicht
ist dieser Block hier.
Das heißt, ich kann hier einzeln eintragen.
Das Löschen ist hier sehr umständlich, deswegen schauen wir, dass wir
nichts falsch machen.
Dann haben wir hier den Block D0D1, das heißt, der Zusammenschluss von
diesem Block und diesem Block ist dieser Block hier, also 3 und 7.
Das heißt, hier kommt nochmal eine 1 rein.
In 3 habe ich ja schon eine 1.
Und ich habe S und D1 entspricht diesem Block hier.
Das heißt, bei 7 habe ich schon eine 1 und bei 6 muss noch eine 1
rein.
Folglich ist der Rest, besteht aus Nullen.
Das heißt, so sieht meine Funktion im KV-Diagramm aus.
Das hat jeder verstanden, oder?
Das solltet ihr im Schlaf können.
Also ich glaube, dieser Schritt von da nach da, das sollte...
Wer kann es nicht?
Wer kann es?
Wer hat mir nicht zugehört?
Sehr gut.
Wir betrachten den Übergang.
Wir haben ja vorhin gesagt, es findet ein Wechsel statt von...
Mal gucken, was wir gesagt hatten.
Eingangssignale D0 und S wechseln gleichzeitig von 0 auf 1.
Das heißt, wir haben den Übergang von hier nach hier.
Oder wenn wir es hinschreiben.
D0, S1.
So, dann wechseln wir von 0, 0, 0.
Ist korrekt.
Trollt mich hier.
D0 und S.
Das heißt, ich wechsle hier auf 1, 0, 1.
Das heißt, es sind zwei Eingangsvariablen, die sich ändern.
Ich habe zwei Fakultäten.
Zwei Fakultäten gleich 1 mal 2, zwei Pfade.
Und ich sehe hier, dass wenn ich hier zuerst D0 wechsle, dass ich hier
von 0 auf 1 komme, von 1 auf 0.
Das ist genau das, was wir beobachtet haben, dass wir hier eine nicht
monotone Folge haben.
Hazard-technisch kann es sich natürlich nur um einen statischen Hazard
handeln, egal welche Art.
Und es ist ein statischer Null-Hazard.
Es ist ein Funktions-Hazard oder es ist ein Struktur-Hazard.
Und da wir die Struktur noch gar nicht betrachtet haben, sondern da
wir jetzt nur die Funktion betrachtet haben an sich, können wir hier
schon mal sagen, dass es ein statischer Null-Funktions-Hazard ist.
Wir betrachten den Übergang, der hier genommen wird.
Wir haben B0 nach B1, B0 nach B1 und dann nach B5.
Und der findet nur statt, weil wir hier zuerst D0 wechseln.
Das heißt, dass die Verzögerung von D0 kleiner ist als die Verzögerung
von S.
Das heißt, nur weil Tau von D0 kleiner ist als Tau von S.
Und wir können das natürlich kontrollieren.
S geht ja hier über drei Glieder.
Das heißt, hier die Verzögerungszeit sind 15 Nanosekunden.
Und von D0 sind natürlich nur zwei Glieder.
Das heißt, hier habe ich 10 Nanosekunden.
So, das hätten wir jetzt hier nochmal zeigen können.
Also Tau D0 über diesem Pfad hier zwei Glieder, also 10 Nanosekunden,
da jedes Glied nur 5 Nanosekunden hat und S über drei Glieder 15
Nanosekunden.
Und das war schon unsere detaillierte Analyse, warum dieser Hazard
auftritt.
Soweit Fragen.
Das ist eine gute Frage.
Christian, weißt du das?
Warum schreiben wir Hazard mit S?
Hazard.
Glitsch, so wie Glitsch beim Computerspielen, wenn da irgendwelche
Sachen passieren, die nicht passieren sollten.
Im gleichen Kontext natürlich heißt es hier natürlich auch,
irgendetwas, was nicht passieren sollte, aber trotzdem passiert.
Tatsächlich weiß ich nicht, warum es mit Z ausgesprochen wird.
Wenn man es nicht kennt, würde man es wahrscheinlich als Hazard lesen,
aber das klingt auch ein bisschen komisch.
Sonst noch irgendwelche Fragen allgemein wissenstechnischer Art?
Ist jeder Funktionshazard auch ein Strukturhazard?
Nicht unbedingt, weil du in der Struktur, also in der Implementierung
ja schon die Möglichkeit hättest, diesen Fehler nicht auftreten zu
lassen.
Also kurz ein Beispiel überlegen.
Richtig.
Mir fällt jetzt kein konkretes Beispiel ein, der
den gleichen Pfad hat, der auch nicht monotone Folgen erzeugt.
Ja, richtig.
Gut.
Sehr gut.
Sonst noch Fragen?
Also falls mir ein Beispiel einfällt, dann setze ich es auf die TI
-Homepage, dann kannst du nochmal gucken.
Okay, dann war es das von meiner Seite aus.
Ich wünsche noch einen schönen Mittwoch und hoffe, es hat ein bisschen
Spaß gemacht.