00001 --**************************************************************
00002 --* *
00003 --* The source code for the ATLAS BCM "AAA" FPGA is made *
00004 --* available via the GNU General Public License (GPL) *
00005 --* unless otherwise stated below. *
00006 --* *
00007 --* In case of problems/questions/bug reports etc. please *
00008 --* contact michael.niegl@cern.ch *
00009 --* *
00010 --**************************************************************
00011
00012 --**************************************************************
00013 --* *
00014 --* $Source: /local/reps/bcmfpga/bcm_aaa/bcm_aaa/sata/bridge.vhd,v $
00015 --* $Revision: 1.1.2.5 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 17:57:49 $ *
00019
00020
00021 --* *
00022 --**************************************************************
00023
00024 library ieee;
00025
00026 use ieee.std_logic_1164.all;
00027
00028 use ieee.std_logic_arith.all;
00029
00030 use ieee.std_logic_unsigned.all;
00031
00032
00033 entity bridge is
00034 port(
00035 --CLOCKS-----------------------------------
00036 CLK_RIO_IN : in ;
00037 CLK_DRP_IN : in ;
00038 CLK_SATA_IN : in ;
00039 USRCLK_STABLE_IN : in ;
00040 CLK_DATA_IN : in ;
00041 --RESET------------------------------------
00042 RESET_A_IN : in ;
00043 RESET_B_IN : in ;
00044 --PACKAGE PINS-----------------------------
00045 RXP_SATA_IN : in (1 downto 0);
00046 RXN_SATA_IN : in (1 downto 0);
00047 TXP_SATA_OUT : out (1 downto 0);
00048 TXN_SATA_OUT : out (1 downto 0);
00049 --DIAGNOSTIC-------------------------------
00050 TX_A_READY : out ;
00051 TX_B_READY : out ;
00052 RX_A_READY : out ;
00053 RX_B_READY : out ;
00054 --DATA-------------------------------------
00055 A_DATA_IN : in (63 downto 0);
00056 B_DATA_IN : in (63 downto 0);
00057 A_DATA_VALID_IN : in ;
00058 B_DATA_VALID_IN : in ;
00059 A_DATA_OUT : out (63 downto 0);
00060 B_DATA_OUT : out (63 downto 0);
00061 A_DATA_VALID_OUT : out ;
00062 B_DATA_VALID_OUT : out ;
00063 A_DATA_ERROR : out ;
00064 B_DATA_ERROR : out ;
00065 A_LISTENING : out ;
00066 B_LISTENING : out ;
00067 --PACKAGE----------------------------------
00068 A_PACKAGE_GOOD : out ;
00069 B_PACKAGE_GOOD : out ;
00070 A_PACKAGE_BAD : out ;
00071 B_PACKAGE_BAD : out ;
00072 --SCOPE------------------------------------
00073 c_scope : out (165 downto 0)
00074 );
00075 end bridge;
00076
00077
00078 architecture bridge_arc of bridge is
00079
00080
00081 component sata is
00082 generic (
00083 C_SIMULATION : := 0 -- Set to 1 for simulation
00084 );
00085 port
00086 (
00087 --CLOCK-PORTS---------------------------------------------------------------------
00088 CLK_RIO_IN : in ; --RIOs reference clock
00089 CLK_DRP_IN : in ; --50MHz system clock for PLL correction (used) and DRP (nou used), used also for reset clocking since it is slover than TXOUTCLK1/2 = 75 MHz
00090 CLK_DATA_IN : in ; --clock for data Retrieval
00091 USRCLK_STABLE_IN : in ; --stable then '1' --signaling stable inputs of input clocks
00092 --RESET-PORTS---------------------------------------------------------------------
00093 TX_A_SYSTEM_RESET_IN : in ; --reset signal for both TX
00094 TX_B_SYSTEM_RESET_IN : in ; --reset signal for both TX
00095 --PACKAGE-PINS--------------------------------------------------------------------
00096 RXP_SATA_IN : in (1 downto 0); --package pins
00097 RXN_SATA_IN : in (1 downto 0); --package pins
00098 TXP_SATA_OUT : out (1 downto 0); --package pins
00099 TXN_SATA_OUT : out (1 downto 0); --package pins
00100 --STATUS-PORTS--------------------------------------------------------------------
00101 MGTA_TXLOCK_OUT : out ; --PLL lock state
00102 MGTA_RXLOCK_OUT : out ; --PLL lock state
00103 MGTB_TXLOCK_OUT : out ; --PLL lock state
00104 MGTB_RXLOCK_OUT : out ; --PLL lock state
00105 TX_A_READY : out ; --transmitrers ready
00106 RX_A_READY : out ; --receivers ready
00107 TX_B_READY : out ; --transmitrers ready
00108 RX_B_READY : out ; --receivers ready
00109 --DATA-PORTS----------------------------------------------------------------------
00110 A_DATA_IN : in (31 downto 0); --data to be send
00111 B_DATA_IN : in (31 downto 0); --data to be send
00112 A_DATA_CONTROL_IN : in (3 downto 0); --'1' bits encodes coresponding byte as comma character
00113 B_DATA_CONTROL_IN : in (3 downto 0); --'1' bits encodes coresponding byte as comma character
00114 A_DATA_READY_IN : in ; --'1' if data is to be sent '0' if there is no data
00115 B_DATA_READY_IN : in ; --'1' if data is to be sent '0' if there is no data
00116 A_EOP_IN : in ; --initiate the end of package sequence --must be only one CLK_DATA_IN cycle long
00117 B_EOP_IN : in ; --initiate the end of package sequence --must be only one CLK_DATA_IN cycle long
00118 A_DATA_OUT : out (31 downto 0); --data received
00119 B_DATA_OUT : out (31 downto 0); --data received
00120 A_DATA_READY_OUT : out ; --'1' if received data is avalible, '0' if there is no data
00121 B_DATA_READY_OUT : out ; --'1' if received data is avalible, '0' if there is no data
00122 A_DATA_CONTROL_OUT : out (3 downto 0); --'1' bit coresponds to byte as comma character
00123 B_DATA_CONTROL_OUT : out (3 downto 0); --'1' bit coresponds to byte as comma character
00124 A_EOP_OUT : out ; --signals, that end of package has been received
00125 B_EOP_OUT : out ; --signals, that end of package has been received
00126 A_PACKAGE_OK_OUT : out ; --four CLK_DATA_IN cycles lather than EOP_OUT this signal indicates whether previous packet was received correctly
00127 B_PACKAGE_OK_OUT : out ; --four CLK_DATA_IN cycles lather than EOP_OUT this signal indicates whether previous packet was received correctly
00128 A_DATA_ERROR_OUT : out ; --'1' if error ocoured, '0' if ok
00129 B_DATA_ERROR_OUT : out ; --'1' if error ocoured, '0' if ok
00130 --CHIPSCOPE-PORTS-----------------------------------------------------------------
00131 SCOPE_OUT : out (191 downto 0)
00132 );
00133 end component;
00134
00135
00136 component clock_divider is
00137 generic(
00138 DIVISION_FACTOR : := 2; --only even numbers
00139 INITIAL_VALUE : := 2 --only even numbers
00140 );
00141 port(
00142 CLK_IN : in ;
00143 CLK_OUT : out
00144 );
00145 end component;
00146
00147 --signals----------------------------------------------------------------
00148 constant cycle_limit : (7 downto 0) := "10000001"; --must be in a form of 2n+1
00149 type states is (sending, eop, pause, receiving, skip);
00150 signal state_a : states := sending;
00151 signal state_b : states := sending;
00152 signal state_II_a : states := receiving;
00153 signal state_II_b : states := receiving;
00154 signal a_txlock : ;
00155 signal b_txlock : ;
00156 signal a_rxlock : ;
00157 signal b_rxlock : ;
00158 signal t_a_ready : ;
00159 signal t_b_ready : ;
00160 signal r_a_ready : ;
00161 signal r_b_ready : ;
00162 signal phase_a : ;
00163 signal phase_b : ;
00164 signal counter_a : (7 downto 0);
00165 signal counter_b : (7 downto 0);
00166 signal counter_in_a : (7 downto 0);
00167 signal counter_in_b : (7 downto 0);
00168 signal sata_eop_a : ;
00169 signal sata_eop_b : ;
00170 signal sata_data_a : (31 downto 0);
00171 signal sata_data_b : (31 downto 0);
00172 signal data_direct_a : (35 downto 0);
00173 signal data_direct_b : (35 downto 0);
00174 signal data_delay_a : (35 downto 0);
00175 signal data_delay_b : (35 downto 0);
00176 signal sata_data_ready_a : ;
00177 signal sata_data_ready_b : ;
00178 signal sata_data_out_a : (31 downto 0);
00179 signal sata_data_out_b : (31 downto 0);
00180 signal sata_data_present_a : ;
00181 signal sata_data_present_b : ;
00182 signal sata_eop_signal_a : ;
00183 signal sata_eop_signal_b : ;
00184 signal p_good_a : ;
00185 signal p_good_b : ;
00186 signal p_bad_a : ;
00187 signal p_bad_b : ;
00188 signal package_report_a : ;
00189 signal package_report_b : ;
00190 signal last_buffer_a : (65 downto 0);
00191 signal last_buffer_b : (65 downto 0);
00192 signal sata_error_a : ;
00193 signal sata_error_b : ;
00194 signal delay_a : ;
00195 signal delay_b : ;
00196
00197 begin
00198
00199 sata_modul : sata port map(
00200 --CLOCK-PORTS---------------------------------------------------------------------
00201 CLK_RIO_IN => CLK_RIO_IN,
00202 CLK_DRP_IN => CLK_DRP_IN,
00203 CLK_DATA_IN => CLK_SATA_IN,
00204 USRCLK_STABLE_IN => USRCLK_STABLE_IN,
00205 --RESET-PORTS---------------------------------------------------------------------
00206 TX_A_SYSTEM_RESET_IN => RESET_A_IN,
00207 TX_B_SYSTEM_RESET_IN => RESET_B_IN,
00208 --PACKAGE-PINS--------------------------------------------------------------------
00209 RXP_SATA_IN => RXP_SATA_IN,
00210 RXN_SATA_IN => RXN_SATA_IN,
00211 TXP_SATA_OUT => TXP_SATA_OUT,
00212 TXN_SATA_OUT => TXN_SATA_OUT,
00213 --STATUS-PORTS--------------------------------------------------------------------
00214 MGTA_TXLOCK_OUT => a_txlock,
00215 MGTA_RXLOCK_OUT => a_rxlock,
00216 MGTB_TXLOCK_OUT => b_txlock,
00217 MGTB_RXLOCK_OUT => b_rxlock,
00218 TX_A_READY => t_a_ready,
00219 RX_A_READY => r_a_ready,
00220 TX_B_READY => t_b_ready,
00221 RX_B_READY => r_b_ready,
00222 --DATA-PORTS----------------------------------------------------------------------
00223 A_DATA_IN => sata_data_a,
00224 B_DATA_IN => sata_data_b,
00225 A_DATA_CONTROL_IN => "0000",
00226 B_DATA_CONTROL_IN => "0000" ,
00227 A_DATA_READY_IN => sata_data_ready_a ,
00228 B_DATA_READY_IN => sata_data_ready_b ,
00229 A_EOP_IN => sata_eop_a,
00230 B_EOP_IN => sata_eop_b,
00231 A_DATA_OUT => data_direct_a(31 downto 0),
00232 B_DATA_OUT => data_direct_b(31 downto 0),
00233 A_DATA_READY_OUT => data_direct_a(33),
00234 B_DATA_READY_OUT => data_direct_b(33),
00235 A_DATA_CONTROL_OUT => open,
00236 B_DATA_CONTROL_OUT => open,
00237 A_EOP_OUT => data_direct_a(32),
00238 B_EOP_OUT => data_direct_b(32),
00239 A_PACKAGE_OK_OUT => data_direct_a(34),
00240 B_PACKAGE_OK_OUT => data_direct_b(34),
00241 A_DATA_ERROR_OUT => data_direct_a(35),
00242 B_DATA_ERROR_OUT => data_direct_b(35),
00243 --CHIPSCOPE-PORTS-----------------------------------------------------------------
00244 SCOPE_OUT => open
00245 );
00246
00247 --delay line
00248 data_delay_a <= data_direct_a when rising_edge(CLK_SATA_IN);
00249 data_delay_b <= data_direct_b when rising_edge(CLK_SATA_IN);
00250
00251 --delay or not
00252 sata_data_out_a <= data_direct_a(31 downto 0) when delay_a = '0' else data_delay_a(31 downto 0);
00253 sata_data_out_b <= data_direct_b(31 downto 0) when delay_b = '0' else data_delay_b(31 downto 0);
00254 sata_eop_signal_a <= data_direct_a(32) when delay_a = '0' else data_delay_a(32);
00255 sata_eop_signal_b <= data_direct_b(32) when delay_b = '0' else data_delay_b(32);
00256 sata_data_present_a <= data_direct_a(33) when delay_a = '0' else data_delay_a(33);
00257 sata_data_present_b <= data_direct_b(33) when delay_b = '0' else data_delay_b(33);
00258 package_report_a <= data_direct_a(34) when delay_a = '0' else data_delay_a(34);
00259 package_report_b <= data_direct_b(34) when delay_b = '0' else data_delay_b(34);
00260 sata_error_a <= data_direct_a(35) when delay_a = '0' else data_delay_a(35);
00261 sata_error_b <= data_direct_b(35) when delay_b = '0' else data_delay_b(35);
00262 A_LISTENING <= '1' when (state_a = sending and RESET_A_IN = '0') else '0';
00263 B_LISTENING <= '1' when (state_b = sending and RESET_B_IN = '0') else '0';
00264 sata_data_ready_a <= '1' when (state_a = sending and A_DATA_VALID_IN = '1') else '0';
00265 sata_data_ready_b <= '1' when (state_b = sending and B_DATA_VALID_IN = '1') else '0';
00266 sata_data_a <= A_DATA_IN(31 downto 0) when (phase_a = '0') else A_DATA_IN(63 downto 32);
00267 sata_data_b <= B_DATA_IN(31 downto 0) when (phase_b = '0') else B_DATA_IN(63 downto 32);
00268
00269 TX_A_READY <= t_a_ready and a_txlock;
00270 TX_B_READY <= t_b_ready and b_txlock;
00271 RX_A_READY <= r_a_ready and a_rxlock;
00272 RX_B_READY <= r_b_ready and b_rxlock;
00273
00274
00275 sen_imp_a : process (CLK_SATA_IN)
00276 begin
00277 if CLK_SATA_IN'event and CLK_SATA_IN = '1' then
00278 if RESET_A_IN = '1' then
00279 --we are in the middle of reset
00280 counter_a <= (others => '0');
00281 phase_a <= '0';
00282 state_a <= sending;
00283 sata_eop_a <= '0';
00284 else
00285 --normal running
00286 phase_a <= not phase_a;
00287 case state_a is
00288 when sending =>
00289 counter_a <= counter_a + 1;
00290 if counter_a = cycle_limit then
00291 state_a <= eop;
00292 counter_a <= (others => '0');
00293 sata_eop_a <= '1';
00294 end if;
00295
00296 when eop =>
00297 sata_eop_a <= '0';
00298 state_a <= pause;
00299
00300 when pause =>
00301 counter_a <= counter_a + 1;
00302 if counter_a = 2 then
00303 counter_a <= (others => '0');
00304 state_a <= sending;
00305 end if;
00306
00307 when others =>
00308 counter_a <= (others => '0');
00309 state_a <= sending;
00310
00311 end case;
00312
00313 end if;
00314 end if;
00315 end process;
00316
00317
00318 sen_imp_b : process (CLK_SATA_IN)
00319 begin
00320 if CLK_SATA_IN'event and CLK_SATA_IN = '1' then
00321 if RESET_B_IN = '1' then
00322 --we are in the middle of reset
00323 counter_b <= (others => '0');
00324 phase_b <= '0';
00325 state_b <= sending;
00326 sata_eop_b <= '0';
00327 else
00328 --normal running
00329 phase_b <= not phase_b;
00330 case state_b is
00331 when sending =>
00332 counter_b <= counter_b + 1;
00333 if counter_b = cycle_limit then
00334 state_b <= eop;
00335 counter_b <= (others => '0');
00336 sata_eop_b <= '1';
00337 end if;
00338
00339 when eop =>
00340 sata_eop_b <= '0';
00341 state_b <= pause;
00342
00343 when pause =>
00344 counter_b <= counter_b + 1;
00345 if counter_b = 2 then
00346 counter_b <= (others => '0');
00347 state_b <= sending;
00348 end if;
00349
00350 when others =>
00351 counter_b <= (others => '0');
00352 state_b <= sending;
00353
00354 end case;
00355
00356 end if;
00357 end if;
00358 end process;
00359
00360
00361 rec_imp_a : process (CLK_SATA_IN)
00362 begin
00363 if CLK_SATA_IN'event and CLK_SATA_IN = '1' then
00364 if RESET_A_IN = '1' then
00365 --we are in the middle of reset
00366 counter_in_a <= (others => '0');
00367 state_II_a <= receiving;
00368 delay_a <= '0';
00369 else
00370 --normal running
00371 case state_II_a is
00372 when receiving =>
00373 if sata_eop_signal_a = '1' then
00374 state_II_a <= eop;
00375 counter_in_a <= (others => '0');
00376 if CLK_DATA_IN = '0' then
00377 delay_a <= not delay_a;
00378 state_II_a <= skip;
00379 end if;
00380 end if;
00381 when eop =>
00382 counter_in_a <= counter_in_a + 1;
00383 if counter_in_a = 2 then
00384 if package_report_a = '1' then
00385 p_good_a <= '1';
00386 else
00387 p_bad_a <= '1';
00388 end if;
00389 elsif counter_in_a = 4 then
00390 state_II_a <= receiving;
00391 counter_in_a <= (others => '0');
00392 p_good_a <= '0';
00393 p_bad_a <= '0';
00394 end if;
00395
00396 when skip =>
00397 state_II_a <= receiving;
00398
00399 when others =>
00400 state_II_a <= receiving;
00401 counter_in_a <= (others => '0');
00402
00403 end case;
00404 end if;
00405 end if;
00406 end process;
00407
00408
00409 rec_imp_b : process (CLK_SATA_IN)
00410 begin
00411 if CLK_SATA_IN'event and CLK_SATA_IN = '1' then
00412 if RESET_B_IN = '1' then
00413 --we are in the middle of reset
00414 counter_in_b <= (others => '0');
00415 state_II_b <= receiving;
00416 delay_b <= '0';
00417 else
00418 --normal running
00419 case state_II_b is
00420 when receiving =>
00421 if sata_eop_signal_b = '1' then
00422 state_II_b <= eop;
00423 counter_in_b <= (others => '0');
00424 if CLK_DATA_IN = '0' then
00425 delay_b <= not delay_b;
00426 state_II_b <= skip;
00427 end if;
00428 end if;
00429 when eop =>
00430 counter_in_b <= counter_in_b + 1;
00431 if counter_in_b = 2 then
00432 if package_report_b = '1' then
00433 p_good_b <= '1';
00434 else
00435 p_bad_b <= '1';
00436 end if;
00437 elsif counter_in_b = 4 then
00438 state_II_b <= receiving;
00439 counter_in_b <= (others => '0');
00440 p_good_b <= '0';
00441 p_bad_b <= '0';
00442 end if;
00443
00444 when skip =>
00445 state_II_b <= receiving;
00446
00447 when others =>
00448 state_II_b <= receiving;
00449 counter_in_b <= (others => '0');
00450
00451 end case;
00452 end if;
00453 end if;
00454 end process;
00455
00456 A_PACKAGE_GOOD <= p_good_a;
00457 B_PACKAGE_GOOD <= p_good_b;
00458 A_PACKAGE_BAD <= p_bad_a;
00459 B_PACKAGE_BAD <= p_bad_b;
00460
00461
00462 last_buf_a : process (CLK_SATA_IN)
00463 begin
00464 if CLK_SATA_IN'event and CLK_SATA_IN = '1' then
00465 if CLK_DATA_IN = '1' then
00466 last_buffer_a(31 downto 0) <= sata_data_out_a;
00467 else
00468 last_buffer_a(63 downto 32) <= sata_data_out_a;
00469 last_buffer_a(64) <= sata_data_present_a;
00470 last_buffer_a(65) <= sata_error_a;
00471 end if;
00472 end if;
00473 end process;
00474
00475
00476 last_buf_b : process (CLK_SATA_IN)
00477 begin
00478 if CLK_SATA_IN'event and CLK_SATA_IN = '1' then
00479 if CLK_DATA_IN = '1' then
00480 last_buffer_b(31 downto 0) <= sata_data_out_b;
00481 else
00482 last_buffer_b(63 downto 32) <= sata_data_out_b;
00483 last_buffer_b(64) <= sata_data_present_b;
00484 last_buffer_b(65) <= sata_error_b;
00485 end if;
00486 end if;
00487 end process;
00488
00489
00490 output_value_a : process(CLK_DATA_IN)
00491 begin
00492 if CLK_DATA_IN'event and CLK_DATA_IN = '1' then
00493 A_DATA_OUT <= last_buffer_a(63 downto 0);
00494 A_DATA_VALID_OUT <= last_buffer_a(64);
00495 A_DATA_ERROR <= last_buffer_a(65);
00496 end if;
00497 end process;
00498
00499
00500 output_value_b : process(CLK_DATA_IN)
00501 begin
00502 if CLK_DATA_IN'event and CLK_DATA_IN = '1' then
00503 B_DATA_OUT <= last_buffer_b(63 downto 0);
00504 B_DATA_VALID_OUT <= last_buffer_b(64);
00505 B_DATA_ERROR <= last_buffer_b(65);
00506 end if;
00507 end process;
00508
00509 c_scope <= (others => '0');
00510
00511 end bridge_arc;
00512