mikrocontroller.net

Forum: FPGA, VHDL & Co. ISE: bad synchronous description


Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hab nen kleines Problem mit einer Taktabfrage...
Wieso wird bei folgenden Code vom Webpack beim Synthetisieren
gemeckert, und zwar "bad synchronous description"?
Hab mit Modelsim simuliert, lief 1A. Ich muss halt das Signal
fusstaster asynchron abfragen aber nur in dem Zustand status.
Habt ihr eine Idee?
folge: process (status, fusstaster, timer_1, timer_2)
  begin
      case status is
        when strasse =>
          if fusstaster = '1' and fusstaster'event then
            folge_status <= warten;
          end if;
        when warten =>
          if timer_1 = 10 then
            folge_status <= fussgaenger;
          end if;
        when fussgaenger =>
          if timer_2 = 10  then
            folge_status <= strasse;
          end if;
        when others => folge_status <= strasse;
      end case;
  end process folge;

für Hinweise wäre ich sehr dankbar.

Grüße
T.M.

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Fehler :
die VHDL-Beschreibung ist falsch, bei Deiner Sensitivity-List
mit 4 Signalen erwartet die Synthese einen rein kombin.
Prozess, also nur eine Gatter-Beschreibung,
dann kommt aber plötzlich in Zeile 5 eine Taktabfrage -
das geht nicht

2. :
Ist die Statemachine extra oder soll sie in diesem
Prozess realisiert werden ? (Ich nehme mal an, da
gibts irgendwo noch einen Clock im Design???)
Warum muss "fusstaster" auf die steigende Flanke
abgefragt werden ?
Kann man hier nicht den Zustand '1' abfragen und dann
in einem folgenden State warten, bis "fusstaster" wieder
0 ist ?
andere Idee:
Fusstaster mit 2 Flip-Flops einlesen, dann ist eine synchrone
Flankenerkennung möglich, etwa so:

reg1 <= fusstaster; -- mit einem vorh. Clock eintakten
reg2 <= reg1,

if (reg1 ='1' and reg2 = '0') then  -- steigende Flanke
...
evt. sind noch Maßnahmen zum entprellen erforderlich

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verstehe ich richtig, dass man bei getakteten Prozessen dann keine
anderen Signale ausser dem Clock in der Sens.liste stehen haben darf?

Das Problem mit dem Taster ist, dass er nicht nur bei der Flanke von
clk erkannt werden soll, sondern auch dazwischen. Ne Möglichkeit wäre
wohl, das Signal des Tasters zu speichern bis zur nächsten Flanke. An
dem Punkt kam ich aber nicht weiter, nen Latch schied da aus, oder habe
es nicht hinbekommen wie ich es wollte.

Hier mal der komplette Code:
entity FSM is
port(
  clk : in bit;
  reset : in bit;
  fusstaster : in bit;
  autoampel : out bit_vector(2 downto 0);
  fussampel : out bit_vector(1 downto 0));
end FSM;

architecture Verhalten of FSM is

-- interne Signale

signal clk_geteilt: bit;
signal lauf: natural := 0;
signal timer_1: natural := 0;
signal timer_2: natural :=0;

type phasen is (strasse, warten, fussgaenger);
signal status: phasen;
signal folge_status: phasen;

-- Beginn für Synthese
attribute clock_signal : string;
attribute clock_signal of clk_geteilt : signal is "yes";
--  Ende

begin


--  Zustandsaktualisierung

  ampel: process (clk_geteilt, reset)
  begin
    if reset = '1' then
      status <= strasse;    
    elsif clk_geteilt'event and clk_geteilt='1' then
      status <= folge_status;
    end if;
  end process ampel;  


-- Folgezustand ermitteln

  folge: process (status, fusstaster, timer_1, timer_2)
  begin
      case status is
        when strasse =>
          if fusstaster = '1' and fusstaster'event then
            folge_status <= warten;
          end if;
        when warten =>
          if timer_1 = 10 then
            folge_status <= fussgaenger;
          end if;
        when fussgaenger =>
          if timer_2 = 10  then
            folge_status <= strasse;
          end if;
        when others => folge_status <= strasse;
      end case;
  end process folge;


-- Ausgangskombinatorik

  ausgang: process (status)
  begin
    case status is
      when strasse => autoampel <= "001";
                      fussampel <= "10";
      when warten => autoampel <= "001";
                     fussampel <= "10";
      when fussgaenger => autoampel <= "100";
                          fussampel <= "01";
      when others => autoampel <= "001";
                     fussampel <= "10";
    end case;
  end process ausgang;


-- Timer

  timer: process (clk_geteilt, status)
  begin
    if clk_geteilt'event and clk_geteilt = '1' then
      case status is
        when strasse =>
          timer_2 <= 0;
        when warten =>
          timer_1 <= timer_1 +1;
        when fussgaenger =>
          timer_1 <= 0;
          timer_2 <= timer_2 + 1;
        when others => timer_1 <= 0;
                       timer_2 <= 0;
      end case;
    end if;
  end process timer;


-- Taktteiler

  taktteiler: process(clk)
  begin
    clk_geteilt <= '0';
    if clk'event and clk = '1' then
      lauf <= lauf +1;
    end if;
    if lauf = 48000000 then
      clk_geteilt <= '1';
      lauf <= 0;
    end if;
  end process taktteiler;

end Verhalten;

Grüße
T.M.

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du könntest das Signal z.B. im Prozess ampel
mit clk_geteilt in einem Flip-Flop speichern:

fusstaster_q <= fusstaster;


Ein asynchrones Signal in einer Statemachine abzufragen
ist sehr gefährlich. Alle Signale, die einen Einfluss
auf die States haben können, müssen mit dem Takt
der Statemachine einsynchronisiert sein, sonst
kann es zu unerwünschten Effekten kommen.

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mhm, ich werd am besten den Takt mal nicht soweit runterteilen, damit
ich bei kurzen Drücken des Tasters auch ne Flanke erwische. In dem
obigen Design sind es ja nach Teilung nur noch 1Hz...mit 100Hz dürfte
ich wohl hinkommen. Damit würden sich ja dann die Probleme erledigen.
Da kann ich dann wieder alles synchron machen... Danke für die Hinweise
:-)

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So. Hab jetzt mal nur auf 100Hz geteilt. Damit geht es nun, frage nur
noch den Zustand von dem Taster ab und alles funzt. Ausserdem hab ich
mal die 3 Latches im Prozess folge weggemacht, is mir vor der Synthese
gar ni aufgefallen. Für was Warnungen alles gut sind ;-)

Grüße
T.M.

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na gut :-)
noch zu Deiner Frage :
ja, in der Sens-Liste von getakteten Prozessen gibt es
normalerweise das Clock-Signal und evt. noch 1 bis 2
Signale für asynchronen Set / Reset.
Du musst übrigens die Statemachine nicht in Register
und Kombinatorik trennen, es geht auch beides in einem
Prozess, das ist manchmal besser lesbar.

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.