diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_adc/tb_lofar2_unb2b_sdp_station_adc.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_adc/tb_lofar2_unb2b_sdp_station_adc.vhd index b2652e604002332fd31a9dabaa98ae864aa812fc..8857119f97f65eb7d8f28db300a5fa1e060c2a50 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_adc/tb_lofar2_unb2b_sdp_station_adc.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_adc/tb_lofar2_unb2b_sdp_station_adc.vhd @@ -85,13 +85,10 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_adc IS CONSTANT c_hi_factor : REAL := 1.0 + c_percentage; -- higher boundary -- WG - CONSTANT c_full_scale_ampl : REAL := REAL(2**(14-1)-1); -- = full scale of WG CONSTANT c_bsn_start_wg : NATURAL := 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values - CONSTANT c_ampl_sp_0 : NATURAL := 2**(c_sdp_W_adc-1)/2; -- in number of lsb - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus + CONSTANT c_ampl_sp_0 : NATURAL := c_sdp_FS_adc/2; -- = 0.5 * FS, so in number of lsb CONSTANT c_wg_freq_offset : REAL := 0.0/11.0; -- in freq_unit CONSTANT c_subband_sp_0 : REAL := 102.0; -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / c_full_scale_ampl; -- amplitude in number of LSbit resolution steps CONSTANT c_exp_wg_power_sp_0 : REAL := REAL(c_ampl_sp_0**2)/2.0 * REAL(c_nof_clk_per_sync); -- ADUH @@ -253,8 +250,8 @@ BEGIN -- 3 : ampl[16:0] mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1, INTEGER( 0.0 * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl -- Read current BSN mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO 0), tb_clk); diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd index e8ce4aa58bc61676155d7925d19b2a7891079c50..db72ccae4fc97d40718982ba01b4fa0b1862757f 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_bf/tb_lofar2_unb2b_sdp_station_bf.vhd @@ -153,9 +153,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_bf IS -- WG CONSTANT c_bsn_start_wg : NATURAL := c_init_bsn + 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values -- .ampl - CONSTANT c_wg_ampl_full_scale : NATURAL := 2**(c_sdp_W_adc-1); -- full scale (FS) of WG, will just cause clipping of +FS to +FS-1 - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / REAL(c_wg_ampl_full_scale); -- amplitude in number of LSbit resolution steps - CONSTANT c_wg_ampl : NATURAL := NATURAL(g_wg_ampl * REAL(c_wg_ampl_full_scale)); -- in number of lsb + CONSTANT c_wg_ampl : NATURAL := NATURAL(g_wg_ampl * REAL(c_sdp_FS_adc)); -- in number of lsb CONSTANT c_exp_sp_power : REAL := REAL(c_wg_ampl**2) / 2.0; CONSTANT c_exp_sp_ast : REAL := c_exp_sp_power * REAL(c_nof_clk_per_sync); -- . phase @@ -164,8 +162,6 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_bf IS CONSTANT c_wg_latency : INTEGER := c_diag_wg_latency - 0; -- -0 to account for BSN scheduler start trigger latency CONSTANT c_wg_phase_offset : REAL := 360.0 * REAL(c_wg_latency) * c_subband_freq; -- c_diag_wg_latency is in dp_clk cycles CONSTANT c_wg_phase : REAL := c_subband_phase + c_wg_phase_offset; -- WG phase in degrees - -- . freq - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus -- WPFB CONSTANT c_pol_index : NATURAL := g_sp MOD c_sdp_Q_fft; @@ -173,8 +169,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_bf IS CONSTANT c_subband_phase_offset : REAL := -90.0; -- WG with zero phase sinues yields subband with -90 degrees phase (negative Im, zero Re) CONSTANT c_subband_weight_gain : REAL := 1.0; -- use default unit subband weights CONSTANT c_subband_weight_phase : REAL := 0.0; -- use default unit subband weights - CONSTANT c_exp_subband_sp_ampl_ratio : REAL := 7.96; -- ~= 8 for unit FIR DC gain, depends on internal WPFB quantization and FIR coefficients - CONSTANT c_exp_subband_ampl : REAL := REAL(c_wg_ampl) * c_exp_subband_sp_ampl_ratio * c_subband_weight_gain; + CONSTANT c_exp_subband_ampl : REAL := REAL(c_wg_ampl) * c_sdp_wpfb_subband_sp_ampl_ratio * c_subband_weight_gain; CONSTANT c_exp_subband_power : REAL := c_exp_subband_ampl**2.0; -- complex, so no divide by 2 CONSTANT c_exp_subband_sst : REAL := c_exp_subband_power * REAL(c_nof_block_per_sync); @@ -604,7 +599,7 @@ BEGIN -- 9 "sdp_source_info_gn_id" ), "RW", 5, field_default(0) ), -- -- 7 "sdp_reserved" ), "RW", 40, field_default(0) ), - -- 6 "sdp_beamlet_scale" ), "RW", 16, field_default(c_sdp_beamlet_scale_default) ), + -- 6 "sdp_beamlet_scale" ), "RW", 16, field_default(c_sdp_unit_beamlet_scale) ), -- 5 "sdp_beamlet_index" ), "RW", 16, field_default(0) ), -- 4 "sdp_nof_blocks_per_packet" ), "RW", 8, field_default(c_sdp_cep_nof_blocks_per_packet) ), -- 3 "sdp_nof_beamlets_per_block" ), "RW", 16, field_default(c_sdp_cep_nof_beamlets_per_block) ), @@ -657,8 +652,8 @@ BEGIN v_offset := g_sp * c_mm_span_reg_diag_wg; mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl -- Read current BSN mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO 0), tb_clk); diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd index b48c8064f8144cc4d7172729ef1bd6dd6aa82d98..a3955762ff3b7e47a03cb1ae08290e80e24fd54b 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_fsub/tb_lofar2_unb2b_sdp_station_fsub.vhd @@ -114,9 +114,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_fsub IS -- WG CONSTANT c_bsn_start_wg : NATURAL := c_init_bsn + 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values -- .ampl - CONSTANT c_wg_ampl_full_scale : NATURAL := 2**(c_sdp_W_adc-1); -- full scale (FS) of WG, will just cause clipping of +FS to +FS-1 - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / REAL(c_wg_ampl_full_scale); -- amplitude in number of LSbit resolution steps - CONSTANT c_wg_ampl : NATURAL := NATURAL(g_wg_ampl * REAL(c_wg_ampl_full_scale)); -- in number of lsb + CONSTANT c_wg_ampl : NATURAL := NATURAL(g_wg_ampl * REAL(c_sdp_FS_adc)); -- in number of lsb CONSTANT c_exp_sp_power : REAL := REAL(c_wg_ampl**2) / 2.0; CONSTANT c_exp_sp_ast : REAL := c_exp_sp_power * REAL(c_nof_clk_per_sync); -- . phase @@ -125,15 +123,12 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_fsub IS CONSTANT c_wg_latency : INTEGER := c_diag_wg_latency - 0; -- -0 to account for BSN scheduler start trigger latency CONSTANT c_wg_phase_offset : REAL := 360.0 * REAL(c_wg_latency) * c_subband_freq; -- c_diag_wg_latency is in dp_clk cycles CONSTANT c_wg_phase : REAL := c_subband_phase + c_wg_phase_offset; -- WG phase in degrees - -- . freq - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus -- FSUB -- . WPFB CONSTANT c_pol_index : NATURAL := g_sp MOD c_sdp_Q_fft; CONSTANT c_pfb_index : NATURAL := g_sp / c_sdp_Q_fft; -- only read used WPFB unit out of range(c_sdp_P_pfb = 6) - CONSTANT c_exp_subband_sp_ampl_ratio : REAL := 7.96; -- ~= 8 for unit FIR DC gain, depends on internal WPFB quantization and FIR coefficients - CONSTANT c_exp_subband_ampl_raw : REAL := REAL(c_wg_ampl) * c_exp_subband_sp_ampl_ratio; + CONSTANT c_exp_subband_ampl_raw : REAL := REAL(c_wg_ampl) * c_sdp_wpfb_subband_sp_ampl_ratio; CONSTANT c_exp_subband_ampl_weighted : REAL := c_exp_subband_ampl_raw * g_subband_weight_gain; CONSTANT c_exp_subband_power_raw : REAL := c_exp_subband_ampl_raw**2.0; -- complex, so no divide by 2 CONSTANT c_exp_subband_power_weighted : REAL := c_exp_subband_ampl_weighted**2.0; -- complex, so no divide by 2 @@ -353,8 +348,8 @@ BEGIN v_offset := g_sp * c_mm_span_reg_diag_wg; mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl -- Read current BSN mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO 0), tb_clk); diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one.vhd index 6bdaf12e935afa0b47dd0cb70c4a7b7bfb70434a..6f9806c00c2dfa97f4523b4b7b23aad145bc0f30 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one.vhd @@ -89,13 +89,10 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_xsub_one IS CONSTANT c_hi_factor : REAL := 1.0 + c_percentage; -- higher boundary -- WG - CONSTANT c_FS_adc : REAL := REAL(c_sdp_FS_adc); -- = full scale of WG CONSTANT c_bsn_start_wg : NATURAL := 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values CONSTANT c_ampl_sp_0 : NATURAL := c_sdp_FS_adc/2; -- = 0.5 * FS, so in number of lsb - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus CONSTANT c_wg_freq_offset : REAL := 0.0/11.0; -- in freq_unit CONSTANT c_subband_sp_0 : REAL := 102.0; -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / c_FS_adc; -- amplitude in number of LSbit resolution steps CONSTANT c_exp_wg_power_sp_0 : REAL := REAL(c_ampl_sp_0**2)/2.0 * REAL(c_nof_clk_per_sync); -- WPFB @@ -273,8 +270,8 @@ BEGIN FOR I IN 0 TO c_sdp_S_pn-1 LOOP mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 1, INTEGER( 0.0 * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 2, INTEGER((c_subband_sp_0 + c_wg_freq_offset) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 3, INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl END LOOP; -- Read current BSN diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_ring/tb_lofar2_unb2b_sdp_station_xsub_ring.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_ring/tb_lofar2_unb2b_sdp_station_xsub_ring.vhd index cc9fab9fcd06ae09302aee6c241b78a2968c75e3..bae28377a194b0945c99117ea90ea8485bdc6276 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_ring/tb_lofar2_unb2b_sdp_station_xsub_ring.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_ring/tb_lofar2_unb2b_sdp_station_xsub_ring.vhd @@ -94,13 +94,10 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_xsub_ring IS CONSTANT c_nof_lanes : NATURAL := 1; -- WG - CONSTANT c_FS_adc : REAL := REAL(c_sdp_FS_adc); -- = full scale of WG CONSTANT c_bsn_start_wg : NATURAL := 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values CONSTANT c_ampl_sp_0 : NATURAL := c_sdp_FS_adc/2; -- = 0.5 * FS, so in number of lsb - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus CONSTANT c_wg_freq_offset : REAL := 0.0/11.0; -- in freq_unit CONSTANT c_subband_sp_0 : REAL := 102.0; -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / c_FS_adc; -- amplitude in number of LSbit resolution steps CONSTANT c_exp_wg_power_sp_0 : REAL := REAL(c_ampl_sp_0**2)/2.0 * REAL(c_nof_clk_per_sync); -- WPFB @@ -350,8 +347,8 @@ BEGIN FOR I IN 0 TO c_sdp_S_pn-1 LOOP mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 1, INTEGER( 0.0 * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER((c_subband_sp_0 + c_wg_freq_offset) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl END LOOP; END LOOP; diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/tb/vhdl/tb_lofar2_unb2b_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/tb/vhdl/tb_lofar2_unb2b_sdp_station.vhd index 3c63f38cd1b46e389ec71d96f70af019f539ee1f..cf7b09358cc248615adbb96566840e7c822fcc4e 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/tb/vhdl/tb_lofar2_unb2b_sdp_station.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/tb/vhdl/tb_lofar2_unb2b_sdp_station.vhd @@ -69,13 +69,9 @@ ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station IS CONSTANT c_wpfb_sim : t_wpfb := func_wpfb_set_nof_block_per_sync(c_sdp_wpfb_subbands, c_nof_block_per_sync); -- WG - CONSTANT c_full_scale_ampl : REAL := REAL(2**(18-1) - 1); -- = full scale of WG CONSTANT c_bsn_start_wg : NATURAL := 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values - CONSTANT c_ampl_sp_0 : NATURAL := 2**(c_sdp_W_adc-1) / 2; -- in number of lsb - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit / REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus - CONSTANT c_wg_freq_offset : REAL := 0.0 / 11.0; -- in freq_unit + CONSTANT c_ampl_sp_0 : NATURAL := c_sdp_FS_adc/2; -- = 0.5 * FS, so in number of lsb CONSTANT c_subband_sp_0 : REAL := 102.0; -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / c_full_scale_ampl; -- amplitude in number of LSbit resolution steps -- . 1GbE output CONSTANT c_eth_check_nof_packets : NATURAL := 1; @@ -219,10 +215,10 @@ BEGIN -- 1 : phase[15:0] -- 2 : freq[30:0] -- 3 : ampl[16:0] - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0, 1024 * 2**16 + 1, tb_clk); -- nof_samples, mode calc - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1, INTEGER( 0.0 * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0 + c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0, 1024 * 2**16 + 1, tb_clk); -- nof_samples, mode calc + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1, INTEGER( 0.0 * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER(c_subband_sp_0 * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl -- Read current BSN mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO 0), tb_clk); diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc.vhd index 6f191077675c51968fbc4bfc36c193b6f2aaf07e..70cc4fc665584d56982fa5701e5e15ce49fc0492 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_adc/tb_lofar2_unb2c_sdp_station_adc.vhd @@ -85,13 +85,10 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_adc IS CONSTANT c_hi_factor : REAL := 1.0 + c_percentage; -- higher boundary -- WG - CONSTANT c_full_scale_ampl : REAL := REAL(2**(14-1)-1); -- = full scale of WG CONSTANT c_bsn_start_wg : NATURAL := 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values - CONSTANT c_ampl_sp_0 : NATURAL := 2**(c_sdp_W_adc-1)/2; -- in number of lsb - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus + CONSTANT c_ampl_sp_0 : NATURAL := c_sdp_FS_adc/2; -- = 0.5 * FS, so in number of lsb CONSTANT c_wg_freq_offset : REAL := 0.0/11.0; -- in freq_unit CONSTANT c_subband_sp_0 : REAL := 102.0; -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / c_full_scale_ampl; -- amplitude in number of LSbit resolution steps CONSTANT c_exp_wg_power_sp_0 : REAL := REAL(c_ampl_sp_0**2)/2.0 * REAL(c_nof_clk_per_sync); -- ADUH @@ -235,8 +232,8 @@ BEGIN -- 3 : ampl[16:0] mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1, INTEGER( 0.0 * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0 + c_wg_freq_offset) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl -- Read current BSN mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO 0), tb_clk); diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd index c641685358e7fcb63c7f01ad40ca2c14c3c4dc69..c995e931644467a19e890a769c8ec7b395c4a7f6 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf/tb_lofar2_unb2c_sdp_station_bf.vhd @@ -225,10 +225,8 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf IS -- WG CONSTANT c_bsn_start_wg : NATURAL := c_init_bsn + 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values -- .ampl - CONSTANT c_wg_ampl_full_scale : NATURAL := 2**(c_sdp_W_adc-1); -- full scale (FS) of WG, will just cause clipping of +FS to +FS-1 - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / REAL(c_wg_ampl_full_scale); -- amplitude in number of LSbit resolution steps - CONSTANT c_wg_ampl : NATURAL := NATURAL(g_sp_ampl * REAL(c_wg_ampl_full_scale)); -- in number of lsb - CONSTANT c_wg_remnant_ampl : NATURAL := NATURAL(g_sp_remnant_ampl * REAL(c_wg_ampl_full_scale)); -- in number of lsb + CONSTANT c_wg_ampl : NATURAL := NATURAL(g_sp_ampl * REAL(c_sdp_FS_adc)); -- in number of lsb + CONSTANT c_wg_remnant_ampl : NATURAL := NATURAL(g_sp_remnant_ampl * REAL(c_sdp_FS_adc)); -- in number of lsb CONSTANT c_exp_sp_power : REAL := REAL(c_wg_ampl**2) / 2.0; CONSTANT c_exp_sp_ast : REAL := c_exp_sp_power * REAL(c_nof_clk_per_sync); -- . phase @@ -237,8 +235,6 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf IS CONSTANT c_wg_phase_offset : REAL := 360.0 * REAL(c_wg_latency) * c_subband_freq; -- c_diag_wg_latency is in dp_clk cycles CONSTANT c_wg_phase : REAL := g_sp_phase + c_wg_phase_offset; -- WG phase in degrees CONSTANT c_wg_remnant_phase : REAL := g_sp_remnant_phase + c_wg_phase_offset; -- WG phase in degrees - -- . freq - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus -- WPFB CONSTANT c_pol_index : NATURAL := g_sp MOD c_sdp_Q_fft; @@ -760,7 +756,7 @@ BEGIN -- 9 "sdp_source_info_gn_id" ), "RW", 5, field_default(0) ), -- -- 7 "sdp_reserved" ), "RW", 40, field_default(0) ), - -- 6 "sdp_beamlet_scale" ), "RW", 16, field_default(c_sdp_beamlet_scale_default) ), + -- 6 "sdp_beamlet_scale" ), "RW", 16, field_default(c_sdp_unit_beamlet_scale) ), -- 5 "sdp_beamlet_index" ), "RW", 16, field_default(0) ), -- 4 "sdp_nof_blocks_per_packet" ), "RW", 8, field_default(c_sdp_cep_nof_blocks_per_packet) ), -- 3 "sdp_nof_beamlets_per_block" ), "RW", 16, field_default(c_sdp_cep_nof_beamlets_per_block) ), @@ -815,13 +811,13 @@ BEGIN IF s = g_sp THEN mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl ELSE mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 1, INTEGER(c_wg_remnant_phase * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_remnant_ampl) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_remnant_ampl) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl END IF; END LOOP; diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd index d1efebdef031e01550a6d3853bfcfaa6b94f3f10..8199b260fc08ad707a490e6a16076d1d4c074d34 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_bf_ring/tb_lofar2_unb2c_sdp_station_bf_ring.vhd @@ -227,10 +227,8 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS -- WG CONSTANT c_bsn_start_wg : NATURAL := c_init_bsn + 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values -- .ampl - CONSTANT c_wg_ampl_full_scale : NATURAL := 2**(c_sdp_W_adc-1); -- full scale (FS) of WG, will just cause clipping of +FS to +FS-1 - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / REAL(c_wg_ampl_full_scale); -- amplitude in number of LSbit resolution steps - CONSTANT c_wg_ampl : NATURAL := NATURAL(g_sp_ampl * REAL(c_wg_ampl_full_scale)); -- in number of lsb - CONSTANT c_wg_remnant_ampl : NATURAL := NATURAL(g_sp_remnant_ampl * REAL(c_wg_ampl_full_scale)); -- in number of lsb + CONSTANT c_wg_ampl : NATURAL := NATURAL(g_sp_ampl * REAL(c_sdp_FS_adc)); -- in number of lsb + CONSTANT c_wg_remnant_ampl : NATURAL := NATURAL(g_sp_remnant_ampl * REAL(c_sdp_FS_adc)); -- in number of lsb CONSTANT c_exp_sp_power : REAL := REAL(c_wg_ampl**2) / 2.0; CONSTANT c_exp_sp_ast : REAL := c_exp_sp_power * REAL(c_nof_clk_per_sync); -- . phase @@ -239,8 +237,6 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_bf_ring IS CONSTANT c_wg_phase_offset : REAL := 360.0 * REAL(c_wg_latency) * c_subband_freq; -- c_diag_wg_latency is in dp_clk cycles CONSTANT c_wg_phase : REAL := g_sp_phase + c_wg_phase_offset; -- WG phase in degrees CONSTANT c_wg_remnant_phase : REAL := g_sp_remnant_phase + c_wg_phase_offset; -- WG phase in degrees - -- . freq - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus -- WPFB CONSTANT c_pol_index : NATURAL := g_sp MOD c_sdp_Q_fft; @@ -800,7 +796,7 @@ BEGIN -- 9 "sdp_source_info_gn_id" ), "RW", 5, field_default(0) ), -- -- 7 "sdp_reserved" ), "RW", 40, field_default(0) ), - -- 6 "sdp_beamlet_scale" ), "RW", 16, field_default(c_sdp_beamlet_scale_default) ), + -- 6 "sdp_beamlet_scale" ), "RW", 16, field_default(c_sdp_unit_beamlet_scale) ), -- 5 "sdp_beamlet_index" ), "RW", 16, field_default(0) ), -- 4 "sdp_nof_blocks_per_packet" ), "RW", 8, field_default(c_sdp_cep_nof_blocks_per_packet) ), -- 3 "sdp_nof_beamlets_per_block" ), "RW", 16, field_default(c_sdp_cep_nof_beamlets_per_block) ), @@ -888,13 +884,13 @@ BEGIN IF RN * c_sdp_S_pn + I = g_sp THEN mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_wg_ampl) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl ELSE mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 1, INTEGER(c_wg_remnant_phase * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_wg_remnant_ampl) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(mmf_unb_file_prefix(c_unb_nr + (RN / c_quad), RN MOD c_quad) & "REG_WG", I*4 + 3, INTEGER(REAL(c_wg_remnant_ampl) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl END IF; END LOOP; END LOOP; diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_fsub/tb_lofar2_unb2c_sdp_station_fsub.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_fsub/tb_lofar2_unb2c_sdp_station_fsub.vhd index 1896e85d9447a378aff1e97882eda23696324c4e..4d70659aa31bd72e71412a6e52368cb376123312 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_fsub/tb_lofar2_unb2c_sdp_station_fsub.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_fsub/tb_lofar2_unb2c_sdp_station_fsub.vhd @@ -114,9 +114,7 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_fsub IS -- WG CONSTANT c_bsn_start_wg : NATURAL := c_init_bsn + 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values -- .ampl - CONSTANT c_wg_ampl_full_scale : NATURAL := 2**(c_sdp_W_adc-1); -- full scale (FS) of WG, will just cause clipping of +FS to +FS-1 - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / REAL(c_wg_ampl_full_scale); -- amplitude in number of LSbit resolution steps - CONSTANT c_wg_ampl : NATURAL := NATURAL(g_wg_ampl * REAL(c_wg_ampl_full_scale)); -- in number of lsb + CONSTANT c_wg_ampl : NATURAL := NATURAL(g_wg_ampl * REAL(c_sdp_FS_adc)); -- in number of lsb CONSTANT c_exp_sp_power : REAL := REAL(c_wg_ampl**2) / 2.0; CONSTANT c_exp_sp_ast : REAL := c_exp_sp_power * REAL(c_nof_clk_per_sync); -- . phase @@ -125,15 +123,12 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_fsub IS CONSTANT c_wg_latency : INTEGER := c_diag_wg_latency - 0; -- -0 to account for BSN scheduler start trigger latency CONSTANT c_wg_phase_offset : REAL := 360.0 * REAL(c_wg_latency) * c_subband_freq; -- c_diag_wg_latency is in dp_clk cycles CONSTANT c_wg_phase : REAL := c_subband_phase + c_wg_phase_offset; -- WG phase in degrees - -- . freq - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus -- FSUB -- . WPFB CONSTANT c_pol_index : NATURAL := g_sp MOD c_sdp_Q_fft; CONSTANT c_pfb_index : NATURAL := g_sp / c_sdp_Q_fft; -- only read used WPFB unit out of range(c_sdp_P_pfb = 6) - CONSTANT c_exp_subband_sp_ampl_ratio : REAL := 7.96; -- ~= 8 for unit FIR DC gain, depends on internal WPFB quantization and FIR coefficients - CONSTANT c_exp_subband_ampl_raw : REAL := REAL(c_wg_ampl) * c_exp_subband_sp_ampl_ratio; + CONSTANT c_exp_subband_ampl_raw : REAL := REAL(c_wg_ampl) * c_sdp_wpfb_subband_sp_ampl_ratio; CONSTANT c_exp_subband_ampl_weighted : REAL := c_exp_subband_ampl_raw * g_subband_weight_gain; CONSTANT c_exp_subband_power_raw : REAL := c_exp_subband_ampl_raw**2.0; -- complex, so no divide by 2 CONSTANT c_exp_subband_power_weighted : REAL := c_exp_subband_ampl_weighted**2.0; -- complex, so no divide by 2 @@ -335,8 +330,8 @@ BEGIN v_offset := g_sp * c_mm_span_reg_diag_wg; mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 1, INTEGER(c_wg_phase * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 2, INTEGER(REAL(g_subband) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, v_offset + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl -- Read current BSN mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO 0), tb_clk); diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_xsub_one/tb_lofar2_unb2c_sdp_station_xsub_one.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_xsub_one/tb_lofar2_unb2c_sdp_station_xsub_one.vhd index 3b8c5cb0fe2672726f3b078aaed54afd41b55d73..2774f8ae02240508d9aa2160f8986d5fb38e46d8 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_xsub_one/tb_lofar2_unb2c_sdp_station_xsub_one.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/revisions/lofar2_unb2c_sdp_station_xsub_one/tb_lofar2_unb2c_sdp_station_xsub_one.vhd @@ -34,15 +34,16 @@ -- to trigger start of WG at BSN. -- -- 3) Read crosslets statistics (XST) via ram_st_xsq and verify that the values --- are as expected. This is done by comparing the values in the outgoing square --- correlation matrix. --- +-- are as expected. This is done by: +-- . comparing the values in the outgoing square correlation matrix, they +-- should all be almost equal because all signal inputs use same WG +-- . comparing with expected XST value c_exp_subband_xst -- -- Usage: -- > as 7 # default -- > as 12 # for detailed debugging -- > run -a --- Takes about 40 m +-- Takes about 45 m -- ------------------------------------------------------------------------------- LIBRARY IEEE, common_lib, unb2c_board_lib, i2c_lib, mm_lib, dp_lib, diag_lib, lofar2_sdp_lib, wpfb_lib, lofar2_unb2c_sdp_station_lib; @@ -78,34 +79,28 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station_xsub_one IS CONSTANT c_tb_clk_period : TIME := 100 ps; -- use fast tb_clk to speed up M&C - CONSTANT c_nof_block_per_sync : NATURAL := 24; + CONSTANT c_nof_block_per_sync : NATURAL := 20; CONSTANT c_nof_clk_per_sync : NATURAL := c_nof_block_per_sync*c_sdp_N_fft; CONSTANT c_pps_period : NATURAL := c_nof_clk_per_sync; CONSTANT c_wpfb_sim : t_wpfb := func_wpfb_set_nof_block_per_sync(c_sdp_wpfb_subbands, c_nof_block_per_sync); CONSTANT c_ctrl_interval_size : NATURAL := c_nof_clk_per_sync; - CONSTANT c_percentage : REAL := 0.05; -- percentage that actual value may differ from expected value - CONSTANT c_lo_factor : REAL := 1.0 - c_percentage; -- lower boundary - CONSTANT c_hi_factor : REAL := 1.0 + c_percentage; -- higher boundary + CONSTANT c_max_ratio : REAL := 0.0001; -- ratio that actual value may differ from expected value -- WG - CONSTANT c_FS_adc : REAL := REAL(c_sdp_FS_adc); -- = full scale of WG CONSTANT c_bsn_start_wg : NATURAL := 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values - CONSTANT c_ampl_sp_0 : NATURAL := c_sdp_FS_adc/2; -- = 0.5 * FS, so in number of lsb - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus + CONSTANT c_sp_ampl : REAL := 0.5; -- WG normalized amplitude, 1.0 = FS (full scale), use <= 0.5 to avoid XST overflow + CONSTANT c_wg_ampl : NATURAL := NATURAL(c_sp_ampl * REAL(c_sdp_FS_adc)); -- in number of lsb CONSTANT c_wg_freq_offset : REAL := 0.0/11.0; -- in freq_unit - CONSTANT c_subband_sp_0 : REAL := 102.0; -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / c_FS_adc; -- amplitude in number of LSbit resolution steps - CONSTANT c_exp_wg_power_sp_0 : REAL := REAL(c_ampl_sp_0**2)/2.0 * REAL(c_nof_clk_per_sync); + CONSTANT c_subband_sp : REAL := 102.0; -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz -- WPFB - CONSTANT c_nof_pfb : NATURAL := 1; -- Verifying 1 of c_sdp_P_pfb = 6 pfb to speed up simulation. - CONSTANT c_wb_leakage_bin : NATURAL := c_wpfb_sim.nof_points / c_wpfb_sim.wb_factor; -- = 256, leakage will occur in this bin if FIR wb_factor is reversed - CONSTANT c_exp_sp_subband_power_ratio : REAL := 1.0/8.0; -- depends on internal WPFB quantization and FIR coefficients - CONSTANT c_exp_sp_subband_power_sum_ratio : REAL := c_exp_sp_subband_power_ratio; -- because all sinus power is expected in one subband - CONSTANT c_exp_subband_power_sp_0 : REAL := c_exp_wg_power_sp_0 * c_exp_sp_subband_power_ratio; + CONSTANT c_exp_subband_ampl : REAL := REAL(c_wg_ampl) * c_sdp_wpfb_subband_sp_ampl_ratio; + CONSTANT c_exp_subband_power : REAL := c_exp_subband_ampl**2.0; -- complex, so no divide by 2 + CONSTANT c_exp_subband_sst : REAL := c_exp_subband_power * REAL(c_nof_block_per_sync); + CONSTANT c_exp_subband_xst : REAL := c_exp_subband_sst; -- all signal inputs use same WG, and auto correlation XST = SST - TYPE t_real_arr IS ARRAY (INTEGER RANGE <>) OF REAL; + TYPE t_real_arr IS ARRAY (INTEGER RANGE <>) OF REAL; -- MM CONSTANT c_mm_file_reg_bsn_source_v2 : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SOURCE_V2"; @@ -182,7 +177,7 @@ BEGIN g_sim_node_nr => c_node_nr, g_wpfb => c_wpfb_sim, g_bsn_nof_clk_per_sync => c_nof_clk_per_sync, - g_scope_selected_subband => NATURAL(c_subband_sp_0) + g_scope_selected_subband => NATURAL(c_subband_sp) ) PORT MAP ( -- GENERAL @@ -242,8 +237,8 @@ BEGIN ---------------------------------------------------------------------------- -- Crosslets Info ---------------------------------------------------------------------------- - mmf_mm_bus_wr(c_mm_file_reg_crosslets_info, 0, INTEGER(c_subband_sp_0), tb_clk); -- offset - mmf_mm_bus_wr(c_mm_file_reg_crosslets_info, 15, 0 , tb_clk); -- stepsize + mmf_mm_bus_wr(c_mm_file_reg_crosslets_info, 0, INTEGER(c_subband_sp), tb_clk); -- offset + mmf_mm_bus_wr(c_mm_file_reg_crosslets_info, 15, 0 , tb_clk); -- stepsize ---------------------------------------------------------------------------- -- Enable WG @@ -255,9 +250,9 @@ BEGIN -- 3 : ampl[16:0] FOR I IN 0 TO c_sdp_S_pn-1 LOOP mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 1, INTEGER( 0.0 * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 1, INTEGER(0.0 * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 2, INTEGER((c_subband_sp + c_wg_freq_offset) * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 3, INTEGER(REAL(c_wg_ampl) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl END LOOP; -- Read current BSN @@ -279,7 +274,7 @@ BEGIN -- Wait for enough WG data and start of sync interval mmf_mm_wait_until_value(c_mm_file_reg_bsn_scheduler_wg, 0, -- read BSN low - "UNSIGNED", rd_data, ">=", c_nof_block_per_sync * 2, -- this is the wait until condition + "UNSIGNED", rd_data, ">=", c_nof_block_per_sync * 3, -- this is the wait until condition c_sdp_T_sub, tb_clk); --------------------------------------------------------------------------- @@ -343,7 +338,17 @@ BEGIN -- Check if values are > 0 IF v_C=0 THEN ASSERT (SIGNED(xsub_stats_arr(I)) > TO_SIGNED(0, c_longword_w)) REPORT "correlation is 0 which is unexpected! at I = " & int_to_str(I) SEVERITY ERROR; END IF; - END LOOP; + + -- All XST values (almost) equal, because they use the same WG setting. + -- therefore also verify the expected XST value for all XST. + IF I MOD c_nof_complex = 0 THEN + -- real part + ASSERT almost_equal(TO_SREAL(xsub_stats_arr(I)) / c_exp_subband_xst, 1.0, c_max_ratio) REPORT "Wrong XST real value at I = " & int_to_str(I) SEVERITY ERROR; + ELSE + -- imag part + ASSERT almost_zero(TO_SREAL(xsub_stats_arr(I)) / c_exp_subband_xst, c_max_ratio) REPORT "Wrong XST imag value at I = " & int_to_str(I) SEVERITY ERROR; + END IF; + END LOOP; --------------------------------------------------------------------------- -- End Simulation diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/tb/vhdl/tb_lofar2_unb2c_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/tb/vhdl/tb_lofar2_unb2c_sdp_station.vhd index 2129d701d1eddfa82e247b8c4ae31ef9a225cbf3..aff3d655da014f566d15bc51e966bf13c20635a6 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/tb/vhdl/tb_lofar2_unb2c_sdp_station.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/tb/vhdl/tb_lofar2_unb2c_sdp_station.vhd @@ -69,15 +69,11 @@ ARCHITECTURE tb OF tb_lofar2_unb2c_sdp_station IS CONSTANT c_wpfb_sim : t_wpfb := func_wpfb_set_nof_block_per_sync(c_sdp_wpfb_subbands, c_nof_block_per_sync); -- WG - CONSTANT c_full_scale_ampl : REAL := REAL(2**(18-1) - 1); -- = full scale of WG CONSTANT c_bsn_start_wg : NATURAL := 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values CONSTANT c_ampl_sp_0 : NATURAL := 2**(c_sdp_W_adc-1) / 2; -- in number of lsb - CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit / REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus - CONSTANT c_wg_freq_offset : REAL := 0.0 / 11.0; -- in freq_unit CONSTANT c_subband_sp_0 : REAL := 102.0; -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz - CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / c_full_scale_ampl; -- amplitude in number of LSbit resolution steps --- . 1GbE output + -- 1GbE output CONSTANT c_eth_check_nof_packets : NATURAL := 1; CONSTANT c_eth_runtime_timeout : TIME := 300 us; @@ -206,10 +202,10 @@ BEGIN -- 1 : phase[15:0] -- 2 : freq[30:0] -- 3 : ampl[16:0] - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0, 1024 * 2**16 + 1, tb_clk); -- nof_samples, mode calc - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1, INTEGER( 0.0 * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER((c_subband_sp_0 + c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk); -- freq - mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk); -- ampl + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 0, 1024 * 2**16 + 1, tb_clk); -- nof_samples, mode calc + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 1, INTEGER( 0.0 * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 2, INTEGER(c_subband_sp_0 * c_sdp_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, 3, INTEGER(REAL(c_ampl_sp_0) * c_sdp_wg_ampl_lsb), tb_clk); -- ampl -- Read current BSN mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO 0), tb_clk); diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd index 38214e72d7c3202a66b85fe2fed3e064fda6f004..6a102999a4b198ff37643cf257c9fe066758d4d1 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd @@ -52,8 +52,7 @@ ENTITY ddrctrl IS g_nof_streams : NATURAL := 12; -- number of input streams g_data_w : NATURAL := 14; -- data with of input data vectors g_stop_percentage : NATURAL := 50; - g_block_size : NATURAL := 1024; - g_burstsize : NATURAL := 64 + g_block_size : NATURAL := 1024 ); PORT ( clk : IN STD_LOGIC := '0'; @@ -87,8 +86,10 @@ ARCHITECTURE str OF ddrctrl IS CONSTANT c_io_ddr_data_w : NATURAL := func_tech_ddr_ctlr_data_w( g_tech_ddr ); -- 576 CONSTANT c_wr_fifo_depth : NATURAL := 256; -- defined at DDR side of the FIFO, >=16 and independent of wr burst size, default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K CONSTANT c_rd_fifo_depth : NATURAL := 256; -- defined at DDR side of the FIFO, >=16 AND > max number of rd burst sizes (so > c_rd_fifo_af_margin), default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K + CONSTANT c_wr_fifo_uw_w : NATURAL := ceil_log2(c_wr_fifo_depth*(func_tech_ddr_ctlr_data_w(g_tech_ddr)/c_io_ddr_data_w)); CONSTANT c_rd_fifo_uw_w : NATURAL := ceil_log2(c_rd_fifo_depth*(func_tech_ddr_ctlr_data_w(g_tech_ddr)/c_io_ddr_data_w)); + CONSTANT c_burstsize : NATURAL := g_tech_ddr.maxburstsize; CONSTANT c_adr_w : NATURAL := func_tech_ddr_ctlr_address_w(g_tech_ddr); -- the lengt of the address vector, for simulation this is smaller, otherwise the simulation would take to long, 27 CONSTANT c_max_adr : NATURAL := 2**(c_adr_w)-1; -- the maximal address that is possible within the vector length of the address CONSTANT c_bim : NATURAL := (c_max_adr*c_io_ddr_data_w)/(g_block_size*g_nof_streams*g_data_w); -- the amount of whole blocks that fit in memory. @@ -104,8 +105,8 @@ ARCHITECTURE str OF ddrctrl IS -- the amount of overflow after one block is written CONSTANT c_of_pb : NATURAL := (g_block_size*g_nof_streams*g_data_w)-(((g_block_size*g_nof_streams*g_data_w)/c_io_ddr_data_w)*c_io_ddr_data_w); -- amount of overflow after one block is written to memory - CONSTANT c_aof_full_burst : NATURAL := c_nof_adr/g_burstsize; - CONSTANT c_last_burstsize : NATURAL := c_nof_adr-(c_aof_full_burst*g_burstsize); + CONSTANT c_aof_full_burst : NATURAL := c_nof_adr/c_burstsize; + CONSTANT c_last_burstsize : NATURAL := c_nof_adr-(c_aof_full_burst*c_burstsize); SIGNAL s_last_burstsize : NATURAL := c_last_burstsize; @@ -122,12 +123,11 @@ ARCHITECTURE str OF ddrctrl IS SIGNAL rd_siso : t_dp_siso := c_dp_siso_rst; SIGNAL rd_sosi : t_dp_sosi := c_dp_sosi_init; SIGNAL stop : STD_LOGIC; + SIGNAL wr_fifo_usedw : STD_LOGIC_VECTOR(c_wr_fifo_uw_w-1 DOWNTO 0); SIGNAL rd_fifo_usedw : STD_LOGIC_VECTOR(c_rd_fifo_uw_w-1 DOWNTO 0); SIGNAL rd_ready : STD_LOGIC; - SIGNAL inp_ds : NATURAL; SIGNAL inp_bsn_adr : NATURAL; - SIGNAL outp_ds : NATURAL; - SIGNAL outp_bsn : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); + SIGNAL bsn_co : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); SIGNAL data_stopped : STD_LOGIC; BEGIN @@ -153,7 +153,6 @@ BEGIN in_stop => stop, out_sosi => out_sosi, out_adr => out_adr, - out_bsn_ds => inp_ds, out_bsn_adr => inp_bsn_adr, out_data_stopped => data_stopped ); @@ -206,7 +205,7 @@ BEGIN wr_clk => clk, wr_rst => rst, - wr_fifo_usedw => open, + wr_fifo_usedw => wr_fifo_usedw, wr_sosi => wr_sosi, wr_siso => open, @@ -240,15 +239,15 @@ BEGIN g_in_data_w => c_io_ddr_data_w, g_nof_streams => g_nof_streams, g_data_w => g_data_w, - g_block_size => g_block_size + g_block_size => g_block_size, + g_bim => c_bim ) PORT MAP( clk => clk, rst => rst, in_sosi => rd_sosi, - in_ds => outp_ds, - in_bsn => outp_bsn, + in_bsn => bsn_co, out_sosi_arr => out_sosi_arr, out_ready => rd_ready @@ -265,11 +264,13 @@ BEGIN g_rd_fifo_depth => c_rd_fifo_depth, g_rd_data_w => c_io_ddr_data_w, g_block_size => g_block_size, + g_wr_fifo_uw_w => c_wr_fifo_uw_w, g_rd_fifo_uw_w => c_rd_fifo_uw_w, g_max_adr => c_nof_adr, - g_burstsize => g_burstsize, + g_burstsize => c_burstsize, g_last_burstsize => c_last_burstsize, - g_adr_per_b => c_adr_per_b + g_adr_per_b => c_adr_per_b, + g_bim => c_bim ) PORT MAP( clk => clk, @@ -279,7 +280,6 @@ BEGIN inp_of => out_of, inp_sosi => out_sosi, inp_adr => out_adr, - inp_ds => inp_ds, inp_bsn_adr => inp_bsn_adr, inp_data_stopped => data_stopped, rst_ddrctrl_input => rst_ddrctrl_input, @@ -288,11 +288,11 @@ BEGIN dvr_mosi => dvr_mosi, dvr_miso => dvr_miso, wr_sosi => wr_sosi, + wr_fifo_usedw => wr_fifo_usedw, rd_fifo_usedw => rd_fifo_usedw, -- ddrctrl_output - outp_ds => outp_ds, - outp_bsn => outp_bsn, + outp_bsn => bsn_co, -- ddrctrl_controller stop_in => stop_in, diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd index 3f4cab12b7d991c5abd15ddc3fe2030bb5ff222e..8a91295a14c756bef34e5da15016791a507e2340 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd @@ -46,11 +46,13 @@ ENTITY ddrctrl_controller IS g_rd_fifo_depth : NATURAL; -- 256 g_rd_data_w : NATURAL; -- 256 g_block_size : NATURAL; -- 1024 + g_wr_fifo_uw_w : NATURAL; -- 8 g_rd_fifo_uw_w : NATURAL; -- 8 g_max_adr : NATURAL; -- 16128 g_burstsize : NATURAL; -- 64 g_last_burstsize : NATURAL; -- 18 - g_adr_per_b : NATURAL -- 299 + g_adr_per_b : NATURAL; -- 299 + g_bim : NATURAL -- 54 ); PORT ( clk : IN STD_LOGIC; @@ -60,7 +62,6 @@ ENTITY ddrctrl_controller IS inp_of : IN NATURAL; inp_sosi : IN t_dp_sosi; inp_adr : IN NATURAL; - inp_ds : IN NATURAL; inp_bsn_adr : IN NATURAL; inp_data_stopped : IN STD_LOGIC; rst_ddrctrl_input : OUT STD_LOGIC; @@ -69,10 +70,10 @@ ENTITY ddrctrl_controller IS dvr_mosi : OUT t_mem_ctlr_mosi; dvr_miso : IN t_mem_ctlr_miso; wr_sosi : OUT t_dp_sosi; + wr_fifo_usedw : IN STD_LOGIC_VECTOR(g_wr_fifo_uw_w-1 DOWNTO 0); rd_fifo_usedw : IN STD_LOGIC_VECTOR(g_rd_fifo_uw_w-1 DOWNTO 0); -- ddrctrl_output - outp_ds : OUT NATURAL; outp_bsn : OUT STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0) := (OTHERS => '0'); -- ddrctrl_controller @@ -94,12 +95,10 @@ ARCHITECTURE rtl OF ddrctrl_controller IS CONSTANT c_rd_data_w : NATURAL := g_nof_streams*g_out_data_w; -- 168 CONSTANT c_rest : NATURAL := c_rd_data_w-(g_wr_data_w mod c_rd_data_w); -- 96 - CONSTANT c_max_read_cnt : NATURAL := (g_max_adr+1)/g_burstsize; -- 256 CONSTANT c_io_ddr_data_w : NATURAL := func_tech_ddr_ctlr_data_w(g_tech_ddr); -- 576 - CONSTANT c_proportion : NATURAL := (c_io_ddr_data_w/c_rd_data_w)+1; -- type for statemachine - TYPE t_state IS (RESET, WRITING, SET_STOP, STOP_WRITING, LAST_WRITE_BURST, START_READING, READING, STOP_READING, IDLE); + TYPE t_state IS (RESET, WAIT_FOR_SOP, START_WRITING, WRITING, SET_STOP, STOP_WRITING, LAST_WRITE_BURST, START_READING, READING, STOP_READING, IDLE); -- record for readability TYPE t_reg IS RECORD @@ -116,12 +115,11 @@ ARCHITECTURE rtl OF ddrctrl_controller IS rst_ddrctrl_input : STD_LOGIC; -- writing signals - need_burst : STD_LOGIC; + wr_burst_en : STD_LOGIC; -- reading signals - outp_ds : NATURAL; outp_bsn : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); - read_cnt : NATURAL; + read_adr : NATURAL; rd_burst_en : STD_LOGIC; -- output @@ -129,45 +127,74 @@ ARCHITECTURE rtl OF ddrctrl_controller IS wr_sosi : t_dp_sosi; END RECORD; - CONSTANT c_t_reg_init : t_reg := (RESET, '0', '0', TO_UVEC(g_max_adr, c_adr_w), (OTHERS => '0'), 0, '1', '1', '0', 0, (OTHERS => '0'), 0, '0', c_mem_ctlr_mosi_rst, c_dp_sosi_init); + CONSTANT c_t_reg_init : t_reg := (RESET, '0', '0', TO_UVEC(g_max_adr, c_adr_w), (OTHERS => '0'), 0, '1', '1', '0', (OTHERS => '0'), 0, '0', c_mem_ctlr_mosi_rst, c_dp_sosi_init); -- signals for readability SIGNAL d_reg : t_reg := c_t_reg_init; SIGNAL q_reg : t_reg := c_t_reg_init; + BEGIN q_reg <= d_reg WHEN rising_edge(clk); -- put the input data into c_v and fill the output vector from c_v - p_state : PROCESS(q_reg, rst, inp_of, inp_sosi, inp_adr, inp_ds, inp_bsn_adr, inp_data_stopped, dvr_miso, rd_fifo_usedw, stop_in) + p_state : PROCESS(q_reg, rst, inp_of, inp_sosi, inp_adr, inp_bsn_adr, inp_data_stopped, dvr_miso, rd_fifo_usedw, stop_in) VARIABLE v : t_reg := c_t_reg_init; BEGIN - v := q_reg; + v := q_reg; + v.wr_sosi := inp_sosi; CASE q_reg.state IS WHEN RESET => - v := c_t_reg_init; - v.dvr_mosi.burstbegin := '1'; - v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0) := (OTHERS => '0'); - v.dvr_mosi.wr := '1'; + v := c_t_reg_init; + v.dvr_mosi.burstbegin := '1'; + v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0) := (OTHERS => '0'); + v.dvr_mosi.wr := '1'; + v.wr_sosi.valid := '1'; + WHEN WAIT_FOR_SOP => + v.dvr_mosi.burstbegin := '0'; + v.rst_ddrctrl_input := '0'; + IF q_reg.started = '0' AND inp_sosi.eop = '1' THEN + v.wr_sosi.valid := '1'; + ELSIF inp_sosi.sop = '1' THEN + v.state := WRITING; --START_WRITING; + ELSE + v.wr_sosi.valid := '0'; + v.state := WAIT_FOR_SOP; + END IF; - WHEN WRITING => - -- if adr mod g_burstsize = 0 - -- this makes sure that only ones every 64 writes a writeburst is started. - IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN - v.need_burst := '1'; + + + WHEN START_WRITING => + -- this state generates the first write burst. + IF TO_UINT(wr_fifo_usedw) > g_burstsize AND dvr_miso.done = '1' AND v.wr_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN + v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC(TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+q_reg.stop_burstsize, c_adr_w); + v.dvr_mosi.wr := '1'; + v.dvr_mosi.rd := '0'; + v.dvr_mosi.burstbegin := '1'; + v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0) := TO_UVEC(g_burstsize-q_reg.stop_burstsize, dvr_mosi.burstsize'length); + v.wr_burst_en := '0'; + v.wr_burst_en := '1'; + v.state := WRITING; + ELSE + v.dvr_mosi.burstbegin := '0'; + v.state := START_WRITING; END IF; - IF dvr_miso.done = '1' AND q_reg.need_burst = '1' THEN + + + WHEN WRITING => + -- this state generates the rest of the write bursts, it also checks if there is a stop signal or if it needs to stop writing. + IF TO_UINT(wr_fifo_usedw) > g_burstsize AND dvr_miso.done = '1' AND q_reg.wr_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN v.dvr_mosi.burstbegin := '1'; - v.need_burst := '0'; + v.wr_burst_en := '0'; IF inp_adr < g_burstsize-1 THEN v.dvr_mosi.address := TO_UVEC(g_max_adr-g_last_burstsize, dvr_mosi.address'length); v.dvr_mosi.burstsize := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length); @@ -181,30 +208,45 @@ BEGIN END IF; v.dvr_mosi.wr := '1'; v.dvr_mosi.rd := '0'; - v.wr_sosi := inp_sosi; + + IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN + v.wr_burst_en := '1'; + END IF; + + IF stop_in = '1' THEN + v.ready_for_set_stop := '1'; + END IF; + + IF q_reg.ready_for_set_stop = '1' AND inp_sosi.eop = '1' THEN + v.state := SET_STOP; + ELSIF q_reg.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN + v.state := STOP_WRITING; + ELSE + v.state := WRITING; + END IF; WHEN SET_STOP => - --setting a stop address dependend on the g_stop_percentage + -- this state sets a stop address dependend on the g_stop_percentage. IF inp_adr+c_pof_ma >= g_max_adr THEN v.stop_adr(c_adr_w-1 DOWNTO 0) := TO_UVEC(inp_adr-c_pof_ma, c_adr_w)(c_adr_w-1 DOWNTO 0); ELSE v.stop_adr(c_adr_w-1 DOWNTO 0) := TO_UVEC(inp_adr+c_pof_ma, c_adr_w)(c_adr_w-1 DOWNTO 0); END IF; - v.ready_for_set_stop := '0'; + v.ready_for_set_stop := '0'; v.last_adr_to_write_to(c_adr_w-1 DOWNTO c_bitshift_w) := v.stop_adr(c_adr_w-1 DOWNTO c_bitshift_w); v.last_adr_to_write_to(c_bitshift_w-1 DOWNTO 0) := (OTHERS => '0'); - v.stop_burstsize := TO_UINT(v.stop_adr(c_adr_w-1 DOWNTO 0))-TO_UINT(v.last_adr_to_write_to); + v.stop_burstsize := TO_UINT(v.stop_adr(c_adr_w-1 DOWNTO 0))-TO_UINT(v.last_adr_to_write_to)+1; -- still a write cyle -- if adr mod g_burstsize = 0 -- this makes sure that only ones every 64 writes a writeburst is started. IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN - v.need_burst := '1'; + v.wr_burst_en := '1'; END IF; - IF dvr_miso.done = '1' AND q_reg.need_burst = '1' THEN + IF dvr_miso.done = '1' AND q_reg.wr_burst_en = '1' THEN v.dvr_mosi.burstbegin := '1'; - v.need_burst := '0'; + v.wr_burst_en := '0'; IF inp_adr < g_burstsize-1 THEN v.dvr_mosi.address := TO_UVEC(g_max_adr-g_last_burstsize, dvr_mosi.address'length); v.dvr_mosi.burstsize := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length); @@ -218,20 +260,28 @@ BEGIN END IF; v.dvr_mosi.wr := '1'; v.dvr_mosi.rd := '0'; - v.wr_sosi := inp_sosi; + + IF q_reg.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN + v.state := STOP_WRITING; + ELSE + v.state := WRITING; + END IF; + WHEN STOP_WRITING => + -- this state stops the writing by generatign one last whole write burst which almost empties wr_fifo. + v.wr_sosi.valid := '0'; v.dvr_mosi.burstbegin := '0'; v.stopped := '1'; + v.stop_adr := TO_UVEC(g_max_adr, c_adr_w); -- wait until the write burst is finished IF inp_data_stopped = '0' THEN v.state := STOP_WRITING; - ELSIF dvr_miso.done = '1' AND q_reg.dvr_mosi.burstbegin = '0' AND q_reg.need_burst = '0' THEN - v.wr_sosi.valid := '0'; - v.state := LAST_WRITE_BURST; + ELSIF dvr_miso.done = '1' AND q_reg.dvr_mosi.burstbegin = '0' AND q_reg.wr_burst_en = '0' THEN + v.state := LAST_WRITE_BURST; ELSE - v.state := STOP_WRITING; + v.state := STOP_WRITING; END IF; @@ -239,11 +289,11 @@ BEGIN -- if adr mod g_burstsize = 0 -- this makes sure that only ones every 64 writes a writeburst is started. IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_w-1 DOWNTO 0) = c_zeros AND q_reg.dvr_mosi.burstbegin = '0'THEN - v.need_burst := '1'; + v.wr_burst_en := '1'; END IF; - IF dvr_miso.done = '1' AND q_reg.need_burst = '1' THEN + IF dvr_miso.done = '1' AND q_reg.wr_burst_en = '1' THEN v.dvr_mosi.burstbegin := '1'; - v.need_burst := '0'; + v.wr_burst_en := '0'; IF inp_adr < g_burstsize-1 THEN v.dvr_mosi.address := TO_UVEC(g_max_adr-g_last_burstsize, dvr_mosi.address'length); v.dvr_mosi.burstsize := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length); @@ -257,16 +307,16 @@ BEGIN END IF; v.dvr_mosi.wr := '1'; v.dvr_mosi.rd := '0'; - v.wr_sosi := inp_sosi; WHEN LAST_WRITE_BURST => - + -- this state stops the writing by generatign one last write burst which empties wr_fifo. IF dvr_miso.done = '1' THEN v.dvr_mosi.burstbegin := '1'; v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0); v.dvr_mosi.burstsize := TO_UVEC(q_reg.stop_burstsize, dvr_mosi.burstsize'length); v.state := START_READING; + v.rd_burst_en := '1'; ELSE v.dvr_mosi.burstbegin := '0'; v.state := LAST_WRITE_BURST; @@ -277,48 +327,56 @@ BEGIN WHEN START_READING => + -- this state generates the first read burst, the size of this burst is dependend on the size of the last write burst. v.dvr_mosi.burstbegin := '0'; - v.rd_burst_en := '1'; - v.outp_ds := inp_ds; - v.read_cnt := 0; + v.outp_bsn := TO_UVEC(TO_UINT(inp_sosi.bsn)-g_bim, c_dp_stream_bsn_w); - FOR I IN 0 TO inp_bsn_adr+(g_max_adr-TO_UINT(q_reg.stop_adr)) LOOP -- takes a while WRONG, wil be fixed after L2SDP-705, 706 and 70 - IF v.outp_ds-c_rest <= 0 THEN - v.outp_ds := v.outp_ds+c_rd_data_w-c_rest; - ELSE - v.outp_ds := v.outp_ds-c_rest; - END IF; - END LOOP; - v.outp_bsn := TO_UVEC(TO_UINT(inp_sosi.bsn), c_dp_stream_bsn_w); -- WRONG, wil be fixed after L2SDP-705, 706 and 707 - v.state := READING; + IF dvr_miso.done = '1' AND v.rd_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN + v.dvr_mosi.burstbegin := '1'; + v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0) := TO_UVEC(g_burstsize-q_reg.stop_burstsize, dvr_mosi.burstsize'length); + v.dvr_mosi.wr := '0'; + v.dvr_mosi.rd := '1'; + v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC(TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+q_reg.stop_burstsize, c_adr_w); + v.rd_burst_en := '0'; + v.read_adr := TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+g_burstsize; + END IF; + + -- makes sure the fifo is filled before asking for another rd request. to prevent 4 rd burst to happend directly after one another. + IF dvr_miso.done = '0' AND q_reg.rd_burst_en = '0' THEN + v.rd_burst_en := '1'; + v.state := READING; + ELSE + v.state := START_READING; + END IF; WHEN READING => -- rd_fifo needs a refil after rd_fifo_usedw <= 10 because of delays, if you wait until rd_fifo_usedw = 0 then you get an empty fifo which results in your outputs sosi.valid not being constatly valid. - IF TO_UINT(rd_fifo_usedw) <= 10 AND dvr_miso.done = '1' AND q_reg.rd_burst_en = '1' AND dvr_miso.done = '1' THEN - v.dvr_mosi.burstbegin := '0'; - v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0) := TO_UVEC(g_burstsize, dvr_mosi.burstsize'length); - v.dvr_mosi.wr := '0'; - v.dvr_mosi.rd := '1'; - v.outp_ds := inp_ds; - IF TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+g_burstsize*q_reg.read_cnt >= g_max_adr THEN - v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC((TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+g_burstsize*q_reg.read_cnt)-g_max_adr-1, c_adr_w); + IF TO_UINT(rd_fifo_usedw) <= g_burstsize AND dvr_miso.done = '1' AND q_reg.rd_burst_en = '1' THEN + v.dvr_mosi.wr := '0'; + v.dvr_mosi.rd := '1'; + v.dvr_mosi.burstbegin := '1'; + v.rd_burst_en := '0'; + IF q_reg.read_adr > g_max_adr-g_burstsize THEN + v.dvr_mosi.address := TO_UVEC(q_reg.read_adr, dvr_mosi.address'length); + v.dvr_mosi.burstsize := TO_UVEC(g_last_burstsize, dvr_mosi.burstsize'length); + v.read_adr := 0; ELSE - v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC(TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+g_burstsize*q_reg.read_cnt, c_adr_w); + v.dvr_mosi.address := TO_UVEC(q_reg.read_adr, dvr_mosi.address'length); + v.dvr_mosi.burstsize := TO_UVEC(g_burstsize, dvr_mosi.burstsize'length); + v.read_adr := q_reg.read_adr+g_burstsize; END IF; - v.dvr_mosi.burstbegin := '1'; - v.read_cnt := v.read_cnt+1; - v.rd_burst_en := '0'; ELSE v.dvr_mosi.burstbegin := '0'; END IF; -- makes sure the fifo is filled before asking for another rd request. to prevent 4 rd burst to happend directly after one another. - IF TO_UINT(rd_fifo_usedw) = 11 THEN + IF dvr_miso.done = '0' THEN v.rd_burst_en := '1'; END IF; - IF q_reg.read_cnt >= c_max_read_cnt THEN + -- goes to STOP_reading when this read burst was from the burstblock before q_reg.stop_adr + IF q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0) = TO_UVEC(q_reg.read_adr, c_adr_w) THEN v.state := STOP_READING; ELSE v.state := READING; @@ -327,19 +385,33 @@ BEGIN WHEN STOP_READING => - IF dvr_miso.done = '1' THEN - v.rst_ddrctrl_input := '0'; - v.stopped := '0'; - v.state := IDLE; - ELSE - v.state := STOP_READING; - END IF; + -- this is the last read burst, this make sure every data containing word in the memory has been read. + IF TO_UINT(rd_fifo_usedw) <= g_burstsize AND dvr_miso.done = '1' AND q_reg.rd_burst_en = '1' THEN + v.dvr_mosi.burstbegin := '1'; + v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0); + v.dvr_mosi.burstsize := TO_UVEC(q_reg.stop_burstsize, dvr_mosi.burstsize'length); + v.stopped := '0'; + v.wr_sosi.valid := '0'; + v.state := WAIT_FOR_SOP; + v.wr_burst_en := '1'; + v.rst_ddrctrl_input := '1'; + ELSE + v.dvr_mosi.burstbegin := '0'; + v.state := STOP_READING; + END IF; + v.dvr_mosi.wr := '0'; + v.dvr_mosi.rd := '1'; + IF dvr_miso.done = '0' THEN + v.rd_burst_en := '1'; + END IF; WHEN IDLE => - v.wr_sosi.valid := '0'; + IF q_reg.started = '0' THEN + v.wr_sosi.valid := '0'; + END IF; -- the statemachine goes to Idle when its finished or when its waiting on other components. WHEN OTHERS => @@ -349,16 +421,15 @@ BEGIN END CASE; - IF q_reg.state = RESET OR q_reg.state = WRITING OR q_reg.state = SET_STOP OR q_reg.state = IDLE THEN + IF q_reg.state = RESET OR q_reg.state = IDLE THEN IF stop_in = '1' THEN v.ready_for_set_stop := '1'; ELSIF q_reg.ready_for_set_stop = '1' AND inp_sosi.eop = '1' THEN v.state := SET_STOP; - ELSIF v.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN + ELSIF q_reg.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN v.state := STOP_WRITING; - ELSIF v.stopped = '0' AND inp_sosi.valid = '1' AND q_reg.started = '1' THEN + ELSIF v.stopped = '0' AND inp_sosi.valid = '1' AND q_reg.started = '1' THEN v.state := WRITING; - v.wr_sosi := inp_sosi; ELSIF q_reg.stopped = '1' THEN v.state := STOP_READING; ELSE @@ -373,7 +444,6 @@ BEGIN IF inp_sosi.eop = '1' THEN v.started := '1'; - v.wr_sosi.valid := '1'; END IF; d_reg <= v; @@ -385,7 +455,6 @@ BEGIN wr_sosi <= q_reg.wr_sosi; stop_out <= q_reg.stopped; outp_bsn <= q_reg.outp_bsn; - outp_ds <= q_reg.outp_ds; rst_ddrctrl_input <= q_reg.rst_ddrctrl_input OR rst; END rtl; diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input.vhd index 208780472a0e4df9cfc607de8f8f3e87e0ffb783..c27c54acd3401cc8996d26e5dcebcd664ab65fb3 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input.vhd @@ -59,7 +59,6 @@ ENTITY ddrctrl_input IS in_stop : IN STD_LOGIC; out_sosi : OUT t_dp_sosi; -- output data out_adr : OUT NATURAL; - out_bsn_ds : OUT NATURAL; out_bsn_adr : OUT NATURAL; out_data_stopped : OUT STD_LOGIC ); @@ -76,7 +75,6 @@ ARCHITECTURE str OF ddrctrl_input IS SIGNAL sosi_p_rp : t_dp_sosi := c_dp_sosi_init; SIGNAL sosi_rp_ac : t_dp_sosi := c_dp_sosi_init; SIGNAL adr : NATURAL := 0; - SIGNAL bsn_ds : NATURAL := 0; SIGNAL valid : STD_LOGIC := '0'; SIGNAL data_stopped_rp_ac : STD_LOGIC := '0'; @@ -110,7 +108,6 @@ BEGIN in_sosi => sosi_p_rp, -- input data in_stop => in_stop, out_sosi => sosi_rp_ac, -- output data - out_bsn_ds => bsn_ds, -- amount of bits between adr [0] and sosi_arr[0][0] where bsn is assigned to out_data_stopped => data_stopped_rp_ac ); @@ -124,12 +121,10 @@ BEGIN clk => clk, rst => rst, in_sosi => sosi_rp_ac, -- input data - in_bsn_ds => bsn_ds, in_data_stopped => data_stopped_rp_ac, out_sosi => out_sosi, -- output data out_adr => adr, out_bsn_adr => out_bsn_adr, - out_bsn_ds => out_bsn_ds, out_data_stopped => out_data_stopped ); diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd index 916bbb2a18196a555303ca81f99dc0f79b188292..874e81e5ea1a12a4dd40c0247d77818f41208549 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_address_counter.vhd @@ -48,12 +48,10 @@ ENTITY ddrctrl_input_address_counter IS clk : IN STD_LOGIC; rst : IN STD_LOGIC; in_sosi : IN t_dp_sosi; -- input data - in_bsn_ds : IN NATURAL; in_data_stopped : IN STD_LOGIC; out_sosi : OUT t_dp_sosi := c_dp_sosi_init; -- output data out_adr : OUT NATURAL; out_bsn_adr : OUT NATURAL; - out_bsn_ds : OUT NATURAL; out_data_stopped : OUT STD_LOGIC ); END ddrctrl_input_address_counter; @@ -73,15 +71,13 @@ ARCHITECTURE rtl OF ddrctrl_input_address_counter IS bsn_passed : STD_LOGIC; out_sosi : t_dp_sosi; out_bsn_adr : NATURAL; - out_bsn_ds : NATURAL; out_data_stopped : STD_LOGIC; s_in_sosi : t_dp_sosi; - s_in_bsn_ds : NATURAL; s_in_data_stopped : STD_LOGIC; s_adr : NATURAL; END RECORD; - CONSTANT c_t_reg_init : t_reg := (RESET, '0', c_dp_sosi_init, 0, 0, '0', c_dp_sosi_init, 0, '0', 0); + CONSTANT c_t_reg_init : t_reg := (RESET, '0', c_dp_sosi_init, 0, '0', c_dp_sosi_init, '0', 0); -- signals for readability @@ -93,7 +89,7 @@ BEGIN q_reg <= d_reg WHEN rising_edge(clk); -- Increments the address each time in_sosi.valid = '1', if address = g_max_adr the address is reset to 0. - p_adr : PROCESS(rst, in_sosi, in_bsn_ds, in_data_stopped, q_reg) + p_adr : PROCESS(rst, in_sosi, in_data_stopped, q_reg) VARIABLE v : t_reg; @@ -102,16 +98,14 @@ BEGIN -- compensate for delay in ddrctrl_input_address_counter v.out_sosi := q_reg.s_in_sosi; - v.out_bsn_ds := q_reg.s_in_bsn_ds; v.out_data_stopped := q_reg.s_in_data_stopped; v.s_in_sosi := in_sosi; - v.s_in_bsn_ds := in_bsn_ds; v.s_in_data_stopped := in_data_stopped; CASE q_reg.state IS WHEN RESET => - v.s_adr := 0; + v := c_t_reg_init; IF q_reg.s_in_sosi.sop = '1' THEN v.out_bsn_adr := v.s_adr; @@ -136,7 +130,7 @@ BEGIN WHEN IDLE => -- after a reset skip the first data block so the ddr memory can initialize. - IF NOT(q_reg.s_in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN + IF in_sosi.sop = '1' THEN v.bsn_passed := '1'; END IF; @@ -160,7 +154,6 @@ BEGIN out_sosi <= q_reg.out_sosi; out_adr <= q_reg.s_adr; out_bsn_adr <= q_reg.out_bsn_adr; - out_bsn_ds <= q_reg.out_bsn_ds; out_sosi.bsn <= q_reg.out_sosi.bsn; out_data_stopped <= q_reg.out_data_stopped; diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd index 7b7a3ed0d98c5229929b4d25982b3aa41910a258..f85f1b201e9f30497302d8b684c47f73647325c9 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_input_repack.vhd @@ -48,7 +48,6 @@ ENTITY ddrctrl_input_repack IS in_sosi : IN t_dp_sosi; -- input data in_stop : IN STD_LOGIC := '0'; out_sosi : OUT t_dp_sosi := c_dp_sosi_init; -- output data - out_bsn_ds : OUT NATURAL := 0; out_bsn_wr : OUT STD_LOGIC := '0'; out_data_stopped : OUT STD_LOGIC := '0' ); @@ -69,19 +68,16 @@ ARCHITECTURE rtl OF ddrctrl_input_repack IS state : t_state; -- the state the process is currently in; c_v : STD_LOGIC_VECTOR(k_c_v_w-1 DOWNTO 0); -- the vector that stores the input data until the data is put into the output data vector c_v_count : NATURAL; -- the amount of times the c_v vector received data from the input since the last time it was filled completely - a_of : NATURAL; -- this is the amount of bits that the first data word(168) is shifted from the first bit in the data word(576) q_bsn : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); - q_sop : STD_LOGIC; - q_out_bsn_ds : NATURAL; + q_sop : STD_LOGIC; s_input_cnt : NATURAL; out_of : NATURAL; out_data_count : STD_LOGIC; -- the amount of times the output data vector has been filled since the last time c_v was filled completely out_sosi : t_dp_sosi; -- this is the sosi stream that contains the data - out_bsn_ds : NATURAL; -- this is the amount of bits that the data corresponding to out_bsn is shifted from the first bit in that data word out_data_stopped : STD_LOGIC; -- this signal is '1' when there is no more data comming form ddrctrl_input_pack END RECORD; - CONSTANT c_t_reg_init : t_reg := (RESET, (OTHERS => '0'), 0, 0, (OTHERS => '0'), '0', 0, 0, 0, '0', c_dp_sosi_init, 0, '0'); + CONSTANT c_t_reg_init : t_reg := (RESET, (OTHERS => '0'), 0, (OTHERS => '0'), '0', 0, 0, '0', c_dp_sosi_init, '0'); -- signals for readability @@ -125,7 +121,7 @@ BEGIN v.state := FILL_VECTOR; END IF; - IF NOT (q_reg.q_bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN + IF in_sosi.eop = '1' THEN v.s_input_cnt := 0; v.state := BSN; END IF; @@ -139,7 +135,6 @@ BEGIN v.out_data_count := '1'; -- increase the counter of out_sosi.data with 1 v.s_input_cnt := q_reg.s_input_cnt+1; v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := q_reg.q_bsn(c_dp_stream_bsn_w-1 DOWNTO 0); - v.out_bsn_ds := q_reg.q_out_bsn_ds; v.out_sosi.sop := q_reg.q_sop; v.out_sosi.eop := '0'; v.out_data_stopped := '0'; @@ -155,7 +150,7 @@ BEGIN v.state := FILL_VECTOR; END IF; - IF NOT (q_reg.q_bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN + IF in_sosi.eop = '1' THEN v.s_input_cnt := 0; v.state := BSN; END IF; @@ -186,7 +181,7 @@ BEGIN v.state := FILL_VECTOR; END IF; - IF NOT (q_reg.q_bsn(c_dp_stream_bsn_w-1 DOWNTO 0) = in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0)) THEN + IF in_sosi.eop = '1' THEN v.s_input_cnt := 0; v.state := BSN; END IF; @@ -195,23 +190,18 @@ BEGIN WHEN BSN => v.c_v(k_c_v_w-1 DOWNTO ((g_in_data_w*q_reg.c_v_count)+q_reg.out_of)) := (OTHERS =>'0'); + v.out_of := 0; IF ((g_in_data_w*q_reg.c_v_count)+q_reg.out_of < c_out_data_w*1) THEN v.out_sosi.data(c_out_data_w-1 DOWNTO 0) := v.c_v(c_out_data_w-1 DOWNTO 0); -- fill out_sosi.data with 1st part of c_v - v.out_sosi.valid := '1'; -- out_sosi.valid 1 + v.out_sosi.valid := '1'; -- out_sosi.valid 1 ELSE v.out_sosi.data(c_out_data_w-1 DOWNTO 0) := v.c_v(k_c_v_w-1 DOWNTO c_out_data_w); -- fill out_sosi.data with 2nd part of c_v - v.out_sosi.valid := '1'; -- out_sosi.valid 1 + v.out_sosi.valid := '1'; -- out_sosi.valid 1 END IF; -- BSN_INPUT v.q_bsn := in_sosi.bsn; -- a bsn number is saved when the bsn changes - IF g_in_data_w*q_reg.c_v_count+q_reg.out_of >= c_out_data_w THEN - v.q_out_bsn_ds := g_in_data_w*q_reg.c_v_count+q_reg.out_of-c_out_data_w; -- the amount of bits between word[0] and data[0] where data is the data with the bsn - ELSE - v.q_out_bsn_ds := g_in_data_w*q_reg.c_v_count+q_reg.out_of; -- the amount of bits between word[0] and data[0] where data is the data with the bsn - END IF; v.q_sop := '1'; -- a signal which indicates that a bsn is written in this word(576) so the address counter can save the corresponinding address. (there are delay in address counter so in_adr is not the same as the address of the word the data from the bsn is written to) - v.a_of := 0; v.c_v(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0); -- fill c_v v.c_v_count := 1; -- increase the counter of c_v with 1 v.out_data_count := '0'; @@ -270,7 +260,6 @@ BEGIN -- fill outputs out_sosi <= q_reg.out_sosi; - out_bsn_ds <= q_reg.out_bsn_ds; out_data_stopped <= q_reg.out_data_stopped; END rtl; diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd index 7896dad2a2c726a34178cab7509d3d598e2ccbf0..2e48f3e4d7861b920a159cc8343f0283e10ef3ea 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output.vhd @@ -46,14 +46,14 @@ ENTITY ddrctrl_output IS g_in_data_w : NATURAL := 576; g_nof_streams : NATURAL := 12; -- number of input streams g_data_w : NATURAL := 14; -- data with of input data vectors - g_block_size : NATURAL := 1024 + g_block_size : NATURAL := 1024; + g_bim : NATURAL := 54 ); PORT ( clk : IN STD_LOGIC := '0'; rst : IN STD_LOGIC; in_sosi : IN t_dp_sosi := c_dp_sosi_init; -- input data - in_ds : IN NATURAL; -- amount of internal overflow this output - in_bsn : IN STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); -- bsn corresponding to the data at in_data[in_of] + in_bsn : IN STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); out_sosi_arr : OUT t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_init); -- output data out_ready : OUT STD_LOGIC ); @@ -76,13 +76,13 @@ BEGIN g_tech_ddr => g_tech_ddr, g_in_data_w => g_in_data_w, g_out_data_w => c_out_data_w, - g_block_size => g_block_size + g_block_size => g_block_size, + g_bim => g_bim ) PORT MAP( clk => clk, rst => rst, in_sosi => in_sosi, -- input data - in_ds => in_ds, in_bsn => in_bsn, out_sosi => sosi, -- output data out_ready => out_ready diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd index 9c8555f3ea8561de24a5de65de0aeaf88bd57c69..fd2a2c43425cc68e36961da24a6ec62f21b62065 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_repack.vhd @@ -50,9 +50,11 @@ BEGIN -- putting the data from the stream into different streams. gen_repack_data : FOR I IN 0 TO g_nof_streams-1 GENERATE - out_sosi_arr(I).data(g_data_w-1 DOWNTO 0) <= in_sosi.data(g_data_w*(I+1)-1 DOWNTO g_data_w*I); - out_sosi_arr(I).bsn(c_dp_stream_bsn_w-1 DOWNTO 0) <= in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0); - out_sosi_arr(I).valid <= in_sosi.valid; + out_sosi_arr(I).data(g_data_w-1 DOWNTO 0) <= in_sosi.data(g_data_w*(I+1)-1 DOWNTO g_data_w*I); + out_sosi_arr(I).bsn(c_dp_stream_bsn_w-1 DOWNTO 0) <= in_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0); + out_sosi_arr(I).valid <= in_sosi.valid; + out_sosi_arr(I).sop <= in_sosi.sop; + out_sosi_arr(I).eop <= in_sosi.eop; END GENERATE; END rtl; diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd index 823f5e3ec6ae6e3ad0d25bafedd34b46b25af57e..5f92f62557d7b530caf860856400fba7bef66338 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd @@ -42,13 +42,13 @@ ENTITY ddrctrl_output_unpack IS g_tech_ddr : t_c_tech_ddr; g_in_data_w : NATURAL; g_out_data_w : NATURAL; - g_block_size : NATURAL + g_block_size : NATURAL; + g_bim : NATURAL ); PORT ( clk : IN STD_LOGIC; rst : IN STD_LOGIC; in_sosi : IN t_dp_sosi := c_dp_sosi_init; - in_ds : IN NATURAL; in_bsn : IN STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); out_sosi : OUT t_dp_sosi := c_dp_sosi_init; out_ready : OUT STD_LOGIC := '0' @@ -58,8 +58,10 @@ END ddrctrl_output_unpack; ARCHITECTURE rtl OF ddrctrl_output_unpack IS + CONSTANT c_v_w : NATURAL := g_in_data_w*2; + -- type for statemachine - TYPE t_state IS ( READING, FIRST_READ, SECOND_READ, OVER_HALF, RESET, IDLE, OFF); + TYPE t_state IS ( READING, FIRST_READ, OVER_HALF, BSN, RESET, IDLE, OFF); -- record for readability TYPE t_reg IS RECORD @@ -68,15 +70,14 @@ ARCHITECTURE rtl OF ddrctrl_output_unpack IS op_data_cnt : NATURAL; delay_data : STD_LOGIC_VECTOR(g_in_data_w-1 DOWNTO 0); dd_fresh : STD_LOGIC; - c_v : STD_LOGIC_VECTOR(g_in_data_w*2-1 DOWNTO 0); - sr_done : STD_LOGIC; + valid_data : STD_LOGIC; + c_v : STD_LOGIC_VECTOR(c_v_w-1 DOWNTO 0); bsn_cnt : NATURAL; out_sosi : t_dp_sosi; out_ready : STD_LOGIC; END RECORD; - CONSTANT c_t_reg_init : t_reg := (RESET, 0, 0, (OTHERS => '0'), '0', (OTHERS => '0'), '0', 0, c_dp_sosi_init, '0'); - + CONSTANT c_t_reg_init : t_reg := (RESET, 0, 0, (OTHERS => '0'), '0', '0', (OTHERS => '0'), 0, c_dp_sosi_init, '0'); -- signals for readability SIGNAL d_reg : t_reg := c_t_reg_init; @@ -87,7 +88,7 @@ BEGIN q_reg <= d_reg WHEN rising_edge(clk); -- put the input data into c_v and fill the output vector from c_v - p_state : PROCESS(q_reg, rst, in_sosi, in_ds, in_bsn) + p_state : PROCESS(q_reg, rst, in_sosi) VARIABLE v : t_reg; @@ -104,107 +105,205 @@ BEGIN v.bsn_cnt := q_reg.bsn_cnt+1; v.op_data_cnt := q_reg.op_data_cnt+1; - IF q_reg.bsn_cnt = g_block_size-1 THEN - v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := INCR_UVEC(q_reg.out_sosi.bsn, 1); - v.bsn_cnt := 0; + IF q_reg.dd_fresh = '1' AND q_reg.valid_data = '0' THEN + -- put the delay data into the second half of c_v beceause these are now zeros + v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); + v.dd_fresh := '0'; + v.valid_data := '1'; END IF; - IF in_sosi.valid = '1' THEN v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0); v.dd_fresh := '1'; END IF; - IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN + IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND (v.dd_fresh = '1' OR v.valid_data = '1')THEN v.state := OVER_HALF; - ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '0' THEN + ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '0' AND v.valid_data = '0' THEN v.state := IDLE; ELSE v.state := READING; END IF; + IF q_reg.out_sosi.eop = '1' THEN + v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := INCR_UVEC(q_reg.out_sosi.bsn, 1); + v.out_sosi.eop := '0'; + v.out_sosi.sop := '1'; + v.bsn_cnt := 0; + ELSIF q_reg.out_sosi.sop = '1' THEN + v.out_sosi.sop := '0'; + END IF; + + IF q_reg.bsn_cnt = g_block_size-3 THEN + v.state := BSN; + v.out_ready := '1'; + END IF; + + WHEN OVER_HALF => -- generating output data from c_v but past the halfway point of c_v so there needs to be new data added - v.out_ready := '1'; - v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of); - v.out_sosi.valid := '1'; - v.bsn_cnt := q_reg.bsn_cnt+1; - v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(g_in_data_w*2-1 DOWNTO g_in_data_w); - v.c_v(g_in_data_w*2-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); - v.dd_fresh := '0'; - v.a_of := (g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-g_in_data_w; - v.op_data_cnt := 0; - - IF q_reg.bsn_cnt = g_block_size-1 THEN - v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := INCR_UVEC(q_reg.out_sosi.bsn, 1); - v.bsn_cnt := 0; + IF q_reg.dd_fresh = '1' AND q_reg.valid_data = '1' THEN + v.out_ready := '1'; + -- generate output from the middle of c_v + v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of); + v.out_sosi.valid := '1'; + v.bsn_cnt := q_reg.bsn_cnt+1; + -- put the second half of c_v into the first half of c_v + v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w); + -- put the delay data into the first half of c_v + v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); + v.dd_fresh := '0'; + v.a_of := ((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of)-g_in_data_w; + v.op_data_cnt := 0; + ELSIF q_reg.dd_fresh = '0' AND q_reg.valid_data = '1' THEN + v.out_ready := '1'; + -- generate output from the middle of c_v + v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of); + v.out_sosi.valid := '1'; + v.bsn_cnt := q_reg.bsn_cnt+1; + -- put the second half of c_v into the first half of c_v + v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w); + -- put zeros into the second half of c_v beceause dd_fresh is '0' + v.c_v(c_v_w-1 DOWNTO g_in_data_w) := (OTHERS => '0'); + v.a_of := ((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of)-g_in_data_w; + v.op_data_cnt := 0; + v.valid_data := '0'; + ELSIF q_reg.dd_fresh = '1' AND q_reg.valid_data = '0' THEN + v.out_ready := '1'; + -- put the delay data into the second half of c_v beceause these are now zeros + v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); + -- generate output from the middle of c_v + v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of); + -- put the second half of c_v into the first half of c_v + v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w); + v.out_sosi.valid := '1'; + v.bsn_cnt := q_reg.bsn_cnt+1; + v.dd_fresh := '0'; + v.a_of := ((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of)-g_in_data_w; + v.op_data_cnt := 0; END IF; + + + IF in_sosi.valid = '1' THEN v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0); - v.dd_fresh := '1'; + v.dd_fresh := '1'; END IF; - - IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN - v.state := OVER_HALF; - ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '0' THEN - v.state := IDLE; + IF (g_out_data_w*(v.op_data_cnt+1))+v.a_of >= g_in_data_w AND (v.dd_fresh = '1' OR v.valid_data = '1') THEN + v.state := OVER_HALF; + ELSIF q_reg.dd_fresh = '0' AND q_reg.valid_data = '0' THEN + v.state := IDLE; ELSE - v.state := READING; + v.state := READING; + END IF; + + IF q_reg.out_sosi.sop = '1' THEN + v.out_sosi.sop := '0'; END IF; + IF q_reg.bsn_cnt = g_block_size-3 THEN + v.state := BSN; + v.dd_fresh := '1'; + END IF; WHEN FIRST_READ => - -- fills the first half of c_v and generates a output from it. - v.out_ready := '0'; + -- fills the first half of c_v and generates output from it. + v.out_ready := '0'; + v.c_v(c_v_w-1 DOWNTO 0) := (OTHERS => '0'); v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); - v.dd_fresh := '0'; + v.dd_fresh := '0'; v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v(g_out_data_w+v.a_of-1 DOWNTO v.a_of); - v.out_sosi.valid := '1'; + v.out_sosi.valid := '0'; v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := in_bsn(c_dp_stream_bsn_w-1 DOWNTO 0); - + v.out_sosi.sop := '1'; + v.out_sosi.eop := '0'; + v.bsn_cnt := 0; + v.op_data_cnt := q_reg.op_data_cnt+1; + + IF v.dd_fresh = '1' AND v.valid_data = '0' THEN + -- put the delay data into the second half of c_v beceause these are now zeros + v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); + v.dd_fresh := '0'; + v.valid_data := '1'; + END IF; IF in_sosi.valid = '1' THEN v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0); - v.dd_fresh := '1'; + v.dd_fresh := '1'; END IF; - IF v.dd_fresh = '1' THEN - v.state := SECOND_READ; - ELSE - v.state := IDLE; + v.state := READING; + + WHEN BSN => + -- generating output data from c_v but past the halfway point of c_v so there needs to be new data added also increases the bsn output + v.out_sosi.valid := '0'; + IF q_reg.dd_fresh = '1' AND q_reg.valid_data = '1' THEN + -- generate output from the middle of c_v + v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of); + v.out_sosi.valid := '1'; + v.bsn_cnt := q_reg.bsn_cnt+1; + -- put the second half of c_v into the first half of c_v + v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w); + -- put the delay data into the first half of c_v + v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); + v.dd_fresh := '0'; + v.op_data_cnt := 0; + ELSIF q_reg.dd_fresh = '0' AND q_reg.valid_data = '1' THEN + -- generate output from the middle of c_v + v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of); + v.out_sosi.valid := '1'; + v.bsn_cnt := q_reg.bsn_cnt+1; + -- put the second half of c_v into the first half of c_v + v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w); + -- put zeros into the second half of c_v beceause dd_fresh is '0' + v.c_v(c_v_w-1 DOWNTO g_in_data_w) := (OTHERS => '0'); + v.op_data_cnt := 0; + v.valid_data := '0'; + ELSIF q_reg.dd_fresh = '1' AND q_reg.valid_data = '0' THEN + -- put the delay data into the second half of c_v beceause these are now zeros + v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); + -- generate output from the middle of c_v + v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of); + -- put the second half of c_v into the first half of c_v + v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(c_v_w-1 DOWNTO g_in_data_w); + v.out_sosi.valid := '1'; + v.bsn_cnt := q_reg.bsn_cnt+1; + v.dd_fresh := '0'; + v.op_data_cnt := 0; + ELSIF q_reg.dd_fresh = '0' AND q_reg.valid_data = '0' AND (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of < g_in_data_w THEN + -- generate output from the middle of c_v + v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of); + v.out_sosi.valid := '1'; + v.bsn_cnt := q_reg.bsn_cnt+1; END IF; - WHEN SECOND_READ => - -- fills the second half of c_v and generates a output from it. - v.out_ready := '0'; - v.c_v(g_in_data_w*2-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); - v.dd_fresh := '0'; - v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v(g_out_data_w*2+q_reg.a_of-1 DOWNTO g_out_data_w+q_reg.a_of); - v.out_sosi.valid := '1'; - v.bsn_cnt := 1; - v.op_data_cnt := 2; - v.sr_done := '1'; + v.out_ready := '0'; + v.out_sosi.eop := '1'; + v.a_of := 0; + v.bsn_cnt := q_reg.bsn_cnt+1; + IF v.dd_fresh = '1' AND v.valid_data = '0' THEN + -- put the delay data into the second half of c_v beceause these are now zeros + v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); + v.dd_fresh := '0'; + v.valid_data := '1'; + END IF; IF in_sosi.valid = '1' THEN v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0); - v.dd_fresh := '1'; + v.dd_fresh := '1'; END IF; - - IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN - v.state := OVER_HALF; - ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '0' THEN - v.state := IDLE; + IF g_bim+TO_UINT(in_bsn)-1 = TO_UINT(v.out_sosi.bsn) THEN + v.state := OFF; ELSE - v.state := READING; + v.state := READING; END IF; - WHEN RESET => v := c_t_reg_init; @@ -220,16 +319,20 @@ BEGIN v.out_ready := '1'; v.out_sosi.valid := '0'; + IF q_reg.dd_fresh = '1' AND q_reg.valid_data = '0' THEN + -- put the delay data into the second half of c_v beceause these are now zeros + v.c_v(c_v_w-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); + v.dd_fresh := '0'; + v.valid_data := '1'; + END IF; IF in_sosi.valid = '1' THEN v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0); v.dd_fresh := '1'; END IF; - IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' AND q_reg.sr_done = '1' THEN + IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1'THEN v.state := OVER_HALF; - ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' AND q_reg.sr_done = '0' THEN - v.state := SECOND_READ; ELSE v.state := IDLE; END IF; @@ -240,7 +343,7 @@ BEGIN -- the stamachine has a state off so it knows when to go to first read, it can't go to first read from IDLE v.out_ready := '1'; v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0); - + v.out_sosi := c_dp_sosi_init; IF in_sosi.valid = '1' THEN v.state := FIRST_READ; diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd index 422c72f091f333e4dc5d57da568da322917e21c5..881d039d0bfc8bbea512fcebfc74ac169d3b9801 100644 --- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd +++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd @@ -1,3 +1,4 @@ + ------------------------------------------------------------------------------- -- -- Copyright 2022 @@ -59,7 +60,7 @@ ARCHITECTURE tb OF tb_ddrctrl IS -- constants for readability CONSTANT c_ctrl_data_w : NATURAL := func_tech_ddr_ctlr_data_w(c_tech_ddr); -- 576 - CONSTANT c_in_data_w : NATURAL := g_nof_streams * g_data_w; -- output data with, 168 + CONSTANT c_in_data_w : NATURAL := g_nof_streams*g_data_w; -- output data with, 168 -- constants for testbench CONSTANT c_clk_freq : NATURAL := 200; -- clock frequency in MHz @@ -128,7 +129,6 @@ ARCHITECTURE tb OF tb_ddrctrl IS SIGNAL mm_rst : STD_LOGIC := '0'; SIGNAL in_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_init); -- input data signal for ddrctrl_pack.vhd SIGNAL stop_in : STD_LOGIC := '0'; - SIGNAL bsn : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0) := (OTHERS => '0'); SIGNAL out_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_init); -- testbench signal @@ -158,6 +158,9 @@ BEGIN -- excecuting test p_test : PROCESS + + + BEGIN -- start the test @@ -180,29 +183,26 @@ BEGIN make_data : FOR J IN 0 TO c_bim*g_block_size-1 LOOP in_data_cnt <= in_data_cnt+1; fill_in_sosi_arr : FOR I IN 0 TO g_nof_streams-1 LOOP - in_sosi_arr(I).data(g_data_w-1 DOWNTO 0) <= c_total_vector(g_data_w*(I+1)+J*c_in_data_w-1 DOWNTO g_data_w*I+J*c_in_data_w); - in_sosi_arr(I).valid <= '1'; - in_sosi_arr(I).bsn(c_dp_stream_bsn_w-1 DOWNTO 0) <= bsn(c_dp_stream_bsn_w-1 DOWNTO 0); IF bsn_cnt = g_block_size-1 THEN - bsn_cnt <= 0; - FOR I IN 0 TO g_nof_streams-1 LOOP - in_sosi_arr(I).sop <= '1'; - in_sosi_arr(I).eop <= '0'; - END LOOP; - bsn <= INCR_UVEC(bsn, 1); + IF I = 0 THEN + bsn_cnt <= 0; + END IF; + in_sosi_arr(I).sop <= '1'; + in_sosi_arr(I).eop <= '0'; + in_sosi_arr(I).bsn <= INCR_UVEC(in_sosi_arr(I).bsn, 1); ELSE - bsn_cnt <= bsn_cnt + 1; - FOR I IN 0 TO g_nof_streams-1 LOOP - in_sosi_arr(I).sop <= '0'; - END LOOP; + IF I = 0 THEN + bsn_cnt <= bsn_cnt + 1; + END IF; + in_sosi_arr(I).sop <= '0'; END IF; IF bsn_cnt = g_block_size-2 THEN - FOR I IN 0 TO g_nof_streams-1 LOOP - in_sosi_arr(I).eop <= '1'; - END LOOP; + in_sosi_arr(I).eop <= '1'; END IF; + in_sosi_arr(I).data(g_data_w-1 DOWNTO 0) <= c_total_vector(g_data_w*(I+1)+J*c_in_data_w-1 DOWNTO g_data_w*I+J*c_in_data_w); + in_sosi_arr(I).valid <= '1'; END LOOP; - IF K = 1 AND J = c_bim*g_block_size-1 THEN + IF K = 0 AND J = c_bim*g_block_size-1 THEN stop_in <= '1'; ELSE stop_in <= '0'; diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd index e9e7f6c3ad9dc6ddb43161bb98e7862d677bed61..294fbe0f43ca72b0086a13d98e67469fb971ce98 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd @@ -23,18 +23,18 @@ -- Author: R. van der Walle, E. Kooistra -- Purpose: -- . This package contains sdp specific constants. --- Description: --- Remark: --- . See Document: L3 SDP Decision: SDP Parameter definitions. --- https://support.astron.nl/confluence/display/L2M/L3+SDP+Decision%3A+SDP+Parameter+definitions +-- Description: See [1] +-- References: +-- . [1] https://support.astron.nl/confluence/display/L2M/L3+SDP+Decision%3A+SDP+Parameter+definitions ------------------------------------------------------------------------------- -LIBRARY IEEE, common_lib, rTwoSDF_lib, fft_lib, filter_lib, wpfb_lib; +LIBRARY IEEE, common_lib, rTwoSDF_lib, fft_lib, filter_lib, wpfb_lib, diag_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.math_real.ALL; USE common_lib.common_pkg.ALL; USE common_lib.common_mem_pkg.ALL; USE common_lib.common_field_pkg.ALL; USE common_lib.common_network_layers_pkg.ALL; +USE diag_lib.diag_pkg.ALL; USE rTwoSDF_lib.rTwoSDFPkg.ALL; USE fft_lib.fft_pkg.ALL; USE filter_lib.fil_pkg.ALL; @@ -62,8 +62,7 @@ PACKAGE sdp_pkg is (OTHERS => '0') ); ------------------------------------------------- - -- SDP specific parameters as defined in: - -- L3 SDP Decision: SDP Parameter definitions + -- SDP specific parameters as defined in [1] CONSTANT c_sdp_f_adc_MHz : NATURAL := 200; CONSTANT c_sdp_N_beamsets : NATURAL := 2; -- = N_beamsets_sdp in doc CONSTANT c_sdp_N_cross_sets_sdp : NATURAL := 1; @@ -110,24 +109,25 @@ PACKAGE sdp_pkg is CONSTANT c_sdp_N_ring_nof_mac10g : NATURAL := 3; -- for sdp_station_xsub_ring design. -- Derived constants - CONSTANT c_sdp_FS_adc : NATURAL := 2**(c_sdp_W_adc - 1); -- full scale FS corresponds to amplitude 1.0 - CONSTANT c_sdp_N_clk_per_sync : NATURAL := c_sdp_f_adc_MHz*10**6; -- Default 200M clock cycles per second - CONSTANT c_sdp_N_clk_sync_timeout : NATURAL := c_sdp_f_adc_MHz*10**6 + c_sdp_f_adc_MHz*10**5; -- 10% margin. - CONSTANT c_sdp_N_sync_jesd : NATURAL := c_sdp_S_pn * c_sdp_N_sync_rcu / c_sdp_S_rcu; -- = 4, nof JESD IP sync outputs per PN - CONSTANT c_sdp_A_pn : NATURAL := c_sdp_S_pn / c_sdp_N_pol; -- = 6 dual pol antenna per PN, is 6 signal input pairs - CONSTANT c_sdp_P_pfb : NATURAL := c_sdp_S_pn / c_sdp_Q_fft; -- = 6 PFB units, for 6 signal input pairs - CONSTANT c_sdp_T_adc : TIME := (10**6 / c_sdp_f_adc_MHz) * 1 ps; -- = 5 ns @ 200MHz - CONSTANT c_sdp_T_sub : TIME := c_sdp_N_fft * c_sdp_T_adc; -- = 5.12 us @ 200MHz - CONSTANT c_sdp_W_bf_product : NATURAL := c_sdp_W_subband + c_sdp_W_bf_weight -1; - CONSTANT c_sdp_X_sq : NATURAL := c_sdp_S_pn * c_sdp_S_pn; -- = 144 - CONSTANT c_sdp_block_period : NATURAL := c_sdp_N_fft * 1000 / c_sdp_f_adc_MHz; -- = 5120 [ns] - CONSTANT c_sdp_N_beamlets_sdp : NATURAL := c_sdp_N_beamsets * c_sdp_S_sub_bf; -- = 976 - CONSTANT c_sdp_unit_sub_weight : NATURAL := 2**c_sdp_W_sub_weight_fraction; -- 2**13, so range +-4.0 for 16 bit signed weight - CONSTANT c_sdp_unit_bf_weight : NATURAL := 2**c_sdp_W_bf_weight_fraction; -- 2**14, so range +-2.0 for 16 bit signed weight - CONSTANT c_sdp_unit_beamlet_scale : NATURAL := 2**c_sdp_W_beamlet_scale_fraction; -- 2**15, so range +-1.0 for 16 bit signed weight - - -- Default / tb values - CONSTANT c_sdp_beamlet_scale_default : NATURAL := 2**15; + CONSTANT c_sdp_FS_adc : NATURAL := 2**(c_sdp_W_adc - 1); -- full scale FS corresponds to amplitude 1.0, will just cause clipping of +FS to +FS-1 + CONSTANT c_sdp_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / REAL(c_sdp_FS_adc); -- WG amplitude in number of LSbit resolution steps + CONSTANT c_sdp_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus + CONSTANT c_sdp_N_clk_per_sync : NATURAL := c_sdp_f_adc_MHz*10**6; -- Default 200M clock cycles per second + CONSTANT c_sdp_N_clk_sync_timeout : NATURAL := c_sdp_f_adc_MHz*10**6 + c_sdp_f_adc_MHz*10**5; -- 10% margin. + CONSTANT c_sdp_N_sync_jesd : NATURAL := c_sdp_S_pn * c_sdp_N_sync_rcu / c_sdp_S_rcu; -- = 4, nof JESD IP sync outputs per PN + CONSTANT c_sdp_A_pn : NATURAL := c_sdp_S_pn / c_sdp_N_pol; -- = 6 dual pol antenna per PN, is 6 signal input pairs + CONSTANT c_sdp_P_pfb : NATURAL := c_sdp_S_pn / c_sdp_Q_fft; -- = 6 PFB units, for 6 signal input pairs + CONSTANT c_sdp_T_adc : TIME := (10**6 / c_sdp_f_adc_MHz) * 1 ps; -- = 5 ns @ 200MHz + CONSTANT c_sdp_T_sub : TIME := c_sdp_N_fft * c_sdp_T_adc; -- = 5.12 us @ 200MHz + CONSTANT c_sdp_W_bf_product : NATURAL := c_sdp_W_subband + c_sdp_W_bf_weight -1; + CONSTANT c_sdp_X_sq : NATURAL := c_sdp_S_pn * c_sdp_S_pn; -- = 144 + CONSTANT c_sdp_block_period : NATURAL := c_sdp_N_fft * 1000 / c_sdp_f_adc_MHz; -- = 5120 [ns] + CONSTANT c_sdp_N_beamlets_sdp : NATURAL := c_sdp_N_beamsets * c_sdp_S_sub_bf; -- = 976 + + -- . unit weights + CONSTANT c_sdp_unit_sub_weight : NATURAL := 2**c_sdp_W_sub_weight_fraction; -- 2**13, so range +-4.0 for 16 bit signed weight + CONSTANT c_sdp_unit_bf_weight : NATURAL := 2**c_sdp_W_bf_weight_fraction; -- 2**14, so range +-2.0 for 16 bit signed weight + CONSTANT c_sdp_unit_beamlet_scale : NATURAL := 2**c_sdp_W_beamlet_scale_fraction; -- 2**15, so range +-1.0 for 16 bit signed weight ----------------------------------------------------------------------------- -- PFB @@ -366,7 +366,7 @@ PACKAGE sdp_pkg is ( field_name_pad("sdp_source_info_gn_id" ), "RW", 5, field_default(0) ), ( field_name_pad("sdp_reserved" ), "RW", 40, field_default(0) ), - ( field_name_pad("sdp_beamlet_scale" ), "RW", 16, field_default(c_sdp_beamlet_scale_default) ), + ( field_name_pad("sdp_beamlet_scale" ), "RW", 16, field_default(c_sdp_unit_beamlet_scale) ), ( field_name_pad("sdp_beamlet_index" ), "RW", 16, field_default(0) ), ( field_name_pad("sdp_nof_blocks_per_packet" ), "RW", 8, field_default(c_sdp_cep_nof_blocks_per_packet) ), ( field_name_pad("sdp_nof_beamlets_per_block" ), "RW", 16, field_default(c_sdp_cep_nof_beamlets_per_block) ), diff --git a/doc/erko_howto_tools.txt b/doc/erko_howto_tools.txt index 3da862a891f2babd981d398dfe9ad1169de2ea42..f1eff095dee90cfb466a4ac0b68bd37a8aef4cbd 100755 --- a/doc/erko_howto_tools.txt +++ b/doc/erko_howto_tools.txt @@ -21,6 +21,7 @@ * Jupyter * Graphana * Zenodo DOI +* SDPTR @@ -491,8 +492,23 @@ Host dop421 * Remote access to regression test machine dop349: ssh -X kooistra@portal.astron.nl -ssh -X regtest@dop349 +# Ipv via portal.astron.nl nu via bastion.astron.nl (195.169.155.27) mbv step client +# zie: https://support.astron.nl/confluence/pages/viewpage.action?spaceKey=IN&title=SSH+access+to+the+ASTRON+network + +/home/kooistra/.ssh/config +/home/kooistra/.step/ssh/config +/home/kooistra/.step/ssh/known_hosts + +ssh -J bastion.astron.nl regtest@dop349.astron.nl +You won't be asked for a (bastion) password. The certificate you've just generated will last for twelve hours. Once it's elapsed, the only step from the above you need to perform again is + +$ step ssh login kooistra@astron.nl --provisioner "keycloak" + +Whereupon you'll be good for another twelve hours. The above command is a great candidate for a shell alias. + + +# On dop349 crontab -l # shows scheduled cron jobs crontab -e # edit schedule @@ -919,3 +935,16 @@ Reading package lists... Done > sudo apt-get install openscad Gelukt ! + + +******************************************************************************* +* SDPTR +******************************************************************************* + +sudo pip3 install setuptools-rust +sudo pip3 install asyncua + +:kooistra@dop466:/dop466_0/kooistra/git/sdptr/test/py/control$ ./sdp_rw.py --host dop421 -l +:kooistra@dop466:/dop466_0/kooistra/git/sdptr/test/py/control$ ./sdp_rw.py --host dop421 -r firmware_version + + diff --git a/libraries/base/common/src/vhdl/common_pkg.vhd b/libraries/base/common/src/vhdl/common_pkg.vhd index d57813bc9a4de02174e449cce1cf367fc7049baa..ef84bffe9d09ed520781e7108c6212dddc026d18 100644 --- a/libraries/base/common/src/vhdl/common_pkg.vhd +++ b/libraries/base/common/src/vhdl/common_pkg.vhd @@ -193,7 +193,9 @@ PACKAGE common_pkg IS FUNCTION ratio( n, d : NATURAL) RETURN NATURAL; -- return n/d when n MOD d = 0 else return 0, so ratio * d = n only when integer ratio > 0 FUNCTION ratio2(n, m : NATURAL) RETURN NATURAL; -- return integer ratio of n/m or m/n, whichever is the largest - + + -- use almost_equal(a/b, 1.0, max_ratio) to verify that a and b differ less than max_ratio/100 percent + -- use almost_zero(a/b, max_ratio) to verify that a is less than max_ratio/100 percent of b, so almost zero FUNCTION almost_equal(a, b, delta : REAL) RETURN BOOLEAN; -- return TRUE when abs(a - b) < abs(delta), else return FALSE FUNCTION almost_zero(a, delta : REAL) RETURN BOOLEAN; -- return TRUE when abs(a) < abs(delta), else return FALSE