Ich versuche, einen Zähler zu bilden, der bis 3 zählt und dann auf 0 usw. zählt. Beispiel: 0 1 2 3 2 1 0 1 2 3 2 1 0 ...VHDL Aufwärts-/Abwärtszähler Fehlerzählung
Was ich tat:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Counter is
port(
Clock: in std_logic;
Reset: in std_logic;
Output: out std_logic_vector(0 to 1));
end Counter;
architecture Behavioral of Counter is
signal temp: std_logic_vector(0 to 1);
signal down: std_logic := '0';
begin process(Clock,Reset)
begin
if Reset='0' then
temp <= "00";
down<= '0';
elsif(rising_edge(Clock)) then
if temp="11" then
down<= '1';
elsif temp="00" then
down<='0';
end if;
if down='0' then
temp <= temp +1;
else
temp <= temp-1;
end if;
end if;
end process;
Output <= temp;
end Behavioral;
Irgendwie ist der Ausgang 3-0 gehen wird, ohne dass die mittleren Zahlen zu zeigen .. Was ist falsch?
vielleicht ist es überläuft eher als herunterzählen. Haben Sie "down" als Variable und nicht als Signal betrachtet und verwenden Sie daher ': =' (unmittelbare Zuweisung) statt '<=' (Zustand bei nächster Zeit)? – diginoise
Seltsam, dass Sie std_logic_vector etwas hinzufügen können. Welches Werkzeug benutzen Sie? Und es ist genau so, wie @Diginoise sagte. Wenn 'temp =" 11 "' Sie 'down <= '1'zuweisen, geschieht dies nach dem Ende des Prozesses. Es ist also immer noch "0", wenn es eingecheckt ist, wenn down = "0" dann ". Deshalb überläuft es. Gleiches in der entgegengesetzten Richtung. – Staszek
@Staszek Sie verwenden das Legacy-Paket std_logic_unsigned. –