-- zaehler_TB.vhd, 17.1.99 GA -- Testbench fuer zaehler.vhd, instantiiert zwei Zaehler (UUT1, UUT2) -- und gibt deren Signale abwechselnd auf EINEN Bus. -- Zusaetzlich ist noch ein einfaches Schieberegister eingebaut. -- Das Testbenchgeruest kann von Active-VHDL mit "Tools/Generate Test Bench" -- automatisch erzeugt werden. library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity zaehler_tb is end zaehler_tb; architecture TB_ARCHITECTURE of zaehler_tb is -- Component declaration of the tested unit -- Die Signatur von zaehler component zaehler port( clk : in std_logic; reset : in std_logic; tristate : in std_logic; count : inout std_logic_vector(7 downto 0) ); end component; -- Stimulus signals - signals mapped to the input and inout ports of tested entity signal clk : std_logic; signal reset : std_logic_vector(2 downto 1); signal tristate : std_logic_vector(2 downto 1); signal count : std_logic_vector(7 downto 0); -- Das ist der gemeinsame Bus -- Fuers Schieberegister signal shift: std_logic_vector(7 downto 0); begin -- Unit Under Test port map -- Hier werden fuer UUT1 den namentlich benannten Ports die -- passenden Signale zugeordnet, links die Portnamen, -- rechts die zugewiesenen Signale UUT1 : zaehler port map (clk => clk, reset => reset(1), tristate => tristate(1), count => count ); -- Zuordnung der Signale anhand der Position fuer UUT2 UUT2 : zaehler port map (clk, reset(2), tristate(2),count); -- Add your stimulus here ... -- Dann stimulieren wir mal... -- Zuerst die Takterzeugung clk_process: process begin clk<='0'; -- 2*50ns -> 100ns Periode -> 10MHz wait for 50 ns; clk<='1'; wait for 50 ns; end process; -- Im folgenden getakteten Prozess wird der Ablauf von Reset/Tristate -- erzeugt. Man beachte das Verhalten des Schieberegisters auf -- das Zuruecknehmen von reset(1)! control_process: process variable n:integer:=0; begin wait until clk='1'; if (n<8) then -- Jetzt sorgen wir dafuer, dass reset<="11"; -- ein Zaehler erst etwas spaeter elsif (n<12) then -- aus dem Reset kommt reset<="10"; else reset<="00"; end if; case (n mod 4) is -- Ausgeben der Zaehlerstaende when 0 => tristate<="01"; -- zuerst UUT2 auf den Bus when 1 => tristate<="10"; -- dann UUT1 when 2 => tristate<="00"; -- Buskollision!!! Es sollten ein paar ? auftauchen when 3 => tristate<="11"; -- beide Ausgaenge hochohmig (ZZZZZZZZ) when others => end case; n:=n+1; end process; -- Und als Schmankerl noch ein kleines Links-Schieberegister mit SYNCHRONEM Reset auf 0xff -- Beim Schieben wird mit '0' aufgefuellt schieben: process(clk) begin if clk'event and clk='1' then if reset(1)='1' then shift<=x"ff"; else shift(0)<='0'; shift(7 downto 1)<=shift(6 downto 0); -- Wer nicht glaubt, dass das so funktioniert, sollte -- sich mit den VHDL-Signalen nochmal etwas besser -- beschaeftigen! end if; end if; end process; end TB_ARCHITECTURE; configuration TESTBENCH_FOR_zaehler of zaehler_tb is for TB_ARCHITECTURE for UUT1,UUT2 : zaehler use entity work.zaehler(zaehler); end for; end for; end TESTBENCH_FOR_zaehler;