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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.