From 834f488f13fbb83d271040a6c221cda0d676f88c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20W=C5=82ostowski?= <tomasz.wlostowski@cern.ch> Date: Tue, 30 Jun 2015 17:32:22 +0200 Subject: [PATCH] Proposed fix for improved cross-clock domain handling --- hdl/gn4124core/rtl/spartan6/gn4124_core.vhd | 39 ++++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/hdl/gn4124core/rtl/spartan6/gn4124_core.vhd b/hdl/gn4124core/rtl/spartan6/gn4124_core.vhd index e0e6f35..1950b49 100644 --- a/hdl/gn4124core/rtl/spartan6/gn4124_core.vhd +++ b/hdl/gn4124core/rtl/spartan6/gn4124_core.vhd @@ -180,15 +180,27 @@ architecture rtl of gn4124_core is rx_bufpll_lckd : out std_logic); -- BUFPLL locked end component serdes_1_to_n_clk_pll_s2_diff; - component pulse_synchronizer - port ( - clk_in_i : in std_logic; --! Input pulse clock domain - clk_out_i : in std_logic; --! Output pulse clock domain - pulse_i : in std_logic; --! One clk_in_i tick input pulse - done_o : out std_logic; --! Input pulse is synchronized (1 clk_in_i tick) - pulse_o : out std_logic --! One clk_out_i tick output pulse - ); - end component pulse_synchronizer; + + +component gc_pulse_synchronizer is + port ( + -- pulse input clock + clk_in_i : in std_logic; + -- pulse output clock + clk_out_i : in std_logic; + -- system reset (clk_in_i domain) + rst_n_i : in std_logic; + -- pulse input ready (clk_in_i domain). When HI, a pulse coming to d_p_i will be + -- correctly transferred to q_p_o. + d_ready_o : out std_logic; + -- pulse input (clk_in_i domain) + d_p_i : in std_logic; + -- pulse output (clk_out_i domain) + q_p_o : out std_logic); +end component gc_pulse_synchronizer; + + + ------------------------------------------------------------------------------ -- Signals declaration @@ -610,13 +622,14 @@ begin -- Synchronise DMA IRQ pulse to csr_clk_i clock domain l_dma_irq_sync : for I in 0 to dma_irq'length-1 generate - cmp_dma_irq_sync : pulse_synchronizer + cmp_dma_irq_sync : gc_pulse_synchronizer port map( clk_in_i => sys_clk, clk_out_i => csr_clk_i, - pulse_i => dma_irq(I), - done_o => open, - pulse_o => dma_irq_o(I) + rst_n_i => rst_n, + d_p_i => dma_irq(I), + d_ready_o => open, + q_p_o => dma_irq_o(I) ); end generate l_dma_irq_sync; -- GitLab