Ich versuche, ein einfaches VHDL-Programm zu erstellen, das darin besteht, einen std_logic_vector bei jedem Drücken von Taste A um eins zu erhöhen. Wenn Knopf B gedrückt wird, sollte der Wert zurückgesetzt werden.
Meine Idee war, es so zu machen
entity simple is
Port ( A : in std_logic;
B : in std_logic;
CLK : in std_logic;
debug : out std_logic_vector (7 downto 0));
end simple;
architecture Behavioral of simple is
signal state: std_logic_vector(7 downto 0) := "00000000";
begin
increment: process(state, A, B)
begin
if (B'event and B = '1') then
state <= "00000000";
end if;
if (A'event andA = '1') then
state <= std_logic_vector(unsigned(state)+1);
end if;
end process;
led_debug: process(CLK)
begin
debug <= state;
end process;
end Behavioral;
Das Problem ist, dass ich einen Fehler erhalte - Schlechte synchrone Beschreibung, die ich nicht verstehen kann.
Ich habe Ihren Code in eine vollständige synchrone Beschreibung umgearbeitet:
Clk
.A
aktiv, dann wird der Zähler auf Null zurückgesetzt.B
aktiv ist, wird es inkrementiert.led_debug
Prozess sollte getaktet werden, also habe ich eine Rising_Edge-Bedingung hinzugefügt.Diese Lösung löst das folgende Problem nicht, wenn A
und B
Drähte von einer externen Taste sind:
Hier ist der umgeschriebene Code:
entity simple is
Port (
CLK : in std_logic;
A : in std_logic;
B : in std_logic;
debug : out std_logic_vector (7 downto 0)
);
end entity;
architecture rtl of simple is
signal state : unsigned(7 downto 0) := (others => '0');
begin
increment : process(Clk)
begin
if rising_edge(Clk) then
if (B = '1') then
state <= "00000000";
elsif (A = '1') then
state <= state + 1;
end if;
end if;
end process;
led_debug : process(CLK)
begin
if rising_edge(Clk) then
debug <= std_logic_vector(state);
end if;
end process;
end architecture;
Mir wurde klar, dass es innerhalb desselben Prozesses an 2 steigenden Flanken überprüfte, wodurch das System empfindlich auf 2 Takte reagierte, was zu einer schlechten Synchronität führte.
mkrieger1
debug
ist nicht unbedingt erforderlich.Paebbels