address filtering
[debian/gnuradio] / usrp2 / fpga / simple_gemac / simple_gemac.v
1
2 module simple_gemac
3   (input clk125, input reset,
4    // GMII
5    output GMII_GTX_CLK, output GMII_TX_EN, output GMII_TX_ER, output [7:0] GMII_TXD,
6    input GMII_RX_CLK, input GMII_RX_DV, input GMII_RX_ER, input [7:0] GMII_RXD,
7
8    // Flow Control Interface
9    input pause_req, input [15:0] pause_time,
10
11    // RX Client Interface
12    output rx_clk, output [7:0] rx_data, output rx_valid, output rx_error, output rx_ack,
13
14    // TX Client Interface
15    output tx_clk, input [7:0] tx_data, input tx_valid, input tx_error, output tx_ack
16    );
17
18    localparam SGE_IFG                = 8'd12;  // 12 should be the absolute minimum
19    localparam SGE_RESPECT_FLOW_CTRL  = 1'b1;  // stop sending if other side requests
20
21    wire rst_rxclk, rst_txclk;   
22    oneshot_2clk tx_rst_1shot (.clk_in(tx_clk),.in(reset),.clk_out(tx_clk),.out(rst_txclk));  // FIXME clocks
23    oneshot_2clk rx_rst_1shot (.clk_in(rx_clk),.in(reset),.clk_out(rx_clk),.out(rst_rxclk));
24
25    wire [15:0] pause_quanta_rcvd;
26
27    wire [47:0] ucast_addr = 48'hF1F2_F3F4_F5F6;
28    wire [47:0] mcast_addr = 0;
29    wire pass_ucast  =1, pass_mcast=0, pass_bcast=1, pass_pause=0, pass_all=0;
30    
31    simple_gemac_tx simple_gemac_tx
32      (.clk125(clk125),.reset(rst_txclk),
33       .GMII_GTX_CLK(GMII_GTX_CLK), .GMII_TX_EN(GMII_TX_EN),
34       .GMII_TX_ER(GMII_TX_ER), .GMII_TXD(GMII_TXD),
35       .tx_clk(tx_clk), .tx_data(tx_data), .tx_valid(tx_valid), .tx_error(tx_error), .tx_ack(tx_ack),
36       .ifg(SGE_IFG), .mac_addr(ucast_addr),
37       .pause_req(pause_req), .pause_time(pause_time),  // We request flow control
38       .pause_apply(pause_apply), .paused(paused)  // We respect flow control
39       );
40
41    simple_gemac_rx simple_gemac_rx
42      (.reset(rst_rxclk),
43       .GMII_RX_CLK(GMII_RX_CLK), .GMII_RX_DV(GMII_RX_DV), 
44       .GMII_RX_ER(GMII_RX_ER), .GMII_RXD(GMII_RXD),
45       .rx_clk(rx_clk), .rx_data(rx_data), .rx_valid(rx_valid), .rx_error(rx_error), .rx_ack(rx_ack),
46       .ucast_addr(ucast_addr), .mcast_addr(mcast_addr),
47       .pass_ucast(pass_ucast), .pass_mcast(pass_mcast), .pass_bcast(pass_bcast), 
48       .pass_pause(pass_pause), .pass_all(pass_all),
49       .pause_quanta_rcvd(pause_quanta_rcvd), .pause_rcvd(pause_rcvd) 
50       );
51
52    flow_ctrl_tx flow_ctrl_tx
53      (.rst(rst_txclk), .tx_clk(tx_clk),
54       .tx_pause_en(SGE_RESPECT_FLOW_CTRL),
55       .pause_quanta(pause_quanta_rcvd), // 16 bit value
56       .pause_quanta_val(pause_rcvd),
57       .pause_apply(pause_apply),
58       .paused(paused)
59       );
60
61 endmodule // simple_gemac