Commit af344aa3 authored by Maciej Lipinski's avatar Maciej Lipinski

LJ: improve/generalize Low-Jitter functionality detection/handling (WIP)

parent a155acb2
Pipeline #4992 failed with stage
in 38 seconds
...@@ -138,7 +138,8 @@ entity wrsw_rt_subsystem is ...@@ -138,7 +138,8 @@ entity wrsw_rt_subsystem is
lj_clk2_en : out std_logic; lj_clk2_en : out std_logic;
lj_detected_o : out std_logic; lj_detected_o : out std_logic;
lj_osc_freq_i : in std_logic_vector (2 downto 0) := (others=>'0'); lj_osc_freq_i : in std_logic_vector (2 downto 0) := (others=>'0');
-- LJD AD9516 lj_periph_id_i: in std_logic_vector (2 downto 0) := (others=>'0');
-- LJD AD9516 -- below IOs used when lj_detected_o = '1'
lj_pll_mosi_o : out std_logic; lj_pll_mosi_o : out std_logic;
lj_pll_miso_i : in std_logic; lj_pll_miso_i : in std_logic;
lj_pll_sck_o : out std_logic; lj_pll_sck_o : out std_logic;
...@@ -182,7 +183,7 @@ architecture rtl of wrsw_rt_subsystem is ...@@ -182,7 +183,7 @@ architecture rtl of wrsw_rt_subsystem is
-- 0x10300 - 0x10400: GPIO -- 0x10300 - 0x10400: GPIO
-- 0x10400 - 0x10500: Timer -- 0x10400 - 0x10500: Timer
constant c_NUM_GPIO_PINS : integer := 9; constant c_NUM_GPIO_PINS : integer := 11;
constant c_NUM_WB_SLAVES : integer := 9; constant c_NUM_WB_SLAVES : integer := 9;
constant c_MASTER_CPU : integer := 0; constant c_MASTER_CPU : integer := 0;
...@@ -487,6 +488,7 @@ begin -- rtl ...@@ -487,6 +488,7 @@ begin -- rtl
gpio_in(4) <= lj_board_detected; gpio_in(4) <= lj_board_detected;
gpio_in(7 downto 5) <= lj_osc_freq_i; gpio_in(7 downto 5) <= lj_osc_freq_i;
gpio_in(10 downto 8)<= lj_periph_id_i;
U_Main_DAC : gc_serial_dac U_Main_DAC : gc_serial_dac
......
...@@ -144,9 +144,10 @@ entity scb_top_bare is ...@@ -144,9 +144,10 @@ entity scb_top_bare is
lj_loopback_o : out std_logic; lj_loopback_o : out std_logic;
lj_clk1_en : out std_logic; lj_clk1_en : out std_logic;
lj_clk2_en : out std_logic; lj_clk2_en : out std_logic;
lj_detected_o : out std_logic; lj_ext_gm_pll_pres_o : out std_logic; -- '1' when GM's external PLL present
lj_present_o : out std_logic; lj_ext_gm_clk_diff_o : out std_logic; -- '1' when differencial ext 10MHz sinput used
lj_osc_freq_i : in std_logic_vector (2 downto 0); lj_osc_freq_i : in std_logic_vector (2 downto 0);
lj_periph_id_i : in std_logic_vector (2 downto 0);
-- LJD AD9516 -- LJD AD9516
lj_pll_mosi_o : out std_logic; lj_pll_mosi_o : out std_logic;
lj_pll_miso_i : in std_logic; lj_pll_miso_i : in std_logic;
...@@ -159,6 +160,10 @@ entity scb_top_bare is ...@@ -159,6 +160,10 @@ entity scb_top_bare is
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- Misc pins -- Misc pins
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- External counter
wd_int_i : in std_logic;
wd_scl_i : in std_logic;
wd_sda_b : inout std_logic;
-- GTX clock fanout enable -- GTX clock fanout enable
clk_en_o : out std_logic; clk_en_o : out std_logic;
...@@ -467,8 +472,8 @@ architecture rtl of scb_top_bare is ...@@ -467,8 +472,8 @@ architecture rtl of scb_top_bare is
signal nic_rtu_rsp : t_rtu_response; signal nic_rtu_rsp : t_rtu_response;
signal nic_rtu_ack : std_logic; signal nic_rtu_ack : std_logic;
signal lj_present : std_logic; signal lj_ext_gm_clk_diff : std_logic;
signal lj_detected : std_logic; signal lj_ext_gm_pll_pres : std_logic;
signal dac_main_sync_n : std_logic; signal dac_main_sync_n : std_logic;
signal dac_main_sclk : std_logic; signal dac_main_sclk : std_logic;
signal dac_main_data : std_logic; signal dac_main_data : std_logic;
...@@ -677,6 +682,8 @@ begin ...@@ -677,6 +682,8 @@ begin
lj_clk2_en => lj_clk2_en, lj_clk2_en => lj_clk2_en,
lj_detected_o => lj_detected, lj_detected_o => lj_detected,
lj_osc_freq_i => lj_osc_freq_i, lj_osc_freq_i => lj_osc_freq_i,
lj_periph_id_i => lj_periph_id_i,
-- below IOs used when lj_detected_o = '1'
lj_pll_mosi_o => lj_pll_mosi_o, lj_pll_mosi_o => lj_pll_mosi_o,
lj_pll_miso_i => lj_pll_miso_i, lj_pll_miso_i => lj_pll_miso_i,
lj_pll_sck_o => lj_pll_sck_o, lj_pll_sck_o => lj_pll_sck_o,
...@@ -1332,14 +1339,80 @@ begin ...@@ -1332,14 +1339,80 @@ begin
end generate; end generate;
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- WRS Low jitter daughterboard -- WRS Low jitter support MUX
-------------------------------------------------------------------------------
--
LJ_perip_select : process (lj_detected, ljd_osc_freq_i, lj_periph_id_i,
dac_main_sync_n, dac_main_sclk, dac_main_data)
begin
--------------------------------------------------------------------------
-- no Low-Jitter functionality at all, default clocking connections
--------------------------------------------------------------------------
if (lj_detected = '0') then
dac_main_sync_n_o <= dac_main_sync_n;
dac_main_sclk_o <= dac_main_sclk;
dac_main_data_o <= dac_main_data;
lj_dac_main_sync_n_o <= '0';
lj_dac_main_sclk_o <= '0';
lj_dac_main_data_o <= '0';
lj_ext_gm_pll_pres_o <= '0';
lj_ext_gm_clk_diff_o <= '0';
--------------------------------------------------------------------------
-- SyncTech WRS-FL with low-jitter capability integrated into main board
-- Versions supported: WRS-FL v1.0 and v1.5
--------------------------------------------------------------------------
elsif (lj_osc_freq_i = "111" and lj_periph_id_i = "111" ) then
dac_main_sync_n_o <= dac_main_sync_n;
dac_main_sclk_o <= dac_main_sclk;
dac_main_data_o <= dac_main_data;
lj_dac_main_sync_n_o <= '0';
lj_dac_main_sclk_o <= '0';
lj_dac_main_data_o <= '0';
lj_ext_gm_pll_pres_o <= '1';
lj_ext_gm_clk_diff_o <= '0';
-- If possible, do the distinction below:
if (FPGA_WD_INT = '1' ) then -- WRS-LJ v1.0
-- HDL for AD5662
else then -- WRS-LJ v1.5
-- HDL for AD5683R
end if;
elsif (ljd_osc_freq_i = "111" and lj_periph_id_i = "110") then
--------------------------------------------------------------------------
-- Safran WRS-LJ with low-jitter capability integrated into main board
-- Versions supported: WRS-LJ v1.2
--------------------------------------------------------------------------
--------------------------------------------------------------------------
-- Low-jitter daughterboard plugged onto a standard WRS
-- (values "110" and "111" not used/allowed/set bythe LJ-Daugtherboard)
--------------------------------------------------------------------------
-- elsif (ljd_osc_freq_i != "111" ) then
else
dac_main_sync_n_o <= '0';
dac_main_sclk_o <= '0';
dac_main_data_o <= '0';
lj_dac_main_sync_n_o <= dac_main_sync_n;
lj_dac_main_sclk_o <= dac_main_sclk;
lj_dac_main_data_o <= dac_main_data;
lj_ext_gm_pll_pres_o <= '1';
lj_ext_gm_clk_diff_o <= '1';
end if;
end process;
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
lj_present <= '1' when ((lj_detected='1') and (lj_osc_freq_i/="111")) else '0'; lj_present <= '1' when ((lj_detected='1') and (lj_osc_freq_i/="111")) else '0';
lj_detected_o <= lj_detected; lj_detected_o <= lj_detected;
lj_present_o <= lj_present; lj_present_o <= lj_present;
-- Redirect DAC output if external board detetected -- Redirect DAC output if external board detetected
dac_redirection : process (lj_present, dac_main_sync_n, dac_main_sclk, dac_main_data) dac_redirection : process (lj_ext_gm_pll_pres, dac_main_sync_n, dac_main_sclk, dac_main_data)
begin begin
if (lj_present = '0') then if (lj_present = '0') then
dac_main_sync_n_o <= dac_main_sync_n; dac_main_sync_n_o <= dac_main_sync_n;
...@@ -1357,6 +1430,5 @@ begin ...@@ -1357,6 +1430,5 @@ begin
lj_dac_main_data_o <= dac_main_data; lj_dac_main_data_o <= dac_main_data;
end if; end if;
end process; end process;
--
end rtl; end rtl;
...@@ -25,9 +25,12 @@ INST "BUFGMUX_inst" LOC = BUFGCTRL_X0Y1; ...@@ -25,9 +25,12 @@ INST "BUFGMUX_inst" LOC = BUFGCTRL_X0Y1;
NET "lj_clk_62mhz_p_i" LOC = AN33; NET "lj_clk_62mhz_p_i" LOC = AN33;
NET "lj_clk_62mhz_n_i" LOC = AN34; NET "lj_clk_62mhz_n_i" LOC = AN34;
NET "lj_rev_id_i[0]" LOC = AE29; NET "lj_periph_id_i[0]" LOC = AE29;
NET "lj_rev_id_i[1]" LOC = AE28; NET "lj_periph_id_i[0]" PULLUP;
NET "lj_rev_id_i[2]" LOC = AM32; NET "lj_periph_id_i[1]" LOC = AE28;
NET "lj_periph_id_i[1]" PULLUP;
NET "lj_periph_id_i[2]" LOC = AM32;
NET "lj_periph_id_i[2]" PULLUP;
NET "lj_osc_freq_i[0]" LOC = AN32; NET "lj_osc_freq_i[0]" LOC = AN32;
NET "lj_osc_freq_i[0]" PULLUP; NET "lj_osc_freq_i[0]" PULLUP;
...@@ -43,6 +46,10 @@ NET "lj_loopback_i" LOC = AM31; ...@@ -43,6 +46,10 @@ NET "lj_loopback_i" LOC = AM31;
NET "lj_loopback_o" LOC = AL30; NET "lj_loopback_o" LOC = AL30;
NET "lj_pll_locked_i" LOC = AH33; NET "lj_pll_locked_i" LOC = AH33;
NET "wd_int_i" LOC = AC23;
NET "wd_scl_i" LOC = T24;
NET "wd_sda_b" LOC = T23;
#EBI BUS #EBI BUS
#NET "cpu_clk_i" LOC=""; #NET "cpu_clk_i" LOC="";
NET "cpu_cs_n_i" LOC="H34"; NET "cpu_cs_n_i" LOC="H34";
......
...@@ -157,7 +157,7 @@ entity scb_top_synthesis is ...@@ -157,7 +157,7 @@ entity scb_top_synthesis is
lj_clk1_en : out std_logic; lj_clk1_en : out std_logic;
lj_clk2_en : out std_logic; lj_clk2_en : out std_logic;
lj_osc_freq_i : in std_logic_vector (2 downto 0); lj_osc_freq_i : in std_logic_vector (2 downto 0);
lj_rev_id_i : in std_logic_vector (2 downto 0); lj_periph_id_i: in std_logic_vector (2 downto 0);
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
...@@ -330,8 +330,18 @@ architecture Behavioral of scb_top_synthesis is ...@@ -330,8 +330,18 @@ architecture Behavioral of scb_top_synthesis is
signal clk_ext_100 : std_logic; signal clk_ext_100 : std_logic;
signal ext_pll_100_locked, ext_pll_62_locked : std_logic; signal ext_pll_100_locked, ext_pll_62_locked : std_logic;
signal clk_ext_mul_locked : std_logic; signal clk_ext_mul_locked : std_logic;
signal lj_detected : std_logic := '0';
signal lj_present : std_logic := '0'; -- when lj_ext_gm_pll_pres = '0':
-- FPGA-internal PLL is used to multiply input clock from 10MHz to 62.5MHz
-- when lj_ext_gm_pll_pres = '1':
-- external PLL is present and used to multiply input clock from 10MHz to 62.5MHz
signal lj_ext_gm_pll_pres : std_logic := '0';
-- when lj_ext_gm_clk_diff = '0'
-- single-ended 10 MHz input clock at pin K13 is used as input for 10MHz signal to SoftPLL
-- when lj_ext_gm_clk_diff = '1'
-- differencial 10 MHz input clock at pin AF30/AG30 is used as input for 10MHz signal to SoftPLL
signal lj_ext_gm_clk_diff : std_logic := '0';
signal ext_clk_10MHz, ext_clk_10MHz_bufr, clk_10mhz : std_logic; signal ext_clk_10MHz, ext_clk_10MHz_bufr, clk_10mhz : std_logic;
signal lj_clk_62mhz, lj_clk_62mhz_bufr : std_logic; signal lj_clk_62mhz, lj_clk_62mhz_bufr : std_logic;
...@@ -380,9 +390,10 @@ architecture Behavioral of scb_top_synthesis is ...@@ -380,9 +390,10 @@ architecture Behavioral of scb_top_synthesis is
lj_loopback_o : out std_logic; lj_loopback_o : out std_logic;
lj_clk1_en : out std_logic; lj_clk1_en : out std_logic;
lj_clk2_en : out std_logic; lj_clk2_en : out std_logic;
lj_detected_o : out std_logic; lj_ext_gm_pll_pres_o : out std_logic;
lj_present_o : out std_logic; lj_ext_gm_clk_diff_o : out std_logic;
lj_osc_freq_i : in std_logic_vector (2 downto 0); lj_osc_freq_i : in std_logic_vector (2 downto 0);
lj_periph_id_i : in std_logic_vector (2 downto 0);
lj_pll_mosi_o : out std_logic; lj_pll_mosi_o : out std_logic;
lj_pll_miso_i : in std_logic; lj_pll_miso_i : in std_logic;
lj_pll_sck_o : out std_logic; lj_pll_sck_o : out std_logic;
...@@ -390,6 +401,9 @@ architecture Behavioral of scb_top_synthesis is ...@@ -390,6 +401,9 @@ architecture Behavioral of scb_top_synthesis is
lj_pll_sync_n_o : out std_logic; lj_pll_sync_n_o : out std_logic;
lj_pll_reset_n_o : out std_logic; lj_pll_reset_n_o : out std_logic;
lj_pll_locked_i : in std_logic; lj_pll_locked_i : in std_logic;
wd_int_i : in std_logic;
wd_scl_i : in std_logic;
wd_sda_b : inout std_logic;
pll_status_i : in std_logic; pll_status_i : in std_logic;
pll_mosi_o : out std_logic; pll_mosi_o : out std_logic;
pll_miso_i : in std_logic; pll_miso_i : in std_logic;
...@@ -625,10 +639,10 @@ begin ...@@ -625,10 +639,10 @@ begin
CE0 => '1', CE0 => '1',
CE1 => '1', CE1 => '1',
O => clk_10mhz, O => clk_10mhz,
I0 => clk_ext, I0 => clk_ext, -- single-ended
I1 => ext_clk_10MHz_bufr, I1 => ext_clk_10MHz_bufr, -- differencial
S1 => lj_present, S1 => lj_ext_gm_clk_diff,
S0 => NOT lj_present); S0 => NOT lj_ext_gm_clk_diff);
U_Buf_CLK_DMTD : IBUFGDS U_Buf_CLK_DMTD : IBUFGDS
generic map ( generic map (
...@@ -684,7 +698,7 @@ begin ...@@ -684,7 +698,7 @@ begin
clk_ext_i => clk_ext, clk_ext_i => clk_ext,
clk_ext_100_o => clk_ext_100, clk_ext_100_o => clk_ext_100,
rst_a_i => ext_pll_reset, rst_a_i => ext_pll_reset,
powerdown_i => lj_detected, powerdown_i => lj_ext_gm_pll_pres,
locked_o => ext_pll_100_locked); locked_o => ext_pll_100_locked);
U_Ext_PLL2: ext_pll_100_to_62m U_Ext_PLL2: ext_pll_100_to_62m
...@@ -692,7 +706,7 @@ begin ...@@ -692,7 +706,7 @@ begin
clk_ext_100_i => clk_ext_100, clk_ext_100_i => clk_ext_100,
clk_ext_mul_o => clk_ext_mul, clk_ext_mul_o => clk_ext_mul,
rst_a_i => ext_pll_reset, rst_a_i => ext_pll_reset,
powerdown_i => lj_detected, powerdown_i => lj_ext_gm_pll_pres,
locked_o => ext_pll_62_locked); locked_o => ext_pll_62_locked);
clk_ext_mul_locked <= ext_pll_100_locked and ext_pll_62_locked; clk_ext_mul_locked <= ext_pll_100_locked and ext_pll_62_locked;
...@@ -897,9 +911,10 @@ begin ...@@ -897,9 +911,10 @@ begin
lj_loopback_o => lj_loopback_o, lj_loopback_o => lj_loopback_o,
lj_clk1_en => lj_clk1_en, lj_clk1_en => lj_clk1_en,
lj_clk2_en => lj_clk2_en, lj_clk2_en => lj_clk2_en,
lj_detected_o => lj_detected, lj_ext_gm_pll_pres_o => lj_ext_gm_pll_pres,
lj_present_o => lj_present, lj_ext_gm_clk_diff_o => lj_ext_gm_clk_diff,
lj_osc_freq_i => lj_osc_freq_i, lj_osc_freq_i => lj_osc_freq_i,
lj_periph_id_i => lj_periph_id_i,
lj_pll_mosi_o => lj_pll_mosi_o, lj_pll_mosi_o => lj_pll_mosi_o,
lj_pll_miso_i => lj_pll_miso_i, lj_pll_miso_i => lj_pll_miso_i,
lj_pll_sck_o => lj_pll_sck_o, lj_pll_sck_o => lj_pll_sck_o,
...@@ -907,6 +922,10 @@ begin ...@@ -907,6 +922,10 @@ begin
lj_pll_sync_n_o => lj_pll_sync_n_o, lj_pll_sync_n_o => lj_pll_sync_n_o,
lj_pll_reset_n_o => lj_pll_reset_n_o, lj_pll_reset_n_o => lj_pll_reset_n_o,
lj_pll_locked_i => lj_pll_locked_i, lj_pll_locked_i => lj_pll_locked_i,
wd_int_i => wd_int_i,
wd_scl_i => wd_scl_i,
wd_sda_b => wd_sda_b,
pll_status_i => clk_10mhz, pll_status_i => clk_10mhz,
pll_mosi_o => pll_mosi_o, pll_mosi_o => pll_mosi_o,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment