library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_signed.all; use ieee.std_logic_arith.all; use ieee.std_logic_misc.all; library std; use std.textio.all; use ieee.std_logic_textio.all; library work; use work.common_interface.all; use work.hail_simulation.all; entity tb_pupe is end tb_pupe; architecture behave of tb_pupe is signal clk : std_logic := '0'; signal rst : std_logic := '0'; signal links_in : links_in_type; signal links_out : links_out_type; signal system_in,system_out : std_logic_vector(system_width-1 downto 0); signal host_in : host_in_type := host_in_zeros; signal host_out : host_out_type; component pupe generic ( index : integer := 0); port ( -- Host Abstract Interface Connection clk : in std_logic; rst : in std_logic; system_in : in std_logic_vector(system_width-1 downto 0); system_out : out std_logic_vector(system_width-1 downto 0); -- Interrupts irq : out std_logic_vector(7 downto 0); -- Timing Inputs cycle_start : in std_logic; cycle_stop : in std_logic; cal_start : in std_logic; cal_stop : in std_logic; injection : in std_logic; hchange : in std_logic; fref : in std_logic; ten_mhz_clk : in std_logic; -- ADC Inputs sigma : in std_logic_vector(13 downto 0); deltax : in std_logic_vector(13 downto 0); deltay : in std_logic_vector(13 downto 0)); end component; signal cycle_start,cycle_stop,cal_start,cal_stop,injection,hchange,fref,ten_mhz_clk : std_logic := '0'; signal sigma,deltax,deltay : std_logic_vector(13 downto 0) := (others => '0'); signal irq : std_logic_vector(7 downto 0); type integer_array is array (integer range <>) of integer; begin -- Generate 125MHz CLK clk <= not clk after 4 ns; ten_mhz_clk <= not ten_mhz_clk after 100ns; dut0: pupe port map ( clk => clk, rst => rst, system_in => system_in, system_out => system_out, irq => irq, cycle_start => cycle_start, cycle_stop => cycle_stop, cal_start => cal_start, cal_stop => cal_stop, injection => injection, hchange => hchange, fref => fref, ten_mhz_clk => ten_mhz_clk, sigma => sigma, deltax => deltax, deltay => deltay); hail0: hail_simulator generic map ( board => adm_xrc4, number_of_memories => 4) port map ( clk => clk, rst => rst, system_out => system_out, system_in => system_in, links_in => links_in, links_out => links_out, host_in => host_in, host_out => host_out); -- N.B. Not used by PUPE design -- Connect Link 0 to 1 and 2 to 3 links_i: for i in 0 to 1 generate link_connect_i: link_connect port map ( linkA_in => links_in(2*i), linkA_out => links_out(2*i), linkB_in => links_in(2*i+1), linkB_out => links_out(2*i+1)); end generate links_i; -- Host Simulation -- Sequential process process file switch_table_file : text is in "switch_table.txt"; file phase_table_file : text is in "phase_table.txt"; variable text_in : line; variable val : integer; variable addr : integer; variable bank : integer; variable data : std_logic_vector(63 downto 0); variable d : std_logic_vector(31 downto 0); begin -- process rst <= '1'; wait for 30 ns; rst <= '0'; wait for 100 ns; -- Copy Switch Table from File to BRAM Bank #3 addr := 0; bank := 3; while not endfile(switch_table_file) loop for i in 0 to 1 loop if not endfile(switch_table_file) then readline(switch_table_file,text_in); read(text_in,val); else val := 0; end if; data(i*32+31 downto i*32) := CONV_STD_LOGIC_VECTOR(val,32); end loop; -- i host_write_internal_memory(host_in => host_in, host_out => host_out, bank => bank, address => addr, data => data); addr := addr+1; end loop; -- Copy Phase Table from File to BRAM Bank #2 addr := 0; bank := 2; while not endfile(phase_table_file) loop for i in 0 to 7 loop if not endfile(phase_table_file) then readline(phase_table_file,text_in); read(text_in,val); else val := 0; end if; data(i*8+7 downto i*8) := CONV_STD_LOGIC_VECTOR(val,8); end loop; -- i host_write_internal_memory(host_in => host_in, host_out => host_out, bank => bank, address => addr, data => data); addr := addr+1; end loop; -- Set frequnecy d := CONV_STD_LOGIC_VECTOR(2300457,32); addr := 16+4; host_write_control_register(host_in => host_in, host_out => host_out, address => addr, data => d); -- Set phase delay d := CONV_STD_LOGIC_VECTOR(-232,32); addr := 16+6; host_write_control_register(host_in => host_in, host_out => host_out, address => addr, data => d); -- Set gain d := CONV_STD_LOGIC_VECTOR(500,32); addr := 16+7; host_write_control_register(host_in => host_in, host_out => host_out, address => addr, data => d); -- Pulse INIT addr := 16; d := X"00000001"; host_write_control_register(host_in => host_in, host_out => host_out, address => addr, data => d); d := X"00000000"; host_write_control_register(host_in => host_in, host_out => host_out, address => addr, data => d); wait; end process; -- Generate ADC Signals from files process file sigma_file : text is in "beam1-437000-8-sigma.txt"; file deltax_file : text is in "beam1-437000-8-deltax.txt"; file deltay_file : text is in "beam1-437000-8-deltay.txt"; variable text_in : line; variable val : integer; variable sigma_data : integer_array(0 to 16383); variable deltax_data : integer_array(0 to 16383); variable deltay_data : integer_array(0 to 16383); variable sigma_size,deltax_size,deltay_size : integer; variable sigma_idx,deltax_idx,deltay_idx : integer; begin sigma_size :=0; deltax_size := 0; deltay_size :=0; while not endfile(sigma_file) and sigma_size<16383 loop readline(sigma_file,text_in); read(text_in,sigma_data(sigma_size)); sigma_size := sigma_size+1; end loop; while not endfile(deltax_file) and deltax_size<16383 loop readline(deltax_file,text_in); read(text_in,deltax_data(deltax_size)); deltax_size := deltax_size+1; end loop; while not endfile(deltay_file) and deltay_size<16383 loop readline(deltay_file,text_in); read(text_in,deltay_data(deltay_size)); deltay_size := deltay_size+1; end loop; wait until injection = '1'; sigma_idx :=0; deltax_idx := 0; deltay_idx :=0; while true loop sigma <= CONV_STD_LOGIC_VECTOR(sigma_data(sigma_idx),14); deltax <= CONV_STD_LOGIC_VECTOR(deltax_data(deltax_idx),14); deltay <= CONV_STD_LOGIC_VECTOR(deltay_data(deltay_idx),14); if sigma_idx = sigma_size-1 then sigma_idx := 0; else sigma_idx := sigma_idx+1; end if; if deltax_idx = deltax_size-1 then deltax_idx := 0; else deltax_idx := deltax_idx+1; end if; if deltay_idx = deltay_size-1 then deltay_idx := 0; else deltay_idx := deltay_idx+1; end if; wait for 8 ns; end loop; wait; end process; -- Timing process begin -- Start pulse wait for 200 us; cycle_start <= '1'; wait for 200 ns; cycle_start <= '0'; -- Calibration Start wait for 1000 us; cal_start <= '1'; wait for 200 ns; cal_start <= '0'; -- Calibration Stop wait for 1000 us; cal_stop <= '1'; wait for 200 ns; cal_stop <= '0'; -- Injection wait for 500 us; injection <= '1'; wait for 200 ns; injection <= '0'; -- HChange wait for 5000 us; hchange <= '1'; wait for 200 ns; hchange <= '0'; -- HChange wait for 5000 us; hchange <= '1'; wait for 200 ns; hchange <= '0'; -- Cycle end wait for 5000 us; cycle_stop <= '1'; wait for 200 ns; cycle_stop <= '0'; wait; end process; -- Fref process begin wait for 3 us; fref <= '1'; wait for 200 ns; fref <= '0'; end process; end behave;