generic_prescaler_tb.vhd 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4. entity generic_prescaler_tb is
  5. end entity;
  6. architecture beh of generic_prescaler_tb is
  7. component generic_prescaler is
  8. generic (
  9. prescaler_bits : integer := 8
  10. );
  11. port
  12. (
  13. clk : in std_logic;
  14. rst : in std_logic;
  15. en : in std_logic;
  16. load : in std_logic;
  17. prescaler_value : in unsigned (prescaler_bits - 1 downto 0);
  18. en_out : out std_logic
  19. );
  20. end component;
  21. constant freq : integer := 50; -- MHz
  22. constant period : time := 1000 / freq * 1 ns;
  23. constant half_period : time := period / 2;
  24. signal num_rising_edges : integer := 0;
  25. signal clock : std_logic := '0';
  26. signal enable : std_logic;
  27. signal reset : std_logic;
  28. signal prescaled_clk_en : std_logic;
  29. signal prescaled_clk_en2 : std_logic;
  30. signal running : boolean := true;
  31. begin
  32. running <= true, false after 530 * period;
  33. reset <= '0', '1' after 2 * period, '0' after 3 * period;
  34. enable <= '0', '1' after 5 * period;
  35. DUT : generic_prescaler
  36. generic map(
  37. prescaler_bits => 9
  38. )
  39. port map(
  40. clk => clock,
  41. rst => reset,
  42. en => enable,
  43. load => '1',
  44. prescaler_value => to_unsigned(257, 9),
  45. en_out => prescaled_clk_en
  46. );
  47. DUT2 : generic_prescaler
  48. generic map(
  49. prescaler_bits => 8
  50. )
  51. port map(
  52. clk => clock,
  53. rst => reset,
  54. en => prescaled_clk_en,
  55. load => '1',
  56. prescaler_value => to_unsigned(2, 8),
  57. en_out => prescaled_clk_en2
  58. );
  59. process is
  60. begin
  61. if running then
  62. wait for half_period;
  63. clock <= not clock;
  64. else
  65. report "End of simulation!";
  66. wait;
  67. end if;
  68. end process;
  69. process(clock) is
  70. begin
  71. if rising_edge(clock) then
  72. if reset = '1' then
  73. num_rising_edges <= 0;
  74. elsif enable = '1' then
  75. num_rising_edges <= num_rising_edges+1;
  76. else
  77. -- Explicit no change
  78. num_rising_edges <= num_rising_edges;
  79. end if;
  80. end if;
  81. end process;
  82. end architecture;