Studentenversion des ESY6/A Praktikums "signal_processing".
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_task_add_sine_cosine.vhd 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4. use ieee.float_pkg.all;
  5. library work;
  6. use work.reg32.all;
  7. use work.avalon_slave.all;
  8. use work.test_utility.all;
  9. use work.test_avalon_slave.all;
  10. use work.task.all;
  11. use work.sine_data.all;
  12. use work.test_hardware_task.all;
  13. use work.test_data_channel_pkg.all;
  14. library std;
  15. use std.env.all;
  16. use std.textio.all;
  17. entity test_task_add_sine_cosine is
  18. generic( CHECK_RESULTS : boolean; GUI_MODE : boolean := false );
  19. end entity test_task_add_sine_cosine;
  20. architecture test of test_task_add_sine_cosine is
  21. procedure test_configure( signal clk : in std_logic;
  22. signal req : out work.avalon_slave.Request;
  23. signal rsp : in work.avalon_slave.Response ) is
  24. variable index : integer := 0;
  25. variable writedata : std_logic_vector( 31 downto 0 );
  26. begin
  27. std.textio.write( std.textio.OUTPUT, " test_configure ... " );
  28. index := 0;
  29. writedata := x"08000000"; -- 2^32 / 32
  30. write_and_assert_config_eq( clk => clk, req => req, rsp => rsp,
  31. index => index, config => writedata );
  32. index := 1;
  33. writedata := x"00000000";
  34. write_and_assert_config_eq( clk => clk, req => req, rsp => rsp,
  35. index => index, config => writedata );
  36. index := 2;
  37. writedata := x"40800000"; -- 2 ** 2 = 4 float
  38. write_and_assert_config_eq( clk => clk, req => req, rsp => rsp,
  39. index => index, config => writedata );
  40. std.textio.write( std.textio.OUTPUT, TEST_OK );
  41. end procedure test_configure;
  42. signal clk : std_logic := '0';
  43. signal reset : std_logic := '1';
  44. signal req : work.avalon_slave.Request;
  45. signal rsp : work.avalon_slave.Response;
  46. signal data_channel_req : work.avalon_slave.Request;
  47. signal data_channel_rsp : work.avalon_slave.Response;
  48. signal signal_a_read : std_logic;
  49. signal signal_a_readdata : std_logic_vector( 31 downto 0 );
  50. signal signal_b_read : std_logic;
  51. signal signal_b_readdata : std_logic_vector( 31 downto 0 );
  52. signal signal_write : std_logic;
  53. signal signal_writedata : std_logic_vector( 31 downto 0 );
  54. signal data_channel_read : std_logic;
  55. signal data_channel_readdata : std_logic_vector( 31 downto 0 );
  56. begin
  57. dut : entity work.task_add
  58. port map (
  59. clk => clk,
  60. reset => reset,
  61. address => req.address,
  62. read => req.read,
  63. readdata => rsp.readdata,
  64. write => req.write,
  65. writedata => req.writedata,
  66. signal_a_read => signal_a_read,
  67. signal_a_readdata => signal_a_readdata,
  68. signal_b_read => signal_b_read,
  69. signal_b_readdata => signal_b_readdata,
  70. signal_write => signal_write,
  71. signal_writedata => signal_writedata
  72. );
  73. u_data_channel : entity work.data_channel
  74. port map (
  75. clk => clk,
  76. reset => reset,
  77. ctrl_address => data_channel_req.address,
  78. ctrl_read => data_channel_req.read,
  79. ctrl_readdata => data_channel_rsp.readdata,
  80. ctrl_write => data_channel_req.write,
  81. ctrl_writedata => data_channel_req.writedata,
  82. hw_sink_write => signal_write,
  83. hw_sink_writedata => signal_writedata,
  84. hw_source_read => data_channel_read,
  85. hw_source_readdata => data_channel_readdata
  86. );
  87. clk <= not clk after 10 ns;
  88. reset_release : process is
  89. begin
  90. wait for 35 ns;
  91. reset <= '0';
  92. wait;
  93. end process reset_release;
  94. input_data_a_simulus: process is
  95. variable index : integer := 0;
  96. begin
  97. while true loop
  98. signal_a_readdata <= to_std_logic_vector( to_float( work.sine_data.expected( index ) ) );
  99. wait until rising_edge( signal_a_read );
  100. if ( index < 1023 ) then
  101. index := index + 1;
  102. end if;
  103. end loop;
  104. end process input_data_a_simulus;
  105. input_data_b_simulus: process is
  106. variable index : integer := 0;
  107. begin
  108. while true loop
  109. signal_b_readdata <= to_std_logic_vector( to_float( work.cosine_data.expected( index ) ) );
  110. wait until rising_edge( signal_b_read );
  111. if ( index < 1023 ) then
  112. index := index + 1;
  113. end if;
  114. end loop;
  115. end process input_data_b_simulus;
  116. stimulus: process is
  117. variable data_channel_config : std_logic_vector( 31 downto 0 ) := x"00000001";
  118. begin
  119. std.textio.write( std.textio.OUTPUT, "--------------------------------------------------------------------------------" & LF );
  120. std.textio.write( std.textio.OUTPUT, "Starting test_task_add_sine_cosine" & LF );
  121. wait until falling_edge( reset );
  122. wait until falling_edge( clk );
  123. work.test_data_channel_pkg.write_and_assert_config( clk => clk,
  124. req => data_channel_req,
  125. rsp => data_channel_rsp,
  126. config => data_channel_config );
  127. test_configure( clk => clk, req => req, rsp => rsp );
  128. test_execute( clk => clk, req => req, rsp => rsp,
  129. write => signal_write, writedata => signal_writedata );
  130. for i in 0 to 10 loop
  131. wait until falling_edge( clk );
  132. end loop;
  133. if ( CHECK_RESULTS ) then
  134. check_and_write_content( clk => clk,
  135. req => data_channel_req, rsp => data_channel_rsp,
  136. expected => work.sine_cosine_data.expected );
  137. else
  138. write_content( clk => clk,
  139. req => data_channel_req, rsp => data_channel_rsp );
  140. end if;
  141. if ( GUI_MODE ) then
  142. std.env.stop;
  143. else
  144. std.env.finish;
  145. end if;
  146. end process stimulus;
  147. end architecture test;