Forum: FPGA, VHDL & Co. State Maschine Probleme


von Dirk (Gast)


Lesenswert?

Hallo,

ich bin an einem async Memory Controller bei. Leider habe ich ein
kleines Problem. Ich muesste drei Prozesse in einem Zustand abfragen.
Leider wird ein Signal synchron unanhaengig vom Clock abgefragt. Meine
State Maschine arbeitet auf steigende Flanke des Clock Signal's.

Hier mal ein kleiner Auszug:

when Xnibble =>
 if read = '1' then
  if highlow = '1' then
   UB <= '1';
   UL <= '0';
   state_next <= read;
  end if;
 end if;
 if write = '1' then
   if highlow = '1' then
   UB <= '1';
   UL <= '0';
   state_next <= write;
  end if;
 end if;
-- next state

Mein Problem ist das jetzt highlow nicht mehr synchron zum Clock
abgefragt wird. Hat jemand vielleicht ein Tip?

Das komplette ISE7.1 Projekt koennte ich heute abend zur Verfuegung
stellen falls es zur Fehleranalyse benoetigt wird.

Gruß,

Dirk

von Dirk (Gast)


Lesenswert?

Hi,

habe vergessen zu Fragen ob es sinnvoller ist den Fall abzufragen das
Write and Read = '1' sind?

if read = '1' and write = '0' then ....
..
..
end if;
if read = '0' and write = '1' then ....
..
..
end if;

Theoretisch sollte es nicht vorkommen das beide Signale '1' sind.
Eigentlich sollte dieses spaeter in der Main Control State Maschine
verhindert werden.

Gruß,
Dirk

von FPGA-User (Gast)


Lesenswert?

wenn deine FSM mit dem Clock CLK läuft dann wird highlow
ja auch mit CLK "abgefragt".
Das Problem ist nur, wo kommt "highlow" her ?
Eigentlich sollte man das am Signalnamen erkennen, der
ist aber nicht sinnvoll gewählt. Also wenn "highlow"
direkt von einem externen Pin kommt, wird deine FSM
evt. nicht sicher funktionieren.
(Grundregel: nie asynchrone Signale in einer FSM abfragen!)

Noch ne Frage:
können "read" und "write" gleichzeitig 1 sein ? Durch Deine
Beschreibung hat read eine höhere Priorität als write, was
aber keine Rolle spielt, wenn beide nie gleichzeitig 1 sind
oder wenn es so gewollt ist.
Man könnte auch schreiben :

if highlow ='1' then
   if read = '1' then
      ...
   elsif  write = '1' then
      ...
   end if;
end if;

von FPGA-User (Gast)


Lesenswert?

da warst Du schneller als ich mit dem 2. Beitrag, also vergiss
meine Frage mit read und write = 1

von Dirk (Gast)


Lesenswert?

Hi,

danke fuer deine Hilfe. Stimmt der Name highlow ist schlecht gewaehlt.
Highlow stellt ein Input Pin da der wiederum von der Main Control State
Maschine gesteuert werden soll. Die Main Control State Maschine soll
eigentlich auf Clk synchron arbeiten, somit sollte "highlow" synchron
arbeiten.

Ich kann leider erst heute abend die Aenderungen pruefen und werde dann
nochmal berichten ob es nun Synchron alles ist.

Gruß,

Dirk

PS.: Langsam macht VHDL richtig spass auch wenn es manchmal frustierend
ist.

Gruß,

Dirk

von FPGA-User (Gast)


Lesenswert?

hallo Dirk,

wie soll ein Input-Pin voaten einer Statemachine gesteuert werden?
Das hab ich noch nicht verstanden...

von Dirk (Gast)


Lesenswert?

Hallo,

endlich ist der process auch synchron zum Clock.

Ich haette aber gleich noch Fragen zu eine Variable:
Ich hab mir eine Shared Variable  Integer deklariert

SHARED variable bitvariable: integer := 7

Kann man sich Variablen nicht in Modelsim anschaun? nur Prozesse und
Signale?

Gruß,
Dirk

von ope (Gast)


Lesenswert?

Je mehr ich mich mit der FSM und der SRAM Ansteuerung beschäftige, desto
mehr kommt bei mir der Verdacht auf, das dieser Ansatz (FSM) nicht
gerade der Beste ist. Ein Clk Cycle vergeht, bis die state gewechselt
hat (read-write zB) und ein weiterer, bis die Signale (en, wr zB)
gesetzt sind, wenn ich die Ausgänge synchronize. Oder habe ich den
"Dreh" noch nicht raus? Wie macht Ihr das?

Viele Grüße
Olaf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.