generic_counter_tb.vhd 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4. entity generic_counter_tb is
  5. end entity;
  6. architecture beh of generic_counter_tb is
  7. component generic_counter is
  8. generic (
  9. counter_bits : integer
  10. );
  11. port(
  12. clk : in std_logic;
  13. rst : in std_logic;
  14. en : in std_logic;
  15. cnt : out unsigned (counter_bits -1 downto 0)
  16. );
  17. end component;
  18. constant freq : integer := 50; -- MHz
  19. constant period : time := 1000 / freq * 1 ns;
  20. constant half_period : time := period / 2;
  21. signal num_rising_edges : integer := 0;
  22. signal clock : std_logic := '0';
  23. signal enable : std_logic;
  24. signal reset : std_logic;
  25. signal counter_value : unsigned(7 downto 0);
  26. signal running : boolean := true;
  27. begin
  28. running <= true, false after 30 * period;
  29. reset <= '0', '1' after 2 * period, '0' after 3 * period;
  30. enable <= '0', '1' after 5 * period;
  31. cnt_i1 : generic_counter
  32. generic map(
  33. counter_bits => 8
  34. )
  35. port map(
  36. clk => clock,
  37. rst => reset,
  38. en => enable,
  39. cnt => counter_value
  40. );
  41. -- clock process
  42. process is
  43. begin
  44. if running then
  45. wait for half_period;
  46. clock <= not clock;
  47. else
  48. report "End of simulation!";
  49. wait;
  50. end if;
  51. end process;
  52. process(clock) is
  53. begin
  54. if rising_edge(clock) then
  55. if reset = '1' then
  56. num_rising_edges <= 0;
  57. elsif enable = '1' then
  58. num_rising_edges <= num_rising_edges+1;
  59. else
  60. -- Explicit no change
  61. num_rising_edges <= num_rising_edges;
  62. end if;
  63. end if;
  64. end process;
  65. -- Automated checks
  66. process(clock) is
  67. begin
  68. if rising_edge(clock) then
  69. assert num_rising_edges = to_integer(counter_value) report "Counter not working! " & integer'image(to_integer(counter_value)) & " != " & integer'image(num_rising_edges) severity error;
  70. end if;
  71. end process;
  72. end architecture;