diff --git a/libraries/base/dp/src/vhdl/dp_bsn_align_v2.vhd b/libraries/base/dp/src/vhdl/dp_bsn_align_v2.vhd index 051a6533af01d0afb85aa59f074c0c48220fa7b4..ed3cfcba50327e86a79eddb393e015e47f2f76ce 100644 --- a/libraries/base/dp/src/vhdl/dp_bsn_align_v2.vhd +++ b/libraries/base/dp/src/vhdl/dp_bsn_align_v2.vhd @@ -131,6 +131,14 @@ ARCHITECTURE rtl OF dp_bsn_align_v2 IS out_bsn : STD_LOGIC_VECTOR(g_bsn_w-1 DOWNTO 0); -- hold BSN for streaming output END RECORD; + TYPE t_comb IS RECORD + ref_sosi : t_dp_sosi; + pointer_slv : STD_LOGIC_VECTOR(c_blk_pointer_w-1 DOWNTO 0); + product_slv : STD_LOGIC_VECTOR(c_product_w-1 DOWNTO 0); + lost_data_flag : STD_LOGIC; + out_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + END RECORD; + CONSTANT c_reg_rst : t_reg := (0, (OTHERS=>c_mem_copi_rst), (OTHERS=>(OTHERS=>'0')), @@ -145,11 +153,14 @@ ARCHITECTURE rtl OF dp_bsn_align_v2 IS (OTHERS=>c_mem_cipo_rst), (OTHERS=>'0')); - -- State registers + -- State registers for p_comb SIGNAL r : t_reg; SIGNAL nxt_r : t_reg; - -- Wires + -- Memoryless signals in p_comb (wires used as local auxiliary variables) + SIGNAL s : t_comb; + + -- Structural signals (wires used to connect components and IO) SIGNAL dp_done : STD_LOGIC; SIGNAL dp_done_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL dp_copi : t_mem_copi; @@ -190,16 +201,10 @@ BEGIN END PROCESS; p_comb : PROCESS(r, in_sosi_arr_p, mm_copi, dp_copi, rd_cipo_arr, rd_sosi_arr) - -- State variable - VARIABLE v : t_reg; - -- Auxiliary variables / local wires / no memory - VARIABLE v_ref_sosi : t_dp_sosi; - VARIABLE v_pointer_slv : STD_LOGIC_VECTOR(c_blk_pointer_w-1 DOWNTO 0); - VARIABLE v_product_slv : STD_LOGIC_VECTOR(c_product_w-1 DOWNTO 0); - VARIABLE v_lost_data_flag : STD_LOGIC; - VARIABLE v_out_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + VARIABLE v : t_reg; -- State variable + VARIABLE d : t_comb; -- Memoryless auxiliary variables, local wires BEGIN - v := r; + v := r; -- state signals v.mm_sosi := func_dp_stream_reset_control(r.mm_sosi); v.wr_copi_arr := RESET_MEM_COPI_CTRL(r.wr_copi_arr); @@ -217,24 +222,24 @@ BEGIN IF in_sosi_arr_p(I).sop = '1' THEN -- . set address at start of block - v_pointer_slv := in_sosi_arr_p(I).bsn(c_blk_pointer_w-1 DOWNTO 0); - v_product_slv := MULT_UVEC(v_pointer_slv, c_block_size_slv); - v.wr_copi_arr(I).address := RESIZE_MEM_ADDRESS(v_product_slv); + d.pointer_slv := in_sosi_arr_p(I).bsn(c_blk_pointer_w-1 DOWNTO 0); + d.product_slv := MULT_UVEC(d.pointer_slv, c_block_size_slv); + v.wr_copi_arr(I).address := RESIZE_MEM_ADDRESS(d.product_slv); -- . set filled flag at sop, so assume rest of block will follow in time - v.filled_arr(I)(TO_UINT(v_pointer_slv)) := '1'; + v.filled_arr(I)(TO_UINT(d.pointer_slv)) := '1'; END IF; END LOOP; ---------------------------------------------------------------------------- -- p_control, all at sop of local reference input 0 ---------------------------------------------------------------------------- - v_ref_sosi := in_sosi_arr_p(0); - IF v_ref_sosi.sop = '1' THEN + d.ref_sosi := in_sosi_arr_p(0); + IF d.ref_sosi.sop = '1' THEN -- . write sync & bsn buffer - v.wr_pointer := TO_UINT(v_ref_sosi.bsn(c_blk_pointer_w-1 DOWNTO 0)); - v.sync_arr(v.wr_pointer) := v_ref_sosi.sync; - v.bsn_arr(v.wr_pointer) := v_ref_sosi.bsn(g_bsn_w-1 DOWNTO 0); + v.wr_pointer := TO_UINT(d.ref_sosi.bsn(c_blk_pointer_w-1 DOWNTO 0)); + v.sync_arr(v.wr_pointer) := d.ref_sosi.sync; + v.bsn_arr(v.wr_pointer) := d.ref_sosi.bsn(g_bsn_w-1 DOWNTO 0); -- . update read block pointer at g_bsn_latency_max blocks behind the reference write pointer IF g_nof_aligners_max = 1 THEN @@ -247,9 +252,9 @@ BEGIN END IF; -- . update read address of read block pointer - v_pointer_slv := TO_UVEC(v.rd_pointer, c_blk_pointer_w); - v_product_slv := MULT_UVEC(v_pointer_slv, c_block_size_slv); - v.rd_offset := RESIZE_UVEC(v_product_slv, c_mem_ram.adr_w); + d.pointer_slv := TO_UVEC(v.rd_pointer, c_blk_pointer_w); + d.product_slv := MULT_UVEC(d.pointer_slv, c_block_size_slv); + v.rd_offset := RESIZE_UVEC(d.product_slv, c_mem_ram.adr_w); -- . issue mm_sosi, if there is output ready to be read, indicated by filled reference block IF r.filled_arr(0)(v.rd_pointer) = '1' THEN @@ -263,10 +268,10 @@ BEGIN -- determine whether the ouput has to insert replacement data v.mm_sosi.channel := (OTHERS=>'0'); FOR I IN 0 TO g_nof_streams-1 LOOP - v_lost_data_flag := NOT v.filled_arr(I)(v.rd_pointer); + d.lost_data_flag := NOT v.filled_arr(I)(v.rd_pointer); IF stream_en_arr(I) = '1' THEN -- use MM bit at sop - v.use_replacement_data(I) := v_lost_data_flag; -- enabled stream, so replace if data was lost - v.mm_sosi.channel(I) := v_lost_data_flag; + v.use_replacement_data(I) := d.lost_data_flag; -- enabled stream, so replace if data was lost + v.mm_sosi.channel(I) := d.lost_data_flag; ELSE v.use_replacement_data(I) := '1'; -- disabled stream, so replace data END IF; @@ -319,25 +324,28 @@ BEGIN END IF; -- apply mm_sosi.sync and bsn at sop to all streams in out_sosi_arr - v_out_sosi_arr := rd_sosi_arr; -- = v.fill_cipo_arr in streaming format, contains the + d.out_sosi_arr := rd_sosi_arr; -- = v.fill_cipo_arr in streaming format, contains the -- input data from the buffer or replacement data IF rd_sosi_arr(0).sop = '1' THEN - v_out_sosi_arr := func_dp_stream_arr_set(v_out_sosi_arr, r.dp_sosi.sync, "SYNC"); - v_out_sosi_arr := func_dp_stream_arr_set(v_out_sosi_arr, r.dp_sosi.bsn, "BSN"); + d.out_sosi_arr := func_dp_stream_arr_set(d.out_sosi_arr, r.dp_sosi.sync, "SYNC"); + d.out_sosi_arr := func_dp_stream_arr_set(d.out_sosi_arr, r.dp_sosi.bsn, "BSN"); v.out_bsn := r.dp_sosi.bsn(g_bsn_w-1 DOWNTO 0); -- hold BSN until next sop, to ease view in wave window ELSE -- hold BSN until next sop, to ease view in wave window - v_out_sosi_arr := func_dp_stream_arr_set(v_out_sosi_arr, r.out_bsn, "BSN"); + d.out_sosi_arr := func_dp_stream_arr_set(d.out_sosi_arr, r.out_bsn, "BSN"); END IF; -- . output via DP streaming interface - out_sosi_arr <= v_out_sosi_arr; + out_sosi_arr <= d.out_sosi_arr; END IF; ---------------------------------------------------------------------------- -- next state ---------------------------------------------------------------------------- nxt_r <= v; + + -- memory less signals, only for view in wave window + s <= d; END PROCESS; ------------------------------------------------------------------------------