]> jspc29.x-matter.uni-frankfurt.de Git - trbnet.git/commitdiff
DDMTD - first approach
authorMichael Boehmer <mboehmer@ph.tum.de>
Wed, 13 Apr 2022 12:45:59 +0000 (14:45 +0200)
committerMichael Boehmer <mboehmer@ph.tum.de>
Wed, 13 Apr 2022 12:45:59 +0000 (14:45 +0200)
media_interfaces/ecp3_sfp/serdes_sync_all_125M_RS.lpc
media_interfaces/ecp3_sfp/serdes_sync_all_125M_RS.txt
media_interfaces/ecp3_sfp/serdes_sync_all_200M_RS.lpc
media_interfaces/ecp3_sfp/serdes_sync_all_200M_RS.txt
media_interfaces/med_ecp3_sfp_sync_all_RS.vhd
media_interfaces/sync/med_sync_control_RS.vhd
special/ddmtd.vhd [new file with mode: 0644]
special/deglitch.vhd [new file with mode: 0644]
special/phaser.vhd
special/phaser_core.vhd

index be8a991cbc62179cffa439f81d96e71ea3574a53..c6f03fc72a85dfa2577beabd9c951c073383ff30 100644 (file)
@@ -166,10 +166,10 @@ _ilsm0=ENABLED
 _ilsm1=ENABLED
 _ilsm2=ENABLED
 _ilsm3=ENABLED
-_scomma0=K28P157
-_scomma1=K28P157
-_scomma2=K28P157
-_scomma3=K28P157
+_scomma0=User Defined
+_scomma1=User Defined
+_scomma2=User Defined
+_scomma3=User Defined
 _comma_a0=1100000101
 _comma_a1=1100000101
 _comma_a2=1100000101
@@ -178,10 +178,10 @@ _comma_b0=0011111010
 _comma_b1=0011111010
 _comma_b2=0011111010
 _comma_b3=0011111010
-_comma_m0=1111111100
-_comma_m1=1111111100
-_comma_m2=1111111100
-_comma_m3=1111111100
+_comma_m0=1111111111
+_comma_m1=1111111111
+_comma_m2=1111111111
+_comma_m3=1111111111
 _ctc0=DISABLED
 _ctc1=DISABLED
 _ctc2=DISABLED
index 477095aba15d6ee3735ccc65b203d2ef69ffff2f..e1b59256e323398c104535190bcfde96e0bcc6a9 100644 (file)
@@ -115,10 +115,10 @@ CH0_COMMA_B             "0011111010"
 CH1_COMMA_B             "0011111010"
 CH2_COMMA_B             "0011111010"
 CH3_COMMA_B             "0011111010"
-CH0_COMMA_M             "1111111100"
-CH1_COMMA_M             "1111111100"
-CH2_COMMA_M             "1111111100"
-CH3_COMMA_M             "1111111100"
+CH0_COMMA_M             "1111111111"
+CH1_COMMA_M             "1111111111"
+CH2_COMMA_M             "1111111111"
+CH3_COMMA_M             "1111111111"
 CH0_RXWA                "ENABLED"
 CH1_RXWA                "ENABLED"
 CH2_RXWA                "ENABLED"
index c6fde15fb3a0540f2b95be5a6c9c3890f5da22ec..b7ca1f0fd9e300ed187c5a2f43a7216757a3ea93 100644 (file)
@@ -166,10 +166,10 @@ _ilsm0=ENABLED
 _ilsm1=ENABLED
 _ilsm2=ENABLED
 _ilsm3=ENABLED
-_scomma0=K28P157
-_scomma1=K28P157
-_scomma2=K28P157
-_scomma3=K28P157
+_scomma0=User Defined
+_scomma1=User Defined
+_scomma2=User Defined
+_scomma3=User Defined
 _comma_a0=1100000101
 _comma_a1=1100000101
 _comma_a2=1100000101
@@ -178,10 +178,10 @@ _comma_b0=0011111010
 _comma_b1=0011111010
 _comma_b2=0011111010
 _comma_b3=0011111010
-_comma_m0=1111111100
-_comma_m1=1111111100
-_comma_m2=1111111100
-_comma_m3=1111111100
+_comma_m0=1111111111
+_comma_m1=1111111111
+_comma_m2=1111111111
+_comma_m3=1111111111
 _ctc0=DISABLED
 _ctc1=DISABLED
 _ctc2=DISABLED
index 26149c40cacea09630231e35ff25f41da9a8cf83..f7731349f21029311607e18615b8f39313fb51a9 100644 (file)
@@ -115,10 +115,10 @@ CH0_COMMA_B             "0011111010"
 CH1_COMMA_B             "0011111010"
 CH2_COMMA_B             "0011111010"
 CH3_COMMA_B             "0011111010"
-CH0_COMMA_M             "1111111100"
-CH1_COMMA_M             "1111111100"
-CH2_COMMA_M             "1111111100"
-CH3_COMMA_M             "1111111100"
+CH0_COMMA_M             "1111111111"
+CH1_COMMA_M             "1111111111"
+CH2_COMMA_M             "1111111111"
+CH3_COMMA_M             "1111111111"
 CH0_RXWA                "ENABLED"
 CH1_RXWA                "ENABLED"
 CH2_RXWA                "ENABLED"
index 3bef1e5d2d2ddeacbce7f3fe23e018267c3e8929..2ded66af4d38d46fc367ecbaf7d26c69b946e575 100644 (file)
@@ -31,6 +31,10 @@ entity med_ecp3_sfp_sync_all_RS is
     RX_RST_WORD_OUT    : out std_logic_vector(7 downto 0); -- RST data byte, registered
     TX_RST_IN          : in  std_logic;
     TX_RST_WORD_IN     : in  std_logic_vector(7 downto 0);
+    -- phase measurement
+    PING_OUT           : out std_logic_vector(3 downto 0);
+    PONG_OUT           : out std_logic_vector(3 downto 0);
+    PONG_CLK_OUT       : out std_logic_vector(3 downto 0);
     -- sync operation
     WORD_SYNC_IN       : in  std_logic; -- byte alignment for DLM/RST forwarding (to master port)
     WORD_SYNC_OUT      : out std_logic; -- byte alignment for DLM/RST forwarding (from slave port)
@@ -43,7 +47,7 @@ entity med_ecp3_sfp_sync_all_RS is
     TX_PCS_RST_IN      : in  std_logic; -- TX PCS reset signal
     SYNC_TX_PLL_IN     : in  std_logic; -- bit0 alignment for TX serializer
     LINK_TX_READY_IN   : in  std_logic; -- from TX reset generator
-    DESTROY_LINK_IN    : in  std_logic_vector(3 downto 0); -- hard reset for links
+    DISABLE_LINK_IN    : in  std_logic_vector(3 downto 0); -- disable links by status
     WAP_REQUESTED_IN   : in  std_logic_vector(3 downto 0); -- TESTTESTTEST
     --SFP Connection
     SD_PRSNT_N_IN      : in  std_logic_vector(3 downto 0);  -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
@@ -131,6 +135,9 @@ architecture med_ecp3_sfp_sync_all_RS_arch of med_ecp3_sfp_sync_all_RS is
   signal lb_start_i         : std_logic;
   signal lb_start_qsys      : std_logic;
   signal lb_onoff_i         : std_logic;
+
+  signal ws_tx_i            : std_logic_vector(3 downto 0);
+  signal ws_rx_i            : std_logic_vector(3 downto 0);
   
   signal quad_mode          : integer range 0 to 100;
 
@@ -182,10 +189,10 @@ begin
                       link_rx_null_i(3) when ((quad_mode >= 8) and (IS_MODE(3) = c_IS_SLAVE)) else
                       '0';
 
-  link_tx_null_i(3) <= (LINK_TX_NULL_IN or DESTROY_LINK_IN(3)) when (IS_MODE(3) = c_IS_MASTER) else '0';
-  link_tx_null_i(2) <= (LINK_TX_NULL_IN or DESTROY_LINK_IN(2)) when (IS_MODE(2) = c_IS_MASTER) else '0';
-  link_tx_null_i(1) <= (LINK_TX_NULL_IN or DESTROY_LINK_IN(1)) when (IS_MODE(1) = c_IS_MASTER) else '0';
-  link_tx_null_i(0) <= (LINK_TX_NULL_IN or DESTROY_LINK_IN(0)) when (IS_MODE(0) = c_IS_MASTER) else '0';
+  link_tx_null_i(3) <= LINK_TX_NULL_IN when (IS_MODE(3) = c_IS_MASTER) else '0';
+  link_tx_null_i(2) <= LINK_TX_NULL_IN when (IS_MODE(2) = c_IS_MASTER) else '0';
+  link_tx_null_i(1) <= LINK_TX_NULL_IN when (IS_MODE(1) = c_IS_MASTER) else '0';
+  link_tx_null_i(0) <= LINK_TX_NULL_IN when (IS_MODE(0) = c_IS_MASTER) else '0';
 
 -------------------------------------------------
 -- stable RX recovered clock available
@@ -270,6 +277,23 @@ begin
     
   lb_onoff_i <= TX_RST_WORD_IN(0);
 
+-------------------------------------------------
+-------------------------------------------------
+  PING_OUT(0) <= ws_tx_i(0) when (IS_MODE(0) = c_IS_MASTER) else '0';
+  PING_OUT(1) <= ws_tx_i(1) when (IS_MODE(1) = c_IS_MASTER) else '0';
+  PING_OUT(2) <= ws_tx_i(2) when (IS_MODE(2) = c_IS_MASTER) else '0';
+  PING_OUT(3) <= ws_tx_i(3) when (IS_MODE(3) = c_IS_MASTER) else '0';
+
+  PONG_OUT(0) <= ws_rx_i(0) when (IS_MODE(0) = c_IS_MASTER) else '0';
+  PONG_OUT(1) <= ws_rx_i(1) when (IS_MODE(1) = c_IS_MASTER) else '0';
+  PONG_OUT(2) <= ws_rx_i(2) when (IS_MODE(2) = c_IS_MASTER) else '0';
+  PONG_OUT(3) <= ws_rx_i(3) when (IS_MODE(3) = c_IS_MASTER) else '0';
+
+  PONG_CLK_OUT(0) <= clk_rx_full(0) when (IS_MODE(0) = c_IS_MASTER) else '0';
+  PONG_CLK_OUT(1) <= clk_rx_full(1) when (IS_MODE(1) = c_IS_MASTER) else '0';
+  PONG_CLK_OUT(2) <= clk_rx_full(2) when (IS_MODE(2) = c_IS_MASTER) else '0';
+  PONG_CLK_OUT(3) <= clk_rx_full(3) when (IS_MODE(3) = c_IS_MASTER) else '0';
+
 -------------------------------------------------
 -- Serdes
 -------------------------------------------------
@@ -615,6 +639,7 @@ gen_control : for i in 0 to 3 generate
         LINK_RX_READY_OUT  => link_rx_ready_i(i),
         LINK_RX_NULL_OUT   => link_rx_null_i(i),
         LINK_TX_NULL_IN    => link_tx_null_i(i),
+        DISABLE_LINK_IN    => DISABLE_LINK_IN(i),
         -- komma operation
         TX_DLM_IN          => TX_DLM_IN,
         TX_DLM_WORD_IN     => TX_DLM_WORD_IN,
@@ -624,6 +649,9 @@ gen_control : for i in 0 to 3 generate
         RX_DLM_WORD_OUT    => RX_DLM_WORD_OUT(i*8+7 downto i*8),
         RX_RST_OUT         => rx_rst_i(i),
         RX_RST_WORD_OUT    => rx_rst_word_i(i*8+7 downto i*8),
+        --
+        WS_RX_OUT          => ws_rx_i(i),
+        WS_TX_OUT          => ws_tx_i(i),
         -- Status and debug signals
         STAT_TX_CONTROL    => stat_tx_control_i(i*32+31 downto i*32),
         STAT_RX_CONTROL    => stat_rx_control_i(i*32+31 downto i*32),
@@ -651,6 +679,8 @@ gen_control : for i in 0 to 3 generate
     RX_DLM_WORD_OUT(i*8+7 downto i*8) <= (others => '0');
     rx_rst_i(i)                       <= '0';
     rx_rst_word_i(i*8+7 downto i*8)   <= (others => '0');
+    ws_tx_i(i)                        <= '0';
+    ws_rx_i(i)                        <= '0';
     debug_i(i*32+31 downto i*32)      <= (others => '0');
   end generate;
   
index 97c377f53f70994847f1777446147f6a96cddcdd..82f866abdb763ee173bd66f8ab35aceee7f19893 100644 (file)
@@ -42,10 +42,11 @@ entity med_sync_control_RS is
     -- ports for synchronous operation
     WORD_SYNC_IN       : in  std_logic; -- sync signal for Byte/Word Alignment
     WORD_SYNC_OUT      : out std_logic;
-    LINK_TX_READY_IN   : in  std_logic; --
-    LINK_RX_READY_OUT  : out std_logic; --
+    LINK_TX_READY_IN   : in  std_logic;
+    LINK_RX_READY_OUT  : out std_logic;
     LINK_RX_NULL_OUT   : out std_logic;
     LINK_TX_NULL_IN    : in  std_logic;
+    DISABLE_LINK_IN    : in  std_logic;
     -- komma handling
     TX_DLM_IN          : in  std_logic; -- transmit one DLM komma
     TX_DLM_WORD_IN     : in  std_logic_vector(7 downto 0);
@@ -55,6 +56,9 @@ entity med_sync_control_RS is
     RX_DLM_WORD_OUT    : out std_logic_vector(7 downto 0);
     RX_RST_OUT         : out std_logic; -- one RST komma received
     RX_RST_WORD_OUT    : out std_logic_vector(7 downto 0);
+    --
+    WS_RX_OUT          : out std_logic;
+    WS_TX_OUT          : out std_logic;
     -- Status and debug signals
     STAT_TX_CONTROL    : out std_logic_vector(31 downto 0);
     STAT_RX_CONTROL    : out std_logic_vector(31 downto 0);
@@ -209,7 +213,9 @@ begin
     );   
 
   DEBUG_RX_CONTROL <= debug_rx_control_i;
-  
+
+  WS_RX_OUT <= word_sync_rx_i;
+
 -- clocks for media interface
   media_med2int_i.clk_half <= CLK_RXHALF; -- goes to clock and reset handler 
   media_med2int_i.clk_full <= CLK_RXI; -- goes to clock and reset handler
@@ -253,6 +259,8 @@ begin
 
   DEBUG_TX_CONTROL <= debug_tx_control_i;
   
+  WS_TX_OUT <= word_sync_tx_i;
+  
   -- WordSync is taken from RX in case of SP to sync the MPs in a hub.
   -- In case of a root MP it is taken from MP to sync DLM sending.
   -- NB: a root MP needs WORD_SYNC_IN set to '1' for operation.
@@ -298,7 +306,7 @@ begin
   media_med2int_i.stat_op(4)  <= link_active_qsys; -- rx_allow
   media_med2int_i.stat_op(3 downto 0) <= link_status_qsys;
 
-  link_status <= x"0" when (link_active_i = '1') else x"7";
+  link_status <= x"0" when ((link_active_i = '1') and (DISABLE_LINK_IN = '0')) else x"7";
 
   SYNC_MEDIA_SIGS : entity work.signal_sync
     generic map(
@@ -342,5 +350,5 @@ begin
   DEBUG_OUT(2)            <= link_active_qsys;
   DEBUG_OUT(1)            <= link_rx_ready_qsys;
   DEBUG_OUT(0)            <= link_tx_ready_qsys;
-
+  
 end architecture;
diff --git a/special/ddmtd.vhd b/special/ddmtd.vhd
new file mode 100644 (file)
index 0000000..1f1d35e
--- /dev/null
@@ -0,0 +1,94 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.numeric_std.all;\r
+\r
+library work;\r
+\r
+entity ddmtd is\r
+port(\r
+  AUXCLK           : in  std_logic; -- auxiliary clock for sampling\r
+  RESET            : in  std_logic;\r
+  PING_IN          : in  std_logic; -- TX_K signal\r
+  PONG_IN          : in  std_logic; -- RX_K signal\r
+  PING_OUT         : out std_logic; -- stretched TX_K signal\r
+  PONG_OUT         : out std_logic; -- stretched RX_K signal\r
+  START_PING_OUT   : out std_logic; -- rising edge of stretched TX_K signal\r
+  START_PONG_OUT   : out std_logic; -- rising edge of stretched RX_K signal \r
+  TOGGLE_OUT       : out std_logic;\r
+  BEAT_OUT         : out std_logic\r
+);\r
+end entity ddmtd;\r
+\r
+architecture ddmtd_arch of ddmtd is\r
+\r
+  signal ping_q        : std_logic_vector(2 downto 0);\r
+  signal pong_q        : std_logic_vector(2 downto 0);\r
+  signal beat_xor_x    : std_logic;\r
+  signal beat_xor_q    : std_logic;\r
+  signal toggle_q      : std_logic;\r
+  signal start_ping_i  : std_logic;\r
+  signal start_pong_i  : std_logic;\r
+  \r
+\r
+  attribute HGROUP : string;\r
+--  attribute BBOX   : string;\r
+  attribute HGROUP of ddmtd_arch : architecture is "ddmtd_group";\r
+--  attribute BBOX   of ddmtd_arch : architecture is "2,2";\r
+  attribute syn_sharing : string;\r
+  attribute syn_sharing of ddmtd_arch : architecture is "off";\r
+  attribute syn_hier : string;\r
+  attribute syn_hier of ddmtd_arch : architecture is "hard";\r
+\r
+begin\r
+\r
+THE_SAMPLER_PROC: process( AUXCLK )\r
+begin\r
+  if( rising_edge(AUXCLK) ) then\r
+    -- shift register for metastability\r
+    ping_q        <= ping_q(1 downto 0) & PING_IN;\r
+    pong_q        <= pong_q(1 downto 0) & PONG_IN;\r
+    -- register stages\r
+    beat_xor_q    <= beat_xor_x;\r
+  end if;\r
+end process THE_SAMPLER_PROC;\r
+\r
+-- PING deglitcher\r
+THE_PING_DEGLITCH: entity deglitch\r
+port map(\r
+  AUXCLK     => AUXCLK,\r
+  RESET      => RESET,\r
+  SIGNAL_IN  => ping_q(1),\r
+  START_OUT  => start_ping_i\r
+);\r
+\r
+-- PONG deglitcher\r
+THE_PONG_DEGLITCH: entity deglitch\r
+port map(\r
+  AUXCLK     => AUXCLK,\r
+  RESET      => RESET,\r
+  SIGNAL_IN  => pong_q(1),\r
+  START_OUT  => start_pong_i\r
+);\r
+\r
+-- XOR of both stretched signals\r
+beat_xor_x <= ping_q(1) xor pong_q(1);\r
+\r
+-- toggle bit for clock check\r
+THE_TOGGLE_PROC: process( AUXCLK, RESET )\r
+begin\r
+  if   ( RESET = '1' ) then\r
+    toggle_q <= '0';\r
+  elsif( rising_edge(AUXCLK) ) then\r
+    toggle_q <= not toggle_q;\r
+  end if;\r
+end process THE_TOGGLE_PROC;\r
+\r
+PING_OUT        <= ping_q(1);\r
+PONG_OUT        <= pong_q(1);\r
+START_PING_OUT  <= start_ping_i;\r
+START_PONG_OUT  <= start_pong_i;\r
+\r
+TOGGLE_OUT      <= toggle_q;\r
+BEAT_OUT        <= beat_xor_q;\r
+\r
+end architecture;\r
diff --git a/special/deglitch.vhd b/special/deglitch.vhd
new file mode 100644 (file)
index 0000000..d2ba61b
--- /dev/null
@@ -0,0 +1,65 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.numeric_std.all;\r
+\r
+library work;\r
+\r
+entity deglitch is\r
+port(\r
+  AUXCLK           : in  std_logic;\r
+  RESET            : in  std_logic;\r
+  SIGNAL_IN        : in  std_logic;\r
+  START_OUT        : out std_logic\r
+);\r
+end entity deglitch;\r
+\r
+architecture deglitch_arch of deglitch is\r
+\r
+  signal deglitch_q     : std_logic_vector(7 downto 0);\r
+  signal counter        : unsigned(3 downto 0);\r
+  signal start_x        : std_logic;\r
+  signal start_q        : std_logic;\r
+  signal ctr_up_x       : std_logic;\r
+  signal ctr_down_x     : std_logic;\r
+\r
+  attribute HGROUP : string;\r
+--  attribute BBOX   : string;\r
+  attribute HGROUP of deglitch_arch : architecture is "deglitch_group";\r
+--  attribute BBOX   of deglitch_arch : architecture is "4,4";\r
+  attribute syn_sharing : string;\r
+  attribute syn_sharing of deglitch_arch : architecture is "off";\r
+  attribute syn_hier : string;\r
+  attribute syn_hier of deglitch_arch : architecture is "hard";\r
+\r
+  begin\r
+\r
+THE_SYNC_PROC: process( AUXCLK )\r
+begin\r
+  if( rising_edge(AUXCLK) ) then\r
+    deglitch_q <= deglitch_q(6 downto 0) & SIGNAL_IN;\r
+    start_q    <= start_x;\r
+  end if;\r
+end process THE_SYNC_PROC;\r
+\r
+THE_UP_DOWN_COUNTER_PROC: process( AUXCLK, RESET )\r
+begin\r
+  if   ( RESET = '1' ) then\r
+    counter <= (others => '0');\r
+  elsif( rising_edge(AUXCLK) ) then\r
+    if   ( ctr_up_x = '1' ) then\r
+      counter <= counter + 1;\r
+    elsif( ctr_down_x = '1' ) then\r
+      counter <= counter - 1;\r
+    end if;\r
+  end if;\r
+end process THE_UP_DOWN_COUNTER_PROC;\r
+\r
+ctr_up_x    <= '1' when ( (SIGNAL_IN = '1') and (deglitch_q(7) = '0') ) else '0';\r
+ctr_down_x  <= '1' when ( (SIGNAL_IN = '0') and (deglitch_q(7) = '1') ) else '0';\r
+\r
+--start_x <= '1' when ( counter = x"4" ) else '0';\r
+start_x <= '1' when ( (counter = x"3") and (ctr_up_x = '1') ) else '0';\r
+\r
+START_OUT <= start_q;\r
+\r
+end architecture;\r
index a1c8ae47cfbf42a4a033c4902ccfc4b1247059e2..68e3b70e37d82e082c74c2aa11e775eea2cd3004 100644 (file)
@@ -10,10 +10,10 @@ entity phaser is
     RESET         : in  std_logic;\r
     START_IN      : in  std_logic; -- TX DLM\r
     STOP_IN       : in  std_logic; -- RX DLM\r
-    PING_IN       : in  std_logic; -- TX K\r
     CLK_PING      : in  std_logic; -- TX CLK\r
+    PING_IN       : in  std_logic; -- TX K\r
     PONG_IN       : in  std_logic; -- RX K\r
-    CLK_PONG      : in  std_logic; -- RX CLK\r
+    SELECT_IN     : in  std_logic_vector(1 downto 0);\r
     RESULT_OUT    : out std_logic_vector(31 downto 0);\r
     UPDATE_OUT    : out std_logic\r
   );\r
@@ -63,9 +63,8 @@ begin
     port map(\r
       SAMPLE_CLK    => SAMPLE_CLK,\r
       PING_IN       => PING_IN,\r
-      CLK_PING      => CLK_PING,\r
       PONG_IN       => PONG_IN,\r
-      CLK_PONG      => CLK_PONG,\r
+      SELECT_IN     => SELECT_IN,\r
       PHASE_OUT     => phase\r
     );\r
 \r
index 7f11e3607c66376514cbdac132f65f092e0e15bd..0c369783bda3258048b222a3c2dc6d9f150c1264 100644 (file)
@@ -10,9 +10,8 @@ entity phaser_core is
   port(\r
     SAMPLE_CLK    : in  std_logic;\r
     PING_IN       : in  std_logic; -- TX K\r
-    CLK_PING      : in  std_logic; -- TX CLK\r
     PONG_IN       : in  std_logic; -- RX K\r
-    CLK_PONG      : in  std_logic; -- RX CLK\r
+    SELECT_IN     : in  std_logic_vector(1 downto 0);\r
     PHASE_OUT     : out std_logic\r
   );\r
 end entity phaser_core;\r
@@ -24,16 +23,17 @@ architecture phaser_core_arch of phaser_core is
 -- state machine signals\r
 \r
 -- Signals\r
-  signal ping_i         : std_logic;\r
-  signal pong_i         : std_logic;\r
-  signal ping_i_q       : std_logic;\r
-  signal pong_i_q       : std_logic;\r
+  signal ch_up_x        : std_logic;\r
+  signal ch_up_q        : std_logic;\r
+  signal ch_dn_x        : std_logic;\r
+  signal ch_dn_q        : std_logic;\r
   signal phase_x        : std_logic;\r
-\r
+  signal phase          : std_logic;\r
+  \r
   attribute HGROUP : string;\r
   attribute BBOX   : string;\r
   attribute HGROUP of phaser_core_arch : architecture is "phaser_core_group";\r
-  attribute BBOX   of phaser_core_arch : architecture is "1,2";\r
+  attribute BBOX   of phaser_core_arch : architecture is "1,1";\r
   attribute syn_sharing : string;\r
   attribute syn_sharing of phaser_core_arch : architecture is "off";\r
   attribute syn_hier : string;\r
@@ -45,25 +45,30 @@ begin
 -- we want all logic in here in one PFU (defined timing)!\r
 ---------------------------------------------------------------------------\r
 \r
---  PINGFF : FD1S3AX port map ( CK => CLK_PING, D => PING_IN, Q => ping_i );\r
---  PONGFF : FD1S3AX port map ( CK => CLK_PONG, D => PONG_IN, Q => pong_i );\r
---\r
---  PINQFF : FD1S3AX port map ( CK => SAMPLE_CLK, D => ping_i, Q => ping_i_q );\r
---  PONQFF : FD1S3AX port map ( CK => SAMPLE_CLK, D => pong_i, Q => pong_i_q );\r
---\r
---  PHXLUT: LUT4 generic map ( INIT => b"0000_0000_0000_0110")\r
---    port map ( A => ping_i_q, B => pong_i_q, C => '0', D => '0', Z => phase_x );\r
-        \r
-  -- slice 0\r
-  ping_i   <= PING_IN when rising_edge(CLK_PING);   -- FF\r
-  -- slice 1\r
-  pong_i   <= PONG_IN when rising_edge(CLK_PONG);   -- FF\r
-  -- slice 2\r
-  ping_i_q <= ping_i  when rising_edge(SAMPLE_CLK); -- FF\r
-  pong_i_q <= pong_i  when rising_edge(SAMPLE_CLK); -- FF\r
-  -- slice 3\r
-  phase_x  <= ping_i_q xor pong_i_q;                -- LUT4\r
+  -- LUT4\r
+  ch_up_x <= PING_IN when SELECT_IN = b"00" else\r
+             PONG_IN when SELECT_IN = b"01" else\r
+             PING_IN when SELECT_IN = b"10" else\r
+             PONG_IN;\r
 \r
-  PHASE_OUT <= phase_x;\r
+  -- LUT4\r
+  ch_dn_x <= PING_IN when SELECT_IN = b"00" else\r
+             PONG_IN when SELECT_IN = b"01" else\r
+             PONG_IN when SELECT_IN = b"10" else\r
+             PING_IN;\r
+\r
+  -- FF\r
+  ch_up_q <= ch_up_x when rising_edge(SAMPLE_CLK);\r
+  \r
+  -- FF\r
+  ch_dn_q <= ch_dn_x when rising_edge(SAMPLE_CLK);\r
+  \r
+  -- LUT4\r
+  phase_x <= ch_up_q xor ch_dn_q;\r
+  \r
+  -- FF\r
+  phase <= phase_x when rising_edge(SAMPLE_CLK);\r
+  \r
+  PHASE_OUT <= phase;\r
 \r
 end architecture;\r