From 449795d35a2a016f5f6a3b582aaedf7b7726c263 Mon Sep 17 00:00:00 2001
From: Peter Lemmens
Date: Wed, 17 Dec 2014 11:48:31 +0100
Subject: [PATCH] Soda_client over SFP with trb over copper in the same quad
(pcsa). Testing at length remains to be done to check reset processes.
---
code/Cu_trb3_periph_soda_client.vhd | 574 ++++++++++++++++++++++
code/soda_components.vhd | 42 +-
code/trb_net16_med_1_2sync_3_ecp3_sfp.vhd | 3 +-
code/trb_net16_soda_sync_ecp3_sfp.vhd | 447 +++++++++++------
ctsc.ldf | 20 +-
ctsc.lpf | 15 +-
ctsc_20141217.bit | Bin 0 -> 3804522 bytes
7 files changed, 919 insertions(+), 182 deletions(-)
create mode 100644 code/Cu_trb3_periph_soda_client.vhd
create mode 100644 ctsc_20141217.bit
diff --git a/code/Cu_trb3_periph_soda_client.vhd b/code/Cu_trb3_periph_soda_client.vhd
new file mode 100644
index 0000000..df8634c
--- /dev/null
+++ b/code/Cu_trb3_periph_soda_client.vhd
@@ -0,0 +1,574 @@
+---------------
+-- TOP LEVEL --
+---------------
+-- TAB=3 !!
+
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+library work;
+use work.trb_net_std.all;
+use work.trb_net_components.all;
+use work.trb_net16_hub_func.all;
+use work.trb3_components.all;
+use work.soda_components.all;
+use work.med_sync_define.all;
+use work.version.all;
+
+entity Cu_trb3_periph_soda_client is
+ generic(
+ SYNC_MODE : integer range 0 to 1 := c_NO; --use the RX clock for internal logic and transmission. Should be NO for soda tests!
+ USE_125_MHZ : integer := c_NO;
+ CLOCK_FREQUENCY : integer := 100;
+ NUM_INTERFACES : integer := 1
+ );
+ port(
+ --Clocks
+ CLK_GPLL_LEFT : in std_logic; --Clock Manager 1/(2468), 125 MHz
+ CLK_GPLL_RIGHT : in std_logic; --Clock Manager 2/(2468), 200 MHz <-- MAIN CLOCK for FPGA
+ CLK_PCLK_LEFT : in std_logic; --Clock Fan-out, 200/400 MHz <-- For TDC. Same oscillator as GPLL right!
+ CLK_PCLK_RIGHT : in std_logic; --Clock Fan-out, 200/400 MHz <-- For TDC. Same oscillator as GPLL right!
+
+ --serdes I/O - connect as you like, no real use
+ SERDES_ADDON_TX : out std_logic_vector(15 downto 0);
+ SERDES_ADDON_RX : in std_logic_vector(15 downto 0);
+
+ --Inter-FPGA Communication
+ FPGA5_COMM : inout std_logic_vector(11 downto 0);
+ --Bit 0/1 input, serial link RX active
+ --Bit 2/3 output, serial link TX active
+ --others yet undefined
+ --Connection to AddOn
+ LED_LINKOK : out std_logic_vector(6 downto 1);
+ LED_RX : out std_logic_vector(6 downto 1);
+ LED_TX : out std_logic_vector(6 downto 1);
+ SFP_MOD0 : in std_logic_vector(6 downto 1);
+ SFP_TXDIS : out std_logic_vector(6 downto 1);
+ SFP_LOS : in std_logic_vector(6 downto 1);
+ --SFP_MOD1 : inout std_logic_vector(6 downto 1);
+ --SFP_MOD2 : inout std_logic_vector(6 downto 1);
+ --SFP_RATESEL : out std_logic_vector(6 downto 1);
+ --SFP_TXFAULT : in std_logic_vector(6 downto 1);
+
+ --Flash ROM & Reboot
+ FLASH_CLK : out std_logic;
+ FLASH_CS : out std_logic;
+ FLASH_DIN : out std_logic;
+ FLASH_DOUT : in std_logic;
+ PROGRAMN : out std_logic; --reboot FPGA
+
+ --Misc
+ TEMPSENS : inout std_logic; --Temperature Sensor
+ CODE_LINE : in std_logic_vector(1 downto 0);
+ LED_GREEN : out std_logic;
+ LED_ORANGE : out std_logic;
+ LED_RED : out std_logic;
+ LED_YELLOW : out std_logic;
+ SUPPL : in std_logic; --terminated diff pair, PCLK, Pads
+
+ --Test Connectors
+ TEST_LINE : out std_logic_vector(15 downto 0)
+ );
+end Cu_trb3_periph_soda_client;
+
+architecture Cu_trb3_periph_soda_client_arch of Cu_trb3_periph_soda_client is
+ -- Constants
+ constant REGIO_NUM_STAT_REGS : integer := 0;
+ constant REGIO_NUM_CTRL_REGS : integer := 2;
+
+
+ constant USE_200_MHZ : integer := 1 - USE_125_MHZ; -- if USE_125_MHZ=c_NO then USE_200_MHZ=c_YES and ViceVersa
+
+ --Clock / Reset
+ signal pll_lock : std_logic; --Internal PLL locked. E.g. used to reset all internal logic.
+ signal clear_i : std_logic;
+ signal reset_i : std_logic;
+ signal GSR_N : std_logic;
+
+ signal clk_100_osc : std_logic;
+ signal clk_200_osc : std_logic;
+ signal time_counter : unsigned(31 downto 0);
+
+ --Media Interface
+ signal med_stat_op : std_logic_vector (NUM_INTERFACES*16-1 downto 0);
+ signal med_ctrl_op : std_logic_vector (NUM_INTERFACES*16-1 downto 0);
+ signal med_stat_debug : std_logic_vector (NUM_INTERFACES*64-1 downto 0);
+ signal med_ctrl_debug : std_logic_vector (NUM_INTERFACES*64-1 downto 0);
+ signal med_data_out : std_logic_vector (NUM_INTERFACES*16-1 downto 0);
+ signal med_packet_num_out : std_logic_vector (NUM_INTERFACES* 3-1 downto 0);
+ signal med_dataready_out : std_logic_vector (NUM_INTERFACES* 1-1 downto 0);
+ signal med_read_out : std_logic_vector (NUM_INTERFACES* 1-1 downto 0);
+ signal med_data_in : std_logic_vector (NUM_INTERFACES*16-1 downto 0);
+ signal med_packet_num_in : std_logic_vector (NUM_INTERFACES* 3-1 downto 0);
+ signal med_dataready_in : std_logic_vector (NUM_INTERFACES* 1-1 downto 0);
+ signal med_read_in : std_logic_vector (NUM_INTERFACES* 1-1 downto 0);
+
+ --Slow Control channel
+ signal common_stat_reg : std_logic_vector(std_COMSTATREG*32-1 downto 0);
+ signal common_ctrl_reg : std_logic_vector(std_COMCTRLREG*32-1 downto 0);
+ signal stat_reg : std_logic_vector(32*2**REGIO_NUM_STAT_REGS-1 downto 0);
+ signal ctrl_reg : std_logic_vector(32*2**REGIO_NUM_CTRL_REGS-1 downto 0);
+ signal common_stat_reg_strobe : std_logic_vector(std_COMSTATREG-1 downto 0);
+ signal common_ctrl_reg_strobe : std_logic_vector(std_COMCTRLREG-1 downto 0);
+ signal stat_reg_strobe : std_logic_vector(2**REGIO_NUM_STAT_REGS-1 downto 0);
+ signal ctrl_reg_strobe : std_logic_vector(2**REGIO_NUM_CTRL_REGS-1 downto 0);
+
+ --RegIO
+ signal my_address : std_logic_vector (15 downto 0);
+ signal regio_addr_out : std_logic_vector (15 downto 0);
+ signal regio_read_enable_out : std_logic;
+ signal regio_write_enable_out : std_logic;
+ signal regio_data_out : std_logic_vector (31 downto 0);
+ signal regio_data_in : std_logic_vector (31 downto 0);
+ signal regio_dataready_in : std_logic;
+ signal regio_no_more_data_in : std_logic;
+ signal regio_write_ack_in : std_logic;
+ signal regio_unknown_addr_in : std_logic;
+ signal regio_timeout_out : std_logic;
+
+ --Timer
+ signal global_time : std_logic_vector(31 downto 0);
+ signal local_time : std_logic_vector(7 downto 0);
+ signal time_since_last_trg : std_logic_vector(31 downto 0);
+ signal timer_ticks : std_logic_vector(1 downto 0);
+
+ --Flash
+ signal spimem_read_en : std_logic;
+ signal spimem_write_en : std_logic;
+ signal spimem_data_in : std_logic_vector(31 downto 0);
+ signal spimem_addr : std_logic_vector(8 downto 0);
+ signal spimem_data_out : std_logic_vector(31 downto 0);
+ signal spimem_dataready_out : std_logic;
+ signal spimem_no_more_data_out : std_logic;
+ signal spimem_unknown_addr_out : std_logic;
+ signal spimem_write_ack_out : std_logic;
+
+ --Cu media interface
+ signal sci1_ack : std_logic;
+ signal sci1_write : std_logic;
+ signal sci1_read : std_logic;
+ signal sci1_data_in : std_logic_vector(7 downto 0);
+ signal sci1_data_out : std_logic_vector(7 downto 0);
+ signal sci1_addr : std_logic_vector(8 downto 0);
+ signal sfp_txdis_S : std_logic_vector(6 downto 1) := (others => '1');
+
+
+ --SODA
+ signal soda_rx_full_clk : std_logic;
+ signal soda_rx_half_clk : std_logic;
+ signal soda_tx_full_clk : std_logic;
+ signal soda_tx_half_clk : std_logic;
+
+ signal soda_tx_dlm_S : std_logic;
+ signal soda_tx_dlm_word_S : std_logic_vector(7 downto 0);
+ signal soda_rx_dlm_S : std_logic;
+ signal soda_rx_dlm_word_S : std_logic_vector(7 downto 0);
+-- signal make_reset : std_logic;
+ signal soda_tx_dlm_preview_S : std_logic; --PL!
+ signal link_phase_S : std_logic; --PL!
+-- signal rx_cdr_lol_S : std_logic;
+-- signal link_locked_S : std_logic; --PL!
+
+ -- SODA slow controll
+ signal soda_ack : std_logic;
+ signal soda_write : std_logic;
+ signal soda_read : std_logic;
+ signal soda_data_in : std_logic_vector(31 downto 0);
+ signal soda_data_out : std_logic_vector(31 downto 0);
+ signal soda_addr : std_logic_vector(3 downto 0);
+ signal soda_leds : std_logic_vector(3 downto 0);
+
+ signal link_debug_in_S : std_logic_vector(31 downto 0);
+ signal general_reset_i : std_logic := '1';
+
+begin
+---------------------------------------------------------------------------
+-- Reset Generation
+---------------------------------------------------------------------------
+
+
+ LED_RX <= (others => '0'); -- otherwise it is floating
+ LED_TX <= (others => '0'); -- otherwise it is floating
+ LED_LINKOK <= (others => '0'); -- otherwise it is floating
+ GSR_N <= pll_lock;
+
+ THE_RESET_HANDLER : trb_net_reset_handler
+ generic map(
+ RESET_DELAY => x"FEEE"
+ )
+ port map(
+ CLEAR_IN => '0', -- reset input (high active, async)
+ CLEAR_N_IN => '1', -- reset input (low active, async)
+ CLK_IN => clk_200_osc, --clk_raw_internal, -- raw master clock, NOT from PLL/DLL!
+ SYSCLK_IN => clk_100_osc, --rx_half_clk, PL 111114, -- PLL/DLL remastered clock
+ PLL_LOCKED_IN => pll_lock, -- master PLL lock signal (async)
+ RESET_IN => '0', --general_reset_i, -- '0', -- general reset signal (SYSCLK) --peter schakel
+ TRB_RESET_IN => med_stat_op(13), -- TRBnet reset signal (SYSCLK)
+ CLEAR_OUT => clear_i, -- async reset out, USE WITH CARE!
+ RESET_OUT => reset_i, -- synchronous reset out (SYSCLK)
+ DEBUG_OUT => open
+ );
+
+-------------------------------------------------------------------------
+-- Clock Handling
+-------------------------------------------------------------------------
+THE_MAIN_PLL : pll_in200_out100
+ port map(
+ CLK => CLK_GPLL_RIGHT,
+ CLKOP => clk_100_osc,
+ CLKOK => clk_200_osc,
+ LOCK => pll_lock
+ );
+
+---------------------------------------------------------------------------
+-- The TrbNet media interface (to other FPGA)
+---------------------------------------------------------------------------
+ TRB_MEDIA_AND_SODA_SYNC_UPLINK : Cu_trb_net16_soda_sync_ecp3_sfp
+ port map(
+ OSCCLK => clk_200_osc,
+ SYSCLK => clk_100_osc,
+ RESET => reset_i,
+ CLEAR => clear_i,
+ --Internal Connection
+ MED_DATA_IN => med_data_out(15 downto 0),
+ MED_PACKET_NUM_IN => med_packet_num_out(2 downto 0),
+ MED_DATAREADY_IN => med_dataready_out(0),
+ MED_READ_OUT => med_read_in(0),
+ MED_DATA_OUT => med_data_in(15 downto 0),
+ MED_PACKET_NUM_OUT => med_packet_num_in(2 downto 0),
+ MED_DATAREADY_OUT => med_dataready_in(0),
+ MED_READ_IN => med_read_out(0),
+
+ --Copper SFP Connection
+ CU_RXD_P_IN => SERDES_ADDON_RX(2),
+ CU_RXD_N_IN => SERDES_ADDON_RX(3),
+ CU_TXD_P_OUT => SERDES_ADDON_TX(2),
+ CU_TXD_N_OUT => SERDES_ADDON_TX(3),
+ CU_PRSNT_N_IN => FPGA5_COMM(0),
+ CU_LOS_IN => FPGA5_COMM(0),
+ CU_TXDIS_OUT => FPGA5_COMM(2),
+
+ -- sync clocks
+ SYNC_RX_HALF_CLK_OUT => soda_rx_half_clk,
+ SYNC_RX_FULL_CLK_OUT => soda_rx_full_clk,
+ SYNC_TX_HALF_CLK_OUT => soda_tx_half_clk,
+ SYNC_TX_FULL_CLK_OUT => soda_tx_full_clk,
+
+ SYNC_RXD_P_IN => SERDES_ADDON_RX(4),
+ SYNC_RXD_N_IN => SERDES_ADDON_RX(5),
+ SYNC_TXD_P_OUT => SERDES_ADDON_TX(4),
+ SYNC_TXD_N_OUT => SERDES_ADDON_TX(5),
+ SYNC_DLM_IN => soda_tx_dlm_S,
+ SYNC_DLM_WORD_IN => soda_tx_dlm_word_S,
+ SYNC_DLM_OUT => soda_rx_dlm_S,
+ SYNC_DLM_WORD_OUT => soda_rx_dlm_word_S,
+ SYNC_PRSNT_N_IN => SFP_MOD0(3),
+ SYNC_LOS_IN => SFP_LOS(3),
+ SYNC_TXDIS_OUT => sfp_txdis_S(3),
+
+ SCI_DATA_IN => sci1_data_in,
+ SCI_DATA_OUT => sci1_data_out,
+ SCI_ADDR => sci1_addr,
+ SCI_READ => sci1_read,
+ SCI_WRITE => sci1_write,
+ SCI_ACK => sci1_ack,
+ -- Status and control port
+ STAT_OP => med_stat_op(15 downto 0),
+ CTRL_OP => med_ctrl_op(15 downto 0),
+ STAT_DEBUG => med_stat_debug(63 downto 0),
+ CTRL_DEBUG => (others => '0')
+ );
+
+
+-------------------------------------------------------------------------
+-- Endpoint
+-------------------------------------------------------------------------
+ THE_ENDPOINT : trb_net16_endpoint_hades_full_handler
+ generic map(
+ --USE_CHANNEL => (c_YES,c_YES,c_NO,c_YES),
+ REGIO_NUM_STAT_REGS => REGIO_NUM_STAT_REGS, --4, --16 stat reg
+ REGIO_NUM_CTRL_REGS => REGIO_NUM_CTRL_REGS, --3, --8 cotrol reg
+ ADDRESS_MASK => x"FFFF",
+ BROADCAST_BITMASK => x"FF",
+ BROADCAST_SPECIAL_ADDR => x"45",
+ REGIO_COMPILE_TIME => std_logic_vector(to_unsigned(VERSION_NUMBER_TIME, 32)),
+ REGIO_HARDWARE_VERSION => x"9100b000",
+ REGIO_INIT_ADDRESS => x"f35a",
+ REGIO_USE_VAR_ENDPOINT_ID => c_YES,
+ CLOCK_FREQUENCY => CLOCK_FREQUENCY,
+ TIMING_TRIGGER_RAW => c_YES,
+ --Configure data handler
+ DATA_INTERFACE_NUMBER => 1,
+ DATA_BUFFER_DEPTH => 9, --13
+ DATA_BUFFER_WIDTH => 32,
+ DATA_BUFFER_FULL_THRESH => 256,
+ TRG_RELEASE_AFTER_DATA => c_YES,
+ HEADER_BUFFER_DEPTH => 9,
+ HEADER_BUFFER_FULL_THRESH => 256
+ )
+ port map(
+ CLK => clk_100_osc, --rx_half_clk, PL 111114
+ RESET => reset_i,
+ CLK_EN => '1',
+ MED_DATAREADY_OUT => med_dataready_out(0),
+ MED_DATA_OUT => med_data_out,
+ MED_PACKET_NUM_OUT => med_packet_num_out,
+ MED_READ_IN => med_read_in(0),
+ MED_DATAREADY_IN => med_dataready_in(0),
+ MED_DATA_IN => med_data_in,
+ MED_PACKET_NUM_IN => med_packet_num_in,
+ MED_READ_OUT => med_read_out(0),
+ MED_STAT_OP_IN => med_stat_op,
+ MED_CTRL_OP_OUT => med_ctrl_op,
+
+ --Timing trigger in
+ TRG_TIMING_TRG_RECEIVED_IN => '0',
+ --LVL1 trigger to FEE
+ LVL1_TRG_DATA_VALID_OUT => open,
+ LVL1_VALID_TIMING_TRG_OUT => open,
+ LVL1_VALID_NOTIMING_TRG_OUT => open,
+ LVL1_INVALID_TRG_OUT => open,
+
+ LVL1_TRG_TYPE_OUT => open,
+ LVL1_TRG_NUMBER_OUT => open,
+ LVL1_TRG_CODE_OUT => open,
+ LVL1_TRG_INFORMATION_OUT => open,
+ LVL1_INT_TRG_NUMBER_OUT => open,
+
+ --Information about trigger handler errors
+ TRG_MULTIPLE_TRG_OUT => open,
+ TRG_TIMEOUT_DETECTED_OUT => open,
+ TRG_SPURIOUS_TRG_OUT => open,
+ TRG_MISSING_TMG_TRG_OUT => open,
+ TRG_SPIKE_DETECTED_OUT => open,
+
+ --Response from FEE
+ FEE_TRG_RELEASE_IN(0) => '1',
+ FEE_TRG_STATUSBITS_IN => (others => '0'),
+ FEE_DATA_IN => (others => '0'),
+ FEE_DATA_WRITE_IN(0) => '0',
+ FEE_DATA_FINISHED_IN(0) => '1',
+ FEE_DATA_ALMOST_FULL_OUT(0) => open,
+
+ -- Slow Control Data Port
+ REGIO_COMMON_STAT_REG_IN => (others => '0'), --common_stat_reg, --0x00 because it is floating
+ REGIO_COMMON_CTRL_REG_OUT => common_ctrl_reg, --0x20
+ REGIO_COMMON_STAT_STROBE_OUT => common_stat_reg_strobe,
+ REGIO_COMMON_CTRL_STROBE_OUT => common_ctrl_reg_strobe,
+ REGIO_STAT_REG_IN => stat_reg, --start 0x80
+ REGIO_CTRL_REG_OUT => ctrl_reg, --start 0xc0
+ REGIO_STAT_STROBE_OUT => stat_reg_strobe,
+ REGIO_CTRL_STROBE_OUT => ctrl_reg_strobe,
+ REGIO_VAR_ENDPOINT_ID(1 downto 0) => CODE_LINE,
+ REGIO_VAR_ENDPOINT_ID(15 downto 2) => (others => '0'),
+
+ BUS_ADDR_OUT => regio_addr_out,
+ BUS_READ_ENABLE_OUT => regio_read_enable_out,
+ BUS_WRITE_ENABLE_OUT => regio_write_enable_out,
+ BUS_DATA_OUT => regio_data_out,
+ BUS_DATA_IN => regio_data_in,
+ BUS_DATAREADY_IN => regio_dataready_in,
+ BUS_NO_MORE_DATA_IN => regio_no_more_data_in,
+ BUS_WRITE_ACK_IN => regio_write_ack_in,
+ BUS_UNKNOWN_ADDR_IN => regio_unknown_addr_in,
+ BUS_TIMEOUT_OUT => regio_timeout_out,
+ ONEWIRE_INOUT => TEMPSENS,
+ ONEWIRE_MONITOR_OUT => open,
+
+ TIME_GLOBAL_OUT => global_time,
+ TIME_LOCAL_OUT => local_time,
+ TIME_SINCE_LAST_TRG_OUT => time_since_last_trg,
+ TIME_TICKS_OUT => timer_ticks,
+
+ STAT_DEBUG_IPU => open,
+ STAT_DEBUG_1 => open,
+ STAT_DEBUG_2 => open,
+ STAT_DEBUG_DATA_HANDLER_OUT => open,
+ STAT_DEBUG_IPU_HANDLER_OUT => open,
+ STAT_TRIGGER_OUT => open,
+ CTRL_MPLEX => (others => '0'),
+ IOBUF_CTRL_GEN => (others => '0'),
+ STAT_ONEWIRE => open,
+ STAT_ADDR_DEBUG => open,
+ DEBUG_LVL1_HANDLER_OUT => open
+ );
+
+---------------------------------------------------------------------------
+-- Bus Handler
+---------------------------------------------------------------------------
+ THE_BUS_HANDLER : trb_net16_regio_bus_handler
+ generic map(
+ PORT_NUMBER => 3,
+ PORT_ADDRESSES => (0 => x"d000", 1 => x"b000", 2 => x"be00", others => x"0000"),
+ PORT_ADDR_MASK => (0 => 9, 1 => 9, 2 => 4, others => 0)
+ )
+ port map(
+ CLK => clk_100_osc, --rx_half_clk, PL 111114
+ RESET => reset_i,
+
+ DAT_ADDR_IN => regio_addr_out,
+ DAT_DATA_IN => regio_data_out,
+ DAT_DATA_OUT => regio_data_in,
+ DAT_READ_ENABLE_IN => regio_read_enable_out,
+ DAT_WRITE_ENABLE_IN => regio_write_enable_out,
+ DAT_TIMEOUT_IN => regio_timeout_out,
+ DAT_DATAREADY_OUT => regio_dataready_in,
+ DAT_WRITE_ACK_OUT => regio_write_ack_in,
+ DAT_NO_MORE_DATA_OUT => regio_no_more_data_in,
+ DAT_UNKNOWN_ADDR_OUT => regio_unknown_addr_in,
+
+ BUS_READ_ENABLE_OUT(0) => spimem_read_en,
+ BUS_READ_ENABLE_OUT(1) => sci1_read,
+ BUS_READ_ENABLE_OUT(2) => soda_read,
+
+ BUS_WRITE_ENABLE_OUT(0) => spimem_write_en,
+ BUS_WRITE_ENABLE_OUT(1) => sci1_write,
+ BUS_WRITE_ENABLE_OUT(2) => soda_write,
+
+ BUS_DATA_OUT(0*32+31 downto 0*32) => spimem_data_in,
+ BUS_DATA_OUT(1*32+7 downto 1*32) => sci1_data_in,
+ BUS_DATA_OUT(1*32+31 downto 1*32+8) => open,
+ BUS_DATA_OUT(2*32+31 downto 2*32) => soda_data_in,
+
+ BUS_ADDR_OUT(0*16+8 downto 0*16) => spimem_addr,
+ BUS_ADDR_OUT(0*16+15 downto 0*16+9) => open,
+ BUS_ADDR_OUT(1*16+8 downto 1*16) => sci1_addr,
+ BUS_ADDR_OUT(1*16+15 downto 1*16+9) => open,
+ BUS_ADDR_OUT(2*16+3 downto 2*16) => soda_addr,
+ BUS_ADDR_OUT(2*16+15 downto 2*16+4) => open,
+
+ BUS_TIMEOUT_OUT(0) => open,
+ BUS_TIMEOUT_OUT(1) => open,
+ BUS_TIMEOUT_OUT(2) => open,
+
+ BUS_DATA_IN(0*32+31 downto 0*32) => spimem_data_out,
+ BUS_DATA_IN(1*32+7 downto 1*32) => sci1_data_out,
+ BUS_DATA_IN(1*32+31 downto 1*32+8) => open,
+ BUS_DATA_IN(2*32+31 downto 2*32) => soda_data_out,
+
+ BUS_DATAREADY_IN(0) => spimem_dataready_out,
+ BUS_DATAREADY_IN(1) => sci1_ack,
+ BUS_DATAREADY_IN(2) => soda_ack,
+
+ BUS_WRITE_ACK_IN(0) => spimem_write_ack_out,
+ BUS_WRITE_ACK_IN(1) => sci1_ack,
+ BUS_WRITE_ACK_IN(2) => soda_ack,
+
+ BUS_NO_MORE_DATA_IN(0) => spimem_no_more_data_out,
+ BUS_NO_MORE_DATA_IN(1) => '0',
+ BUS_NO_MORE_DATA_IN(2) => '0',
+
+ BUS_UNKNOWN_ADDR_IN(0) => spimem_unknown_addr_out,
+ BUS_UNKNOWN_ADDR_IN(1) => '0',
+ BUS_UNKNOWN_ADDR_IN(2) => '0',
+
+ STAT_DEBUG => open
+ );
+
+---------------------------------------------------------------------------
+-- SPI / Flash
+---------------------------------------------------------------------------
+
+THE_SPI_RELOAD : spi_flash_and_fpga_reload --.flash_reboot_arch
+ port map(
+ CLK_IN => clk_100_osc,
+ RESET_IN => reset_i,
+
+ BUS_ADDR_IN => spimem_addr,
+ BUS_READ_IN => spimem_read_en,
+ BUS_WRITE_IN => spimem_write_en,
+ BUS_DATAREADY_OUT => spimem_dataready_out,
+ BUS_WRITE_ACK_OUT => spimem_write_ack_out,
+ BUS_UNKNOWN_ADDR_OUT => spimem_unknown_addr_out,
+ BUS_NO_MORE_DATA_OUT => spimem_no_more_data_out,
+ BUS_DATA_IN => spimem_data_in,
+ BUS_DATA_OUT => spimem_data_out,
+
+ DO_REBOOT_IN => common_ctrl_reg(15),
+ PROGRAMN => PROGRAMN,
+
+ SPI_CS_OUT => FLASH_CS,
+ SPI_SCK_OUT => FLASH_CLK,
+ SPI_SDO_OUT => FLASH_DIN,
+ SPI_SDI_IN => FLASH_DOUT
+ );
+
+
+-- SFP_TXDIS(1) <= sfp_txdis_S(1);
+ SFP_TXDIS <= sfp_txdis_S;
+
+ -----------------------------------------------------------------------
+ -- Since there is nomore trb on this link, link-phase does not need to
+ -- be controlled. To avoid changing code, link-phase is faked here.
+ -----------------------------------------------------------------------
+ DUMMY_LINK_PHASE_PROC : process (soda_rx_full_clk)
+ begin
+ if rising_edge(soda_rx_full_clk) then
+ if (reset_i='1') then
+ link_phase_S <='0';
+ elsif (link_phase_S='0') then
+ link_phase_S <='1';
+ else
+ link_phase_S <='0';
+ end if;
+ end if;
+ end process;
+
+---------------------------------------------------------------------------
+-- The Soda Central
+---------------------------------------------------------------------------
+
+ A_SODA_CLIENT : soda_client
+ port map(
+ SYSCLK => soda_rx_half_clk, --clk_100_osc,
+ SODACLK => soda_rx_full_clk,
+ RESET => reset_i,
+ CLEAR => clear_i,
+ CLK_EN => '1',
+ --Internal Connection
+ RX_DLM_WORD_IN => soda_rx_dlm_word_S,
+ RX_DLM_IN => soda_rx_dlm_S,
+ TX_DLM_OUT => soda_tx_dlm_S,
+ TX_DLM_WORD_OUT => soda_tx_dlm_word_S,
+ TX_DLM_PREVIEW_OUT => soda_tx_dlm_preview_S,
+ LINK_PHASE_IN => link_phase_S,
+ SODA_DATA_IN => soda_data_in,
+ SODA_DATA_OUT => soda_data_out,
+ SODA_ADDR_IN => soda_addr,
+ SODA_READ_IN => soda_read,
+ SODA_WRITE_IN => soda_write,
+ SODA_ACK_OUT => soda_ack,
+ LEDS_OUT => soda_leds,
+ LINK_DEBUG_IN => link_debug_in_S
+ );
+
+
+---------------------------------------------------------------------------
+-- LED
+---------------------------------------------------------------------------
+
+ LED_ORANGE <= time_counter(26);
+ LED_YELLOW <= time_counter(26);
+ LED_GREEN <= time_counter(26);
+ LED_RED <= time_counter(26);
+---------------------------------------------------------------------------
+-- DEBUG
+---------------------------------------------------------------------------
+ link_debug_in_S(31 downto 16) <= med_stat_op(15 downto 0);
+ link_debug_in_S(15 downto 0) <= (3 => pll_lock, others => '0');
+---------------------------------------------------------------------------
+-- Test Circuits
+---------------------------------------------------------------------------
+ blink : process (clk_100_osc)
+ begin
+ if rising_edge(clk_100_osc) then
+ if (time_counter = x"FFFFFFFF") then
+ time_counter <= x"00000000";
+ else
+ time_counter <= time_counter + 1;
+ end if;
+ end if;
+ end process;
+
+end Cu_trb3_periph_soda_client_arch;
\ No newline at end of file
diff --git a/code/soda_components.vhd b/code/soda_components.vhd
index 1a2d2ed..4ce848f 100644
--- a/code/soda_components.vhd
+++ b/code/soda_components.vhd
@@ -678,15 +678,6 @@ package soda_components is
end component;
component Cu_trb_net16_soda_sync_ecp3_sfp
- generic(
- SERDES_NUM : integer range 0 to 3 := 0;
- EXT_CLOCK : integer range 0 to 1 := c_NO;
- USE_200_MHZ : integer range 0 to 1 := c_YES;
- USE_125_MHZ : integer range 0 to 1 := c_NO;
- USE_CTC : integer range 0 to 1 := c_YES;
- USE_SLAVE : integer range 0 to 1 := c_NO;
- SODA_IS_SYNC_SLAVE : integer range 0 to 1 := c_YES
- );
port(
OSCCLK : in std_logic; -- 200 MHz reference clock
SYSCLK : in std_logic; -- 100 MHz main clock net, synchronous to RX clock
@@ -702,32 +693,31 @@ package soda_components is
MED_PACKET_NUM_OUT : out std_logic_vector(c_NUM_WIDTH-1 downto 0) := (others => '0');
MED_DATAREADY_OUT : out std_logic := '0';
MED_READ_IN : in std_logic;
- -- sync clocks
- SYNC_RX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz
- SYNC_RX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz
- SYNC_TX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz
- SYNC_TX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz
--Copper SFP Connection
CU_RXD_P_IN : in std_logic;
CU_RXD_N_IN : in std_logic;
CU_TXD_P_OUT : out std_logic;
CU_TXD_N_OUT : out std_logic;
- CU_REFCLK_P_IN : in std_logic; --not used
- CU_REFCLK_N_IN : in std_logic; --not used
CU_PRSNT_N_IN : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
CU_LOS_IN : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
CU_TXDIS_OUT : out std_logic := '0'; -- SFP disable
- --SFP Connection
- SD_RXD_P_IN : in std_logic;
- SD_RXD_N_IN : in std_logic;
- SD_TXD_P_OUT : out std_logic;
- SD_TXD_N_OUT : out std_logic;
- SD_REFCLK_P_IN : in std_logic; --not used
- SD_REFCLK_N_IN : in std_logic; --not used
- SD_PRSNT_N_IN : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
- SD_LOS_IN : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
- SD_TXDIS_OUT : out std_logic := '0'; -- SFP disable
+ --Fiber/sync SFP Connection
+ SYNC_RX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz
+ SYNC_RX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz
+ SYNC_TX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz
+ SYNC_TX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz
+ SYNC_DLM_IN : in std_logic;
+ SYNC_DLM_WORD_IN : in std_logic_vector(7 downto 0);
+ SYNC_DLM_OUT : out std_logic;
+ SYNC_DLM_WORD_OUT : out std_logic_vector(7 downto 0);
+ SYNC_RXD_P_IN : in std_logic;
+ SYNC_RXD_N_IN : in std_logic;
+ SYNC_TXD_P_OUT : out std_logic;
+ SYNC_TXD_N_OUT : out std_logic;
+ SYNC_PRSNT_N_IN : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
+ SYNC_LOS_IN : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
+ SYNC_TXDIS_OUT : out std_logic := '0'; -- SFP disable
--Control Interface
SCI_DATA_IN : in std_logic_vector(7 downto 0) := (others => '0');
SCI_DATA_OUT : out std_logic_vector(7 downto 0) := (others => '0');
diff --git a/code/trb_net16_med_1_2sync_3_ecp3_sfp.vhd b/code/trb_net16_med_1_2sync_3_ecp3_sfp.vhd
index f245c3e..c8b2c04 100644
--- a/code/trb_net16_med_1_2sync_3_ecp3_sfp.vhd
+++ b/code/trb_net16_med_1_2sync_3_ecp3_sfp.vhd
@@ -696,6 +696,7 @@ THE_SERDES: sfp_1_2sync_3_200_int port map(
syncfifo_din(7 downto 0) <= SODA_DLM_WORD_IN;
syncfifo_din(17 downto 8) <= (others => '0');
SODA_dlm_word_S <= syncfifo_dout(7 downto 0);
+
sync_DLM_tx: trb_net_fifo_16bit_bram_dualport
generic map(
USE_STATUS_FLAGS => c_NO
@@ -1147,4 +1148,4 @@ begin
end if;
end process;
-end architecture;
\ No newline at end of file
+end architecture;
diff --git a/code/trb_net16_soda_sync_ecp3_sfp.vhd b/code/trb_net16_soda_sync_ecp3_sfp.vhd
index 437afc9..8000fb5 100644
--- a/code/trb_net16_soda_sync_ecp3_sfp.vhd
+++ b/code/trb_net16_soda_sync_ecp3_sfp.vhd
@@ -7,18 +7,10 @@ USE IEEE.numeric_std.all;
library work;
use work.trb_net_std.all;
-use work.trb_net_components.all;
+use work.trb_net_components.all;
+use work.med_sync_define.all;
entity Cu_trb_net16_soda_sync_ecp3_sfp is
- generic(
- SERDES_NUM : integer range 0 to 3 := 0;
- EXT_CLOCK : integer range 0 to 1 := c_NO;
- USE_200_MHZ : integer range 0 to 1 := c_YES;
- USE_125_MHZ : integer range 0 to 1 := c_NO;
- USE_CTC : integer range 0 to 1 := c_NO;
- USE_SLAVE : integer range 0 to 1 := c_NO;
- SODA_IS_SYNC_SLAVE : integer range 0 to 1 := c_YES
- );
port(
OSCCLK : in std_logic; -- 200 MHz reference clock
SYSCLK : in std_logic; -- 100 MHz main clock net, synchronous to RX clock
@@ -34,32 +26,31 @@ entity Cu_trb_net16_soda_sync_ecp3_sfp is
MED_PACKET_NUM_OUT : out std_logic_vector(c_NUM_WIDTH-1 downto 0) := (others => '0');
MED_DATAREADY_OUT : out std_logic := '0';
MED_READ_IN : in std_logic;
- -- sync clocks
- SYNC_RX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz
- SYNC_RX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz
- SYNC_TX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz
- SYNC_TX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz
--Copper SFP Connection
CU_RXD_P_IN : in std_logic;
CU_RXD_N_IN : in std_logic;
CU_TXD_P_OUT : out std_logic;
CU_TXD_N_OUT : out std_logic;
- CU_REFCLK_P_IN : in std_logic; --not used
- CU_REFCLK_N_IN : in std_logic; --not used
CU_PRSNT_N_IN : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
CU_LOS_IN : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
CU_TXDIS_OUT : out std_logic := '0'; -- SFP disable
- --Fiber SFP Connection
- SD_RXD_P_IN : in std_logic;
- SD_RXD_N_IN : in std_logic;
- SD_TXD_P_OUT : out std_logic;
- SD_TXD_N_OUT : out std_logic;
- SD_REFCLK_P_IN : in std_logic; --not used
- SD_REFCLK_N_IN : in std_logic; --not used
- SD_PRSNT_N_IN : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
- SD_LOS_IN : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
- SD_TXDIS_OUT : out std_logic := '0'; -- SFP disable
+ --Fiber/sync SFP Connection
+ SYNC_RX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz
+ SYNC_RX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz
+ SYNC_TX_HALF_CLK_OUT : out std_logic := '0'; --received 100 MHz
+ SYNC_TX_FULL_CLK_OUT : out std_logic := '0'; --received 200 MHz
+ SYNC_dlm_IN : in std_logic;
+ SYNC_dlm_WORD_IN : in std_logic_vector(7 downto 0);
+ SYNC_DLM_OUT : out std_logic;
+ SYNC_DLM_WORD_OUT : out std_logic_vector(7 downto 0);
+ SYNC_RXD_P_IN : in std_logic;
+ SYNC_RXD_N_IN : in std_logic;
+ SYNC_TXD_P_OUT : out std_logic;
+ SYNC_TXD_N_OUT : out std_logic;
+ SYNC_PRSNT_N_IN : in std_logic; -- SFP Present ('0' = SFP in place, '1' = no SFP mounted)
+ SYNC_LOS_IN : in std_logic; -- SFP Loss Of Signal ('0' = OK, '1' = no signal)
+ SYNC_TXDIS_OUT : out std_logic := '0'; -- SFP disable
--Control Interface
SCI_DATA_IN : in std_logic_vector(7 downto 0) := (others => '0');
SCI_DATA_OUT : out std_logic_vector(7 downto 0) := (others => '0');
@@ -67,7 +58,9 @@ entity Cu_trb_net16_soda_sync_ecp3_sfp is
SCI_READ : in std_logic := '0';
SCI_WRITE : in std_logic := '0';
SCI_ACK : out std_logic := '0';
- SCI_NACK : out std_logic := '0';
+ SCI_NACK : out std_logic := '0';
+
+ TX_READY_CH3 : out std_logic;
-- Status and control port
STAT_OP : out std_logic_vector (15 downto 0);
CTRL_OP : in std_logic_vector (15 downto 0) := (others => '0');
@@ -248,7 +241,6 @@ architecture Cu_trb_net16_soda_sync_ecp3_sfp_arch of Cu_trb_net16_soda_sync_ecp3
signal reset_i : std_logic;
signal reset_i_rx : std_logic;
signal pwr_up : std_logic;
- signal clear_n : std_logic;
signal clk_sys : std_logic;
signal clk_tx : std_logic;
@@ -268,14 +260,15 @@ architecture Cu_trb_net16_soda_sync_ecp3_sfp_arch of Cu_trb_net16_soda_sync_ecp3
signal rst_qd : std_logic;
signal link_OK_S : std_logic;
signal trb_rx_fsm_state : std_logic_vector(3 downto 0);
+ signal trb_tx_fsm_state : std_logic_vector(3 downto 0);
+ signal sync_rx_fsm_state : std_logic_vector(3 downto 0);
+ signal sync_tx_fsm_state : std_logic_vector(3 downto 0);
signal clk_200_osc : std_logic;
signal sync_rx_full_clk : std_logic;
signal sync_rx_half_clk : std_logic;
signal sync_tx_full_clk : std_logic;
signal sync_tx_half_clk : std_logic;
-
- signal rst_n : std_logic;
- signal rst : std_logic; -- PL!
+
signal sync_tx_data : std_logic_vector(7 downto 0);
signal sync_tx_k : std_logic;
signal sync_rx_data : std_logic_vector(7 downto 0);
@@ -287,9 +280,20 @@ architecture Cu_trb_net16_soda_sync_ecp3_sfp_arch of Cu_trb_net16_soda_sync_ecp3
signal sync_rx_los_low : std_logic;
signal sync_lsm_status : std_logic;
signal sync_rx_cdr_lol : std_logic;
- signal sd_los_i : std_logic; --PL!
+ signal dlm_fifo_rd_en : std_logic;
+ signal dlm_fifo_empty : std_logic;
+ signal dlm_fifo_reading : std_logic;
+ signal dlm_received_S : std_logic;
+
+ signal syncfifo_din : std_logic_vector(17 downto 0);
+ signal syncfifo_dout : std_logic_vector(17 downto 0);
+ type sci_ctrl is (IDLE, SCTRL, SCTRL_WAIT, SCTRL_WAIT2, SCTRL_FINISH, GET_WA, GET_WA_WAIT, GET_WA_WAIT2, GET_WA_FINISH);
+ signal sci_state : sci_ctrl;
+
signal sci_ch_i : std_logic_vector(3 downto 0);
+ signal sci_qd_i : std_logic;
+ signal sci_reg_i : std_logic;
signal sci_addr_i : std_logic_vector(8 downto 0);
signal sci_data_in_i : std_logic_vector(7 downto 0);
signal sci_data_out_i : std_logic_vector(7 downto 0);
@@ -297,9 +301,12 @@ architecture Cu_trb_net16_soda_sync_ecp3_sfp_arch of Cu_trb_net16_soda_sync_ecp3
signal sci_write_i : std_logic;
signal sci_write_shift_i : std_logic_vector(2 downto 0);
signal sci_read_shift_i : std_logic_vector(2 downto 0);
+
+ signal tx_pll_lol_qd_i : std_logic;
signal wa_position : std_logic_vector(15 downto 0) := x"FFFF";
signal wa_position_rx : std_logic_vector(15 downto 0) := x"FFFF";
+ signal sync_wa_position_rx : std_logic_vector(15 downto 0) := x"FFFF";
signal sync_tx_allow : std_logic;
signal sync_rx_allow : std_logic;
signal sync_tx_allow_q : std_logic;
@@ -311,12 +318,6 @@ architecture Cu_trb_net16_soda_sync_ecp3_sfp_arch of Cu_trb_net16_soda_sync_ecp3
signal start_retr_position_i : std_logic_vector(7 downto 0);
signal send_link_reset_i : std_logic;
signal make_link_reset_i : std_logic;
- signal got_link_ready_i : std_logic;
- signal internal_make_link_reset_out : std_logic;
-
- signal start_timer : unsigned(18 downto 0) := (others => '0');
- signal watchdog_timer : unsigned(20 downto 0) := (others => '0');
- signal watchdog_trigger : std_logic :='0';
attribute syn_keep : boolean;
attribute syn_preserve : boolean;
@@ -360,17 +361,8 @@ clk_tx <= SYSCLK;
clk_rx <= ff_rxhalfclk;
clk_rxref <= OSCCLK;
clk_txref <= OSCCLK;
---------------------------------------------------------------------------
--- Internal Lane Resets
---------------------------------------------------------------------------
-clear_n <= not clear;
-
-internal_make_link_reset_out <= make_link_reset_i when SODA_IS_SYNC_SLAVE = c_YES else '0';
-sd_los_i <= SD_LOS_IN when rising_edge(SYSCLK); -- PL!
-
-rst_n <= not(CLEAR or SD_LOS_IN or internal_make_link_reset_out or watchdog_trigger);
-rst <= (CLEAR or SD_LOS_IN or internal_make_link_reset_out or watchdog_trigger);
+--sd_los_i <= SD_LOS_IN when rising_edge(SYSCLK); -- PL!
--------------------------------------------------------------------------
-- Internal Lane Resets
@@ -396,8 +388,8 @@ THE_SFP_STATUS_SYNC: signal_sync
)
port map(
RESET => '0',
- D_IN(0) => sd_prsnt_n_in,
- D_IN(1) => sd_los_in,
+ D_IN(0) => sync_prsnt_n_in,
+ D_IN(1) => sync_los_in,
CLK0 => clk_sys,
CLK1 => clk_sys,
D_OUT(0) => sfp_prsnt_n,
@@ -463,34 +455,34 @@ THE_RX_RESET: signal_sync
-- Delay for ALLOW signals
THE_RX_ALLOW_SYNC: signal_sync
- generic map(
- DEPTH => 2,
- WIDTH => 2
- )
- port map(
- RESET => reset_i,
- D_IN(0) => rx_allow,
- D_IN(1) => tx_allow,
- CLK0 => clk_sys,
- CLK1 => clk_sys,
- D_OUT(0) => rx_allow_q,
- D_OUT(1) => tx_allow_q
- );
+ generic map(
+ DEPTH => 2,
+ WIDTH => 2
+ )
+ port map(
+ RESET => reset_i,
+ D_IN(0) => rx_allow,
+ D_IN(1) => tx_allow,
+ CLK0 => clk_sys,
+ CLK1 => clk_sys,
+ D_OUT(0) => rx_allow_q,
+ D_OUT(1) => tx_allow_q
+ );
THE_TX_SYNC: signal_sync
- generic map(
- DEPTH => 1,
- WIDTH => 2
- )
- port map(
- RESET => '0',
- D_IN(0) => send_reset_in,
- D_IN(1) => tx_allow,
- CLK0 => clk_tx,
- CLK1 => clk_tx,
- D_OUT(0) => send_reset_in_qtx,
- D_OUT(1) => tx_allow_qtx
- );
+ generic map(
+ DEPTH => 1,
+ WIDTH => 2
+ )
+ port map(
+ RESET => '0',
+ D_IN(0) => send_reset_in,
+ D_IN(1) => tx_allow,
+ CLK0 => clk_tx,
+ CLK1 => clk_tx,
+ D_OUT(0) => send_reset_in_qtx,
+ D_OUT(1) => tx_allow_qtx
+ );
--------------------------------------------------------------------------
@@ -524,7 +516,7 @@ THE_SFP_LSM: trb_net16_lsm_sfp
STAT_DEBUG => buf_stat_debug
);
-sd_txdis_out <= quad_rst or reset_i;
+SYNC_TXDIS_OUT <= quad_rst or reset_i;
--------------------------------------------------------------------------
--------------------------------------------------------------------------
@@ -534,17 +526,17 @@ ffc_lane_tx_rst <= lane_rst;
ffc_lane_rx_rst <= lane_rst;
-
+
-- Instantiation of serdes module
THE_SERDES: sfp_2_200_int
port map(
- HDINP_CH1 => cu_rxd_p_in,
- HDINN_CH1 => cu_rxd_n_in,
- HDOUTP_CH1 => cu_txd_p_out,
- HDOUTN_CH1 => cu_txd_n_out,
+ HDINP_CH1 => CU_RXD_P_IN,
+ HDINN_CH1 => CU_RXD_N_IN,
+ HDOUTP_CH1 => CU_TXD_P_OUT,
+ HDOUTN_CH1 => CU_TXD_N_OUT,
SCI_SEL_CH1 => sci_ch_i(1),
RXICLK_CH1 => clk_rx,
TXICLK_CH1 => clk_tx,
@@ -574,10 +566,10 @@ ffc_lane_rx_rst <= lane_rst;
TX_DIV2_MODE_CH1_C => '0', --full rate
RX_DIV2_MODE_CH1_C => '0', --full rate
- HDINP_CH3 => sd_rxd_p_in,
- HDINN_CH3 => sd_rxd_n_in,
- HDOUTP_CH3 => sd_txd_p_out,
- HDOUTN_CH3 => sd_txd_n_out,
+ HDINP_CH3 => SYNC_RXD_P_IN,
+ HDINN_CH3 => SYNC_RXD_N_IN,
+ HDOUTP_CH3 => SYNC_TXD_P_OUT,
+ HDOUTN_CH3 => SYNC_TXD_N_OUT,
SCI_SEL_CH3 => sci_ch_i(3),
TXICLK_CH3 => sync_rx_full_clk,
RX_FULL_CLK_CH3 => sync_rx_full_clk,
@@ -763,75 +755,236 @@ THE_SERDES_INPUT_PROC: process( clk_tx )
end if;
end process THE_SERDES_INPUT_PROC;
-PROC_START_TIMER : process(sync_rx_full_clk)
+
+-- map 8-bit dlm on 18-bit fifo
+syncfifo_din(7 downto 0) <= SYNC_dlm_WORD_IN;
+syncfifo_din(17 downto 8) <= (others => '0');
+--sync_dlm_word_S <= syncfifo_dout(7 downto 0);
+
+sync_dlm_tx: trb_net_fifo_16bit_bram_dualport
+ generic map(
+ USE_STATUS_FLAGS => c_NO
+ )
+ port map(
+ read_clock_in => sync_tx_full_clk,
+ write_clock_in => sync_rx_full_clk,
+ read_enable_in => dlm_fifo_rd_en,
+ write_enable_in => SYNC_dlm_IN,
+ fifo_gsr_in => reset,
+ write_data_in => syncfifo_din,
+ read_data_out => syncfifo_dout,
+ full_out => open,
+ empty_out => dlm_fifo_empty
+ );
+
+sync_rx_proc : process(sync_rx_full_clk)
+begin
+ if rising_edge(sync_rx_full_clk) then
+ SYNC_DLM_OUT <= '0';
+ if dlm_received_S='1' then
+ dlm_received_S <= '0';
+ SYNC_DLM_OUT <= '1';
+ SYNC_dlm_WORD_OUT <= sync_rx_data;
+ elsif (sync_rx_data=x"DC") and (sync_rx_k='1') then
+ dlm_received_S <= '1';
+ end if;
+ end if;
+end process;
+
+sync_tx_proc : process(sync_tx_full_clk)
begin
- if rising_edge(sync_rx_full_clk) then
- if got_link_ready_i = '1' then
- watchdog_timer <= (others => '0');
- if start_timer(start_timer'left) = '0' then
- start_timer <= start_timer + 1;
- end if;
+ if rising_edge(sync_tx_full_clk) then
+ if dlm_fifo_rd_en='1' then
+ dlm_fifo_rd_en <= '0';
+ sync_tx_data <= syncfifo_dout(7 downto 0);
+ sync_tx_k <= '0';
+ elsif (dlm_fifo_empty='0') and (dlm_fifo_reading='1') then
+ dlm_fifo_rd_en <= '1';
+ sync_tx_data <= x"DC";
+ sync_tx_k <= '1';
+ elsif dlm_fifo_empty='0' then
+ dlm_fifo_reading <= '1';
+ dlm_fifo_rd_en <= '0';
+ sync_tx_data <= x"BC"; -- idle
+ sync_tx_k <= '1';
else
- start_timer <= (others => '0');
- if ((watchdog_timer(watchdog_timer'left) = '1') and (watchdog_timer(watchdog_timer'left - 2) = '1')) then
- watchdog_trigger <= '1';
- else
- watchdog_trigger <= '0';
- end if;
- if watchdog_trigger = '0' then
- watchdog_timer <= watchdog_timer + 1;
- else
- watchdog_timer <= (others => '0');
- end if;
+ dlm_fifo_reading <= '0';
+ dlm_fifo_rd_en <= '0';
+ sync_tx_data <= x"BC"; -- idle
+ sync_tx_k <= '1';
end if;
end if;
-end process;
---SCI
-----------------------
-PROC_SCI : process begin
- wait until rising_edge(clk_sys);
- if SCI_READ = '1' or SCI_WRITE = '1' then
- sci_ch_i(0) <= not SCI_ADDR(6) and not SCI_ADDR(7) and not SCI_ADDR(8);
- sci_ch_i(1) <= SCI_ADDR(6) and not SCI_ADDR(7) and not SCI_ADDR(8);
- sci_ch_i(2) <= not SCI_ADDR(6) and SCI_ADDR(7) and not SCI_ADDR(8);
- sci_ch_i(3) <= SCI_ADDR(6) and SCI_ADDR(7) and not SCI_ADDR(8);
- sci_addr_i <= SCI_ADDR;
- sci_data_in_i <= SCI_DATA_IN;
- end if;
- sci_read_shift_i <= sci_read_shift_i(1 downto 0) & SCI_READ;
- sci_write_shift_i <= sci_write_shift_i(1 downto 0) & SCI_WRITE;
- SCI_DATA_OUT <= sci_data_out_i;
+end process;
+
+link_error(8) <= trb_rx_los_low; -- loss of signal
+link_error(4) <= '1' when (trb_rx_cdr_lol='1') or (link_OK_S='0') else '0'; -- loss of lock
+link_error(5) <= tx_pll_lol_qd_i; -- transmit loss of lock
+
+reset_n <= '0' when (RESET='1') or (CLEAR='1') else '1';
+
+-------------------------------------------------
+-- Reset FSM & Link states
+-------------------------------------------------
+THE_RX_FSM1: rx_reset_fsm
+ port map(
+ RST_N => reset_n,
+ RX_REFCLK => OSCCLK,
+ TX_PLL_LOL_QD_S => tx_pll_lol_qd_i,
+ RX_SERDES_RST_CH_C => trb_rx_serdes_rst,
+ RX_CDR_LOL_CH_S => trb_rx_cdr_lol,
+ RX_LOS_LOW_CH_S => trb_rx_los_low,
+ RX_PCS_RST_CH_C => trb_rx_pcs_rst,
+ WA_POSITION => "0000",
+ STATE_OUT => trb_rx_fsm_state
+ );
+
+link_OK_S <= '1' when (link_ok(0)='1') and (trb_rx_fsm_state = x"6") else '0';
+
+THE_TX_FSM1: tx_reset_fsm
+ port map(
+ RST_N => reset_n,
+ TX_REFCLK => OSCCLK,
+ TX_PLL_LOL_QD_S => tx_pll_lol_qd_i,
+ RST_QD_C => rst_qd,
+ TX_PCS_RST_CH_C => trb_tx_pcs_rst,
+ STATE_OUT => trb_tx_fsm_state --open
+ );
+
+THE_RX_FSM3: rx_reset_fsm
+ port map(
+ RST_N => reset_n,
+ RX_REFCLK => sync_rx_full_clk,
+ TX_PLL_LOL_QD_S => tx_pll_lol_qd_i,
+ RX_SERDES_RST_CH_C => sync_rx_serdes_rst,
+ RX_CDR_LOL_CH_S => sync_rx_cdr_lol,
+ RX_LOS_LOW_CH_S => sync_rx_los_low,
+ RX_PCS_RST_CH_C => sync_rx_pcs_rst,
+ WA_POSITION => sync_wa_position_rx(11 downto 8),
+ STATE_OUT => sync_rx_fsm_state
+ );
+
+SYNC_WA_POSITION : process(sync_rx_full_clk) --??CLK)
+begin
+ if rising_edge(sync_rx_full_clk) then
+ sync_wa_position_rx <= wa_position;
+ end if;
end process;
-sci_write_i <= or_all(sci_write_shift_i);
-sci_read_i <= or_all(sci_read_shift_i);
-SCI_ACK <= sci_write_shift_i(2) or sci_read_shift_i(2);
-
-
-
+THE_TX_FSM3 : tx_reset_fsm
+ port map(
+ RST_N => reset_n,
+ TX_REFCLK => OSCCLK,
+ TX_PLL_LOL_QD_S => tx_pll_lol_qd_i,
+ RST_QD_C => open, --??
+ TX_PCS_RST_CH_C => sync_tx_pcs_rst,
+ STATE_OUT => sync_tx_fsm_state
+ );
+
+TX_READY_CH3 <= '1' when (sync_tx_fsm_state=x"5") and (tx_pll_lol_qd_i='0') else '0';
+
+-----------------------------------------------------------------------------------------------------
+-- SCI --gives access to serdes config port from slow control and reads word alignment every ~ 40 us
+-----------------------------------------------------------------------------------------------------
+PROC_SCI_CTRL: process(clk_sys)
+ variable cnt : integer range 0 to 4 := 0;
+begin
+ if( rising_edge(clk_sys) ) then
+ SCI_ACK <= '0';
+ case sci_state is
+ when IDLE =>
+ sci_ch_i <= x"0";
+ sci_qd_i <= '0';
+ sci_reg_i <= '0';
+ sci_read_i <= '0';
+ sci_write_i <= '0';
+ sci_timer <= sci_timer + 1;
+ if SCI_READ = '1' or SCI_WRITE = '1' then
+ sci_ch_i(0) <= not SCI_ADDR(6) and not SCI_ADDR(7) and not SCI_ADDR(8);
+ sci_ch_i(1) <= SCI_ADDR(6) and not SCI_ADDR(7) and not SCI_ADDR(8);
+ sci_ch_i(2) <= not SCI_ADDR(6) and SCI_ADDR(7) and not SCI_ADDR(8);
+ sci_ch_i(3) <= SCI_ADDR(6) and SCI_ADDR(7) and not SCI_ADDR(8);
+ sci_qd_i <= not SCI_ADDR(6) and not SCI_ADDR(7) and SCI_ADDR(8);
+ sci_reg_i <= SCI_ADDR(6) and not SCI_ADDR(7) and SCI_ADDR(8);
+ sci_addr_i <= SCI_ADDR;
+ sci_data_in_i <= SCI_DATA_IN;
+ sci_read_i <= SCI_READ and not (SCI_ADDR(6) and not SCI_ADDR(7) and SCI_ADDR(8));
+ sci_write_i <= SCI_WRITE and not (SCI_ADDR(6) and not SCI_ADDR(7) and SCI_ADDR(8));
+ sci_state <= SCTRL;
+ elsif sci_timer(sci_timer'left) = '1' then
+ sci_timer <= (others => '0');
+ sci_state <= GET_WA;
+ end if;
+ when SCTRL =>
+ if sci_reg_i = '1' then
+ --// SCI_DATA_OUT <= debug_reg(8*(to_integer(unsigned(SCI_ADDR(3 downto 0))))+7 downto 8*(to_integer(unsigned(SCI_ADDR(3 downto 0)))));
+ SCI_DATA_OUT <= (others => '0');
+ SCI_ACK <= '1';
+ sci_write_i <= '0';
+ sci_read_i <= '0';
+ sci_state <= IDLE;
+ else
+ sci_state <= SCTRL_WAIT;
+ end if;
+ when SCTRL_WAIT =>
+ sci_state <= SCTRL_WAIT2;
+ when SCTRL_WAIT2 =>
+ sci_state <= SCTRL_FINISH;
+ when SCTRL_FINISH =>
+ SCI_DATA_OUT <= sci_data_out_i;
+ SCI_ACK <= '1';
+ sci_write_i <= '0';
+ sci_read_i <= '0';
+ sci_state <= IDLE;
+
+ when GET_WA =>
+ if cnt = 4 then
+ cnt := 0;
+ sci_state <= IDLE;
+ else
+ sci_state <= GET_WA_WAIT;
+ sci_addr_i <= '0' & x"22";
+ sci_ch_i <= x"0";
+ sci_ch_i(cnt) <= '1';
+ sci_read_i <= '1';
+ end if;
+ when GET_WA_WAIT =>
+ sci_state <= GET_WA_WAIT2;
+ when GET_WA_WAIT2 =>
+ sci_state <= GET_WA_FINISH;
+ when GET_WA_FINISH =>
+ wa_position(cnt*4+3 downto cnt*4) <= sci_data_out_i(3 downto 0);
+ sci_state <= GET_WA;
+ cnt := cnt + 1;
+ end case;
+
+ if (SCI_READ = '1' or SCI_WRITE = '1') and sci_state /= IDLE then
+ SCI_NACK <= '1';
+ else
+ SCI_NACK <= '0';
+ end if;
+ end if;
+end process PROC_SCI_CTRL;
+----------------------
--Generate LED signals
----------------------
-process( clk_sys )
- begin
- if rising_edge(clk_sys) then
- led_counter <= led_counter + to_unsigned(1,1);
-
- if buf_med_dataready_out = '1' then
- rx_led <= '1';
- elsif led_counter = 0 then
- rx_led <= '0';
- end if;
-
- if tx_k(0) = '0' then
- tx_led <= '1';
- elsif led_counter = 0 then
- tx_led <= '0';
- end if;
+LED_PROC : process( clk_sys )
+ begin
+ if rising_edge(clk_sys) then
+ led_counter <= led_counter + to_unsigned(1,1);
+ if buf_med_dataready_out = '1' then
+ rx_led <= '1';
+ elsif led_counter = 0 then
+ rx_led <= '0';
+ end if;
+ if tx_k(0) = '0' then
+ tx_led <= '1';
+ elsif led_counter = 0 then
+ tx_led <= '0';
+ end if;
+ end if;
+ end process LED_PROC;
- end if;
- end process;
-
stat_op(15) <= send_reset_words_q;
stat_op(14) <= buf_stat_op(14);
@@ -860,4 +1013,4 @@ stat_debug(59 downto 44) <= (others => '0');
stat_debug(63 downto 60) <= buf_stat_debug(3 downto 0);
-end architecture;
\ No newline at end of file
+end Cu_trb_net16_soda_sync_ecp3_sfp_arch;
\ No newline at end of file
diff --git a/ctsc.ldf b/ctsc.ldf
index d8dbbb0..84844b3 100644
--- a/ctsc.ldf
+++ b/ctsc.ldf
@@ -2,7 +2,7 @@
-
+
@@ -207,6 +207,12 @@
+
+
+
+
+
+
@@ -219,6 +225,9 @@
+
+
+
@@ -273,12 +282,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/ctsc.lpf b/ctsc.lpf
index 61d5cb0..0824311 100644
--- a/ctsc.lpf
+++ b/ctsc.lpf
@@ -1,3 +1,4 @@
+rvl_alias "soda_rx_full_clk" "soda_rx_full_clk";
BLOCK RESETPATHS;
BLOCK ASYNCPATHS;
BLOCK RD_DURING_WR_PATHS ;
@@ -136,12 +137,12 @@ IOBUF GROUP "LED_group" IO_TYPE=LVCMOS25 PULLMODE=NONE DRIVE=12 ;
#################################################################
# Locate Serdes and media interfaces
#################################################################
-LOCATE COMP "TRB_MEDIA_AND_SODA_SYNC_UPLINK/PCSD_INST" SITE "PCSA" ;
+LOCATE COMP "TRB_MEDIA_AND_SODA_SYNC_UPLINK/THE_SERDES/PCSD_INST" SITE "PCSA" ;
MULTICYCLE FROM CELL "THE_RESET_HANDLER/rese*" 20.000000 ns ;
MULTICYCLE TO CELL "TRB_MEDIA_AND_SODA_SYNC_UPLINK/SCI_DATA_OUT*" 20.000000 ns ;
-MULTICYCLE TO CELL "TRB_MEDIA_AND_SODA_SYNC_UPLINK/sci*" 20.000000 ns ;
-MULTICYCLE FROM CELL "TRB_MEDIA_AND_SODA_SYNC_UPLINK/sci*" 20.000000 ns ;
+MULTICYCLE TO CELL "TRB_MEDIA_AND_SODA_SYNC_UPLINK/SCI*" 20.000000 ns ;
+MULTICYCLE FROM CELL "TRB_MEDIA_AND_SODA_SYNC_UPLINK/SCI*" 20.000000 ns ;
#MULTICYCLE TO CELL "TRB_MEDIA_AND_SODA_SYNC_UPLINK/SCI_DATA_OUT*" 50 ns;
BLOCK JTAGPATHS ;
@@ -151,7 +152,7 @@ USE PRIMARY NET "clk_100_osc" ;
FREQUENCY NET "clk_200_osc" 200.000000 MHz ;
FREQUENCY NET "clk_100_osc" 100.000000 MHz ;
-FREQUENCY NET "rx_full_clk" 200.000000 MHz ;
-FREQUENCY NET "rx_half_clk" 100.000000 MHz ;
-#FREQUENCY NET "tx_full_clk" 200.000000 MHz ;
-#FREQUENCY NET "tx_half_clk" 100.000000 MHz ;
\ No newline at end of file
+FREQUENCY NET "soda_rx_full_clk" 200.000000 MHz ;
+FREQUENCY NET "soda_rx_half_clk" 100.000000 MHz ;
+#FREQUENCY NET "soda_tx_full_clk" 200.000000 MHz ;
+#FREQUENCY NET "soda_tx_half_clk" 100.000000 MHz ;
\ No newline at end of file
diff --git a/ctsc_20141217.bit b/ctsc_20141217.bit
new file mode 100644
index 0000000000000000000000000000000000000000..36f43d6a7359231f18481c4ad1d44d40e2ae305c
GIT binary patch
literal 3804522
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