Aufgabe 2.4: Moore-Automat, Typ 1 -> Frage

tmx-master
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 253
Registriert: 25. Okt 2006 17:44

Aufgabe 2.4: Moore-Automat, Typ 1 -> Frage

Beitrag von tmx-master »

Hi,
ich verstehe eine Zeile im Verilog-Programm in Aufgabe 2.4: Moore-Automat, Typ 1 nicht ganz.

Komplettes Programm:
module moore1(clk, x, y1);
input clk, x;
output y1;
reg [1:0] s;
initial s = 0;
always @(posedge clk) case (s)
0: if (x == 0) s <= 1;
1: if (x == 1) s <= 2;
2: s <= 0;
default: s <= 0; // für den Fall s==3
endcase
assign y1 = (s == 0) || (s == 2);
endmodule

Und zwar geht es um die Zeile: assign y1 = (s == 0) || (s == 2);

y1 hat ja für jeden Zustand s einen speziellen Wert. Aus meiner Sicht müsste es hier (statt dieser Zeile) doch noch mal einen Case-Block geben, der y1 je nach Zustand s einen Wert zuweist, also so etwas:
always @(s) case (s)
0: y1 = 1;
1: y1 = 0;
2: y1 = 1;
default: y1=0 #???
endcase

Kann mir emand die Zeile: assign y1 = (s == 0) || (s == 2); erklären, also ob die das gleiche macht (wenn ja, wie) und kann jemand bestätigen, dass mein Case-Block auch richtig ist?
Gruß TM

Benutzeravatar
Tigger
Kernelcompilierer
Kernelcompilierer
Beiträge: 404
Registriert: 26. Okt 2007 17:35
Wohnort: Hofheim
Kontaktdaten:

Re: Aufgabe 2.4: Moore-Automat, Typ 1 -> Frage

Beitrag von Tigger »

Also die linke Seite ist eine logische Operation. || bedeutet "oder". == wird wahr, wenn rechts und links das selbe steht. Steht auch alles nochmal in der Verilog übersicht. Logische Operationen haben als Ergebnis ein Bit (Also 0 oder 1 ;)). Also ist das Ergebnis (dass y1 zugewiesen wird) 1, wenn s 0 oder 2 ist. Genau das wollen wir ja haben. Dein alwaysblock macht im Prinzip auch nix anderes, is halt nur etwas mehr schreibarbeit.
Zuletzt geändert von Tigger am 20. Sep 2008 20:46, insgesamt 1-mal geändert.

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Re: Aufgabe 2.4: Moore-Automat, Typ 1 -> Frage

Beitrag von Krümelmonster »

Dein case-Block sieht auch richtig aus.
Du könntest ihn noch abkürzen:
always@(s)
case(s)
0: y1 = 1;
2: y1 = 1;
default: y1 = 0;
endcase

assign y1 = (s == 0) || (s == 2);
Das ist die Kurzschreibweise:
y1 ist in Zustand 0 und 2 eins ansonsten null.
Also ist y1 durch diese FO-Formel beschrieben:
\(\varphi_{y_{1}}(s) := (s = 0) \lor (s = 2)\)
;-)
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

tmx-master
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 253
Registriert: 25. Okt 2006 17:44

Re: Aufgabe 2.4: Moore-Automat, Typ 1 -> Frage

Beitrag von tmx-master »

Ok, super und danke. Frage ist damit beantwortet.
Gruß TM

Benutzeravatar
itportal2
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 236
Registriert: 25. Jan 2008 15:34
Wohnort: Darmstadt

Re: Aufgabe 2.4: Moore-Automat, Typ 1 -> Frage

Beitrag von itportal2 »

Was genau ist der Unterschied zwischen Moore-Automat, Typ 1 und Typ 2.
Der Code von Typ 2 (mulö) gilt doch für die beide. Die einzige Unterschied ist y im Zustand 1.

Mspringer
Nerd
Nerd
Beiträge: 555
Registriert: 19. Okt 2006 14:41
Wohnort: Darmstadt / Alzenau
Kontaktdaten:

Re: Aufgabe 2.4: Moore-Automat, Typ 1 -> Frage

Beitrag von Mspringer »

Wenn ich mich nicht vertue, dann ist der Moore Typ2 synchron.

Code: Alles auswählen

0: begin
if (x == 0) s <= 1; else s <= 0;
yd <= 1;
end
Im ersten Takt ändert sich der Zustand. Im 2. dann auch der Ausgang.

Steven
Kernelcompilierer
Kernelcompilierer
Beiträge: 425
Registriert: 2. Sep 2008 10:00
Wohnort: Frankfurt am Main

Re: Aufgabe 2.4: Moore-Automat, Typ 1 -> Frage

Beitrag von Steven »

Richtig, man kann es sich auch am Code von Typ 2 in der Musterlösung veranschaulichen: Im case wird zuerst synchron der Zustand gewechselt, dann wird im gleichen Abschnitt der Ausgangswert zugewiesen -> also gibt es noch mal den zum alten Zustand gehörenden Wert. Erst bei der nächsten Takflanke laufen wir in den neuen case-Abschnitt und setzen den neuen Wert. Somit kommen alle Werte um einen Takt verzögert am Ausgang an.
Durch die synchrone Zuweisung ist es auch egal, ob man die Ausgabewerte gleich im case zuweist oder einen gesonderten Logikblock dafür verwendet - der neue Zustand wird sowieso erst nach Ablauf des gesamten Codes übernommen.

Benutzeravatar
itportal2
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 236
Registriert: 25. Jan 2008 15:34
Wohnort: Darmstadt

Re: Aufgabe 2.4: Moore-Automat, Typ 1 -> Frage

Beitrag von itportal2 »

Also, wenn wir <= durch = ersetzen (bei y), dann werden wir diese Verzögerung entfernen und y ändert sich gleich mit dem Zustandswechsel, oder?

tmx-master
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 253
Registriert: 25. Okt 2006 17:44

Re: Aufgabe 2.4: Moore-Automat, Typ 1 -> Frage

Beitrag von tmx-master »

Ja, das ist so richtig.

Ich würde das dann in etwa so vor oder nach dem Case schreiben: always@(s) y = ... . Dann ist es auf jeden Fall asynchron und damit Moore Typ 1.

Insgesamt bewerte ich das aber mal als Feinheit, die die vielleicht einen Punkt kostet.
Gruß TM

Antworten

Zurück zu „Archiv“