Skip to content
Snippets Groups Projects
Commit 6ad53859 authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Added REPLICATE_DP_DATA() and UNREPLICATE_DP_DATA() that are used by...

Added REPLICATE_DP_DATA() and UNREPLICATE_DP_DATA() that are used by mms_diag_tx_seq.vhd and mms_diag_rx_seq.vhd.
parent 671fe319
No related branches found
No related tags found
No related merge requests found
......@@ -167,6 +167,9 @@ PACKAGE dp_stream_pkg Is
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;
-- Shift and combine part of previous data and this data, use the other sosi from prev_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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment