6f6c5ed380d5731dd812bc548bfbd2e414e4b56f
[debian/gnuradio] / usrp2 / fpga / eth / mac_rxfifo_int.v
1
2 module mac_rxfifo_int
3   (input clk, input rst,
4
5    input Rx_mac_empty,
6    output Rx_mac_rd,
7    input [31:0] Rx_mac_data,
8    input [1:0] Rx_mac_BE,
9    input Rx_mac_sop,
10    input Rx_mac_eop,
11    input Rx_mac_err,
12
13    output [31:0] wr_dat_o,
14    output wr_write_o,
15    output wr_done_o,
16    output wr_error_o,
17    input wr_ready_i,
18    input wr_full_i,
19
20    // FIFO Status
21    output [15:0] fifo_occupied,
22    output fifo_full,
23    output fifo_empty
24    );
25   
26    // Write side of short FIFO
27    //   Inputs: full, Rx_mac_empty, Rx_mac_sop, Rx_mac_eop, Rx_mac_err, Rx_mac_data/BE
28    //   Controls: write, datain, Rx_mac_rd
29
30    wire  write, full, read, empty, sop_o, eop_o, error_o;
31
32    // Write side of short FIFO
33    assign write = ~full & ~Rx_mac_empty;
34    assign Rx_mac_rd = write;
35
36 `define LONGFIFO 0
37  
38 `ifdef LONGFIFO
39    cascadefifo2 #(.WIDTH(35),.SIZE(10)) mac_rx_longfifo
40      (.clk(clk),.rst(rst),.clear(0),
41       .datain({Rx_mac_sop,Rx_mac_eop,Rx_mac_err,Rx_mac_data}),.write(write),.full(full),
42       .dataout({sop_o,eop_o,error_o,wr_dat_o}),.read(read),.empty(empty),
43       .space(), .occupied(fifo_occupied) );   
44 `else 
45    shortfifo #(.WIDTH(35)) mac_rx_sfifo
46      (.clk(clk),.rst(rst),.clear(0),
47       .datain({Rx_mac_sop,Rx_mac_eop,Rx_mac_err,Rx_mac_data}),.write(write),.full(full),
48       .dataout({sop_o,eop_o,error_o,wr_dat_o}),.read(read),.empty(empty),
49       .space(), .occupied(fifo_occupied[4:0]) );
50    assign fifo_occupied[15:5] = 0;
51 `endif
52    
53    assign fifo_full = full;
54    assign fifo_empty = empty;
55    
56    // Read side of short FIFO
57    //    Inputs:    empty, dataout, wr_ready_i, wr_full_i
58    //    Controls:  read, wr_dat_o, wr_write_o, wr_done_o, wr_error_o
59
60    reg [1:0] rd_state;
61    localparam RD_IDLE = 0;
62    localparam RD_HAVEPKT = 1;
63    localparam RD_XFER = 2;
64    localparam RD_ERROR = 3;
65    
66    always @(posedge clk)
67      if(rst)
68        rd_state <= RD_IDLE;
69      else
70        case(rd_state)
71          RD_IDLE :
72            if(sop_o & ~empty)
73              rd_state <= RD_HAVEPKT;
74          RD_HAVEPKT :
75            if(wr_ready_i)
76              rd_state <= RD_XFER;
77          RD_XFER :
78            if(eop_o & ~empty)
79              rd_state <= RD_IDLE;
80            else if(wr_full_i)
81              rd_state <= RD_HAVEPKT;
82          RD_ERROR :
83            rd_state <= RD_IDLE;
84        endcase // case(rd_state)
85
86    assign     read = ~empty & ((rd_state == RD_XFER) | ((rd_state==RD_IDLE)&~sop_o));
87    assign     wr_write_o = ~empty & (rd_state == RD_XFER);
88    assign     wr_done_o = ~empty & (rd_state == RD_XFER)  & eop_o;
89    assign     wr_error_o = ~empty & (rd_state == RD_XFER) & error_o;
90
91 endmodule // mac_rxfifo_int