async_8n1_tx_tb.vhd 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4. use IEEE.math_real.all;
  5. entity async_8n1_tx_tb is
  6. end entity;
  7. architecture beh of async_8n1_tx_tb is
  8. component generic_prescaler is
  9. generic (
  10. prescaler_bits : integer := 8
  11. );
  12. port(
  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. component async_8n1_tx is
  22. port
  23. (
  24. clk : in std_logic;
  25. rst : in std_logic;
  26. en : in std_logic;
  27. wr : in std_logic;
  28. data_in : in unsigned (7 downto 0);
  29. rdy : out std_logic;
  30. data_out : out std_logic
  31. );
  32. end component;
  33. constant freq : integer := 50; -- MHz
  34. constant period : time := 1000 / freq * 1 ns;
  35. constant half_period : time := period / 2;
  36. signal num_rising_edges : integer := 0;
  37. signal clock : std_logic := '0';
  38. signal enable : std_logic;
  39. signal reset : std_logic;
  40. signal prescaled_clk_en : std_logic;
  41. constant prescaler_value : integer := 10;
  42. constant prescaler_num_bits : integer := integer(ceil(log2(real(prescaler_value))));
  43. signal running : boolean := true;
  44. signal tx : std_logic;
  45. signal rdy : std_logic;
  46. signal wr : std_logic;
  47. signal tx_char : unsigned (7 downto 0);
  48. begin
  49. running <= true,
  50. false after 50 * period;
  51. reset <= '0',
  52. '1' after 2 * period,
  53. '0' after 3 * period;
  54. enable <= '0',
  55. '1' after 5 * period;
  56. wr <= '0',
  57. '1' after 10 * period,
  58. '1' after 11 * period;
  59. --tx_char <= to_unsigned(character'pos('a'), 8);
  60. tx_char <= x"aa";
  61. i_prescaler : generic_prescaler
  62. generic map(
  63. prescaler_bits => prescaler_num_bits
  64. )
  65. port map(
  66. clk => clock,
  67. rst => reset,
  68. en => enable,
  69. load => '1',
  70. prescaler_value => to_unsigned(prescaler_value, prescaler_num_bits),
  71. en_out => prescaled_clk_en
  72. );
  73. DUT : async_8n1_tx
  74. port map(
  75. clk => clock,
  76. rst => reset,
  77. en => enable,
  78. wr => wr,
  79. data_in => tx_char,
  80. rdy => rdy,
  81. data_out => tx
  82. );
  83. -- clock process
  84. process is
  85. begin
  86. if running then
  87. wait for half_period;
  88. clock <= not clock;
  89. else
  90. report "End of simulation!";
  91. wait;
  92. end if;
  93. end process;
  94. -- Rising edge counter
  95. process(clock) is
  96. begin
  97. if rising_edge(clock) then
  98. if reset = '1' then
  99. num_rising_edges <= 0;
  100. elsif enable = '1' then
  101. num_rising_edges <= num_rising_edges+1;
  102. else
  103. -- Explicit no change
  104. num_rising_edges <= num_rising_edges;
  105. end if;
  106. end if;
  107. end process;
  108. -- Automated checks
  109. process(clock) is
  110. begin
  111. if rising_edge(clock)
  112. and num_rising_edges > 1 then
  113. assert not (num_rising_edges mod prescaler_value = 0 and prescaled_clk_en /= '1') report "Prescaler not working!" severity error;
  114. end if;
  115. end process;
  116. end architecture;