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 72263827c36312d13ea97ddcd2c0b11cc28e2d4f..44d48af186c2691e98c150bd1cef97d9b7dda1d0 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 @@ -101,11 +101,14 @@ ARCHITECTURE str OF ip_arria10_e2sg_jesd204b IS SIGNAL dev_lane_aligned_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rx_csr_lane_powerdown_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL xcvr_rst_ctrl_rx_ready_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL rx_xcvr_ready_in_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rx_xcvr_ready_in_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL pll_reset_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL pll_reset_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL xcvr_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0) := (OTHERS => '1'); - SIGNAL rx_avs_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL rxlink_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rx_avs_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rxlink_rst_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rxlink_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rxframe_rst_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rxframe_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); 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); @@ -117,8 +120,6 @@ ARCHITECTURE str OF ip_arria10_e2sg_jesd204b IS SIGNAL jesd204b_sysref_2 : STD_LOGIC; SIGNAL jesd204b_sysref_frameclk_1 : STD_LOGIC; SIGNAL jesd204b_sysref_frameclk_2 : STD_LOGIC; - SIGNAL jesd204b_sysref_linkclk_1 : STD_LOGIC; - SIGNAL jesd204b_sysref_linkclk_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); @@ -176,7 +177,7 @@ ARCHITECTURE str OF ip_arria10_e2sg_jesd204b IS rx_islockedtodata : out std_logic_vector(0 downto 0); -- rx_is_lockedtodata rx_serial_data : in std_logic_vector(0 downto 0) := (others => 'X'); -- rx_serial_data rxlink_clk : in std_logic := 'X'; -- clk - rxlink_rst_n_reset_n : in std_logic := 'X'; -- reset_n + rxlink_rst_n_reset_n : in std_logic := 'X'; -- reset_n rxphy_clk : out std_logic_vector(0 downto 0); -- export sof : out std_logic_vector(3 downto 0); -- export somf : out std_logic_vector(c_jesd204b_rx_somf_w-1 downto 0); -- export @@ -328,16 +329,43 @@ BEGIN reset2_dsrt_qual => '1', -- Tied to '1' in example design. Tx xcvr is not used. reset5_dsrt_qual => rx_xcvr_ready_in_arr(i), reset_in0 => mm_rst, - reset_out0 => pll_reset_arr(i), -- Use channel 0 to reset the core pll + reset_out0 => pll_reset_async_arr(i), -- Use channel 0 to reset the core pll reset_out1 => xcvr_rst_arr(i), -- Use channel 1 to reset the transceiver reset controller reset_out2 => open, reset_out3 => open, reset_out4 => open, - reset_out5 => rx_avs_rst_arr(i), - reset_out6 => rxlink_rst_arr(i), - reset_out7 => rxframe_rst_arr(i) + reset_out5 => rx_avs_rst_arr(i), -- mm_clk domain + reset_out6 => rxlink_rst_async_arr(i), + reset_out7 => rxframe_rst_async_arr(i) ); + -- synchronize pll_reset + u_common_areset_pll : ENTITY common_lib.common_areset + PORT MAP ( + in_rst => pll_reset_async_arr(i), + clk => jesd204b_refclk, + out_rst => pll_reset_arr(i) + ); + + -- No need to synchronize xcvr_rst as it is synchronized in ip_arria10_e1sg_jesd204b_rx_xcvr_reset_control_12 + + -- synchronize rxlink reset + u_common_areset_rxlink : ENTITY common_lib.common_areset + PORT MAP ( + in_rst => rxlink_rst_async_arr(i), + clk => rxlink_clk, + out_rst => rxlink_rst_arr(i) + ); + + -- synchronize rxframe reset + u_common_areset_rxframe : ENTITY common_lib.common_areset + PORT MAP ( + in_rst => rxframe_rst_async_arr(i), + clk => rxframe_clk, + out_rst => rxframe_rst_arr(i) + ); + + rx_xcvr_ready_in_arr(i) <= '1' when rx_csr_lane_powerdown_arr(i)='1' OR xcvr_rst_ctrl_rx_ready_arr(i)='1' else '0'; -- Invert thr active-low resets @@ -399,7 +427,6 @@ BEGIN END IF; END PROCESS; - ----------------------------------------------------------------------------- -- Move sysref from rxlink_clk to rxframe_clk ----------------------------------------------------------------------------- @@ -412,7 +439,7 @@ BEGIN 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_linkclk_1; + 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 @@ -435,25 +462,24 @@ BEGIN ); END GENERATE; - p_pll_locked_reg : PROCESS (mm_rst, mm_clk) - BEGIN - IF mm_rst = '1' THEN - core_pll_locked_reg <= '0'; - ELSE - IF rising_edge(mm_clk) THEN - core_pll_locked_reg <= core_pll_locked; - END IF; - END IF; - END PROCESS; + u_common_areset_pll_locked : ENTITY common_lib.common_areset + GENERIC MAP ( + g_rst_level => '0' -- synchronises the rising edge input. + ) + PORT MAP ( + in_rst => core_pll_locked, + clk => mm_clk, + out_rst => core_pll_locked_reg + ); -- Transceiver reset controller. Use g_nof_streams out of 12 channels. Receive only - -- Clock set to 100MHz (use mm_clk) + -- Clock set to 100MHz (use rxlink_clk) u_ip_arria10_e2sg_jesd204b_rx_xcvr_reset_control : ip_arria10_e2sg_jesd204b_rx_xcvr_reset_control_12 PORT MAP ( - clock => mm_clk, - reset => xcvr_rst_arr(0), -- From Reset Sequencer output1 as per example design + clock => rxlink_clk, + reset => xcvr_rst_arr(0), -- From Reset Sequencer output1 as per example design, the reset input is synchronised internally. rx_analogreset => rx_analogreset_arr, -- output to reset RX PMA. Release before deasserting link and avs resets (Intel JESD204B-UG p70) rx_cal_busy => rx_cal_busy_arr, -- input from PHY rx_digitalreset => rx_digitalreset_arr, -- output to reset RX PCS. Release before deasserting link and avs resets (Intel JESD204B-UG p70)