diff --git a/libraries/base/dp/src/vhdl/dp_fifo_core.vhd b/libraries/base/dp/src/vhdl/dp_fifo_core.vhd index 09acb4b16e037cd1d4da11046debd99d0941b0c0..4c1c2b046372e5a61f59042727ff1fc258759b23 100644 --- a/libraries/base/dp/src/vhdl/dp_fifo_core.vhd +++ b/libraries/base/dp/src/vhdl/dp_fifo_core.vhd @@ -89,7 +89,7 @@ ARCHITECTURE str OF dp_fifo_core IS CONSTANT c_use_data : BOOLEAN := TRUE; CONSTANT c_ctrl_w : NATURAL := 2; -- sop and eop - CONSTANT c_complex_w : NATURAL := g_data_w/2; + CONSTANT c_complex_w : NATURAL := smallest(c_dp_stream_dsp_data_w, g_data_w/2); -- needed to cope with g_data_w > 2*c_dp_stream_dsp_data_w CONSTANT c_fifo_almost_full : NATURAL := g_fifo_size-g_fifo_af_margin; -- FIFO almost full level for snk_out.ready CONSTANT c_fifo_dat_w : NATURAL := func_slv_concat_w(c_use_data, g_use_bsn, g_use_empty, g_use_channel, g_use_error, g_use_sync, g_use_ctrl, @@ -99,8 +99,9 @@ ARCHITECTURE str OF dp_fifo_core IS SIGNAL arst : STD_LOGIC; - SIGNAL wr_data : STD_LOGIC_VECTOR(g_data_w-1 DOWNTO 0); - SIGNAL rd_data : STD_LOGIC_VECTOR(g_data_w-1 DOWNTO 0); + SIGNAL wr_data_complex : STD_LOGIC_VECTOR(2*c_complex_w-1 DOWNTO 0); + SIGNAL wr_data : STD_LOGIC_VECTOR(g_data_w-1 DOWNTO 0); + SIGNAL rd_data : STD_LOGIC_VECTOR(g_data_w-1 DOWNTO 0); SIGNAL fifo_wr_dat : STD_LOGIC_VECTOR(c_fifo_dat_w-1 DOWNTO 0); SIGNAL fifo_wr_req : STD_LOGIC; @@ -142,7 +143,8 @@ BEGIN wr_ctrl <= snk_in.sop & snk_in.eop; -- Assign the snk_in data field or concatenated complex fields to the FIFO wr_data depending on g_use_complex - wr_data <= snk_in.data(g_data_w-1 DOWNTO 0) WHEN g_use_complex = FALSE ELSE snk_in.im(c_complex_w-1 DOWNTO 0) & snk_in.re(c_complex_w-1 DOWNTO 0); + wr_data_complex <= snk_in.im(c_complex_w-1 DOWNTO 0) & snk_in.re(c_complex_w-1 DOWNTO 0); + wr_data <= snk_in.data(g_data_w-1 DOWNTO 0) WHEN g_use_complex = FALSE ELSE RESIZE_UVEC(wr_data_complex, g_data_w); -- fifo wr wires fifo_wr_req <= snk_in.valid; @@ -216,8 +218,8 @@ BEGIN -- SOSI rd_sosi.data( g_data_w-1 DOWNTO 0) <= rd_data; - rd_sosi.re( c_complex_w-1 DOWNTO 0) <= rd_data(g_data_w/2-1 DOWNTO 0); - rd_sosi.im( c_complex_w-1 DOWNTO 0) <= rd_data(g_data_w-1 DOWNTO g_data_w/2); + rd_sosi.re( c_complex_w-1 DOWNTO 0) <= rd_data( c_complex_w-1 DOWNTO 0); + rd_sosi.im( c_complex_w-1 DOWNTO 0) <= rd_data(2*c_complex_w-1 DOWNTO c_complex_w); rd_sosi.bsn( g_bsn_w-1 DOWNTO 0) <= func_slv_extract(c_use_data, g_use_bsn, g_use_empty, g_use_channel, g_use_error, g_use_sync, g_use_ctrl, g_data_w, g_bsn_w, g_empty_w, g_channel_w, g_error_w, 1, c_ctrl_w, fifo_rd_dat, 1); rd_sosi.empty( g_empty_w-1 DOWNTO 0) <= func_slv_extract(c_use_data, g_use_bsn, g_use_empty, g_use_channel, g_use_error, g_use_sync, g_use_ctrl, g_data_w, g_bsn_w, g_empty_w, g_channel_w, g_error_w, 1, c_ctrl_w, fifo_rd_dat, 2); rd_sosi.channel(g_channel_w-1 DOWNTO 0) <= func_slv_extract(c_use_data, g_use_bsn, g_use_empty, g_use_channel, g_use_error, g_use_sync, g_use_ctrl, g_data_w, g_bsn_w, g_empty_w, g_channel_w, g_error_w, 1, c_ctrl_w, fifo_rd_dat, 3);