mikrocontroller.net

Forum: FPGA, VHDL & Co. State Machine Zähler-Problem


Autor: Julian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo miteinander!

Ich bin grad dabei für meine Studienarbeit was kleines in VHDL zu 
programmieren. Soll eine Ansteuerung für nen Display werden 
(Schachbrettmuster). Das Problem ist dabei der Counter in einer der 
State Machines. Der macht leider nicht unbedingt was er soll. Ich hab 
das ganze mal nur auf den Counter (c) reduziert und die zustände 
eingeschränkt und direkt verzweigt (ohne IFs), damits net so 
unübersichtlich ist.


library IEEE;
use IEEE.std_logic_1164.all;

entity state_machine is

port(reset, clk : in std_logic;
  co: out INTEGER RANGE 0 to 7);

end state_machine;

architecture behavioral of state_machine is

type statetype is (state0, state1, state2);
signal state,next_state : statetype:=state0;
signal c: integer:=0;

begin

process(state)

begin

case state is
  when state0=>
    --Grundzustand
    
    c<= 0; --  c zurücksetzen
    
    next_state <= state1;
    
  when state1=>
  
    c<=c+1;
    -- Zählzustand
    next_state <= state2;
      
  when state2 =>
      
    c<=c; -- c beibehalten
    
    --andere befehle 
    
    next_state <= state0;
    
end case;

end process;


clk_process:process(clk, reset)

begin

if CLK = '1' and CLK'event then

  if reset='1' then
    state<=state0;
  else 
    state<=next_state;
    co<=c;
  end if;
end if;
  
end process clk_process;

end behavioral;


Das sollte, meinem Verständnis nach, folgendes bewirken:

1. Fängt in state0 an und setzt c=0
2. Wechsel zu state1
3. addiert 1 auf c -> c=1
4. Wechsel zu state2
5. Zustand behält c bei -> c=1
6. Kehrt in Grundzustand state0 zurück

Leider kommt ziemliches Hickhack raus. (s. angehängte 
Simulationsergebnisse)

Wäre super, wenn mir wer helfen könnte, bin schon am verzweifeln! :)

Danke!

Gruß
Julian

Autor: SeriousSam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ev braucht dein Counter einen Takt auf den er reagieren kann.
Wenn du das case aus dem ersten process in den else Zweig im zweiten 
process packst, und statt next_state direkt state verwendest könnte es 
schon fast funktionieren.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>    c <= c+1;
Grundsätzlich: Zählen können nur FFs, keine Kombinatorik.
Und FFs sind getaktet.

Das geht in der Simulation nur durch, weil deine Sensitivity-Liste 
unvollständig ist.
process(state,c)   <<< Kombinatorik, hier fehlt c
begin
  case state is
  when state0=>
    --Grundzustand
    c<= 0; --  c zurücksetzen
    next_state <= state1;
    
  when state1=>
    c<=c+1;
    -- Zählzustand
    next_state <= state2;
      
  when state2 =>
    c<=c; -- c beibehalten
    --andere befehle 
    next_state <= state0;
    
  end case;
end process;
Wenn du die korrigierst, dann wird deine Simulation das machen, was die 
Hardware aucht tut: im State1 c mit maximaler Geschwindigkeit 
hochzählen.

Dein Fehler ist jetzt noch nicht behoben, der liegt nämlich in deiner 
Denkweise. Du denkst, der getaktete Teil ist nur zum Weiterschalten des 
States, richtig? Aber ist nicht ein Zähler auch nur eine SM? und müsste 
der Zähler dann nicht auch ein wenig vom Takt abbekommen, (z.B. 
wenigstens eine steigende Flanke)?

1) Sieh dir mal den Beitrag "Re: FSM springt nicht in nächsten Status" 
an.
2) Bringe dir die 1-Prozess-Schreibweise (such mal hier im Forum) bei.
2) Wirf das Buch weg, wenn nur diese 2-Prozess-Schreibweise drinsteht.

Autor: Julian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das war ein Fehler in der Denkweise. Hab ich mir auch schon gedacht, 
aber leider bin ich net draufgekommen. Bin VHDL noch nicht so gewohnt. 
:)

Aber vielen Dank! Jetzt funktionierts.

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.