state machine, ein state mit verschiendenen Daten

Gast #388933
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
Gast #388934
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.
#388935
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
Gast #388939
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren