Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
GTI Praktikum 2, Aufg. 6, FSM-Code ab Zeile 80: Case current_state…
Hab schon wieder Fragen.
-
Sehe ich das richtig, dass das Zeiten Einstellen via clk-Sensivität mit 8192 Mhz durch die Ziffern rauschen würde,
wenn ich nicht noch eine weitere Bedingung einbaue? (so wie Uhr Hochzählen durch sectrigger “gerettet” wird)
(äh, oder ich schaffe es die Tasten immer nur für 20ns kurz zu drücken…) -
Zeile 93 (“-- Setze nächsten Zustand”) soll wohl auch ein todo sein, auch wenn’s nicht da steht?
Sonst würden wir ja ewig im ntime-Zustand bleiben.
P.S. bin ich eigentlich der einzige, der mit dem VHDL-Zeug rumkämpfen muss?
Zumindest mal bei mir steht in der Skizze 8192 Hz, was dann 8,192 kHz und noch viel weniger MHz entspricht.
Zum Grundproblem kann ich dir aber leider nichts sagen, kämpfe auch
Würde dir bei 2. aber zumindest mal zustimmen, macht ja sonst keinen Sinn imho…
Ja, da hab ich schlampig gefragt,
sind natürlich bei mclk 8192 Hz,
und die erwähnten 20ns wären es nur bei den 50Mhz von clk,
aber die werden ja vorher für den controller auf mclk runtergeprügelt.
Auch wenn ich keine Ahnung habe, ob mein Gebastel funktioniert:
Am Signal timer kann man immerhin ganz gut eine Bedingung formulieren,
wann jeweils eine Viertel Sekunde gerade vorbei ist.
Das wäre als Tempo zum Uhr stellen dann 4 Ziffern pro Sekunde,
das macht mein Wecker zu Hause auch so etwa beim Dauerdrücken.
Heute war ja wohl schon Praktikum,
aber die, die das jetzt wüssten mit dem “-- Setze nächsten Zustand”,
die schauen hier wahrscheinlich sowieso nicht mehr rein.
Ich hab morgen,
wenn ich es nicht verpenne, kann ich ja am abend noch mal kurz was dazu sagen hier.
Wäre dir sehr verbunden wenn du morgen noch nen Tipp fallen lässt, habe erst am Mittwoch
Ich hab auch noch ne Frage:
Dort wo im Kommentar steht, bei sectrigger
„1 fuer einen Takt wenn eine sekunde vergangen ist, sonst 0“
muss ich das implementieren / programmieren oder kann ich das ignorieren?
NACHTRAG: Ich denke mittlerweile, dass ich das ignorieren kann.
WICHTIG: bei „zaehle uhr hoch“ steht gar kein TO DO da , sollen wir das jetzt machen oder nicht ??
Und kann mal jemand diese Schreibweise erklären:
Gibt mir irgendwie Rätsel auf …
Ich verstehe sectrigger so:
Zeile 32/33: Nur Erklärung, wozu das eingeführt wurde
Zeile 49ff: Prozess Sectimer nutzt timer um das 8192 Hz clk-Portsignal durchzuzählen und einen Durchlauf auf dem höchsten Bit anzuzeigen ( the msb will be our overflow bit)
Zeile 62: sectrigger wird immer genau 1 wenn das overflow-bit mal kurz 1 ist,
zeigt also an, wann eine komplette Sekunde vergangen ist.
Das ist bis hier schon alles fertig, nix zu ergänzen. Aber ganz gut, wenn man es durchdenkt und versteht.
Zeile 77: eindeutig TODO, wurde wohl nur vergessen explizit das todo hinzuschreiben.
und “timer <= (others => ’0’);” ist vermutlich nur eine elegante Methode, alle Bits auf einmal auf Null zu setzen, ohne nachzählen zu müssen, wieviele Nullen das sind.
also mir war auch nicht klar was zu bearbeiten ist und was nicht - aber da ich Teil 2 schon gemacht hab, hier die Zeilen im Controller die bearbeitet werden müssen:
überall da wo “–CODE HERE----------------------------------------CODE HERE” steht muss etwas eingefügt werden:
FSM : PROCESS(clk, reset)
VARIABLE next_state : state_type;
BEGIN
IF reset = '1' THEN
hours <= 0;
mins <= 0;
secs <= 0;
whours <= 0;
wmins <= 0;
alarm <= '0';
current_state <= ntime;
ELSIF (clk'event and clk = '1') THEN
IF (not (current_state = set_time) and (sectrigger = '1')) THEN
-- Zaehle Uhr hoch
--CODE HERE----------------------------------------CODE HERE
END IF;
CASE current_state IS
-- Zustand Time
WHEN ntime =>
-- TODO Pruefe, ob Alarm ausgeloest werden muss
--CODE HERE----------------------------------------CODE HERE
-- Zustand SetTime
WHEN set_time =>
-- TODO Setze Minute und Stunde mit S(3) bzw. S(4)
--CODE HERE----------------------------------------CODE HERE
-- Zustand SetAlarm
WHEN set_alarm =>
-- TODO Setze Minute und Stunde mit S(3) bzw. S(4)
--CODE HERE----------------------------------------CODE HERE
-- Illegale Zustaende
WHEN others =>
END CASE;
-- Setze naechsten Zustand
--CODE HERE----------------------------------------CODE HERE
END IF;
END PROCESS FSM;
Nach “–Zustand Time” gehört Code? Äh, damit brichst du doch das CASE - WHEN Statement auf oder nicht? :huh: Also nicht das ichs wüsste, wundere mich nur und weiß auch nicht so recht was da hinkommen soll…
Danke aber, ist auf jeden Fall hilfreich gewesen
Wozu ist eigentlich die Variable next_state im Prozess FSM gedacht? Kann man nicht einfach um den nächsten Zustand zu setzen einfach
CASE current_state IS
When ntime =>
usw.
schreiben und dann jeweils den nächsten Zustand an current_state zuweisen?
Da Prozesse un VHDL sequentiell abgearbeitet werden müsste das doch gehen, oder?
Hatte die Aufgabe, so wie du beschrieben hast, gelöst und niemand hatte sich beschwert.
@ Cashney - stimmt, habs angepasst - copy paste fehler
@ HAL 9000 - es geht beides:
entweder immer next_state zuweisen und am schluss current_state <= next_state;
oder immer direkt current_state <= <state_to_be_assigned>;