Forum: FPGA, VHDL & Co. VHDL CODE ASYNCHRONER RESET-EINGANG?


von Deniz (Gast)


Lesenswert?

Hier habe ich einen VHDL-Code, ich glaube der Reset-Eingang ist 0-aktiv, 
wegen dem if reset='0' then q<='0'. Falls ich es falsch verstanden habe 
bitte ich gerne um Verbesserung.
Nun zu meiner Frage, wie erkenne ich ob der Reset-Eingang asynchron oder 
synchron ist? wäre lieb wenn mir das jemand ausführlich erklären könnte, 
da ich ein Anfänger bin.

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;


entity counter4 is
  port (
    clk   : in  std_logic;
    reset : in  std_logic;
    q_out : out std_logic_vector(3 downto 0) );    --Ausgänge
end counter4;



architecture beh of counter4 is
  signal q,q_ns: unsigned(3 downto 0);

begin  -- beh
  q_out <= std_logic_vector(q);  -- connect internal signals to output 
ports

  process (clk,reset) -- process for register function
  begin
    if reset='0' then
      q <= (others => '0');
    elsif clk'event and clk = '1' then  -- rising clock edge
        q <= q_ns;
    end if;
  end process;

  process (q)  -- process for next state decoder
  begin
    q_ns <= q + 1;
  end process;

end beh;

von 123 (Gast)


Lesenswert?

Synchron ist er wenn er immer mit der Taktflanke ausgewertet wird. 
(Reset ist nicht in der Sensitivitylist des Prozesses).

Asynchron bedeutet, dass der Reset "sofort" vollzogen wird. Das ist in 
deinem Beispiel der Fall.
1
process (clk,reset) -- process for register function
2
  begin
3
    if reset='0' then
4
      q <= (others => '0');
5
    elsif clk'event and clk = '1' then  -- rising clock edge
6
        q <= q_ns;
7
    end if;
8
  end process;

asynchron

Du siehst in der Sensitivitylist stehen clk und reset. Damit wird der 
Prozess zu jeder Taktzeit und Reset-Signal-Änderung ausgeführt. Der 
Reset schlägt also sofort zu und nicht erst wenn der nächste Taktzyklus 
kommt.

So ist er z.B. synchron
1
process (clk) -- process for register function
2
  begin
3
    if reset='0' then
4
      q <= (others => '0');
5
    elsif clk'event and clk = '1' then  -- rising clock edge
6
        q <= q_ns;
7
    end if;
8
  end process;

von Deniz (Gast)


Lesenswert?

Vielen dand, das hat mir weitergeholfen, aber das der Reset-Eingang 
0-aktiv ist stimmt doch oder?

von 123 (Gast)


Lesenswert?

1
if reset='0' then
2
      q <= (others => '0');
3
    elsif clk'event and clk = '1' then  -- rising clock edge
4
        q <= q_ns;
5
    end if;

naja jetzt schau doch mal hin
1
if reset='0' then
2
q <= (others => '0');

Das ist der Reset.

Also ja der Reset ist low aktiv.

von Deniz (Gast)


Lesenswert?

Danke :) bin noch Neueinsteiger was VHDL angeht daher bin ich mir nicht 
so sicher gewesen :)

von OhJe (Gast)


Lesenswert?

>So ist er z.B. synchron

>process (clk) -- process for register function
>  begin
>    if reset='0' then
>      q <= (others => '0');
>    elsif clk'event and clk = '1' then  -- rising clock edge
>        q <= q_ns;
>    end if;
>  end process;

Bullshit! Hier ist die Sensitivitätsliste einfach nur unvollständig-

von derLars (Gast)


Lesenswert?

Wichtig zu wissen:

Die Sensitivliste benötigt ausschließlich der Simulator!
D.h. der Prozess wird in der Simulation gestartet, wenn sich ein Eintrag 
der Sensitivliste ändert.

Hier wird ein asynchroner Reset simuliert und synthetisiert.
1
process (clk,reset) -- process for register function
2
  begin
3
    if reset='0' then
4
      q <= (others => '0');
5
    elsif clk'event and clk = '1' then  -- rising clock edge
6
        q <= q_ns;
7
    end if;
8
  end process;

Hier verhalten sich Simulation und generierte Hardware unterschiedlich!
Denn die Sensitivliste ist unvollständig, es wird aber weiterhin ein 
asynchroner Reset synthetisiert.
1
process (clk) -- process for register function
2
  begin
3
    if reset='0' then
4
      q <= (others => '0');
5
    elsif clk'event and clk = '1' then  -- rising clock edge
6
        q <= q_ns;
7
    end if;
8
  end process;

Hier wird ein synchroner reset simuliert und synthetisiert, da der Reset 
auch nur mit einer clk-Flanke überprüft wird.
1
process (clk) -- process for register function
2
  begin
3
    if clk'event and clk = '1' then  -- rising clock edge
4
      if reset='0' then
5
        q <= (others => '0');
6
      else
7
        q <= q_ns;
8
      end if;
9
    end if;
10
  end process;

Gruß
derLars

von Björn P. (bjrn_g)


Lesenswert?

@derLars:

Super Erklärung, glaube damit dürfte bei dem TO keine Frage 
diesbezüglich offen sein.

@Deniz
Kleine Anmerkung noch am Rande:

Überlege dir nochmal, ob du "clk'event" nutzen möchtest (das Thema gibts 
hier aber auch schon zuhauf)
Siehe:
http://www.mikrocontroller.net/articles/VHDL#CLK.3D.271.27_and_CLK.27event_oder_rising_edge.28.29

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.