diff --git a/libraries/dsp/correlator/src/vhdl/corr_accumulator.vhd b/libraries/dsp/correlator/src/vhdl/corr_accumulator.vhd index a1b71ddbc14d7fa7eed1571e404ce8112514aecb..4af9c16f9f721b694bd7dba706159b08a2990ffd 100644 --- a/libraries/dsp/correlator/src/vhdl/corr_accumulator.vhd +++ b/libraries/dsp/correlator/src/vhdl/corr_accumulator.vhd @@ -43,8 +43,8 @@ ENTITY corr_accumulator IS rst : IN STD_LOGIC; clk : IN STD_LOGIC; - snk_in_arr : IN t_dp_sosi_arr; - src_out_arr : OUT t_dp_sosi_arr + snk_in_arr : IN t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0); + src_out_arr : OUT t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0) ); END corr_accumulator; @@ -74,7 +74,7 @@ ARCHITECTURE str OF corr_accumulator IS TYPE t_common_shiftram_data_out_shift_arr IS ARRAY(g_nof_inputs-1 DOWNTO 0) OF STD_LOGIC_VECTOR(c_shift_w-1 DOWNTO 0); SIGNAL common_shiftram_data_out_shift_arr : t_common_shiftram_data_out_shift_arr; - + SIGNAL nxt_src_out_arr : t_dp_sosi_arr(g_nof_inputs-1 DOWNTO 0); BEGIN @@ -97,17 +97,6 @@ BEGIN common_shiftram_src_out_arr(i).data( c_acc_data_w-1 DOWNTO 0); END GENERATE; - p_clk : PROCESS (clk, rst) - BEGIN - IF rst='1' THEN - acc_cnt <= (OTHERS=>'0'); - corr_adder_snk_in_2arr_2 <= (OTHERS=>(OTHERS=>c_dp_sosi_rst)); - ELSIF rising_edge(clk) THEN - acc_cnt <= nxt_acc_cnt; - corr_adder_snk_in_2arr_2 <= nxt_corr_adder_snk_in_2arr_2; - END IF; - END PROCESS; - ----------------------------------------------------------------------------- -- Complex adder stage ----------------------------------------------------------------------------- @@ -158,13 +147,33 @@ BEGIN END GENERATE; ----------------------------------------------------------------------------- - -- Output 1/g_nof_acc_per_input words per stream - -- . Not implemented yet. + -- Output g_nof_words_to_acc per stream once per integration period + -- . The first g_nof_acc_per_input words are output. At the same time, the + -- accumulators are reset (zeros) at the adder inputs. + -- . Make sure the shiftram output is valid too so we don't output a block + -- of zeros initially. ----------------------------------------------------------------------------- gen_src_out_arr : FOR i IN 0 TO g_nof_inputs-1 GENERATE - src_out_arr(i).re(c_acc_data_w-1 DOWNTO 0) <= common_shiftram_src_out_arr(i).data(2*c_acc_data_w-1 DOWNTO c_acc_data_w); - src_out_arr(i).im(c_acc_data_w-1 DOWNTO 0) <= common_shiftram_src_out_arr(i).data( c_acc_data_w-1 DOWNTO 0); - src_out_arr(i).valid <= common_shiftram_src_out_arr(i).valid; + nxt_src_out_arr(i).re(c_acc_data_w-1 DOWNTO 0) <= common_shiftram_src_out_arr(i).data(2*c_acc_data_w-1 DOWNTO c_acc_data_w); + nxt_src_out_arr(i).im(c_acc_data_w-1 DOWNTO 0) <= common_shiftram_src_out_arr(i).data( c_acc_data_w-1 DOWNTO 0); + + nxt_src_out_arr(i).valid <= '1' WHEN TO_UINT(acc_cnt)<g_nof_acc_per_input AND common_shiftram_src_out_arr(0).valid='1' ELSE '0'; END GENERATE; + ----------------------------------------------------------------------------- + -- Registers + ----------------------------------------------------------------------------- + p_clk : PROCESS (clk, rst) + BEGIN + IF rst='1' THEN + acc_cnt <= (OTHERS=>'0'); + corr_adder_snk_in_2arr_2 <= (OTHERS=>(OTHERS=>c_dp_sosi_rst)); + src_out_arr <= (OTHERS=>c_dp_sosi_rst); + ELSIF rising_edge(clk) THEN + acc_cnt <= nxt_acc_cnt; + corr_adder_snk_in_2arr_2 <= nxt_corr_adder_snk_in_2arr_2; + src_out_arr <= nxt_src_out_arr; + END IF; + END PROCESS; + END str; diff --git a/libraries/dsp/correlator/tb/python/tc_correlator.py b/libraries/dsp/correlator/tb/python/tc_correlator.py index d897a8d174344ff9f9a2d6d4742bc38cf27d73ee..9e5bb24d88754bd30c4c48ae45bec64e6dcebeea 100644 --- a/libraries/dsp/correlator/tb/python/tc_correlator.py +++ b/libraries/dsp/correlator/tb/python/tc_correlator.py @@ -35,76 +35,71 @@ COMPLEX_WIDTH = 16 NOF_INPUTS = 10 NOF_OUTPUTS = NOF_INPUTS*(NOF_INPUTS+1)/2 NOF_CHANNELS = 64 -NOF_TIMESAMPLES = 4 - -#BUFFER_DEPTH = 256 -BUFFER_WIDTH = 64 #2*COMPLEX_WIDTH +BUFFER_WIDTH = 64 tc = test_case.Testcase('TB - ', '') io = node_io.NodeIO(tc.nodeImages, tc.base_ip) -db = pi_diag_data_buffer.PiDiagDataBuffer(tc, io, nofStreams=NOF_OUTPUTS, ramSizePerStream=2*256) +db = pi_diag_data_buffer.PiDiagDataBuffer(tc, io, nofStreams=NOF_OUTPUTS, ramSizePerStream=2*NOF_CHANNELS) ############################################################################### # Read data buffers -# . Read 256 words -# . 256 words = 4 timesamples * 64 channels +# . Read NOF_CHANNELS accumulator values ############################################################################### data = [] -do_until_ge(db.read_nof_words, ms_retry=2000, val=256, s_timeout=900) +do_until_ge(db.read_nof_words, ms_retry=2000, val=NOF_CHANNELS, s_timeout=900) for output_nr in range(NOF_OUTPUTS): - data.append( db.read_data_buffer(streamNr=output_nr, n=2*256, radix='uns', width=BUFFER_WIDTH, nofColumns=12)[0] ) + data.append( db.read_data_buffer(streamNr=output_nr, n=2*NOF_CHANNELS, radix='uns', width=BUFFER_WIDTH, nofColumns=12)[0] ) ############################################################################### -# 'data' is now a 2d array of [NOF_OUTPUTS][NOF_TIMESAMPLES*NOF_CHANNELS]. We +# 'data' is now a 2d array of [NOF_OUTPUTS][NOF_CHANNELS]. We # want to group the outputs by channel, so transpose this 2d array into -# [NOF_TIMESAMPLES*NOF_CHANNELS][NOF_OUTPUTS] +# [NOF_CHANNELS][NOF_OUTPUTS] ############################################################################### data = transpose(data) -for sample_nr in range(NOF_TIMESAMPLES): - mat_list = [] - amplitudes = [] - for channel_nr in range(NOF_CHANNELS): - ############################################################################### - # Convert the unsigned words to complex - ############################################################################### - channel_data = data[sample_nr*NOF_CHANNELS+channel_nr] - for index,word in enumerate(channel_data): - word_bits = CommonBits(word, BUFFER_WIDTH) - re = word_bits[BUFFER_WIDTH-1:BUFFER_WIDTH/2] - im = word_bits[BUFFER_WIDTH/2-1:0] - channel_data[index] = complex(im, re) - - ############################################################################### - # Convert binomials to complex phasor notation - ############################################################################### - for index,word in enumerate(channel_data): - channel_data[index] = complex_binomial_to_phasor(word) - - ############################################################################### - # Extract the phases and amplitudes from the complex data - ############################################################################### - phases = [] - - for word in channel_data: - amplitudes.append(word[0]) - phases.append(word[1]) - - ################################################################################ - # Re-shape the flat list into a matrix - ################################################################################ - mat = unique_vis_to_full_matrix(phases) - mat_list.append(mat) +mat_list = [] +amplitudes = [] +for channel_nr in range(NOF_CHANNELS): + ############################################################################### + # Convert the unsigned words to complex + ############################################################################### + channel_data = data[channel_nr] + for index,word in enumerate(channel_data): + word_bits = CommonBits(word, BUFFER_WIDTH) + re = word_bits[BUFFER_WIDTH-1:BUFFER_WIDTH/2] + im = word_bits[BUFFER_WIDTH/2-1:0] + channel_data[index] = complex(im, re) + ############################################################################### + # Convert binomials to complex phasor notation + ############################################################################### + for index,word in enumerate(channel_data): + channel_data[index] = complex_binomial_to_phasor(word) + + ############################################################################### + # Extract the phases and amplitudes from the complex data + ############################################################################### + phases = [] + + for word in channel_data: + amplitudes.append(word[0]) + phases.append(word[1]) + ################################################################################ - # re-shape the flat list of 64 matrices into a an 8*8 matrix of matrices, plot + # Re-shape the flat list into a matrix ################################################################################ - print 'Plotting phases of timesample %d, %d channels.' %(sample_nr,NOF_CHANNELS) - print '. Channel amplitudes:' - for channel_nr in range(NOF_CHANNELS): - print ' .', channel_nr, ' - ', amplitudes[channel_nr] + mat = unique_vis_to_full_matrix(phases) + mat_list.append(mat) + +################################################################################ +# re-shape the flat list of 64 matrices into a an 8*8 matrix of matrices, plot +################################################################################ +print 'Plotting phases of %d channels.' %NOF_CHANNELS +print '. Channel amplitudes:' +for channel_nr in range(NOF_CHANNELS): + print ' .', channel_nr, ' - ', amplitudes[channel_nr] - mat_mat = split_list(mat_list, 8) - plot_matrix_color(mat_mat) +mat_mat = split_list(mat_list, 8) +plot_matrix_color(mat_mat) diff --git a/libraries/dsp/correlator/tb/vhdl/tb_correlator.vhd b/libraries/dsp/correlator/tb/vhdl/tb_correlator.vhd index 9fc0be2024768ff1e741f551c700bd6d080a39df..f9005796bec977d7910fa2405fdedbcdb066893b 100644 --- a/libraries/dsp/correlator/tb/vhdl/tb_correlator.vhd +++ b/libraries/dsp/correlator/tb/vhdl/tb_correlator.vhd @@ -37,6 +37,7 @@ ARCHITECTURE tb OF tb_correlator IS CONSTANT c_nof_inputs : NATURAL := 10; CONSTANT c_nof_mults : NATURAL := (c_nof_inputs*(c_nof_inputs+1))/2; + CONSTANT c_nof_channels : NATURAL := 64; CONSTANT c_dp_clk_period : TIME := 10 ns; CONSTANT c_mm_clk_period : TIME := 10 ps; @@ -148,7 +149,7 @@ BEGIN g_nof_streams => c_nof_mults, g_data_w => 64, g_data_type => e_complex, - g_buf_nof_data => 256, --c_bg_block_size, + g_buf_nof_data => c_nof_channels, g_buf_use_sync => FALSE ) PORT MAP (