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;
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; |
Vielen dand, das hat mir weitergeholfen, aber das der Reset-Eingang 0-aktiv ist stimmt doch oder?
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.
>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-
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.