LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; USE IEEE.std_logic_signed.ALL; USE IEEE.MATH_real.ALL; LIBRARY techmap; USE techmap.gencomp.ALL; LIBRARY std; USE std.textio.ALL; LIBRARY lpp; USE lpp.iir_filter.ALL; USE lpp.lpp_ad_conv.ALL; USE lpp.FILTERcfg.ALL; USE lpp.lpp_lfr_filter_coeff.ALL; USE lpp.general_purpose.ALL; USE lpp.data_type_pkg.ALL; USE lpp.lpp_lfr_pkg.ALL; USE lpp.general_purpose.ALL; ENTITY testbench IS END; ARCHITECTURE behav OF testbench IS CONSTANT ChanelCount : INTEGER := 8; CONSTANT Coef_SZ : INTEGER := 9; CONSTANT CoefCntPerCel : INTEGER := 6; CONSTANT CoefPerCel : INTEGER := 5; CONSTANT Cels_count : INTEGER := 5; SIGNAL sample : samplT(ChanelCount-1 DOWNTO 0, 17 DOWNTO 0); SIGNAL sample_val : STD_LOGIC; SIGNAL sample_fx : samplT(ChanelCount-1 DOWNTO 0, 17 DOWNTO 0); SIGNAL sample_fx_val : STD_LOGIC; SIGNAL TSTAMP : INTEGER := 0; SIGNAL clk : STD_LOGIC := '0'; SIGNAL clk_24k : STD_LOGIC := '0'; SIGNAL clk_24k_r : STD_LOGIC := '0'; SIGNAL rstn : STD_LOGIC; SIGNAL signal_gen : Samples(7 DOWNTO 0); SIGNAL offset_gen : Samples(7 DOWNTO 0); --SIGNAL sample_fx_wdata : STD_LOGIC_VECTOR((6*16)-1 DOWNTO 0); SIGNAL sample_fx_wdata : Samples(ChanelCount-1 DOWNTO 0); COMPONENT generator IS GENERIC ( AMPLITUDE : INTEGER := 100; NB_BITS : INTEGER := 16); PORT ( clk : IN STD_LOGIC; rstn : IN STD_LOGIC; run : IN STD_LOGIC; data_ack : IN STD_LOGIC; offset : IN STD_LOGIC_VECTOR(NB_BITS-1 DOWNTO 0); data : OUT STD_LOGIC_VECTOR(NB_BITS-1 DOWNTO 0) ); END COMPONENT; FILE log_input : TEXT OPEN write_mode IS "log_input.txt"; FILE log_output_fx : TEXT OPEN write_mode IS "log_output_fx.txt"; SIGNAL end_of_simu : STD_LOGIC := '0'; BEGIN ----------------------------------------------------------------------------- -- CLOCK and RESET ----------------------------------------------------------------------------- clk <= NOT clk AFTER 5 ns; PROCESS BEGIN -- PROCESS end_of_simu <= '0'; WAIT UNTIL clk = '1'; rstn <= '0'; WAIT UNTIL clk = '1'; WAIT UNTIL clk = '1'; WAIT UNTIL clk = '1'; rstn <= '1'; WAIT FOR 2000 ms; end_of_simu <= '1'; WAIT UNTIL clk = '1'; REPORT "*** END simulation ***" SEVERITY failure; WAIT; END PROCESS; ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -- COMMON TIMESTAMPS ----------------------------------------------------------------------------- PROCESS(clk) BEGIN IF clk'EVENT AND clk = '1' THEN TSTAMP <= TSTAMP+1; END IF; END PROCESS; ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -- LPP_LFR_FILTER f0 ----------------------------------------------------------------------------- IIR_CEL_CTRLR_v2_1 : IIR_CEL_CTRLR_v2 GENERIC MAP ( tech => axcel, Mem_use => use_RAM, Sample_SZ => 18, Coef_SZ => Coef_SZ, Coef_Nb => 25, Coef_sel_SZ => 5, Cels_count => Cels_count, ChanelsCount => ChanelCount) PORT MAP ( rstn => rstn, clk => clk, virg_pos => 7, coefs => CoefsInitValCst_v2, sample_in_val => sample_val, sample_in => sample, sample_out_val => sample_fx_val, sample_out => sample_fx); ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -- SAMPLE GENERATION ----------------------------------------------------------------------------- clk_24k <= NOT clk_24k AFTER 20345 ns; PROCESS (clk, rstn) BEGIN -- PROCESS IF rstn = '0' THEN -- asynchronous reset (active low) sample_val <= '0'; clk_24k_r <= '0'; ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge clk_24k_r <= clk_24k; IF clk_24k = '1' AND clk_24k_r = '0' THEN sample_val <= '1'; ELSE sample_val <= '0'; END IF; END IF; END PROCESS; ----------------------------------------------------------------------------- generators : FOR I IN 0 TO 7 GENERATE gen1 : generator GENERIC MAP ( AMPLITUDE => 100, NB_BITS => 16) PORT MAP ( clk => clk, rstn => rstn, run => '1', data_ack => sample_val, offset => offset_gen(I), data => signal_gen(I) ); offset_gen(I) <= STD_LOGIC_VECTOR(to_signed((I*200), 16)); END GENERATE generators; ChanelLoop : FOR i IN 0 TO ChanelCount-1 GENERATE SampleLoop : FOR j IN 0 TO 15 GENERATE sample(i,j) <= signal_gen(i)(j); sample_fx_wdata(i)(j) <= sample_fx(i,j); END GENERATE; sample(i, 16) <= signal_gen(i)(15); sample(i, 17) <= signal_gen(i)(15); END GENERATE; ----------------------------------------------------------------------------- -- RECORD SIGNALS ----------------------------------------------------------------------------- -- PROCESS(sample_val) -- VARIABLE line_var : LINE; -- BEGIN -- IF sample_val'EVENT AND sample_val = '1' THEN -- write(line_var, INTEGER'IMAGE(TSTAMP)); -- FOR I IN 0 TO 7 LOOP -- write(line_var, " " & INTEGER'IMAGE(to_integer(SIGNED(signal_gen(I))))); -- END LOOP; -- writeline(log_input, line_var); -- END IF; -- END PROCESS; PROCESS(sample_fx_val,end_of_simu) VARIABLE line_var : LINE; BEGIN IF sample_fx_val'EVENT AND sample_fx_val = '1' THEN write(line_var, INTEGER'IMAGE(TSTAMP)); FOR I IN 0 TO 5 LOOP write(line_var, " " & INTEGER'IMAGE(to_integer(SIGNED(sample_fx_wdata(I))))); END LOOP; writeline(log_output_fx, line_var); END IF; IF end_of_simu = '1' THEN file_close(log_output_fx); END IF; END PROCESS; END;