LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY counter IS
PORT (
clk : IN std_logic;
reset : IN std_logic;
enable : IN std_logic;
count : OUT std_logic_vector(3 DOWNTO 0)
);
END counter;
ARCHITECTURE behav OF counter IS
SIGNAL pre_count : std_logic_vector(3 DOWNTO 0);
BEGIN
PROCESS (clk, enable, reset)
BEGIN
IF reset = '1' THEN
pre_count <= "0000";
ELSIF (clk = '1' AND clk'event) THEN
IF enable = '1' THEN
pre_count <= pre_count + "1";
END IF;
END IF;
END PROCESS;
count <= pre_count;
END behav;
VHDL Test bench for the Counter.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.std_logic_textio.ALL;
USE std.textio.ALL;
ENTITY counter_tb IS
END;
ARCHITECTURE counter_tb OF counter_tb IS
COMPONENT counter
PORT (
count : OUT std_logic_vector(3 DOWNTO 0);
clk : IN std_logic;
enable : IN std_logic;
reset : IN std_logic);
END COMPONENT;
SIGNAL clk : std_logic := '0';
SIGNAL reset : std_logic := '0';
SIGNAL enable : std_logic := '0';
SIGNAL count : std_logic_vector(3 DOWNTO 0);
BEGIN
dut : counter
PORT MAP(
count => count,
clk => clk,
enable => enable,
reset => reset);
clock : PROCESS
BEGIN
WAIT FOR 1 ns;
clk <= NOT clk;
END PROCESS clock;
stimulus : PROCESS
BEGIN
WAIT FOR 5 ns;
reset <= '1';
WAIT FOR 4 ns;
reset <= '0';
WAIT FOR 4 ns;
enable <= '1';
WAIT;
END PROCESS stimulus;
monitor : PROCESS (clk)
VARIABLE c_str : line;
BEGIN
IF (clk = '1' AND clk'event) THEN
write(c_str, count);
ASSERT false REPORT TIME'image(now) &
": Current Count Value : " & c_str.ALL
SEVERITY note;
deallocate(c_str);
END IF;
END PROCESS monitor;
END counter_tb;