generic_counter_tb.vhd 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. constant counter_bits : integer := 8;
  26. signal counter_value : unsigned(counter_bits-1 downto 0);
  27. signal running : boolean := true;
  28. begin
  29. running <= true, false after 500 * period;
  30. reset <= '0',
  31. '1' after 2 * period,
  32. '0' after 3 * period,
  33. '1' after 70 * period,
  34. '0' after 71 * period;
  35. enable <= '0',
  36. '1' after 5 * period,
  37. '0' after 100 * period,
  38. '1' after 110 * period;
  39. cnt_i1 : generic_counter
  40. generic map(
  41. counter_bits => counter_bits
  42. )
  43. port map(
  44. clk => clock,
  45. rst => reset,
  46. en => enable,
  47. cnt => counter_value
  48. );
  49. -- clock process
  50. process is
  51. begin
  52. if running then
  53. wait for half_period;
  54. clock <= not clock;
  55. else
  56. report "End of simulation!";
  57. wait;
  58. end if;
  59. end process;
  60. process(clock) is
  61. begin
  62. if rising_edge(clock) then
  63. if reset = '1' then
  64. num_rising_edges <= 0;
  65. elsif enable = '1' then
  66. num_rising_edges <= num_rising_edges+1;
  67. else
  68. -- Explicit no change
  69. num_rising_edges <= num_rising_edges;
  70. end if;
  71. end if;
  72. end process;
  73. -- Automated checks
  74. process(clock) is
  75. begin
  76. if rising_edge(clock) then
  77. assert (num_rising_edges mod 2**counter_bits) = to_integer(counter_value) report "Counter not working! " & integer'image(to_integer(counter_value)) & " != " & integer'image(num_rising_edges) severity error;
  78. end if;
  79. end process;
  80. end architecture;