www.mikrocontroller.net

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


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

process(CKL,RESET)
begin 
if RESET ='1' then 
    STATE <= IDLE ;
elsif rising_edge(CLK) then 
    STATE  <= STATE_next;
end if;
end process;

process(STATE, RESET)
begin 

if RESET ='1' then 
   STATE_next <= IDLE;
else 

 case STATE is 
   when IDLE => STATE_next <= DATA_WRITE;
   when DATA_WRITE => if DATA_COUNTER = X"10" then STATE_next<=IDLE;
                       else STATE_next <= DATA_WRITE;
 end case;
end if;                       

process(STATE, RESET)
begin 

if RESET ='1' then 
   ADDR<= (others => '0') ;
   DATA<= (others => '0') ;
else 

 case STATE is 
   when IDLE =>    ADDR<= (others => '0') ;
                   DATA<= (others => '0') ;
   when DATA_WRITE =>  ADDR<= ADDRESS;
                       DATA<= DATA_WR;
                       ADDRESS <= ADDRESS + '1';
                       DATA_WR <= DATAWR+'1';
                       DATA_COUNTER <= DATA_COUNTER +'1';  
 end case;
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

Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex H. (alex123)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.