diff --git a/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd b/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd index 7db6dde694d76e17654c077897a824763d8e8bfc..49910852bafbcc65f964d010685ff678cd3910dc 100644 --- a/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd +++ b/libraries/base/dp/src/vhdl/dp_stream_pkg.vhd @@ -166,6 +166,9 @@ PACKAGE dp_stream_pkg Is FUNCTION RESIZE_DP_EMPTY( vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; FUNCTION RESIZE_DP_CHANNEL( vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; FUNCTION RESIZE_DP_ERROR( vec : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; + + FUNCTION REPLICATE_DP_DATA( seq : STD_LOGIC_VECTOR ) RETURN STD_LOGIC_VECTOR; -- replicate seq as often as fits in c_dp_stream_data_w + FUNCTION UNREPLICATE_DP_DATA(data : STD_LOGIC_VECTOR; seq_w : NATURAL) RETURN STD_LOGIC_VECTOR; -- unreplicate data to width seq_w, return low seq_w bits and set mismatch MSbits bits to '1' -- Keep part of head data and combine part of tail data, use the other sosi from head_sosi FUNCTION func_dp_data_shift_first(head_sosi, tail_sosi : t_dp_sosi; symbol_w, nof_symbols_per_data, nof_symbols_from_tail : NATURAL) RETURN t_dp_sosi; @@ -194,6 +197,8 @@ PACKAGE dp_stream_pkg Is -- Functions to set or get a STD_LOGIC field as a STD_LOGIC_VECTOR to or from an siso or an sosi array FUNCTION func_dp_stream_arr_set(dp : t_dp_siso_arr; slv : STD_LOGIC_VECTOR; str : STRING) RETURN t_dp_siso_arr; FUNCTION func_dp_stream_arr_set(dp : t_dp_sosi_arr; slv : STD_LOGIC_VECTOR; str : STRING) RETURN t_dp_sosi_arr; + FUNCTION func_dp_stream_arr_set(dp : t_dp_siso_arr; sl : STD_LOGIC; str : STRING) RETURN t_dp_siso_arr; + FUNCTION func_dp_stream_arr_set(dp : t_dp_sosi_arr; sl : STD_LOGIC; str : STRING) RETURN t_dp_sosi_arr; FUNCTION func_dp_stream_arr_get(dp : t_dp_siso_arr; str : STRING) RETURN STD_LOGIC_VECTOR; FUNCTION func_dp_stream_arr_get(dp : t_dp_sosi_arr; str : STRING) RETURN STD_LOGIC_VECTOR; @@ -378,6 +383,36 @@ PACKAGE BODY dp_stream_pkg IS RETURN RESIZE_UVEC(vec, c_dp_stream_error_w); END RESIZE_DP_ERROR; + FUNCTION REPLICATE_DP_DATA(seq : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS + CONSTANT c_seq_w : NATURAL := seq'LENGTH; + CONSTANT c_nof_replications : NATURAL := ceil_div(c_dp_stream_data_w, c_seq_w); + CONSTANT c_vec_w : NATURAL := ceil_value(c_dp_stream_data_w, c_seq_w); + VARIABLE v_vec : STD_LOGIC_VECTOR(c_vec_w-1 DOWNTO 0); + BEGIN + FOR I IN 0 TO c_nof_replications-1 LOOP + v_vec((I+1)*c_seq_w-1 DOWNTO I*c_seq_w) := seq; + END LOOP; + RETURN v_vec(c_dp_stream_data_w-1 DOWNTO 0); + END REPLICATE_DP_DATA; + + FUNCTION UNREPLICATE_DP_DATA(data : STD_LOGIC_VECTOR; seq_w :NATURAL) RETURN STD_LOGIC_VECTOR IS + CONSTANT c_data_w : NATURAL := data'LENGTH; + CONSTANT c_nof_replications : NATURAL := ceil_div(c_data_w, seq_w); + CONSTANT c_vec_w : NATURAL := ceil_value(c_data_w, seq_w); + VARIABLE v_seq : STD_LOGIC_VECTOR(seq_w-1 DOWNTO 0); + VARIABLE v_data : STD_LOGIC_VECTOR(c_vec_w-1 DOWNTO 0); + VARIABLE v_vec : STD_LOGIC_VECTOR(c_vec_w-1 DOWNTO 0); + BEGIN + v_data := RESIZE_UVEC(data, c_vec_w); + v_seq := v_data(seq_w-1 DOWNTO 0); -- low data part is the v_seq + v_vec(seq_w-1 DOWNTO 0) := v_seq; -- keep v_seq at low part of return value + IF c_nof_replications>1 THEN + FOR I IN 1 TO c_nof_replications-1 LOOP + v_vec((I+1)*seq_w-1 DOWNTO I*seq_w) := v_data((I+1)*seq_w-1 DOWNTO I*seq_w) XOR v_seq; -- set return bit to '1' for high part data bits that do not match low part v_seq + END LOOP; + END IF; + RETURN v_vec(c_data_w-1 DOWNTO 0); + END UNREPLICATE_DP_DATA; -- Keep part of head data and combine part of tail data FUNCTION func_dp_data_shift_first(head_sosi, tail_sosi : t_dp_sosi; symbol_w, nof_symbols_per_data, nof_symbols_from_tail : NATURAL) RETURN t_dp_sosi IS @@ -647,6 +682,18 @@ PACKAGE BODY dp_stream_pkg IS RETURN v_dp; END func_dp_stream_arr_set; + FUNCTION func_dp_stream_arr_set(dp : t_dp_siso_arr; sl : STD_LOGIC; str : STRING) RETURN t_dp_siso_arr IS + VARIABLE v_slv : STD_LOGIC_VECTOR(dp'RANGE) := (OTHERS=>sl); + BEGIN + RETURN func_dp_stream_arr_set(dp, v_slv, str); + END func_dp_stream_arr_set; + + FUNCTION func_dp_stream_arr_set(dp : t_dp_sosi_arr; sl : STD_LOGIC; str : STRING) RETURN t_dp_sosi_arr IS + VARIABLE v_slv : STD_LOGIC_VECTOR(dp'RANGE) := (OTHERS=>sl); + BEGIN + RETURN func_dp_stream_arr_set(dp, v_slv, str); + END func_dp_stream_arr_set; + FUNCTION func_dp_stream_arr_get(dp : t_dp_siso_arr; str : STRING) RETURN STD_LOGIC_VECTOR IS VARIABLE v_ctrl : STD_LOGIC_VECTOR(dp'RANGE); BEGIN