VHDL - synchron oder asynchron?

Gast #4187096
Lesenswert?
• ▲
▼
Habe mit VHDL bisher nichts zu tun gehabt, daher fällt mir die 
Beantwortung dieser Frage sehr schwer (ich hoffe, dass ich die File 
richtig abgetippt hab, falls Fehler drin sind, entschuldige ich mich 
schonmal!)

Gegeben ist folgender Code:



ARCHITECTURE a OF state_m IS
  TYPE  STATE_TYPE IS (a0, a1, a2);
  SIGNAL state : STATE_TYPE;
BEGIN
   PROCESS(clk, reset)
   BEGIN
   IF reset = '1' THEN
      state <= a0;
   ELSEIF (clk 'EVENT AND clk = '1') THEN
      CASE state IS
        WHEN a0 =>
    IF input = '1' THEN
       state <= a1;
    ELSE
       state <= a0;
    END IF;
      WHEN a1 =>
    IF input = '1' THEN
       state <= a2;
    ELSE
       state <= a1;
    END IF;
  END CASE;
    END IF;
END PROCESS;
    PROCESS (state)
BEGIN
     CASE state IS
  WHEN a0 =>
     output <= "00";
  WHEN a1 =>
     output <= "01";
  WHEN a2 =>
     output <= "10";
     END CASE;
END PROCESS;
END a;


Erklären und begründen Sie, ob dieses File ein synchrones oder 
asynchrones Design hat.

Meine Idee:

ELSEIF (clk 'EVENT AND clk = '1') THEN <- also hierdran erkenne ich 
doch, dass nur auf die positive Taktflanke reagiert wird, oder? Woher 
weiß ich aber, ob die Daten auch synchron zum Takt sind, also ob das 
Design dann wirklich synchron arbeitet?

Vielen Dank im Voraus!
Gast #4187099
Lesenswert?
• ▲
▼
Entschuldigt, habe vergessen den oberen Part ebenfalls zu kopieren, 
also:

ENTITY state_m IS

PORT(
  clk: IN STD_LOGIC;
  input: IN STD_LOGIC;
  reset: IN STD_LOGIC;
  output: OUT STD_LOGIC_VECTOR (1 downto 0));
END state_m;

ARCHITECTURE a OF state_m IS
  TYPE  STATE_TYPE IS (a0, a1, a2);
  SIGNAL state : STATE_TYPE;
BEGIN
   PROCESS(clk, reset)
   BEGIN
   IF reset = '1' THEN
      state <= a0;
   ELSEIF (clk 'EVENT AND clk = '1') THEN
      CASE state IS
        WHEN a0 =>
    IF input = '1' THEN
       state <= a1;
    ELSE
       state <= a0;
    END IF;
      WHEN a1 =>
    IF input = '1' THEN
       state <= a2;
    ELSE
       state <= a1;
    END IF;
  END CASE;
    END IF;
END PROCESS;
    PROCESS (state)
BEGIN
     CASE state IS
  WHEN a0 =>
     output <= "00";
  WHEN a1 =>
     output <= "01";
  WHEN a2 =>
     output <= "10";
     END CASE;
END PROCESS;
END a;
Gast #4187167
Lesenswert?
• ▲
▼
VHDL-Newcomer schrieb im Beitrag #4187096:
> ELSEIF (clk 'EVENT AND clk = '1') THEN <- also hierdran erkenne ich
> doch, dass nur auf die positive Taktflanke reagiert wird, oder? Woher
> weiß ich aber, ob die Daten auch synchron zum Takt sind, also ob das
> Design dann wirklich synchron arbeitet?

richtig gedacht: die Statemachine reagiert nur bei der Taktflanke, also 
handelt es sich um ein synchones Design, bei dem die States in Registern 
gespeichert werden.

Du kannst das synchrone Design aushebeln, wenn die Eingänge nicht 
synchron mit der CLK sind und sich "im falschen Aufgenblick" ändern. 
Dann kommt es ggf. zu Fehlern und die Statemachine macht nicht das, was 
du eigentlich willst. Aber ein synchrones Design ist es trotzdem noch 
(nur halt eins, das nicht zuverlässig funktioniert).
Gast #4187192
Lesenswert?
• ▲
▼
VHDL-Newcomer schrieb im Beitrag #4187173:
> Mir fällt gerade auf,
> dass mein Prof scheinbar das aus dem Quartus-Tutorial verwendet hat,
> dort steht unten aber was mit asynchron

so ein fauler Prof...

Der Reset ist asynchron - er steht außerhalb der if clk'event Struktur 
und wirk sofort (ohne erst auf die nächste Taktflanke zu warten). Der 
ganze Rest ist aber synchron (reagiert nur bei Taktflanke). Es ist also 
eine synchrone Statemachine mit asynchronem Reset.
Gast #4187240
Lesenswert?
• ▲
▼
VHDL-Newcomer schrieb im Beitrag #4187211:
> Also wenn man sagt "Synchrones Design" bezieht sich das
> dann nur auf die State-Machine und nicht auf den Reset?

So würde ich es zumindest immer beschreiben. Der Reset spielt eine 
Sonderrolle und kann als einzig asynch. Signal in einem ansonsten 
vollständig synchronen Design vorkommen.

vielleicht ist folgender Artikel für dich interessant:
http://www.mikrocontroller.net/articles/Reset_f%C3%BCr_FPGA/CPLD

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.