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 |