);
-- Transfering the komma delimiter in the *training* phase
- THE_RX_K_SYNC: signal_sync
- generic map(
- DEPTH => 3,
- WIDTH => 2
- )
- port map(
- RESET => reset_i(i),
- D_IN => comb_rx_k(i*2+1 downto i*2),
- CLK0 => ff_txhalfclk,
- CLK1 => SYSCLK,
- D_OUT => rx_k_q(i*2+1 downto i*2)
- );
+-- THE_RX_K_SYNC: signal_sync
+-- generic map(
+-- DEPTH => 3,
+-- WIDTH => 2
+-- )
+-- port map(
+-- RESET => reset_i(i),
+-- D_IN => comb_rx_k(i*2+1 downto i*2),
+-- CLK0 => SYSCLK,
+-- CLK1 => SYSCLK,
+-- D_OUT => rx_k_q(i*2+1 downto i*2)
+-- );
-- registers for RX_K and RX_DATA between serdes and internal logic
- THE_RX_DATA_DELAY: signal_sync
+ THE_RX_DATA_SYNC: signal_sync
generic map(
DEPTH => 2,
WIDTH => 18
RESET => reset_i(i),
D_IN(15 downto 0) => comb_rx_data(i*16+15 downto i*16),
D_IN(17 downto 16)=> comb_rx_k(i*2+1 downto i*2),
- CLK0 => ff_txhalfclk,
- CLK1 => ff_txhalfclk,
+ CLK0 => SYSCLK,
+ CLK1 => SYSCLK,
D_OUT(15 downto 0) => rx_data(i*16+15 downto i*16),
D_OUT(17 downto 16) => rx_k(i*2+1 downto i*2)
);
--delay signals for sending and receiving data
- THE_RX_ALLOW_SYNC: signal_sync
+ THE_RX_ALLOW_DELAY: signal_sync
generic map(
DEPTH => 2,
WIDTH => 2
RESET => reset_i(i),
D_IN(0) => rx_allow(i),
D_IN(1) => swap_bytes(i),
- CLK0 => ff_txhalfclk,
- CLK1 => ff_txhalfclk,
+ CLK0 => SYSCLK,
+ CLK1 => SYSCLK,
D_OUT(0) => rx_allow_qrx(i),
D_OUT(1) => swap_bytes_qrx(i)
);
SD_TXCLK_BAD_IN => ffs_plol,
SD_RXCLK_BAD_IN => link_error(i)(7),
SD_RETRY_IN => '0', -- '0' = handle byte swapping in logic, '1' = simply restart link and hope
- SD_ALIGNMENT_IN => rx_k_q(i*2+1 downto i*2),
+ SD_ALIGNMENT_IN => rx_k(i*2+1 downto i*2),
SD_CV_IN => link_error(i)(1 downto 0),
FULL_RESET_OUT => quad_rst(i),
LANE_RESET_OUT => lane_rst(i),
hdinn0 => SD_RXD_N_IN(0),
hdoutp0 => SD_TXD_P_OUT(0),
hdoutn0 => SD_TXD_N_OUT(0),
- ff_rxiclk_ch0 => ff_txhalfclk,
- ff_txiclk_ch0 => ff_txhalfclk,
+ ff_rxiclk_ch0 => SYSCLK,
+ ff_txiclk_ch0 => SYSCLK,
ff_ebrd_clk_0 => ff_txfullclk,
ff_txdata_ch0 => tx_data(15 downto 0),
ff_rxdata_ch0 => comb_rx_data(15 downto 0),
hdinn1 => SD_RXD_N_IN(1),
hdoutp1 => SD_TXD_P_OUT(1),
hdoutn1 => SD_TXD_N_OUT(1),
- ff_rxiclk_ch1 => ff_txhalfclk,
- ff_txiclk_ch1 => ff_txhalfclk,
+ ff_rxiclk_ch1 => SYSCLK,
+ ff_txiclk_ch1 => SYSCLK,
ff_ebrd_clk_1 => ff_txfullclk,
ff_txdata_ch1 => tx_data(31 downto 16),
ff_rxdata_ch1 => comb_rx_data(31 downto 16),
hdinn2 => SD_RXD_N_IN(2),
hdoutp2 => SD_TXD_P_OUT(2),
hdoutn2 => SD_TXD_N_OUT(2),
- ff_rxiclk_ch2 => ff_txhalfclk,
- ff_txiclk_ch2 => ff_txhalfclk,
+ ff_rxiclk_ch2 => SYSCLK,
+ ff_txiclk_ch2 => SYSCLK,
ff_ebrd_clk_2 => ff_txfullclk,
ff_txdata_ch2 => tx_data(47 downto 32),
ff_rxdata_ch2 => comb_rx_data(47 downto 32),
hdinn3 => SD_RXD_N_IN(3),
hdoutp3 => SD_TXD_P_OUT(3),
hdoutn3 => SD_TXD_N_OUT(3),
- ff_rxiclk_ch3 => ff_txhalfclk,
- ff_txiclk_ch3 => ff_txhalfclk,
+ ff_rxiclk_ch3 => SYSCLK,
+ ff_txiclk_ch3 => SYSCLK,
ff_ebrd_clk_3 => ff_txfullclk,
ff_txdata_ch3 => tx_data(63 downto 48),
ff_rxdata_ch3 => comb_rx_data(63 downto 48),
hdinn0 => SD_RXD_N_IN(0),
hdoutp0 => SD_TXD_P_OUT(0),
hdoutn0 => SD_TXD_N_OUT(0),
- ff_rxiclk_ch0 => ff_txhalfclk,
- ff_txiclk_ch0 => ff_txhalfclk,
+ ff_rxiclk_ch0 => SYSCLK,
+ ff_txiclk_ch0 => SYSCLK,
ff_ebrd_clk_0 => ff_txfullclk,
ff_txdata_ch0 => tx_data(63 downto 48),
ff_rxdata_ch0 => comb_rx_data(63 downto 48),
hdinn1 => SD_RXD_N_IN(1),
hdoutp1 => SD_TXD_P_OUT(1),
hdoutn1 => SD_TXD_N_OUT(1),
- ff_rxiclk_ch1 => ff_txhalfclk,
- ff_txiclk_ch1 => ff_txhalfclk,
+ ff_rxiclk_ch1 => SYSCLK,
+ ff_txiclk_ch1 => SYSCLK,
ff_ebrd_clk_1 => ff_txfullclk,
ff_txdata_ch1 => tx_data(47 downto 32),
ff_rxdata_ch1 => comb_rx_data(47 downto 32),
hdinn2 => SD_RXD_N_IN(2),
hdoutp2 => SD_TXD_P_OUT(2),
hdoutn2 => SD_TXD_N_OUT(2),
- ff_rxiclk_ch2 => ff_txhalfclk,
- ff_txiclk_ch2 => ff_txhalfclk,
+ ff_rxiclk_ch2 => SYSCLK,
+ ff_txiclk_ch2 => SYSCLK,
ff_ebrd_clk_2 => ff_txfullclk,
ff_txdata_ch2 => tx_data(31 downto 16),
ff_rxdata_ch2 => comb_rx_data(31 downto 16),
hdinn3 => SD_RXD_N_IN(3),
hdoutp3 => SD_TXD_P_OUT(3),
hdoutn3 => SD_TXD_N_OUT(3),
- ff_rxiclk_ch3 => ff_txhalfclk,
- ff_txiclk_ch3 => ff_txhalfclk,
+ ff_rxiclk_ch3 => SYSCLK,
+ ff_txiclk_ch3 => SYSCLK,
ff_ebrd_clk_3 => ff_txfullclk,
ff_txdata_ch3 => tx_data(15 downto 0),
ff_rxdata_ch3 => comb_rx_data(15 downto 0),
)
port map(
read_clock_in => SYSCLK,
- write_clock_in => ff_txhalfclk,
+ write_clock_in => SYSCLK,
read_enable_in => fifo_rx_rd_en(i),
write_enable_in => fifo_rx_wr_en(i),
fifo_gsr_in => fifo_rx_reset(i),
-- Received bytes need to be swapped if the SerDes is "off by one" in its internal 8bit path
---------------------------------------------------------------------
- THE_BYTE_SWAP_PROC: process( ff_txhalfclk )
+ THE_BYTE_SWAP_PROC: process( SYSCLK )
begin
- if( rising_edge(ff_txhalfclk) ) then
+ if( rising_edge(SYSCLK) ) then
last_rx(9*i+8 downto 9*i) <= rx_k(i*2+1) & rx_data(i*16+15 downto i*16+8);
if( swap_bytes_qrx(i) = '0' ) then
fifo_rx_din(i*18+17 downto i*18) <= rx_k(i*2+1) & rx_k(i*2) & rx_data(i*16+15 downto i*16+8)
---------------------------------------------------------------------
---Output to Internal Logic)
+--Output to Internal Logic
---------------------------------------------------------------------
buf_med_data_out(i*16+15 downto i*16) <= fifo_rx_dout(i*18+15 downto i*18);
USE_STATUS_FLAGS => c_NO
)
port map(
- read_clock_in => ff_txhalfclk,
+ read_clock_in => SYSCLK,
write_clock_in => SYSCLK,
read_enable_in => fifo_tx_rd_en(i),
write_enable_in => fifo_tx_wr_en(i),
- THE_SERDES_INPUT_PROC: process( ff_txhalfclk )
+ THE_SERDES_INPUT_PROC: process( SYSCLK )
begin
- if( rising_edge(ff_txhalfclk) ) then
+ if( rising_edge(SYSCLK) ) then
last_fifo_tx_empty(i) <= fifo_tx_empty(i);
if( (last_fifo_tx_empty(i) = '1') ) then -- or (tx_allow_qtx(i) = '0')
tx_data(i*16+15 downto i*16) <= x"50bc";
elsif( led_counter = 0 ) then
rx_led(i) <= '0';
end if;
- if( fifo_tx_wr_en(i) = '0') then
+ if( fifo_tx_wr_en(i) = '1') then
tx_led(i) <= '1';
elsif led_counter = 0 then
tx_led(i) <= '0';
STAT_DEBUG(i*64+47 downto i*64+32) <= rx_data(i*16+15 downto i*16);
STAT_DEBUG(i*64+57 downto i*64+48) <= link_error(i);
STAT_DEBUG(i*64+58) <= ffs_plol;
- STAT_DEBUG(i*64+60 downto i*64+59) <= rx_k_q(i*2+1 downto i*2);
+ STAT_DEBUG(i*64+60 downto i*64+59) <= rx_k(i*2+1 downto i*2);
STAT_DEBUG(i*64+63 downto i*64+61) <= (others => '0');
end generate;
signal counter: std_logic_vector(15 downto 0);
signal TLK_STAT : std_logic_vector(63 downto 0);
+ signal TLK_STAT_MONITOR : std_logic_vector(100 downto 0);
signal MED_DATAREADY_IN, MED_DATAREADY_OUT : std_logic;
signal MED_DATA_IN, MED_DATA_OUT : std_logic_vector(c_DATA_WIDTH-1 downto 0);
signal STAT_ENDP : std_logic_vector(31 downto 0);
signal STAT_API1 : std_logic_vector(31 downto 0);
signal MED_STAT_OP : std_logic_vector(15 downto 0);
+ signal MED_CTRL_OP : std_logic_vector(15 downto 0);
signal EI_STAT : std_logic_vector(7 downto 0);
+ signal last_CTRL_REGS : std_logic_vector(15 downto 14);
+
+ signal send_reset_counter : std_logic_vector(11 downto 0) := x"FFF";
begin
CLK <= VIRT_CLK;
end if;
end process;
- DGOOD <= not TLK_STAT(0);
+ DGOOD <= not MED_STAT_OP(9);
DBAD <= not (TLK_STAT(36)); -- no error, but not ERROR_OK
DINT <= not (tmp ); --RX_ER and RX_DV;
- DWAIT <= not (MED_PACKET_NUM_IN(1));
+ DWAIT <= not (MED_STAT_OP(10) or MED_STAT_OP(11));
---------------------------------------------------------------------
--Media Interface: Optical Link
MED_DATA_OUT => MED_DATA_IN,
MED_PACKET_NUM_OUT => MED_PACKET_NUM_IN,
STAT => TLK_STAT,
+ STAT_MONITOR => TLK_STAT_MONITOR,
STAT_OP => MED_STAT_OP,
- CTRL_OP => MED_STAT_OP
+ CTRL_OP => MED_CTRL_OP
);
+ MED_CTRL_OP <= (15 => not send_reset_counter(10), others => '0');
MED_ERROR_IN <= MED_STAT_OP(2 downto 0);
+ process(CLK)
+ begin
+ if rising_edge(CLK) then
+ last_CTRL_REGS(15 downto 14) <= CTRL_REGS(15 downto 14);
+ if RESET = '1' then
+ send_reset_counter <= (others => '1');
+ elsif CTRL_REGS(15) = '1' and last_CTRL_REGS(15) = '0' then
+ send_reset_counter <= (others => '0');
+ elsif send_reset_counter(10) = '0' then
+ send_reset_counter <= send_reset_counter + 1;
+ end if;
+ end if;
+ end process;
+
+
---------------------------------------------------------------------
--The Endpoint generating the connection to etrax-read/write/able registers
---------------------------------------------------------------------
---------------------------------------------------------------------
STAT_REGS(63 downto 0) <= APL_STAT & STAT_ENDP;
- buf_ADO_TTL(0) <= etrax_read;
- buf_ADO_TTL(6 downto 1) <= EI_STAT(5 downto 0);
- buf_ADO_TTL(14 downto 7) <= (others => 'Z');
+ buf_ADO_TTL(14 downto 0) <= TLK_STAT(15 downto 14) & "0" & TLK_STAT(27 downto 16);
+-- buf_ADO_TTL(0) <= etrax_read;
+-- buf_ADO_TTL(6 downto 1) <= EI_STAT(5 downto 0);
+-- buf_ADO_TTL(14 downto 7) <= (others => 'Z');
buf_ADO_TTL(46 downto 16) <= (others => 'Z');
PROC_LA_CLK : process(CLK)