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/ncm_temac.vhd,v $ *
00015 --* $Revision: 2.4.2.3 $ *
00016 --* $Name: dev $ *
00017 --* $Author: mniegl $ *
00018 --* $Date: 2008/11/03 17:57:46 $ *
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 library unisim;
00033
00034 use unisim.vcomponents.all;
00035 library work;
00036 use work.ncm_package.all;
00037
00038
00039
00040 entity ncm_temac is
00041 port (sys_clk : in ;
00042 TXVLD_N : out ;
00043 DATA_IN : in (7 downto 0);
00044 SOF : in ;
00045 EOF : in ;
00046 EN : in ;
00047 rst_n : in ;
00048 pause : out ;
00049 EMPTY : out ;
00050 gmii_rx_clk : in ;
00051 gmii_rx_dv : in ;
00052 gmii_rx_er : in ;
00053 gmii_rxd : in (0 to 7);
00054 mii_tx_clk : in ;
00055 gmii_tx_en : out ;
00056 gmii_tx_er : out ;
00057 gmii_txd : out (0 to 3);
00058 MDC_0 : out ;
00059 mdio : inout ;
00060 phy_rst_n : out ;
00061 DATA_OUT : out (7 downto 0);
00062 DATAVLD : out ;
00063 PACKET : out (19 downto 0);
00064 DATA_TYPE : out (11 downto 0);
00065 ARP_vld : out ;
00066 SHA : out (47 downto 0);
00067 SPA : out (31 downto 0);
00068 led1 : out ;
00069 led2 : out
00070 );
00071 end ncm_temac;
00072
00073
00074
00075 architecture ncm_temac_arc of ncm_temac is
00076
00077 signal clk : ;
00078 signal sys_rst : ;
00079 signal dcm1_locked : ;
00080 signal dcm2_locked : ;
00081 signal dcm_locked : ;
00082 signal tx_fifo_data : (31 downto 0);
00083 signal tx_fifo_en : ;
00084 signal tx_fifo_full : ;
00085 signal n_tx_fifo_full : ;
00086 signal tx_fifo_lock_n : ;
00087 signal rx_fifo_rst : := '0';
00088 signal rx_fifo_data : (31 downto 0);
00089 signal rx_fifo_en : := '1';
00090 signal running : := '0';
00091 signal good_packet : ;
00092 signal gmii_tx_clk_i : ;
00093 signal gmii_tx_en_i : ;
00094 signal gmii_tx_er_i : ;
00095 signal gmii_txd_i : (0 to 7);
00096 signal gmii_rxd_i : (0 to 7);
00097 signal gmii_col : := '0';
00098 signal gmii_crs : := '1';
00099
00100 begin
00101
00102 led1 <= running;
00103 led2 <= dcm_locked;
00104
00105 tx_fifo_lock_n <= '1';
00106
00107 gmii_tx_en <= gmii_tx_en_i;
00108 gmii_tx_er <= gmii_tx_er_i;
00109 gmii_txd <= gmii_txd_i(0 to 3);
00110 gmii_rxd_i <= gmii_rxd;
00111
00112 gmii_col <= '0';
00113 gmii_crs <= '1';
00114
00115 clk <= sys_clk;
00116
00117 dcm2_locked <= '1'; -- for later use
00118
00119 dcm_locked <= dcm1_locked and dcm2_locked;
00120 sys_rst <= not rst_n; -- and dcm_locked);
00121
00122 phy_rst_n <= rst_n;
00123
00124
00125 emac0 : temac_controller port map (
00126 TXVLD_N => TXVLD_N,
00127 gmii_col => gmii_col,
00128 gmii_crs => gmii_crs,
00129 gmii_rx_clk => gmii_rx_clk,
00130 gmii_rx_dv => gmii_rx_dv,
00131 gmii_rx_er => gmii_rx_er,
00132 gmii_rxd => gmii_rxd_i,
00133 mii_tx_clk => mii_tx_clk,
00134 gmii_tx_clk => gmii_tx_clk_i,
00135 gmii_tx_en => gmii_tx_en_i,
00136 gmii_tx_er => gmii_tx_er_i,
00137 gmii_txd => gmii_txd_i,
00138 MDC_0 => MDC_0,
00139 mdio => mdio,
00140 phy_mii_int => open, -- interrupt not used now
00141 dcm1_locked => dcm1_locked,
00142 sys_rst => sys_rst,
00143 sys_clk => clk,
00144 -- tx fifo interface
00145 tx_fifo_data => tx_fifo_data,
00146 tx_fifo_wren => tx_fifo_en,
00147 tx_fifo_full => tx_fifo_full,
00148 tx_fifo_lock_n => tx_fifo_lock_n, -- default: keep sending
00149 EMPTY => EMPTY,
00150 -- rx fifo interface
00151 rx_fifo_rst => rx_fifo_rst,
00152 rx_fifo_data => rx_fifo_data,
00153 rx_fifo_rden => rx_fifo_en,
00154 clk_100mhz => clk
00155 );
00156
00157 PAUSE <= tx_fifo_full; --not tx_fifo_en;
00158 n_tx_fifo_full <= not tx_fifo_full;
00159
00160 ---------------------------------------------------------------------------------
00161
00162
00163 pack : process(clk)
00164 variable last_good : := '0';
00165 variable cnt : range 0 to 1000 := 0;
00166 begin
00167 if (rising_edge(clk)) then
00168
00169 if (cnt = 0) then
00170 if (last_good = '0' and rx_fifo_data(22) = '1') then
00171 cnt := 999;
00172 good_packet <= '1';
00173 else
00174 last_good := rx_fifo_data(22);
00175 good_packet <= '0';
00176 end if;
00177
00178 else
00179 last_good := rx_fifo_data(22);
00180 cnt := cnt - 1;
00181 end if;
00182
00183 end if;
00184 end process;
00185
00186
00187 RX : auto_receiver
00188 port map
00189 (
00190 clk => sys_clk,
00191 en => '1',
00192 busy => open,
00193 rx_fifo_rst => rx_fifo_rst,
00194 rx_fifo_data => rx_fifo_data(7 downto 0),
00195 rx_fifo_en => rx_fifo_en,
00196 rx_good_packet => rx_fifo_data(22),
00197 rx_bad_packet => rx_fifo_data(21),
00198 rx_valid => rx_fifo_data(20),
00199 rx_rderr => rx_fifo_data(23),
00200 ncm_sync => open,
00201 ncm_rcv_channel => open,
00202 ncm_rcv_en => DATAVLD,
00203 ncm_rcv_data => DATA_OUT ,
00204 ncm_rcv_reset => open,
00205 ARP_vld => ARP_vld,
00206 SHA => SHA,
00207 SPA => SPA,
00208 PACKET => PACKET,
00209 DATA_TYPE => DATA_TYPE,
00210 lastpacketlen => open,
00211 goodcnt => open,
00212 nobroadcst => open,
00213 badcnt => open
00214 );
00215
00216 tx_fifo_en <= running when rising_edge(clk);
00217
00218 fillit : process(clk, sys_rst)
00219 begin
00220 if (sys_rst = '1') then
00221 running <= '0';
00222 tx_fifo_data <= x"ffffffff";
00223 elsif rising_edge(clk) then
00224 if EN = '1' then
00225 if EOF = '0' and running = '1' then
00226 running <= '0';
00227 tx_fifo_data <= x"000000" & DATA_IN;
00228 elsif running = '1' then
00229 tx_fifo_data <= x"000001" & DATA_IN;
00230 elsif SOF = '0' then
00231 running <= '1';
00232 tx_fifo_data <= x"000001ff";
00233 else
00234 running <= '0';
00235 tx_fifo_data <= x"ffffffff";
00236 end if;
00237 else
00238 running <= '0';
00239 tx_fifo_data <= x"ffffffff";
00240 end if;
00241 end if;
00242 end process;
00243
00244 end ncm_temac_arc;
00245