From 874fbca5afd54daab335b1219d89d0d6938b9bb4 Mon Sep 17 00:00:00 2001 From: Pepping <pepping> Date: Mon, 26 Jan 2015 14:19:23 +0000 Subject: [PATCH] - Added dp_sync_checker and dp_packet_merge - Removed functionality for sync_ok detection. --- .../reorder/src/vhdl/reorder_transpose.vhd | 139 +++++++++--------- 1 file changed, 70 insertions(+), 69 deletions(-) diff --git a/libraries/base/reorder/src/vhdl/reorder_transpose.vhd b/libraries/base/reorder/src/vhdl/reorder_transpose.vhd index 824cf0fc24..c63a2c4f9c 100644 --- a/libraries/base/reorder/src/vhdl/reorder_transpose.vhd +++ b/libraries/base/reorder/src/vhdl/reorder_transpose.vhd @@ -132,15 +132,21 @@ ARCHITECTURE str OF reorder_transpose IS CONSTANT c_nof_ch_in : NATURAL := g_frame_size_in*g_reorder_seq.rd_chunksize; CONSTANT c_nof_ch_sel : NATURAL := c_nof_ch_in; - CONSTANT c_cnt_sop_w : NATURAL := ceil_log2(g_nof_blk_per_sync)+1; - CONSTANT c_ctlr_data_w : NATURAL := func_tech_ddr_ctlr_data_w(g_tech_ddr); CONSTANT c_data_w_ratio : POSITIVE := c_ctlr_data_w/c_data_w; + + SIGNAL sync_check_in_sosi : t_dp_sosi; + SIGNAL sync_check_in_siso : t_dp_siso := c_dp_siso_rdy; + + SIGNAL dp_sync_chk_out_sosi : t_dp_sosi; + + SIGNAL packet_merge_in_sosi : t_dp_sosi; + SIGNAL packet_merge_in_siso : t_dp_siso; SIGNAL ss_in_sosi : t_dp_sosi; - SIGNAL ss_in_siso : t_dp_siso; + SIGNAL ss_in_siso : t_dp_siso := c_dp_siso_rdy; - -- ctrl & status DDR3 driver + -- ctrl & status DDR3 driver SIGNAL dvr_done : STD_LOGIC; SIGNAL dvr_en : STD_LOGIC; SIGNAL dvr_wr_not_rd : STD_LOGIC; @@ -158,23 +164,16 @@ ARCHITECTURE str OF reorder_transpose IS SIGNAL rd_req_i : STD_LOGIC; SIGNAL rd_dat_i : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); SIGNAL rd_val_i : STD_LOGIC; - - SIGNAL cnt_sop : STD_LOGIC_VECTOR(c_cnt_sop_w-1 DOWNTO 0); - SIGNAL nof_sop : STD_LOGIC_VECTOR(c_cnt_sop_w-1 DOWNTO 0); - SIGNAL i_mon_nof_sop : STD_LOGIC_VECTOR(c_cnt_sop_w-1 DOWNTO 0); - SIGNAL nxt_mon_nof_sop : STD_LOGIC_VECTOR(c_cnt_sop_w-1 DOWNTO 0); - SIGNAL sync_ok_in : STD_LOGIC; - SIGNAL sync_ok_out : STD_LOGIC; - + BEGIN g_merge_in_complex : IF g_use_complex = TRUE GENERATE PROCESS(snk_in_arr) BEGIN - ss_in_sosi <= snk_in_arr(0); + sync_check_in_sosi <= snk_in_arr(0); FOR i IN 0 TO g_nof_streams-1 LOOP - ss_in_sosi.data((2*i+1)*g_in_dat_w-1 DOWNTO 2*i*g_in_dat_w) <= snk_in_arr(i).re(g_in_dat_w-1 DOWNTO 0); - ss_in_sosi.data((2*i+2)*g_in_dat_w-1 DOWNTO (2*i+1)*g_in_dat_w) <= snk_in_arr(i).im(g_in_dat_w-1 DOWNTO 0); + sync_check_in_sosi.data((2*i+1)*g_in_dat_w-1 DOWNTO 2*i*g_in_dat_w) <= snk_in_arr(i).re(g_in_dat_w-1 DOWNTO 0); + sync_check_in_sosi.data((2*i+2)*g_in_dat_w-1 DOWNTO (2*i+1)*g_in_dat_w) <= snk_in_arr(i).im(g_in_dat_w-1 DOWNTO 0); END LOOP; END PROCESS; END GENERATE; @@ -182,12 +181,46 @@ BEGIN g_merge_in_data : IF g_use_complex = FALSE GENERATE PROCESS(snk_in_arr) BEGIN - ss_in_sosi <= snk_in_arr(0); + sync_check_in_sosi <= snk_in_arr(0); FOR i IN 0 TO g_nof_streams-1 LOOP - ss_in_sosi.data((i+1)*g_in_dat_w-1 DOWNTO i*g_in_dat_w) <= snk_in_arr(i).data(g_in_dat_w-1 DOWNTO 0); + sync_check_in_sosi.data((i+1)*g_in_dat_w-1 DOWNTO i*g_in_dat_w) <= snk_in_arr(i).data(g_in_dat_w-1 DOWNTO 0); END LOOP; END PROCESS; END GENERATE; + + g_siso : FOR J IN 0 TO g_nof_streams-1 GENERATE + snk_out_arr(J) <= sync_check_in_siso; + END GENERATE; + + u_sync_check_and_restore : ENTITY dp_lib.dp_sync_checker + GENERIC MAP ( + g_nof_blk_per_sync => g_nof_blk_per_sync + ) + PORT MAP ( + mm_rst => mm_rst, + mm_clk => mm_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, + snk_out => sync_check_in_siso, + snk_in => sync_check_in_sosi, + src_in => packet_merge_in_siso, + src_out => packet_merge_in_sosi + ); + + u_dp_packet_merge : ENTITY dp_lib.dp_packet_merge + GENERIC MAP ( + g_nof_pkt => g_reorder_seq.rd_chunksize + ) + PORT MAP ( + rst => dp_rst, + clk => dp_clk, + + snk_out => packet_merge_in_siso, + snk_in => packet_merge_in_sosi, + + src_in => ss_in_siso, + src_out => ss_in_sosi + ); gen_pre_transpose : IF g_ena_pre_transp = TRUE GENERATE u_single_ss : ENTITY work.ss @@ -210,11 +243,12 @@ BEGIN -- Streaming input_sosi => ss_in_sosi, - input_siso => ss_in_siso, + input_siso => OPEN, -- Don't allow backpressure. output_sosi => to_mem_src_out_i, output_siso => to_mem_src_in ); + END GENERATE; to_mem_src_out <= to_mem_src_out_i; @@ -223,66 +257,33 @@ BEGIN to_mem_src_out_i <= ss_in_sosi; ss_in_siso <= to_mem_src_in; END GENERATE; - - g_siso : FOR J IN 0 TO g_nof_streams-1 GENERATE - snk_out_arr(J) <= ss_in_siso; - END GENERATE; -- Map original dvr interface signals to t_mem_ctlr_mosi/miso - dvr_done <= dvr_miso.done; -- Requested wr or rd sequence is done - dvr_mosi.burstbegin <= dvr_en; - dvr_mosi.wr <= dvr_wr_not_rd; -- No need to use dvr_mosi.rd - dvr_mosi.address <= RESIZE_MEM_CTLR_ADDRESS(dvr_start_address); - dvr_mosi.burstsize <= RESIZE_MEM_CTLR_BURSTSIZE(dvr_nof_data); - dvr_mosi.flush <= dvr_wr_flush_en; - - dvr_wr_flush_en <= NOT(sync_ok_out); - + dvr_done <= dvr_miso.done; -- Requested wr or rd sequence is done + dvr_mosi.burstbegin <= dvr_en; + dvr_mosi.wr <= dvr_wr_not_rd; -- No need to use dvr_mosi.rd + dvr_mosi.address <= RESIZE_MEM_CTLR_ADDRESS(dvr_start_address); + dvr_mosi.burstsize <= RESIZE_MEM_CTLR_BURSTSIZE(dvr_nof_data); + dvr_mosi.flush <= dvr_wr_flush_en; + dvr_wr_flush_en <= '0'; + u_ddr_sequencer: ENTITY work.reorder_sequencer GENERIC MAP( g_reorder_seq => g_reorder_seq, g_data_w_ratio => c_data_w_ratio ) PORT MAP ( - dp_rst => dp_rst, - dp_clk => dp_clk, - - en_evt => dvr_en, - wr_not_rd => dvr_wr_not_rd, - - address => dvr_start_address, - burstsize => dvr_nof_data, - - done => dvr_done, - - sync_ok_in => sync_ok_in, - sync_ok_out => sync_ok_out - ); - - u_cnt_sop : ENTITY common_lib.common_counter - GENERIC MAP ( - g_width => c_cnt_sop_w - ) - PORT MAP ( - rst => dp_rst, - clk => dp_clk, - cnt_clr => to_mem_src_out_i.sync, - cnt_en => to_mem_src_out_i.sop, - count => cnt_sop + dp_rst => dp_rst, + dp_clk => dp_clk, + + en_evt => dvr_en, + wr_not_rd => dvr_wr_not_rd, + + address => dvr_start_address, + burstsize => dvr_nof_data, + + done => dvr_done ); - - nof_sop <= INCR_UVEC(cnt_sop, 1); -- +1 because the sop at the sync also counts - nxt_mon_nof_sop <= nof_sop WHEN to_mem_src_out_i.sync='1' ELSE i_mon_nof_sop; - sync_ok_in <= '1' WHEN TO_UINT(i_mon_nof_sop) = g_nof_blk_per_sync AND TO_UINT(nof_sop) <= g_nof_blk_per_sync ELSE '0'; - - p_clk : PROCESS(dp_rst, dp_clk) - BEGIN - IF dp_rst = '1' THEN - i_mon_nof_sop <= (OTHERS=>'0'); - ELSIF rising_edge(dp_clk) THEN - i_mon_nof_sop <= nxt_mon_nof_sop; - END IF; - END PROCESS; --------------------------------------------------------------- -- FIFO FOR SYNC-BSN -- GitLab