OpenCores
URL https://opencores.org/ocsvn/dp_pkg/dp_pkg/trunk

Subversion Repositories dp_pkg

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /dp_pkg/trunk
    from Rev 4 to Rev 5
    Reverse comparison

Rev 4 → Rev 5

/dp_stream_pkg.vhd
353,10 → 353,42
FUNCTION func_dp_stream_set_data(dp : t_dp_sosi_arr; slv : STD_LOGIC_VECTOR; str : STRING ) RETURN t_dp_sosi_arr;
FUNCTION func_dp_stream_set_data(dp : t_dp_sosi_arr; slv : STD_LOGIC_VECTOR; str : STRING; mask : STD_LOGIC_VECTOR) RETURN t_dp_sosi_arr;
-- Concatenate the data from a SOSI array into a single SOSI stream (assumes streams are in sync)
-- Functions to rewire between concatenated sosi.data and concatenated sosi.re,im
-- . data_order_im_re defines the concatenation order data = im&re or re&im
-- . nof_data defines the number of concatenated streams that are concatenated in the sosi.data or sosi.re,im
-- . rewire nof_data streams from data to re,im and force data = X to show that sosi data is used
-- . rewire nof_data streams from re,im to data and force re,im = X to show that sosi complex is used
FUNCTION func_dp_stream_complex_to_data(dp : t_dp_sosi; data_w : NATURAL; nof_data : NATURAL; data_order_im_re : BOOLEAN) RETURN t_dp_sosi;
FUNCTION func_dp_stream_complex_to_data(dp : t_dp_sosi; data_w : NATURAL; nof_data : NATURAL ) RETURN t_dp_sosi; -- data_order_im_re = TRUE
FUNCTION func_dp_stream_complex_to_data(dp : t_dp_sosi; data_w : NATURAL ) RETURN t_dp_sosi; -- data_order_im_re = TRUE, nof_data = 1
FUNCTION func_dp_stream_data_to_complex(dp : t_dp_sosi; data_w : NATURAL; nof_data : NATURAL; data_order_im_re : BOOLEAN) RETURN t_dp_sosi;
FUNCTION func_dp_stream_data_to_complex(dp : t_dp_sosi; data_w : NATURAL; nof_data : NATURAL ) RETURN t_dp_sosi; -- data_order_im_re = TRUE
FUNCTION func_dp_stream_data_to_complex(dp : t_dp_sosi; data_w : NATURAL ) RETURN t_dp_sosi; -- data_order_im_re = TRUE, nof_data = 1
 
FUNCTION func_dp_stream_complex_to_data(dp_arr : t_dp_sosi_arr; data_w : NATURAL; nof_data : NATURAL; data_order_im_re : BOOLEAN) RETURN t_dp_sosi_arr;
FUNCTION func_dp_stream_complex_to_data(dp_arr : t_dp_sosi_arr; data_w : NATURAL; nof_data : NATURAL ) RETURN t_dp_sosi_arr;
FUNCTION func_dp_stream_complex_to_data(dp_arr : t_dp_sosi_arr; data_w : NATURAL ) RETURN t_dp_sosi_arr;
FUNCTION func_dp_stream_data_to_complex(dp_arr : t_dp_sosi_arr; data_w : NATURAL; nof_data : NATURAL; data_order_im_re : BOOLEAN) RETURN t_dp_sosi_arr;
FUNCTION func_dp_stream_data_to_complex(dp_arr : t_dp_sosi_arr; data_w : NATURAL; nof_data : NATURAL ) RETURN t_dp_sosi_arr;
FUNCTION func_dp_stream_data_to_complex(dp_arr : t_dp_sosi_arr; data_w : NATURAL ) RETURN t_dp_sosi_arr;
 
-- Concatenate the data and complex re,im fields from a SOSI array into a single SOSI stream (assumes streams are in sync)
FUNCTION func_dp_stream_concat(snk_in_arr : t_dp_sosi_arr; data_w : NATURAL) RETURN t_dp_sosi; -- Concat SOSI_ARR data into single SOSI
FUNCTION func_dp_stream_concat(src_in : t_dp_siso; nof_streams : NATURAL) RETURN t_dp_siso_arr; -- Wire single SISO to SISO_ARR
-- Deconcatenate data from SOSI into SOSI array
 
-- Reconcatenate the data and complex re,im fields from a SOSI array from nof_data*in_w to nof_data*out_w
-- . data_representation = "SIGNED" treat sosi.data field as signed
-- "UNSIGNED" treat sosi.data field as unsigned
-- "COMPLEX" treat sosi.data field as complex concatenated
-- . data_order_im_re = TRUE then "COMPLEX" data = im&re
-- FALSE then "COMPLEX" data = re&im
-- ignore when data_representation /= "COMPLEX"
FUNCTION func_dp_stream_reconcat(snk_in : t_dp_sosi; in_w, out_w, nof_data : NATURAL; data_representation : STRING; data_order_im_re : BOOLEAN) RETURN t_dp_sosi;
FUNCTION func_dp_stream_reconcat(snk_in : t_dp_sosi; in_w, out_w, nof_data : NATURAL; data_representation : STRING ) RETURN t_dp_sosi;
FUNCTION func_dp_stream_reconcat(snk_in_arr : t_dp_sosi_arr; in_w, out_w, nof_data : NATURAL; data_representation : STRING; data_order_im_re : BOOLEAN) RETURN t_dp_sosi_arr;
FUNCTION func_dp_stream_reconcat(snk_in_arr : t_dp_sosi_arr; in_w, out_w, nof_data : NATURAL; data_representation : STRING ) RETURN t_dp_sosi_arr;
 
-- Deconcatenate data and complex re,im fields from SOSI into SOSI array
FUNCTION func_dp_stream_deconcat(snk_in : t_dp_sosi; nof_streams, data_w : NATURAL) RETURN t_dp_sosi_arr; -- Deconcat SOSI data
FUNCTION func_dp_stream_deconcat(src_out_arr : t_dp_siso_arr) RETURN t_dp_siso; -- Wire SISO_ARR(0) to single SISO
1245,15 → 1277,121
RETURN v_dp;
END;
 
-- Functions to rewire between concatenated sosi.data and concatenated sosi.re,im
FUNCTION func_dp_stream_complex_to_data(dp : t_dp_sosi; data_w : NATURAL; nof_data : NATURAL; data_order_im_re : BOOLEAN) RETURN t_dp_sosi IS
CONSTANT c_compl_data_w : NATURAL := data_w/2;
VARIABLE v_dp : t_dp_sosi := dp;
VARIABLE v_re : STD_LOGIC_VECTOR(c_compl_data_w-1 DOWNTO 0);
VARIABLE v_im : STD_LOGIC_VECTOR(c_compl_data_w-1 DOWNTO 0);
BEGIN
v_dp.data := (OTHERS=>'0');
v_dp.re := (OTHERS=>'X');
v_dp.im := (OTHERS=>'X');
FOR I IN 0 TO nof_data-1 LOOP
v_re := dp.re(c_compl_data_w-1 + I*c_compl_data_w DOWNTO I*c_compl_data_w);
v_im := dp.im(c_compl_data_w-1 + I*c_compl_data_w DOWNTO I*c_compl_data_w);
IF data_order_im_re=TRUE THEN
v_dp.data((I+1)*data_w-1 DOWNTO I*data_w) := v_im & v_re;
ELSE
v_dp.data((I+1)*data_w-1 DOWNTO I*data_w) := v_re & v_im;
END IF;
END LOOP;
RETURN v_dp;
END;
 
FUNCTION func_dp_stream_complex_to_data(dp : t_dp_sosi; data_w : NATURAL; nof_data : NATURAL) RETURN t_dp_sosi IS
BEGIN
RETURN func_dp_stream_complex_to_data(dp, data_w, nof_data, TRUE);
END;
FUNCTION func_dp_stream_complex_to_data(dp : t_dp_sosi; data_w : NATURAL) RETURN t_dp_sosi IS
BEGIN
RETURN func_dp_stream_complex_to_data(dp, data_w, 1, TRUE);
END;
FUNCTION func_dp_stream_data_to_complex(dp : t_dp_sosi; data_w : NATURAL; nof_data : NATURAL; data_order_im_re : BOOLEAN) RETURN t_dp_sosi IS
CONSTANT c_compl_data_w : NATURAL := data_w/2;
VARIABLE v_dp : t_dp_sosi := dp;
VARIABLE v_hi : STD_LOGIC_VECTOR(c_compl_data_w-1 DOWNTO 0);
VARIABLE v_lo : STD_LOGIC_VECTOR(c_compl_data_w-1 DOWNTO 0);
BEGIN
v_dp.data := (OTHERS=>'X');
v_dp.re := (OTHERS=>'0');
v_dp.im := (OTHERS=>'0');
FOR I IN 0 TO nof_data-1 LOOP
v_hi := dp.data( data_w-1 + I*data_w DOWNTO c_compl_data_w + I*data_w);
v_lo := dp.data(c_compl_data_w-1 + I*data_w DOWNTO 0 + I*data_w);
IF data_order_im_re=TRUE THEN
v_dp.im((I+1)*c_compl_data_w-1 DOWNTO I*c_compl_data_w) := v_hi;
v_dp.re((I+1)*c_compl_data_w-1 DOWNTO I*c_compl_data_w) := v_lo;
ELSE
v_dp.re((I+1)*c_compl_data_w-1 DOWNTO I*c_compl_data_w) := v_hi;
v_dp.im((I+1)*c_compl_data_w-1 DOWNTO I*c_compl_data_w) := v_lo;
END IF;
END LOOP;
RETURN v_dp;
END;
 
FUNCTION func_dp_stream_data_to_complex(dp : t_dp_sosi; data_w : NATURAL; nof_data : NATURAL) RETURN t_dp_sosi IS
BEGIN
RETURN func_dp_stream_data_to_complex(dp, data_w, nof_data, TRUE);
END;
 
FUNCTION func_dp_stream_data_to_complex(dp : t_dp_sosi; data_w : NATURAL) RETURN t_dp_sosi IS
BEGIN
RETURN func_dp_stream_data_to_complex(dp, data_w, 1, TRUE);
END;
FUNCTION func_dp_stream_complex_to_data(dp_arr : t_dp_sosi_arr; data_w : NATURAL; nof_data : NATURAL; data_order_im_re : BOOLEAN) RETURN t_dp_sosi_arr IS
VARIABLE v_dp_arr : t_dp_sosi_arr(dp_arr'RANGE);
BEGIN
FOR i IN dp_arr'RANGE LOOP
v_dp_arr(i) := func_dp_stream_complex_to_data(dp_arr(i), data_w, nof_data, data_order_im_re); -- nof_data per stream is 1
END LOOP;
RETURN v_dp_arr;
END;
FUNCTION func_dp_stream_complex_to_data(dp_arr : t_dp_sosi_arr; data_w : NATURAL; nof_data : NATURAL) RETURN t_dp_sosi_arr IS
BEGIN
RETURN func_dp_stream_complex_to_data(dp_arr, data_w, nof_data, TRUE);
END;
 
FUNCTION func_dp_stream_complex_to_data(dp_arr : t_dp_sosi_arr; data_w : NATURAL) RETURN t_dp_sosi_arr IS
BEGIN
RETURN func_dp_stream_complex_to_data(dp_arr, data_w, 1, TRUE);
END;
FUNCTION func_dp_stream_data_to_complex(dp_arr : t_dp_sosi_arr; data_w : NATURAL; nof_data : NATURAL; data_order_im_re : BOOLEAN) RETURN t_dp_sosi_arr IS
VARIABLE v_dp_arr : t_dp_sosi_arr(dp_arr'RANGE);
BEGIN
FOR i IN dp_arr'RANGE LOOP
v_dp_arr(i) := func_dp_stream_data_to_complex(dp_arr(i), data_w, nof_data, data_order_im_re); -- nof_data per stream is 1
END LOOP;
RETURN v_dp_arr;
END;
FUNCTION func_dp_stream_data_to_complex(dp_arr : t_dp_sosi_arr; data_w : NATURAL; nof_data : NATURAL) RETURN t_dp_sosi_arr IS
BEGIN
RETURN func_dp_stream_data_to_complex(dp_arr, data_w, nof_data, TRUE);
END;
 
FUNCTION func_dp_stream_data_to_complex(dp_arr : t_dp_sosi_arr; data_w : NATURAL) RETURN t_dp_sosi_arr IS
BEGIN
RETURN func_dp_stream_data_to_complex(dp_arr, data_w, 1, TRUE);
END;
-- Concatenate the data (and complex fields) from a SOSI array into a single SOSI stream (assumes streams are in sync)
FUNCTION func_dp_stream_concat(snk_in_arr : t_dp_sosi_arr; data_w : NATURAL) RETURN t_dp_sosi IS
CONSTANT c_compl_data_w : NATURAL := data_w/2;
VARIABLE v_src_out : t_dp_sosi := snk_in_arr(0);
VARIABLE v_compl_data_w : NATURAL := data_w/2;
BEGIN
v_src_out.data := (OTHERS=>'0');
v_src_out.re := (OTHERS=>'0');
v_src_out.im := (OTHERS=>'0');
FOR i IN snk_in_arr'RANGE LOOP
v_src_out.data((i+1)* data_w-1 DOWNTO i* data_w) := snk_in_arr(i).data( data_w-1 DOWNTO 0);
v_src_out.re( (i+1)*v_compl_data_w-1 DOWNTO i*v_compl_data_w) := snk_in_arr(i).re(v_compl_data_w-1 DOWNTO 0);
v_src_out.im( (i+1)*v_compl_data_w-1 DOWNTO i*v_compl_data_w) := snk_in_arr(i).im(v_compl_data_w-1 DOWNTO 0);
v_src_out.re( (i+1)*c_compl_data_w-1 DOWNTO i*c_compl_data_w) := snk_in_arr(i).re(c_compl_data_w-1 DOWNTO 0);
v_src_out.im( (i+1)*c_compl_data_w-1 DOWNTO i*c_compl_data_w) := snk_in_arr(i).im(c_compl_data_w-1 DOWNTO 0);
END LOOP;
RETURN v_src_out;
END;
1267,10 → 1405,68
RETURN v_snk_out_arr;
END;
 
-- Reconcatenate the data and complex re,im fields from a SOSI array from nof_data*in_w to nof_data*out_w
FUNCTION func_dp_stream_reconcat(snk_in : t_dp_sosi; in_w, out_w, nof_data : NATURAL; data_representation : STRING; data_order_im_re : BOOLEAN) RETURN t_dp_sosi IS
CONSTANT c_compl_in_w : NATURAL := in_w/2;
CONSTANT c_compl_out_w : NATURAL := out_w/2;
VARIABLE v_src_out : t_dp_sosi := snk_in;
VARIABLE v_in_data : STD_LOGIC_VECTOR(in_w-1 DOWNTO 0);
VARIABLE v_out_data : STD_LOGIC_VECTOR(out_w-1 DOWNTO 0) := (OTHERS=>'0'); -- default set sosi.data to 0
BEGIN
v_src_out := snk_in;
v_src_out.data := (OTHERS=>'0');
v_src_out.re := (OTHERS=>'0');
v_src_out.im := (OTHERS=>'0');
FOR i IN 0 TO nof_data-1 LOOP
v_in_data := snk_in.data((i+1)*in_w-1 DOWNTO i*in_w);
IF data_representation="UNSIGNED" THEN -- treat data as unsigned
v_out_data := RESIZE_UVEC(v_in_data, out_w);
ELSE
IF data_representation="SIGNED" THEN -- treat data as signed
v_out_data := RESIZE_SVEC(v_in_data, out_w);
ELSE
-- treat data as complex
IF data_order_im_re=TRUE THEN
-- data = im&re
v_out_data := RESIZE_SVEC(v_in_data(2*c_compl_in_w-1 DOWNTO c_compl_in_w), c_compl_out_w) &
RESIZE_SVEC(v_in_data( c_compl_in_w-1 DOWNTO 0), c_compl_out_w);
ELSE
-- data = re&im
v_out_data := RESIZE_SVEC(v_in_data( c_compl_in_w-1 DOWNTO 0), c_compl_out_w) &
RESIZE_SVEC(v_in_data(2*c_compl_in_w-1 DOWNTO c_compl_in_w), c_compl_out_w);
END IF;
END IF;
END IF;
v_src_out.data((i+1)* out_w-1 DOWNTO i* out_w) := v_out_data;
v_src_out.re( (i+1)*c_compl_out_w-1 DOWNTO i*c_compl_out_w) := RESIZE_SVEC(snk_in.re((i+1)*c_compl_in_w-1 DOWNTO i*c_compl_in_w), c_compl_out_w);
v_src_out.im( (i+1)*c_compl_out_w-1 DOWNTO i*c_compl_out_w) := RESIZE_SVEC(snk_in.im((i+1)*c_compl_in_w-1 DOWNTO i*c_compl_in_w), c_compl_out_w);
END LOOP;
RETURN v_src_out;
END;
 
FUNCTION func_dp_stream_reconcat(snk_in : t_dp_sosi; in_w, out_w, nof_data : NATURAL; data_representation : STRING) RETURN t_dp_sosi IS
BEGIN
RETURN func_dp_stream_reconcat(snk_in, in_w, out_w, nof_data, data_representation, TRUE);
END;
 
FUNCTION func_dp_stream_reconcat(snk_in_arr : t_dp_sosi_arr; in_w, out_w, nof_data : NATURAL; data_representation : STRING; data_order_im_re : BOOLEAN) RETURN t_dp_sosi_arr IS
VARIABLE v_src_out_arr : t_dp_sosi_arr(snk_in_arr'RANGE) := snk_in_arr;
BEGIN
FOR i IN v_src_out_arr'RANGE LOOP
v_src_out_arr(i) := func_dp_stream_reconcat(snk_in_arr(i), in_w, out_w, nof_data, data_representation, data_order_im_re);
END LOOP;
RETURN v_src_out_arr;
END;
 
FUNCTION func_dp_stream_reconcat(snk_in_arr : t_dp_sosi_arr; in_w, out_w, nof_data : NATURAL; data_representation : STRING) RETURN t_dp_sosi_arr IS
BEGIN
RETURN func_dp_stream_reconcat(snk_in_arr, in_w, out_w, nof_data, data_representation, TRUE);
END;
 
-- Deconcatenate data from SOSI into SOSI array
FUNCTION func_dp_stream_deconcat(snk_in : t_dp_sosi; nof_streams, data_w : NATURAL) RETURN t_dp_sosi_arr IS
CONSTANT c_compl_data_w : NATURAL := data_w/2;
VARIABLE v_src_out_arr : t_dp_sosi_arr(nof_streams-1 DOWNTO 0);
VARIABLE v_compl_data_w : NATURAL := data_w/2;
BEGIN
FOR i IN v_src_out_arr'RANGE LOOP
v_src_out_arr(i) := snk_in;
1277,9 → 1473,9
v_src_out_arr(i).data := (OTHERS=>'0');
v_src_out_arr(i).re := (OTHERS=>'0');
v_src_out_arr(i).im := (OTHERS=>'0');
v_src_out_arr(i).data( data_w-1 DOWNTO 0) := snk_in.data((i+1)* data_w-1 DOWNTO i* data_w);
v_src_out_arr(i).re( v_compl_data_w-1 DOWNTO 0) := snk_in.re ((i+1)*v_compl_data_w-1 DOWNTO i*v_compl_data_w);
v_src_out_arr(i).im( v_compl_data_w-1 DOWNTO 0) := snk_in.im ((i+1)*v_compl_data_w-1 DOWNTO i*v_compl_data_w);
v_src_out_arr(i).data := RESIZE_DP_DATA( snk_in.data((i+1)* data_w-1 DOWNTO i* data_w));
v_src_out_arr(i).re := RESIZE_DP_DSP_DATA(snk_in.re ((i+1)*c_compl_data_w-1 DOWNTO i*c_compl_data_w));
v_src_out_arr(i).im := RESIZE_DP_DSP_DATA(snk_in.im ((i+1)*c_compl_data_w-1 DOWNTO i*c_compl_data_w));
END LOOP;
RETURN v_src_out_arr;
END;
/dp_stream_stimuli.vhd
62,7 → 62,8
g_in_dat_w : NATURAL := 32;
g_nof_repeat : NATURAL := 5;
g_pkt_len : NATURAL := 16;
g_pkt_gap : NATURAL := 4
g_pkt_gap : NATURAL := 4;
g_wait_last_evt : NATURAL := 100 -- number of clk cycles to wait with last_snk_in_evt after finishing the stimuli
);
PORT (
rst : IN STD_LOGIC;
168,7 → 169,7
last_snk_in <= v_last;
-- Signal end of stimuli
proc_common_wait_some_cycles(clk, 100); -- latency from stimuli to verify depends on the flow control, so wait sufficiently long for last packet to have passed through
proc_common_wait_some_cycles(clk, g_wait_last_evt); -- latency from stimuli to verify depends on the flow control, so wait sufficiently long for last packet to have passed through
proc_common_gen_pulse(clk, last_snk_in_evt);
proc_common_wait_some_cycles(clk, 50);
tb_end <= '1';
/tb_dp_pkg.vhd
2003,9 → 2003,9
SIGNAL out_data_3 : INOUT STD_LOGIC_VECTOR;
SIGNAL out_empty : IN STD_LOGIC_VECTOR;
SIGNAL out_empty_1 : INOUT STD_LOGIC_VECTOR) IS
VARIABLE v_last_word : STD_LOGIC_VECTOR(out_data'RANGE);
VARIABLE v_ref_data : STD_LOGIC_VECTOR(out_data'RANGE);
VARIABLE v_empty_data : STD_LOGIC_VECTOR(out_data'RANGE);
VARIABLE v_last_word : STD_LOGIC_VECTOR(out_data'HIGH DOWNTO 0);
VARIABLE v_ref_data : STD_LOGIC_VECTOR(out_data'HIGH DOWNTO 0);
VARIABLE v_empty_data : STD_LOGIC_VECTOR(out_data'HIGH DOWNTO 0);
BEGIN
IF rising_edge(clk) THEN
-- out_val must be active, because only then out_data will differ from the previous out_data

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.