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/eth/temac_controller.vhd,v $ *
00015 --* $Revision: 2.4.2.4 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 17:57:46 $ *
00019
00020
00021 --* *
00022 --**************************************************************
00023
00024 --------------------------------------------------------------------------------
00025 --
00026 --
00027 -- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"
00028 -- SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR
00029 -- XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION
00030 -- AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION
00031 -- OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS
00032 -- IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,
00033 -- AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE
00034 -- FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY
00035 -- WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE
00036 -- IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR
00037 -- REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF
00038 -- INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00039 -- FOR A PARTICULAR PURPOSE.
00040 --
00041 -- (c) Copyright 2005 Xilinx, Inc.
00042 -- All rights reserved.
00043 --
00044 ------------------------------------------------------------------------------
00045
00046 library ieee;
00047
00048 use ieee.std_logic_1164.all;
00049
00050 library unisim;
00051
00052 use unisim.vcomponents.all;
00053
00054
00055
00056
00057 entity temac_controller is
00058 port (
00059 TXVLD_N : out ;
00060 gmii_col : in ;
00061 gmii_crs : in ;
00062 gmii_rx_clk : in ;
00063 gmii_rx_dv : in ;
00064 gmii_rx_er : in ;
00065 gmii_rxd : in (0 to 7);
00066 mii_tx_clk : in ;
00067 gmii_tx_clk : out ;
00068 gmii_tx_en : out ;
00069 gmii_tx_er : out ;
00070 gmii_txd : out (0 to 7);
00071 MDC_0 : out ;
00072 mdio : inout ;
00073 phy_mii_int : out ;
00074 sys_rst : in ;
00075 sys_clk : in ;
00076 dcm1_locked : out ;
00077 tx_fifo_data : in (0 to 31);
00078 tx_fifo_wren : in ;
00079 tx_fifo_full : out ;
00080 tx_fifo_lock_n : in ;
00081 EMPTY : out ;
00082 rx_fifo_rst : in ;
00083 rx_fifo_data : out (0 to 31);
00084 rx_fifo_rden : in ;
00085 clk_100mhz : in
00086 );
00087 end temac_controller;
00088
00089
00090 architecture temac_controller_arc of temac_controller is
00091
00092
00093 component xtemac is
00094 port(
00095 -- Client Receiver Interface - EMAC0
00096 EMAC0CLIENTRXCLIENTCLKOUT : out ;
00097 CLIENTEMAC0RXCLIENTCLKIN : in ;
00098 EMAC0CLIENTRXD : out (7 downto 0);
00099 EMAC0CLIENTRXDVLD : out ;
00100 EMAC0CLIENTRXDVLDMSW : out ;
00101 EMAC0CLIENTRXGOODFRAME : out ;
00102 EMAC0CLIENTRXBADFRAME : out ;
00103 EMAC0CLIENTRXFRAMEDROP : out ;
00104 EMAC0CLIENTRXDVREG6 : out ;
00105 EMAC0CLIENTRXSTATS : out (6 downto 0);
00106 EMAC0CLIENTRXSTATSVLD : out ;
00107 EMAC0CLIENTRXSTATSBYTEVLD : out ;
00108
00109 -- Client Transmitter Interface - EMAC0
00110 EMAC0CLIENTTXCLIENTCLKOUT : out ;
00111 CLIENTEMAC0TXCLIENTCLKIN : in ;
00112 CLIENTEMAC0TXD : in (7 downto 0);
00113 CLIENTEMAC0TXDVLD : in ;
00114 CLIENTEMAC0TXDVLDMSW : in ;
00115 EMAC0CLIENTTXACK : out ;
00116 CLIENTEMAC0TXFIRSTBYTE : in ;
00117 CLIENTEMAC0TXUNDERRUN : in ;
00118 EMAC0CLIENTTXCOLLISION : out ;
00119 EMAC0CLIENTTXRETRANSMIT : out ;
00120 CLIENTEMAC0TXIFGDELAY : in (7 downto 0);
00121 EMAC0CLIENTTXSTATS : out ;
00122 EMAC0CLIENTTXSTATSVLD : out ;
00123 EMAC0CLIENTTXSTATSBYTEVLD : out ;
00124 -- MAC Control Interface - EMAC0
00125 CLIENTEMAC0PAUSEREQ : in ;
00126 CLIENTEMAC0PAUSEVAL : in (15 downto 0);
00127 -- Clock Signal - EMAC0
00128 GTX_CLK_0 : in ;
00129 EMAC0CLIENTTXGMIIMIICLKOUT : out ;
00130 CLIENTEMAC0TXGMIIMIICLKIN : in ;
00131 -- GMII Interface - EMAC0
00132 GMII_TXD_0 : out (7 downto 0);
00133 GMII_TX_EN_0 : out ;
00134 GMII_TX_ER_0 : out ;
00135 GMII_TX_CLK_0 : out ;
00136 GMII_RXD_0 : in (7 downto 0);
00137 GMII_RX_DV_0 : in ;
00138 GMII_RX_ER_0 : in ;
00139 GMII_RX_CLK_0 : in ;
00140 MII_TX_CLK_0 : in ;
00141 GMII_COL_0 : in ;
00142 GMII_CRS_0 : in ;
00143 -- MDIO Interface - EMAC0
00144 MDC_0 : out ;
00145 MDIO_IN_0 : in ;
00146 MDIO_OUT_0 : out ;
00147 MDIO_TRI_0 : out ;
00148 HOSTCLK : in ;
00149 -- Asynchronous Reset
00150 RESET : in
00151 );
00152 end component;
00153
00154
00155 component bcm_emac_fifo
00156 port (
00157 din : in (8 downto 0);
00158 rd_clk : in ;
00159 rd_en : in ;
00160 rst : in ;
00161 wr_clk : in ;
00162 wr_en : in ;
00163 dout : out (8 downto 0);
00164 empty : out ;
00165 full : out );
00166 end component;
00167
00168
00169 component bcm_emac_fifo_rx
00170 port(
00171 din : in (8 downto 0);
00172 rd_clk : in ;
00173 rd_en : in ;
00174 rst : in ;
00175 wr_clk : in ;
00176 wr_en : in ;
00177 dout : out (8 downto 0);
00178 empty : out ;
00179 full : out
00180 );
00181 end component;
00182
00183
00184 component extend_test
00185 generic (
00186 LEN : range 0 to 63 := 2
00187 );
00188 port(
00189 CLK : in ;
00190 RES : in ;
00191 A : in ;
00192 ENDM : out ;
00193 Y : out
00194 );
00195 end component;
00196
00197
00198 component edge
00199 port(
00200 CLK : in ;
00201 A : in ;
00202 PULSE : out
00203 );
00204 end component;
00205
00206
00207 component period_check
00208 generic (
00209 PERIOD : range 0 to 255);
00210 port (
00211 CLK : in ;
00212 RES : in ;
00213 EN : in ;
00214 A : in ;
00215 Y : out
00216 );
00217 end component;
00218
00219 -- DCM Signals
00220 signal gtx_clk_bufg_in : ;
00221 signal dcm1_clk0_i : ;
00222 signal dcm1_clk0_o : ;
00223 -- EMAC signal
00224 signal gnd_i, dcm1_lock, lock_i : ;
00225 signal reset_i, fifo_rst : ;
00226 signal gtx_clk_bufg_0_i : ;
00227 signal rx_client_clk_out_0_i : ;
00228 signal rx_client_clk_in_0_i : ;
00229 signal tx_client_clk_out_0_i : ;
00230 signal tx_client_clk_in_0_i : ;
00231 signal tx_gmii_mii_clk_out_0_i : ;
00232 signal tx_gmii_mii_clk_in_0_i : ;
00233 signal gmii_tx_clk_0_i : ;
00234 signal gmii_tx_en_0_i : ;
00235 signal gmii_tx_er_0_i : ;
00236 signal gmii_txd_0_i : (7 downto 0);
00237 signal gmii_tx_en_0_r : ;
00238 signal gmii_tx_er_0_r : ;
00239 signal gmii_txd_0_r : (7 downto 0);
00240 signal mii_tx_clk_0_i : ;
00241 signal gmii_col_0_i : ;
00242 signal gmii_crs_0_i : ;
00243 signal gmii_rx_clk_ibufg_0_i : ;
00244 signal gmii_rx_clk_0_i : ;
00245 signal gmii_rx_dv_0_i : ;
00246 signal gmii_rx_dv_delay_0_i : ;
00247 signal gmii_rx_er_0_i : ;
00248 signal gmii_rx_er_delay_0_i : ;
00249 signal gmii_rxd_0_i : (7 downto 0);
00250 signal gmii_rxd_delay_0_i : (7 downto 0);
00251 signal gmii_rx_dv_0_r : ;
00252 signal gmii_rx_er_0_r : ;
00253 signal gmii_rxd_0_r : (7 downto 0);
00254 -- MDIO signals
00255 signal MDIO_IN_0 : ;
00256 signal MDIO_OUT_0 : ;
00257 signal MDIO_TRI_0 : ;
00258 signal mdc_0_obuf : ;
00259 signal emac_mdc : ;
00260 signal emac_mdio_in : ;
00261 signal emac_mdio_out : ;
00262 signal emac_mdio_tri : ;
00263 -- EMAC Receive interface to rx_fifo
00264 signal rx_valid : ;
00265 signal rx_good_frame : ;
00266 signal rx_bad_frame : ;
00267 signal rx_data : (0 to 7);
00268 signal rx_clk : ;
00269 signal rx_fifo_DO : (7 downto 0);
00270 signal rx_fifo_wren : ;
00271 signal rx_fifo_full : ;
00272 signal rx_valid_fifo : ;
00273 signal rx_fifo_rderr : ;
00274 -- EMAC Transmit interface to rx_fifo
00275 signal tx_data : (7 downto 0);
00276 signal tx_valid, tx_valid_i : := '0';
00277 signal n_tx_valid, macen : := '0';
00278 signal tx_ack : := '0';
00279 signal tx_ack_delay : := '0';
00280 signal tx_fifo_empty : := '0';
00281 signal tx_fifo_rden : := '0';
00282 signal tx_fifo_di : (8 downto 0);
00283 signal edge_txclk, mac_clk_pres : ;
00284 signal tx_fifo_rden_start : := '0';
00285 signal n_tx_fifo_di8, n_tx_fifo_di8_l, n_tx_fifo_di8_p : ;
00286
00287 alias tx_clk is tx_client_clk_in_0_i;
00288
00289 begin
00290
00291 EMPTY <= tx_fifo_empty;
00292
00293 -- tx fifo supporting logic
00294 tx_fifo_di <= tx_fifo_data(23 to 31);
00295 tx_fifo_rden <= (tx_fifo_rden_start or tx_ack_delay or tx_ack);
00296 --EMPTY <= not tx_valid;
00297
00298
00299 extender : extend_test
00300 generic map (LEN => 20)
00301 port map(
00302 CLK => clk_100mhz,
00303 RES => sys_rst ,
00304 ENDM => open,
00305 A => n_tx_fifo_di8,
00306 Y => n_tx_fifo_di8_l
00307 );
00308
00309
00310 pulser : edge port map(
00311 CLK => tx_clk ,
00312 A => n_tx_fifo_di8_l,
00313 PULSE => n_tx_fifo_di8_p
00314 );
00315
00316
00317 rden_start : process (tx_clk, sys_rst)
00318 begin
00319 if sys_rst = '1' then
00320 tx_fifo_rden_start <= '0';
00321 elsif tx_clk'event and tx_clk = '1' then
00322 tx_fifo_rden_start <= n_tx_fifo_di8_p;
00323 end if;
00324 end process rden_start;
00325
00326
00327 ack_delay : process (tx_clk, sys_rst)
00328 begin
00329 if sys_rst = '1' then
00330 tx_ack_delay <= '0';
00331 elsif tx_clk'event and tx_clk = '1' then
00332 if tx_valid = '0' then
00333 tx_ack_delay <= '0';
00334 elsif tx_ack = '1' then
00335 tx_ack_delay <= '1';
00336 end if;
00337 end if;
00338 end process ack_delay;
00339
00340
00341 mac_en : process(tx_clk, sys_rst)
00342 begin
00343 if sys_rst = '1' then
00344 macen <= '0';
00345 elsif tx_clk'event and tx_clk = '1' then
00346 if tx_fifo_rden_start = '1' then
00347 macen <= '1';
00348 elsif tx_valid = '0' then
00349 macen <= '0';
00350 else
00351 macen <= macen;
00352 end if;
00353 end if;
00354 end process mac_en;
00355
00356 -- rx FIFO supporting logic
00357 rx_fifo_wren <= (rx_valid or rx_good_frame or rx_bad_frame) and (not rx_fifo_rst);
00358 -- connection to ppc from rx fifo
00359 rx_fifo_data(24 to 31) <= rx_fifo_DO; -- 7 downto 0
00360 rx_fifo_data(8) <= rx_fifo_rderr; -- 23
00361 rx_fifo_data(11) <= rx_valid_fifo; -- 20
00362 rx_fifo_data(13) <= rx_fifo_full; -- 18
00363 rx_fifo_data(0 to 7) <= "00000000"; -- 31 downto 24
00364 rx_fifo_data(9) <= rx_good_frame; -- 22
00365 rx_fifo_data(10) <= rx_bad_frame; -- 21
00366 rx_fifo_data(12) <= rx_valid; -- 19
00367 rx_fifo_data(14 to 23) <= "0000000000"; -- 17 downto 8
00368
00369 -----------------------------------------------------------------------------------
00370 --ETHERNET SIGNALS, BUFFERS, FLIPFLOPS, AND EMAC
00371 -----------------------------------------------------------------------------------
00372
00373 -- phy_mii_int<= not phy_mii_int_n_IBUF;
00374 -- ibuf_29 : IBUF port map(
00375 -- I=> phy_mii_int_n,
00376 -- O=> phy_mii_int_n_IBUF
00377 -- );
00378
00379 phy_mii_int <= '0';
00380
00381 obuf55 : OBUF
00382 port map(
00383 I => mdc_0_obuf,
00384 O => mdc_0
00385 );
00386 gnd_i <= '0';
00387
00388 reset_i <= sys_rst;
00389 iobuf_56 : IOBUF
00390 port map(
00391 I => MDIO_OUT_0,
00392 IO => mdio,
00393 O => MDIO_IN_0,
00394 T => MDIO_TRI_0
00395 );
00396
00397
00398 mdio_reg1 : process (sys_clk)
00399 begin
00400 if sys_clk'event and sys_clk = '1' then
00401 mdc_0_obuf <= emac_mdc;
00402 MDIO_OUT_0 <= emac_mdio_out;
00403 MDIO_TRI_0 <= emac_mdio_tri;
00404 end if;
00405
00406
00407 end process mdio_reg1;
00408 mdio_reg2 : process (mdc_0_obuf)
00409 begin
00410 if mdc_0_obuf'event and mdc_0_obuf = '0' then
00411 emac_mdio_in <= MDIO_IN_0;
00412 end if;
00413 end process mdio_reg2;
00414
00415 --********** EMAC0 **********
00416 ----------------------------------------------------------------------------
00417
00418 gtx : BUFG
00419 port map (
00420 I => gtx_clk_bufg_in,
00421 O => gtx_clk_bufg_0_i
00422 );
00423
00424 tx_gmii_mii_clk_0_bufg : BUFG
00425 port map (
00426 I => tx_gmii_mii_clk_out_0_i,
00427 O => tx_gmii_mii_clk_in_0_i
00428 );
00429
00430 ----------------------------------------------------------------------------
00431
00432 gmii_tx_clk_0_obuf : OBUF
00433 port map (
00434 I => gmii_tx_clk_0_i,
00435 O => gmii_tx_clk
00436 );
00437
00438 ----------------------------------------------------------------------------
00439
00440
00441
00442 gmii_output_ffs_0 : process (tx_gmii_mii_clk_in_0_i, reset_i)
00443 begin
00444 if reset_i = '1' then
00445 gmii_tx_en_0_r <= '0';
00446 gmii_tx_er_0_r <= '0';
00447 gmii_txd_0_r <= (others => '0');
00448 elsif tx_gmii_mii_clk_in_0_i'event and tx_gmii_mii_clk_in_0_i = '1' then
00449 gmii_tx_en_0_r <= gmii_tx_en_0_i;
00450 gmii_tx_er_0_r <= gmii_tx_er_0_i;
00451 gmii_txd_0_r <= gmii_txd_0_i;
00452 end if;
00453 end process gmii_output_ffs_0;
00454
00455
00456 gmii_tx_en_0_obuf : OBUF port map (I => gmii_tx_en_0_r, O => gmii_tx_en);
00457
00458 gmii_tx_er_0_obuf : OBUF port map (I => gmii_tx_er_0_r, O => gmii_tx_er);
00459
00460 gmii_txd_0_bus : for I in 7 downto 0 generate
00461 gmii_txd_0_obuf : OBUF
00462 port map (
00463 I => gmii_txd_0_r(I),
00464 O => gmii_txd(I)
00465 );
00466 end generate;
00467
00468 ----------------------------------------------------------------------------
00469
00470 gmii_rx_clk_0_ibufg : IBUFG
00471 port map (
00472 I => gmii_rx_clk,
00473 O => gmii_rx_clk_ibufg_0_i
00474 );
00475
00476 gmii_rx_clk_0_i <= gmii_rx_clk_ibufg_0_i;
00477
00478 ----------------------------------------------------------------------------
00479
00480
00481
00482
00483
00484 gmii_rx_dv_0_ibuf : IBUF port map (I => gmii_rx_dv, O => gmii_rx_dv_0_i);
00485
00486
00487 gmii_rx_dv_0_delay : IDELAY
00488 port map (
00489 I => gmii_rx_dv_0_i,
00490 O => gmii_rx_dv_delay_0_i,
00491 C => gnd_i ,
00492 CE => gnd_i,
00493 INC => gnd_i,
00494 RST => gnd_i
00495 );
00496
00497 gmii_rx_er_0_ibuf : IBUF port map (I => gmii_rx_er, O => gmii_rx_er_0_i);
00498
00499
00500 gmii_rx_er_0_delay : IDELAY
00501 port map (
00502 I => gmii_rx_er_0_i,
00503 O => gmii_rx_er_delay_0_i,
00504 C => gnd_i ,
00505 CE => gnd_i,
00506 INC => gnd_i,
00507 RST => gnd_i
00508 );
00509
00510 gmii_rxd_0_bus : for I in 7 downto 0 generate
00511 gmii_rxd_0_ibuf : IBUF
00512 port map (
00513 I => gmii_rxd(I),
00514 O => gmii_rxd_0_i(I)
00515 );
00516
00517 gmii_rxd_0_delay : IDELAY
00518 port map (
00519 I => gmii_rxd_0_i(I),
00520 O => gmii_rxd_delay_0_i(I),
00521 C => gnd_i ,
00522 CE => gnd_i ,
00523 INC => gnd_i ,
00524 RST => gnd_i
00525 );
00526 end generate;
00527
00528
00529 gmii_input_ffs_0 : process (gmii_rx_clk_0_i, reset_i)
00530 begin
00531 if reset_i = '1' then
00532 gmii_rx_dv_0_r <= '0';
00533 gmii_rx_er_0_r <= '0';
00534 gmii_rxd_0_r <= (others => '0');
00535 elsif gmii_rx_clk_0_i'event and gmii_rx_clk_0_i = '1' then
00536 gmii_rx_dv_0_r <= gmii_rx_dv_delay_0_i;
00537 gmii_rx_er_0_r <= gmii_rx_er_delay_0_i;
00538 gmii_rxd_0_r <= gmii_rxd_delay_0_i;
00539 end if;
00540 end process gmii_input_ffs_0;
00541
00542
00543 mii_tx_clk_0_ibufg : IBUFG
00544 port map (
00545 I => mii_tx_clk,
00546 O => mii_tx_clk_0_i
00547 );
00548
00549
00550 -- auto generate IBUFs
00551 gmii_col_0_i <= gmii_col;
00552 gmii_crs_0_i <= gmii_crs;
00553
00554 -- Half Duplex signals for tri-speed mode
00555 --gmii_col_0_obuf : IBUF port map (I => gmii_col, O => gmii_col_0_i);
00556 --gmii_crs_0_obuf : IBUF port map (I => gmii_crs, O => gmii_crs_0_i);
00557
00558 ----------------------------------------------------------------------------
00559 -- Receive & Transmit Client Clock Management when configured in 8-bit mode
00560 ----------------------------------------------------------------------------
00561
00562 BUFR_inst : BUFR
00563 generic map (
00564 BUFR_DIVIDE => "BYPASS", -- "BYPASS", "1", "2", "3", "4", "5", "6", "7", "8
00565 SIM_DEVICE => "VIRTEX4") -- Specify target device, "VIRTEX4" or "VIRTEX5
00566 port map (
00567 O => tx_client_clk_in_0_i, -- Clock buffer output
00568 CE => '1' , -- Clock enable input
00569 CLR => '0' , -- Clock buffer reset input
00570 I => tx_client_clk_out_0_i -- Clock buffer input
00571 );
00572 rx_client_clk_in_0_i <= rx_client_clk_out_0_i;
00573 rx_clk <= rx_client_clk_in_0_i;
00574
00575 ----------------------------------------------------------------------------
00576
00577 v4_emac_top : xtemac
00578 port map (
00579 -- Client Receiver Interface - EMAC0
00580 EMAC0CLIENTRXCLIENTCLKOUT => rx_client_clk_out_0_i,
00581 CLIENTEMAC0RXCLIENTCLKIN => rx_client_clk_in_0_i,
00582 EMAC0CLIENTRXD => rx_data,
00583 EMAC0CLIENTRXDVLD => rx_valid,
00584 EMAC0CLIENTRXDVLDMSW => open,
00585 EMAC0CLIENTRXGOODFRAME => rx_good_frame,
00586 EMAC0CLIENTRXBADFRAME => rx_bad_frame,
00587 EMAC0CLIENTRXFRAMEDROP => open,
00588 EMAC0CLIENTRXDVREG6 => open,
00589 EMAC0CLIENTRXSTATS => open,
00590 EMAC0CLIENTRXSTATSVLD => open,
00591 EMAC0CLIENTRXSTATSBYTEVLD => open,
00592 -- Client Transmitter Interface - EMAC0
00593 EMAC0CLIENTTXCLIENTCLKOUT => tx_client_clk_out_0_i,
00594 CLIENTEMAC0TXCLIENTCLKIN => tx_client_clk_in_0_i,
00595 CLIENTEMAC0TXD => tx_data,
00596 CLIENTEMAC0TXDVLD => macen,
00597 CLIENTEMAC0TXDVLDMSW => '0',
00598 EMAC0CLIENTTXACK => tx_ack,
00599 CLIENTEMAC0TXFIRSTBYTE => '0',
00600 CLIENTEMAC0TXUNDERRUN => '0',
00601 EMAC0CLIENTTXCOLLISION => open,
00602 EMAC0CLIENTTXRETRANSMIT => open,
00603 CLIENTEMAC0TXIFGDELAY => "00000000",
00604 EMAC0CLIENTTXSTATS => open,
00605 EMAC0CLIENTTXSTATSVLD => open,
00606 EMAC0CLIENTTXSTATSBYTEVLD => open,
00607 -- MAC Control Interface - EMAC0
00608 CLIENTEMAC0PAUSEREQ => '0',
00609 CLIENTEMAC0PAUSEVAL => "0000000000000000",
00610 -- Clock Signal - EMAC0
00611 GTX_CLK_0 => gtx_clk_bufg_0_i,
00612 EMAC0CLIENTTXGMIIMIICLKOUT => tx_gmii_mii_clk_out_0_i,
00613 CLIENTEMAC0TXGMIIMIICLKIN => tx_gmii_mii_clk_in_0_i,
00614 -- GMII Interface - EMAC0
00615 GMII_TXD_0 => gmii_txd_0_i,
00616 GMII_TX_EN_0 => gmii_tx_en_0_i,
00617 GMII_TX_ER_0 => gmii_tx_er_0_i,
00618 GMII_TX_CLK_0 => gmii_tx_clk_0_i,
00619 GMII_RXD_0 => gmii_rxd_0_r,
00620 GMII_RX_DV_0 => gmii_rx_dv_0_r,
00621 GMII_RX_ER_0 => gmii_rx_er_0_r,
00622 GMII_RX_CLK_0 => gmii_rx_clk_0_i,
00623 MII_TX_CLK_0 => mii_tx_clk_0_i,
00624 GMII_COL_0 => gmii_col_0_i,
00625 GMII_CRS_0 => gmii_crs_0_i,
00626 -- MDIO Interface - EMAC0
00627 MDC_0 => emac_mdc,
00628 MDIO_IN_0 => emac_mdio_in,
00629 MDIO_OUT_0 => emac_mdio_out,
00630 MDIO_TRI_0 => emac_mdio_tri,
00631 HOSTCLK => sys_clk,
00632 -- Asynchronous Reset
00633 RESET => reset_i
00634 );
00635
00636
00637 clk_checker : edge port map(
00638 CLK => clk_100mhz,
00639 A => tx_clk ,
00640 PULSE => edge_txclk
00641 );
00642
00643
00644 clk_checker_cnt : process(clk_100mhz)
00645 variable cnt : range 0 to 10 := 0;
00646 begin
00647 if clk_100mhz'event and clk_100mhz = '1' then
00648 if sys_rst = '1' then
00649 cnt := 0;
00650 mac_clk_pres <= '0';
00651 else
00652 if edge_txclk = '1' then
00653 if mac_clk_pres = '0' then
00654 cnt := cnt + 1;
00655 if cnt = 4 then
00656 mac_clk_pres <= '1';
00657 end if;
00658 else
00659 cnt := cnt;
00660 end if;
00661 end if;
00662 end if;
00663 end if;
00664 end process clk_checker_cnt;
00665
00666
00667 MAC_DCM : DCM_BASE
00668 generic map (
00669 CLKDV_DIVIDE => 2.0, -- Divide by: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
00670 -- 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
00671 CLKFX_DIVIDE => 4, -- Can be any interger from 1 to 32
00672 CLKFX_MULTIPLY => 5, -- Can be any integer from 2 to 32
00673 CLKIN_DIVIDE_BY_2 => false, -- TRUE/FALSE to enable CLKIN divide by two feature
00674 CLKIN_PERIOD => 10.0, -- Specify period of input clock in ns from 1.25 to 1000.00
00675 CLKOUT_PHASE_SHIFT => "NONE", -- Specify phase shift mode of NONE or FIXED
00676 CLK_FEEDBACK => "1X", -- Specify clock feedback of NONE or 1X
00677 DCM_AUTOCALIBRATION => true, -- DCM calibrartion circuitry TRUE/FALSE
00678 DCM_PERFORMANCE_MODE => "MAX_SPEED", -- Can be MAX_SPEED or MAX_RANGE
00679 DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS" , -- SOURCE_SYNCHRONOUS, SYSTEM_SYNCHRONOUS or
00680 -- an integer from 0 to 15
00681 DFS_FREQUENCY_MODE => "LOW", -- LOW or HIGH frequency mode for frequency synthesis
00682 DLL_FREQUENCY_MODE => "LOW", -- LOW, HIGH, or HIGH_SER frequency mode for DLL
00683 DUTY_CYCLE_CORRECTION => true, -- Duty cycle correction, TRUE or FALSE
00684 FACTORY_JF => X"F0F0", -- FACTORY JF Values Suggested to be set to X"F0F0"
00685 PHASE_SHIFT => 0, -- Amount of fixed phase shift from -255 to 1023
00686 STARTUP_WAIT => false) -- Delay configuration DONE until DCM LOCK, TRUE/FALSE
00687 port map (
00688 CLK0 => dcm1_clk0_o , -- 0 degree DCM CLK ouptput
00689 CLK180 => open, -- 180 degree DCM CLK output
00690 CLK270 => open, -- 270 degree DCM CLK output
00691 CLK2X => open, -- 2X DCM CLK output
00692 CLK2X180 => open, -- 2X, 180 degree DCM CLK out
00693 CLK90 => open, -- 90 degree DCM CLK output
00694 CLKDV => open, -- Divided DCM CLK out (CLKDV_DIVIDE)
00695 CLKFX => gtx_clk_bufg_in, -- DCM CLK synthesis out (M/D)
00696 CLKFX180 => open, -- 180 degree CLK synthesis out
00697 LOCKED => dcm1_lock, -- DCM LOCK status output
00698 CLKFB => dcm1_clk0_i , -- DCM clock feedback
00699 CLKIN => clk_100mhz , -- Clock input (from IBUFG, BUFG or DCM)
00700 RST => sys_rst -- DCM asynchronous reset input
00701 );
00702
00703 lock_i <= dcm1_lock and mac_clk_pres;
00704
00705 dcmfb : bufg port map (O => dcm1_clk0_i, I => dcm1_clk0_o);
00706
00707
00708 mac_clk_chk : period_check
00709 generic map (
00710 PERIOD => 8 )
00711 port map (
00712 CLK => clk_100mhz,
00713 RES => sys_rst ,
00714 EN => lock_i ,
00715 A => tx_clk ,
00716 Y => dcm1_locked
00717 );
00718
00719
00720 rx_fifo : bcm_emac_fifo_rx
00721 port map (
00722 din(7 downto 0) => rx_data,
00723 din(8) => rx_valid ,
00724 rd_clk => sys_clk,
00725 rd_en => rx_fifo_rden,
00726 rst => sys_rst,
00727 wr_clk => rx_clk,
00728 wr_en => rx_fifo_wren,
00729 dout(7 downto 0) => rx_fifo_DO,
00730 dout(8) => rx_valid_fifo,
00731 empty => open,
00732 full => rx_fifo_full
00733 );
00734
00735 rx_fifo_rderr <= '0';
00736
00737
00738 tx_fifo : bcm_emac_fifo
00739 port map (
00740 din(7 downto 4) => tx_fifo_di(3 downto 0),
00741 din(3 downto 0) => tx_fifo_di(7 downto 4),
00742 din(8) => tx_fifo_di(8),
00743 rd_clk => tx_clk,
00744 rd_en => tx_fifo_rden,
00745 rst => fifo_rst,
00746 wr_clk => sys_clk,
00747 wr_en => tx_fifo_wren,
00748 dout(7 downto 4) => tx_data(3 downto 0),
00749 dout(3 downto 0) => tx_data(7 downto 4),
00750 dout(8) => tx_valid_i,
00751 empty => tx_fifo_empty,
00752 full => tx_fifo_full
00753 );
00754
00755 fifo_rst <= sys_rst or (not dcm1_lock);
00756 tx_valid <= tx_valid_i when tx_fifo_rden = '1' else '1';
00757 n_tx_valid <= not tx_valid;
00758 n_tx_fifo_di8 <= not tx_fifo_di(8);
00759 TXVLD_N <= n_tx_valid;
00760
00761 end architecture temac_controller_arc;
00762
00763
00764
00765
00766