Tcount.VHD

-------------------------------------------------------
-- Structural description of a fast and efficient T
-- flip-flop counter.
--
-- This example demonstrates the use of component port
-- maps and default interfaces.
--
-- Copyright 1997, Accolade Design Automation, Inc.
--
library ieee;
use ieee.std_logic_1164.all;
 
entity andgate is
    port(A,B,C,D: in std_ulogic := '1';
         Y: out std_ulogic);
end andgate;
 
architecture gate of andgate is
begin
    Y <= A and B and C and D;
end gate;
 
use ieee.std_logic_1164.all;
entity tff is
    port(Rst,Clk,T: in std_ulogic;
         Q: out std_ulogic);
end tff;
 
architecture behavior of tff is
begin
    process(Rst,Clk)
        variable Qtmp: std_ulogic;
    begin
        if (Rst = '1') then
            Qtmp := '0';
        elsif rising_edge(Clk) then
            if T = '1' then
                Qtmp := not Qtmp;
            end if;
        end if;
        Q <= Qtmp;
    end process;
end behavior;
 
use ieee.std_logic_1164.all;
entity TCOUNT is
    port (Rst: in std_ulogic;
          Clk: in std_ulogic;
          Count: out std_ulogic_vector(4 downto 0)
    );
end TCOUNT;
 
architecture STRUCTURE of TCOUNT is
    component tff
        port(Rst,Clk,T: in std_ulogic;
             Q: out std_ulogic);
    end component;
    component andgate
        port(A,B,C,D: in std_ulogic := '1';
             Y: out std_ulogic);
    end component;
    constant VCC: std_ulogic := '1';
    signal T,Q: std_ulogic_vector(4 downto 0);
begin
    T(0) <= VCC;
    T0: tff port map (Rst=>Rst, Clk=>Clk, T=>T(0), Q=>Q(0));
    T(1) <= Q(0);
    T1: tff port map (Rst=>Rst, Clk=>Clk, T=>T(1), Q=>Q(1));
    A1: andgate port map(A=>Q(0), B=>Q(1), Y=>T(2));
    T2: tff port map (Rst=>Rst, Clk=>Clk, T=>T(2), Q=>Q(2));
    A2: andgate port map(A=>Q(0), B=>Q(1), C=>Q(2), Y=>T(3));
    T3: tff port map (Rst=>Rst, Clk=>Clk, T=>T(3), Q=>Q(3));
    A3: andgate port map(A=>Q(0), B=>Q(1), C=>Q(2), D=>Q(3), Y=>T(4));
    T4: tff port map (Rst=>Rst, Clk=>Clk, T=>T(4), Q=>Q(4));
 
    Count <= Q;
 
end STRUCTURE;
 

T_tcount.VHD

-------------------------------------------------------
-- Auto-generated test bench for TCOUNT
--
library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;
use work.all;
 
entity TESTBNCH is
end TESTBNCH;
 
architecture stimulus of TESTBNCH is
component TCOUNT
    port (
        Rst: in std_ulogic;
        Clk: in std_ulogic;
        Count: out std_ulogic_vector(4 downto 0)
    );
end component;
constant PERIOD: time := 100 ns;
-- Top level signals go here...
signal Rst: std_ulogic;
signal Clk: std_ulogic;
signal Count: std_ulogic_vector(4 downto 0);
signal done: boolean := false;
 
for DUT: TCOUNT use entity work.TCOUNT(STRUCTURE);
 
begin
    DUT: TCOUNT port map (
            Rst => Rst,
            Clk => Clk,
            Count => Count
          );
 
    CLOCK1: process
        variable clktmp: std_ulogic := '0';
    begin    
        wait for PERIOD/2;
        clktmp := not clktmp;
        Clk <= clktmp;  -- Attach your clock here
        if done = true then
            wait;
        end if;
    end process;
 
    STIMULUS1: process
    begin
 
        -- Sequential stimulus goes here...
 
        Rst <= '1';
        wait for PERIOD;
 
        Rst <= '0';
 
        wait for PERIOD * 36;
 
        done <= true;
        wait;
    end process;
 
end stimulus;