diff --git a/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd b/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd index 8125c67b0c4926a3fd6563035a5d88d0bd0274cf..40b52605bea043ecf8072a28934746c36c46eb4a 100644 --- a/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd +++ b/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd @@ -118,13 +118,13 @@ architecture str of ip_arria10_e1sg_jesd204b is signal rx_avs_rst_n_arr : std_logic_vector(g_nof_streams - 1 downto 0); signal rxlink_rst_n_arr : std_logic_vector(g_nof_streams - 1 downto 0); signal rxframe_rst_n_arr : std_logic_vector(g_nof_streams - 1 downto 0); - signal f2_div1_cnt_arr : std_logic_vector(g_nof_streams - 1 downto 0); + signal rxframe_toggle_arr : std_logic_vector(g_nof_streams - 1 downto 0); signal core_pll_locked : std_logic; - signal mm_core_pll_locked_reg : std_logic; - signal jesd204b_sysref_1 : std_logic; - signal jesd204b_sysref_2 : std_logic; - signal jesd204b_sysref_frameclk_1 : std_logic; - signal jesd204b_sysref_frameclk_2 : std_logic; + signal mm_core_pll_locked : std_logic; + signal rxlink_sysref_1 : std_logic; + signal rxlink_sysref_2 : std_logic; + signal rxframe_sysref_1 : std_logic; + signal rxframe_sysref_2 : std_logic; -- Data path signal jesd204b_rx_link_data_arr : std_logic_vector(c_jesd204b_rx_data_w * g_nof_streams - 1 downto 0); @@ -309,7 +309,7 @@ begin sof => OPEN, somf => jesd204b_rx_somf_arr(c_jesd204b_rx_somf_w * i + c_jesd204b_rx_somf_w - 1 downto c_jesd204b_rx_somf_w * i), - sysref => jesd204b_sysref_2 + sysref => rxlink_sysref_2 ); -- One cycle rd-rdval latency, waitrequest = '0' fixed @@ -329,7 +329,7 @@ begin irq => open, clk => mm_clk, -- use clk = mm_clk for av_* port csr_reset => mm_rst, - reset1_dsrt_qual => mm_core_pll_locked_reg, -- core pll_locked synchronised to clk = mm_clk domain + reset1_dsrt_qual => mm_core_pll_locked, -- core pll_locked synchronised to clk = mm_clk domain reset2_dsrt_qual => '1', -- Tied to '1' in example design. Tx xcvr is not used. reset5_dsrt_qual => mm_rx_xcvr_ready_in_arr(i), reset_in0 => mm_rst, @@ -395,32 +395,32 @@ begin begin if rising_edge(rxframe_clk) then if rxframe_rst_n_arr(i) = '0' then - rx_src_out_arr(i).data(c_jesd204b_rx_framer_data_w - 1 downto 0) <= (others => '0'); - rx_src_out_arr(i).channel(c_jesd204b_rx_framer_somf_w - 1 downto 0) <= (others => '0'); - f2_div1_cnt_arr(i) <= '0'; + rx_src_out_arr(i).data <= (others => '0'); + rx_src_out_arr(i).channel <= (others => '0'); + rxframe_toggle_arr(i) <= '0'; rx_src_out_arr(i).valid <= '0'; else rx_src_out_arr(i).valid <= jesd204b_rx_link_valid_arr(i); if jesd204b_rx_link_valid_arr(i) = '0' then - rx_src_out_arr(i).data(c_jesd204b_rx_framer_data_w - 1 downto 0) <= (others => '0'); - rx_src_out_arr(i).channel(c_jesd204b_rx_framer_somf_w - 1 downto 0) <= (others => '0'); + rx_src_out_arr(i).data <= (others => '0'); + rx_src_out_arr(i).channel <= (others => '0'); else - if f2_div1_cnt_arr(i) = '1' then - rx_src_out_arr(i).data(c_jesd204b_rx_framer_data_w - 1 downto 0) <= - jesd204b_rx_link_data_arr(c_jesd204b_rx_data_w * i + c_jesd204b_rx_framer_data_w - 1 downto - c_jesd204b_rx_data_w * i); - rx_src_out_arr(i).channel(c_jesd204b_rx_framer_somf_w - 1 downto 0) <= - jesd204b_rx_somf_arr(c_jesd204b_rx_somf_w * i + c_jesd204b_rx_framer_somf_w - 1 downto - c_jesd204b_rx_somf_w * i); + if rxframe_toggle_arr(i) = '1' then + rx_src_out_arr(i).data <= RESIZE_DP_SDATA(jesd204b_rx_link_data_arr( + c_jesd204b_rx_data_w * i + c_jesd204b_rx_framer_data_w - 1 downto + c_jesd204b_rx_data_w * i)); + rx_src_out_arr(i).channel <= RESIZE_DP_CHANNEL(jesd204b_rx_somf_arr( + c_jesd204b_rx_somf_w * i + c_jesd204b_rx_framer_somf_w - 1 downto + c_jesd204b_rx_somf_w * i)); else - rx_src_out_arr(i).data(c_jesd204b_rx_framer_data_w - 1 downto 0) <= - jesd204b_rx_link_data_arr(c_jesd204b_rx_data_w * i + c_jesd204b_rx_data_w - 1 downto - c_jesd204b_rx_data_w * i + c_jesd204b_rx_framer_data_w); - rx_src_out_arr(i).channel(c_jesd204b_rx_framer_somf_w - 1 downto 0) <= - jesd204b_rx_somf_arr(c_jesd204b_rx_somf_w * i + c_jesd204b_rx_somf_w - 1 downto - c_jesd204b_rx_somf_w * i + c_jesd204b_rx_framer_somf_w); + rx_src_out_arr(i).data <= RESIZE_DP_SDATA(jesd204b_rx_link_data_arr( + c_jesd204b_rx_data_w * i + c_jesd204b_rx_data_w - 1 downto + c_jesd204b_rx_data_w * i + c_jesd204b_rx_framer_data_w)); + rx_src_out_arr(i).channel <= RESIZE_DP_CHANNEL(jesd204b_rx_somf_arr( + c_jesd204b_rx_somf_w * i + c_jesd204b_rx_somf_w - 1 downto + c_jesd204b_rx_somf_w * i + c_jesd204b_rx_framer_somf_w)); end if; - f2_div1_cnt_arr(i) <= not f2_div1_cnt_arr(i); + rxframe_toggle_arr(i) <= not rxframe_toggle_arr(i); end if; end if; end if; @@ -432,15 +432,15 @@ begin -- See: https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_jesd204b.pdf -- Figure 25, page 151 ----------------------------------------------------------------------------- - p_reclocksysref : process (rxlink_clk, core_pll_locked) + p_reclocksysref : process (core_pll_locked, rxlink_clk) begin if core_pll_locked = '0' then - jesd204b_sysref_1 <= '0'; - jesd204b_sysref_2 <= '0'; + rxlink_sysref_1 <= '0'; + rxlink_sysref_2 <= '0'; jesd204b_sync_n_arr <= (others => '0'); elsif rising_edge(rxlink_clk) then - jesd204b_sysref_1 <= jesd204b_sysref; - jesd204b_sysref_2 <= jesd204b_sysref_1; + rxlink_sysref_1 <= jesd204b_sysref; + rxlink_sysref_2 <= rxlink_sysref_1; jesd204b_sync_n_arr <= jesd204b_sync_n_combined_arr; end if; end process; @@ -448,21 +448,19 @@ begin ----------------------------------------------------------------------------- -- Move sysref from rxlink_clk to rxframe_clk ----------------------------------------------------------------------------- - p_rx_sysref : process (rxframe_clk, core_pll_locked) + p_rx_sysref : process (core_pll_locked, rxframe_clk) begin if core_pll_locked = '0' then - jesd204b_sysref_frameclk_1 <= '0'; - jesd204b_sysref_frameclk_2 <= '0'; + rxframe_sysref_1 <= '0'; + rxframe_sysref_2 <= '0'; rx_sysref <= '0'; - else - if rising_edge(rxframe_clk) then - jesd204b_sysref_frameclk_1 <= jesd204b_sysref_2; -- sysref from rxlink_clk domain - jesd204b_sysref_frameclk_2 <= jesd204b_sysref_frameclk_1; - if jesd204b_sysref_frameclk_1 = '1' and jesd204b_sysref_frameclk_2 = '0' then - rx_sysref <= '1'; - else - rx_sysref <= '0'; - end if; + elsif rising_edge(rxframe_clk) then + rxframe_sysref_1 <= rxlink_sysref_2; -- sysref from rxlink_clk domain + rxframe_sysref_2 <= rxframe_sysref_1; + if rxframe_sysref_1 = '1' and rxframe_sysref_2 = '0' then + rx_sysref <= '1'; + else + rx_sysref <= '0'; end if; end if; end process; @@ -487,7 +485,7 @@ begin port map ( in_rst => core_pll_locked, clk => mm_clk, - out_rst => mm_core_pll_locked_reg + out_rst => mm_core_pll_locked ); -- Transceiver reset controller. Use g_nof_streams out of 12 channels. Receive only diff --git a/libraries/technology/ip_arria10_e2sg/jesd204b/ip_arria10_e2sg_jesd204b.vhd b/libraries/technology/ip_arria10_e2sg/jesd204b/ip_arria10_e2sg_jesd204b.vhd index 1d44c476be539338716cd38fa5ca48177a7117a8..8d5a6a89609c77b6bf4b4b30d205f4aad439b44c 100644 --- a/libraries/technology/ip_arria10_e2sg/jesd204b/ip_arria10_e2sg_jesd204b.vhd +++ b/libraries/technology/ip_arria10_e2sg/jesd204b/ip_arria10_e2sg_jesd204b.vhd @@ -118,13 +118,13 @@ architecture str of ip_arria10_e2sg_jesd204b is signal rx_avs_rst_n_arr : std_logic_vector(g_nof_streams - 1 downto 0); signal rxlink_rst_n_arr : std_logic_vector(g_nof_streams - 1 downto 0); signal rxframe_rst_n_arr : std_logic_vector(g_nof_streams - 1 downto 0); - signal f2_div1_cnt_arr : std_logic_vector(g_nof_streams - 1 downto 0); + signal rxframe_toggle_arr : std_logic_vector(g_nof_streams - 1 downto 0); signal core_pll_locked : std_logic; - signal mm_core_pll_locked_reg : std_logic; - signal jesd204b_sysref_1 : std_logic; - signal jesd204b_sysref_2 : std_logic; - signal jesd204b_sysref_frameclk_1 : std_logic; - signal jesd204b_sysref_frameclk_2 : std_logic; + signal mm_core_pll_locked : std_logic; + signal rxlink_sysref_1 : std_logic; + signal rxlink_sysref_2 : std_logic; + signal rxframe_sysref_1 : std_logic; + signal rxframe_sysref_2 : std_logic; -- Data path signal jesd204b_rx_link_data_arr : std_logic_vector(c_jesd204b_rx_data_w * g_nof_streams - 1 downto 0); @@ -309,7 +309,7 @@ begin sof => OPEN, somf => jesd204b_rx_somf_arr(c_jesd204b_rx_somf_w * i + c_jesd204b_rx_somf_w - 1 downto c_jesd204b_rx_somf_w * i), - sysref => jesd204b_sysref_2 + sysref => rxlink_sysref_2 ); -- One cycle rd-rdval latency, waitrequest = '0' fixed @@ -329,7 +329,7 @@ begin irq => open, clk => mm_clk, -- use clk = mm_clk for av_* port csr_reset => mm_rst, - reset1_dsrt_qual => mm_core_pll_locked_reg, -- core pll_locked synchronised to clk = mm_clk domain + reset1_dsrt_qual => mm_core_pll_locked, -- core pll_locked synchronised to clk = mm_clk domain reset2_dsrt_qual => '1', -- Tied to '1' in example design. Tx xcvr is not used. reset5_dsrt_qual => mm_rx_xcvr_ready_in_arr(i), reset_in0 => mm_rst, @@ -395,32 +395,32 @@ begin begin if rising_edge(rxframe_clk) then if rxframe_rst_n_arr(i) = '0' then - rx_src_out_arr(i).data(c_jesd204b_rx_framer_data_w - 1 downto 0) <= (others => '0'); - rx_src_out_arr(i).channel(c_jesd204b_rx_framer_somf_w - 1 downto 0) <= (others => '0'); - f2_div1_cnt_arr(i) <= '0'; + rx_src_out_arr(i).data <= (others => '0'); + rx_src_out_arr(i).channel <= (others => '0'); + rxframe_toggle_arr(i) <= '0'; rx_src_out_arr(i).valid <= '0'; else rx_src_out_arr(i).valid <= jesd204b_rx_link_valid_arr(i); if jesd204b_rx_link_valid_arr(i) = '0' then - rx_src_out_arr(i).data(c_jesd204b_rx_framer_data_w - 1 downto 0) <= (others => '0'); - rx_src_out_arr(i).channel(c_jesd204b_rx_framer_somf_w - 1 downto 0) <= (others => '0'); + rx_src_out_arr(i).data <= (others => '0'); + rx_src_out_arr(i).channel <= (others => '0'); else - if f2_div1_cnt_arr(i) = '1' then - rx_src_out_arr(i).data(c_jesd204b_rx_framer_data_w - 1 downto 0) <= - jesd204b_rx_link_data_arr(c_jesd204b_rx_data_w * i + c_jesd204b_rx_framer_data_w - 1 downto - c_jesd204b_rx_data_w * i); - rx_src_out_arr(i).channel(c_jesd204b_rx_framer_somf_w - 1 downto 0) <= - jesd204b_rx_somf_arr(c_jesd204b_rx_somf_w * i + c_jesd204b_rx_framer_somf_w - 1 downto - c_jesd204b_rx_somf_w * i); + if rxframe_toggle_arr(i) = '1' then + rx_src_out_arr(i).data <= RESIZE_DP_SDATA(jesd204b_rx_link_data_arr( + c_jesd204b_rx_data_w * i + c_jesd204b_rx_framer_data_w - 1 downto + c_jesd204b_rx_data_w * i)); + rx_src_out_arr(i).channel <= RESIZE_DP_CHANNEL(jesd204b_rx_somf_arr( + c_jesd204b_rx_somf_w * i + c_jesd204b_rx_framer_somf_w - 1 downto + c_jesd204b_rx_somf_w * i)); else - rx_src_out_arr(i).data(c_jesd204b_rx_framer_data_w - 1 downto 0) <= - jesd204b_rx_link_data_arr(c_jesd204b_rx_data_w * i + c_jesd204b_rx_data_w - 1 downto - c_jesd204b_rx_data_w * i + c_jesd204b_rx_framer_data_w); - rx_src_out_arr(i).channel(c_jesd204b_rx_framer_somf_w - 1 downto 0) <= - jesd204b_rx_somf_arr(c_jesd204b_rx_somf_w * i + c_jesd204b_rx_somf_w - 1 downto - c_jesd204b_rx_somf_w * i + c_jesd204b_rx_framer_somf_w); + rx_src_out_arr(i).data <= RESIZE_DP_SDATA(jesd204b_rx_link_data_arr( + c_jesd204b_rx_data_w * i + c_jesd204b_rx_data_w - 1 downto + c_jesd204b_rx_data_w * i + c_jesd204b_rx_framer_data_w)); + rx_src_out_arr(i).channel <= RESIZE_DP_CHANNEL(jesd204b_rx_somf_arr( + c_jesd204b_rx_somf_w * i + c_jesd204b_rx_somf_w - 1 downto + c_jesd204b_rx_somf_w * i + c_jesd204b_rx_framer_somf_w)); end if; - f2_div1_cnt_arr(i) <= not f2_div1_cnt_arr(i); + rxframe_toggle_arr(i) <= not rxframe_toggle_arr(i); end if; end if; end if; @@ -432,15 +432,15 @@ begin -- See: https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_jesd204b.pdf -- Figure 25, page 151 ----------------------------------------------------------------------------- - p_reclocksysref : process (rxlink_clk, core_pll_locked) + p_reclocksysref : process (core_pll_locked, rxlink_clk) begin if core_pll_locked = '0' then - jesd204b_sysref_1 <= '0'; - jesd204b_sysref_2 <= '0'; + rxlink_sysref_1 <= '0'; + rxlink_sysref_2 <= '0'; jesd204b_sync_n_arr <= (others => '0'); elsif rising_edge(rxlink_clk) then - jesd204b_sysref_1 <= jesd204b_sysref; - jesd204b_sysref_2 <= jesd204b_sysref_1; + rxlink_sysref_1 <= jesd204b_sysref; + rxlink_sysref_2 <= rxlink_sysref_1; jesd204b_sync_n_arr <= jesd204b_sync_n_combined_arr; end if; end process; @@ -448,21 +448,19 @@ begin ----------------------------------------------------------------------------- -- Move sysref from rxlink_clk to rxframe_clk ----------------------------------------------------------------------------- - p_rx_sysref : process (rxframe_clk, core_pll_locked) + p_rx_sysref : process (core_pll_locked, rxframe_clk) begin if core_pll_locked = '0' then - jesd204b_sysref_frameclk_1 <= '0'; - jesd204b_sysref_frameclk_2 <= '0'; + rxframe_sysref_1 <= '0'; + rxframe_sysref_2 <= '0'; rx_sysref <= '0'; - else - if rising_edge(rxframe_clk) then - jesd204b_sysref_frameclk_1 <= jesd204b_sysref_2; -- sysref from rxlink_clk domain - jesd204b_sysref_frameclk_2 <= jesd204b_sysref_frameclk_1; - if jesd204b_sysref_frameclk_1 = '1' and jesd204b_sysref_frameclk_2 = '0' then - rx_sysref <= '1'; - else - rx_sysref <= '0'; - end if; + elsif rising_edge(rxframe_clk) then + rxframe_sysref_1 <= rxlink_sysref_2; -- sysref from rxlink_clk domain + rxframe_sysref_2 <= rxframe_sysref_1; + if rxframe_sysref_1 = '1' and rxframe_sysref_2 = '0' then + rx_sysref <= '1'; + else + rx_sysref <= '0'; end if; end if; end process; @@ -487,7 +485,7 @@ begin port map ( in_rst => core_pll_locked, clk => mm_clk, - out_rst => mm_core_pll_locked_reg + out_rst => mm_core_pll_locked ); -- Transceiver reset controller. Use g_nof_streams out of 12 channels. Receive only