generic_prescaler_tb.vhd 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. clk : in std_logic;
  13. rst : in std_logic;
  14. en : in std_logic;
  15. load : in std_logic;
  16. prescaler_value : in unsigned (prescaler_bits - 1 downto 0);
  17. en_out : out std_logic
  18. );
  19. end component;
  20. constant freq : integer := 50; -- MHz
  21. constant period : time := 1000 / freq * 1 ns;
  22. constant half_period : time := period / 2;
  23. signal num_rising_edges : integer := 0;
  24. signal clock : std_logic := '0';
  25. signal enable : std_logic;
  26. signal reset : std_logic;
  27. signal prescaled_clk_en : std_logic;
  28. signal prescaled_clk_en2 : std_logic;
  29. constant first_prescaler : integer := 257;
  30. constant second_prescaler : integer := 2;
  31. signal running : boolean := true;
  32. begin
  33. running <= true, false after 530 * period;
  34. reset <= '0', '1' after 2 * period, '0' after 3 * period;
  35. enable <= '0', '1' after 5 * period;
  36. DUT : generic_prescaler
  37. generic map(
  38. prescaler_bits => 9
  39. )
  40. port map(
  41. clk => clock,
  42. rst => reset,
  43. en => enable,
  44. load => '1',
  45. prescaler_value => to_unsigned(first_prescaler, 9),
  46. en_out => prescaled_clk_en
  47. );
  48. DUT2 : generic_prescaler
  49. generic map(
  50. prescaler_bits => 8
  51. )
  52. port map(
  53. clk => clock,
  54. rst => reset,
  55. en => prescaled_clk_en,
  56. load => '1',
  57. prescaler_value => to_unsigned(second_prescaler, 8),
  58. en_out => prescaled_clk_en2
  59. );
  60. -- clock process
  61. process is
  62. begin
  63. if running then
  64. wait for half_period;
  65. clock <= not clock;
  66. else
  67. report "End of simulation!";
  68. wait;
  69. end if;
  70. end process;
  71. process(clock) is
  72. begin
  73. if rising_edge(clock) then
  74. if reset = '1' then
  75. num_rising_edges <= 0;
  76. elsif enable = '1' then
  77. num_rising_edges <= num_rising_edges+1;
  78. else
  79. -- Explicit no change
  80. num_rising_edges <= num_rising_edges;
  81. end if;
  82. end if;
  83. end process;
  84. -- Automated checks
  85. process(clock) is
  86. begin
  87. if rising_edge(clock)
  88. and num_rising_edges > 1 then
  89. assert not (num_rising_edges mod first_prescaler = 0 and prescaled_clk_en /= '1') report "First prescaler not working!" severity error;
  90. end if;
  91. end process;
  92. end architecture;