Forum: FPGA, VHDL & Co. state machine, ein state mit verschiendenen Daten


von chris (Gast)


Lesenswert?

hallo,
ich möchte in VHDL eine SM basteln.
Die SM soll Daten in ein DOP Ram schreiben.
Ich habe eine 3 Prozess Struktur:

1
process(CKL,RESET)
2
begin 
3
if RESET ='1' then 
4
    STATE <= IDLE ;
5
elsif rising_edge(CLK) then 
6
    STATE  <= STATE_next;
7
end if;
8
end process;
9
10
process(STATE, RESET)
11
begin 
12
13
if RESET ='1' then 
14
   STATE_next <= IDLE;
15
else 
16
17
 case STATE is 
18
   when IDLE => STATE_next <= DATA_WRITE;
19
   when DATA_WRITE => if DATA_COUNTER = X"10" then STATE_next<=IDLE;
20
                       else STATE_next <= DATA_WRITE;
21
 end case;
22
end if;                       
23
24
process(STATE, RESET)
25
begin 
26
27
if RESET ='1' then 
28
   ADDR<= (others => '0') ;
29
   DATA<= (others => '0') ;
30
else 
31
32
 case STATE is 
33
   when IDLE =>    ADDR<= (others => '0') ;
34
                   DATA<= (others => '0') ;
35
   when DATA_WRITE =>  ADDR<= ADDRESS;
36
                       DATA<= DATA_WR;
37
                       ADDRESS <= ADDRESS + '1';
38
                       DATA_WR <= DATAWR+'1';
39
                       DATA_COUNTER <= DATA_COUNTER +'1';  
40
 end case;
41
end if;


der Wert von DATA_COUNTER wird beim initialisieren des Siganls
eingegeben

signal DATA_COUNTER : std_logic_vector (7 downto 0) := X"10";
-- es sollen 16 Bytes geschrieben werden
signal DATA  : std_logic_vector (7 downto 0) := X"00";
-- die Daten soll bei 0 beginnen aufsteigend bis 15
signal ADDR :  : std_logic_vector (7 downto 0) := X"00";
-- es soll ab der Adresse 0 beginnend geschrieben werden
-- auf Adresse 0 wird Data = 0 geschrieben
-- auf Adresse 1 wird Data = 1 geschrieben
-- auf Adresse 2 wird Data = 2 geschrieben
usw.
dh. State DATA_WRITE soll 16 mal aufgerufen werden ( jeweils mit
anderen Daten )

leider funktioniert das nicht5 so wie ich mir das vorgestellt habe,
muss ich im dritten process mit rising_edge(CLK) arbeiten ?

vielen danke
  chris

von alex (Gast)


Lesenswert?

>leider funktioniert das nicht5 so wie ich mir das vorgestellt habe,
>muss ich im dritten process mit rising_edge(CLK) arbeiten ?

ja, es sieht so aus, dass der dritte Prozess asynchron ist und im
Zustand DATA_WRITE lauter asynchron zurückgekoppelter Addierer für
ADDRESS, DATA_WR und DATA_COUNTER entstehen.

von Alex H. (alex123)


Lesenswert?

Hallo Chris,

im 2. Prozess mussen alle Signale in die Sensitivity-Liste
(sonst passt's später auch nicht zwischen Simulation und
Synthese zusammen).

So wie Du's beschrieben hast, hängt sich State im Zustand
Data_Write auf, da dann kein neuer "event" mehr erfolgt
(ausser dem Reset - den ich hier gar nicht verwenden würde).
D.h. der Prozess wird nicht mehr neu gestartet, also auch
kein Vergleich mit dem Data_Counter ...

Rest hab ich mir nicht angeschaut.

Gruss,

Alex

von Klaus F. (kfalser)


Lesenswert?

Der dritte Prozess sollte von CLK getaktet sein und das case solle auf
STATE_next abfragen. Dann werden die Ausgangssignale beim Eintreten in
den Zustand gesetzt und Zustand und Ausgangssignale treten gleichzeitig
auf.

Grüße
Klaus

von chris (Gast)


Lesenswert?

Danke für die Hilfe.
Ich hatte den dritten Prozess getaktet,dann aber das Problem das ich
auch STATE und nicht auf STATE_next abegefragt habe.

Danke nochmals.

  Chris

von Tom (Gast)


Lesenswert?

Hi chris,

wieso packst Du alles nicht in eine FSM?!?
Quasi eine SM mit der Ein-Prozess-Dartsellung.
Das hat den Vorteil, dass alles synchron läuft, inclu die
Ausgangssignale.

Gruß
Tom

von Axel (Gast)


Lesenswert?

Im zweiten Process müssen alle Eingangssignale in die Sensitivity List
sonst generiert der Latche. Der dritte sollte einen Clock bekommen.

Ich würde den zweiten Process mit in den ersten Integrieren und beim
dritten den Clock wieder reinnehmen.

Übrigends sparst Du eine Menge Logik und FF, wenn Du einfach "Data <=
Adress;" nimmst. Spart den extra Addierer für Data

Gruss
Axel

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.