2016-04-13 8 views
-1

Ich habe diesen VHDL-Code für einen 3-Bit-Aufwärts-/Abwärtszähler, aber wenn ich es simuliere, gib kein Ausgangsergebnis, was ist falsch ??VHDL 3-Bit-U/D-Zähler

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use ieee.std_logic_unsigned.all; 
use ieee.numeric_std.all; 
entity counter is 
    Port (rst,clk : in STD_LOGIC; 
    up: in bit; 
      z : out STD_LOGIC_vector(2 downto 0)); 
end counter; 
architecture Behavioral of Counter is 
signal zint: STD_LOGIC_vector(2 downto 0) ; 
begin 
z<= zint; 
process (clk) 
begin 
if (clk' event and clk='1') then 
if (rst ='1') then 
zint <= "000" ; 
end if; 
if (zint <= "111")then zint <= "000"; 
elsif (up='1') then zint <= zint+1; 
else zint <= zint-1; 
end if; 
end if; 
end process; 
end Behavioral; 
+0

Willkommen bei Stack-Überlauf . Normalerweise ist es besser, ein [MCVE] (http://stackoverflow.com/help/mcve) zu geben, damit jemand anderes deine Schuld reproduzieren kann, aber in diesem Fall denke ich, dass ich sehen kann, was falsch ist. –

+2

Bitte den Code einrücken. – Paebbels

+0

Bitte zeigen Sie Ihre Testbench. Was meinst du mit _wird kein Ausgabeergebnis geben_? –

Antwort

0

Sie setzen zint auf "000" beim Zurücksetzen. Dann, solange zint ist weniger gleich "111" Sie setzen es wieder auf "000". Wie kann zint von "000" abweichen?
Sie könnten die erste if-Bedingung vollständig löschen, der Zähler wird automatisch von "111" auf "000" überlaufen oder umgekehrt.

0

Ich denke, diese Linie ist Ihr Problem:

if (zint <= "111")then zint <= "000"; 

hast du das nicht bedeuten?

if (zint = "111")then zint <= "000"; 

In der Tat, Sie brauchen nicht auf die obige Zeile überhaupt - der Zähler automatisch Wrap-Runde. (Und das gleiche gilt für das Herunterzählen, eine Situation, die Sie keinen Code haben für jedenfalls.)

gesagt haben, dass hier einige andere Vorschläge, Ihren Code zu verbessern:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
-- use ieee.std_logic_unsigned.all;  -- DON'T USE THIS... 
use ieee.numeric_std.all;     -- ...USE THIS INSTEAD 
entity counter is 
    Port (rst,clk : in STD_LOGIC; 
    up: in bit;        -- DID YOU REALLY WANT TYPE 'bit' HERE? 
    z : out STD_LOGIC_vector(2 downto 0)); 
end counter; 

architecture Behavioral of Counter is 
    signal zint: unsigned(2 downto 0) ; -- MAKE THIS TYPE 'unsigned'... 
begin 
    z<= std_logic_vector(zint);    -- ... AND USE A TYPE CONVERSION HERE 
    process (clk) 
    begin 
    if rising_edge(clk) then    -- '(clk' event and clk='1')' BECAME OLD-FASHIONED in 1993! 
     if rst ='1' then      -- YOU DON'T NEED THE BRACKETS 
     zint <= "000" ;     -- USE INDENTATION! 
     --end if; 
     --if zint = "111" then zint <= "000"; 
     elsif up='1' then 
     zint <= zint+1; 
     else 
     zint <= zint-1; 
     end if; 
    end if; 
    end process; 
end Behavioral;