Copied wb_1master back from quad radio
[debian/gnuradio] / usrp2 / fpga / eth / rtl / verilog / flow_ctrl_rx.v
1 \r
2 // RX side of flow control -- when we are running out of RX space, send a PAUSE\r
3 \r
4 module flow_ctrl_rx\r
5   (input        rst,\r
6    //host processor\r
7    input        pause_frame_send_en,\r
8    input [15:0] pause_quanta_set,\r
9    input [15:0] fc_hwmark,\r
10    input [15:0] fc_lwmark,\r
11    input [15:0] fc_padtime,\r
12    // From MAC_rx_ctrl\r
13    input        rx_clk,\r
14    input [15:0] rx_fifo_space,\r
15    // MAC_tx_ctrl\r
16    input        tx_clk,\r
17    output reg   xoff_gen,\r
18    output reg   xon_gen,\r
19    input        xoff_gen_complete,\r
20    input        xon_gen_complete\r
21    );\r
22    \r
23    // ******************************************************************************        \r
24    // Force our TX to send a PAUSE frame because our RX is nearly full\r
25    // ******************************************************************************\r
26 \r
27    reg xon_int, xoff_int;\r
28    reg [21:0] countdown;\r
29  \r
30    always @(posedge rx_clk or posedge rst)\r
31      if(rst)\r
32        begin\r
33           xon_int <= 0;\r
34           xoff_int <= 0;\r
35        end\r
36      else \r
37        begin\r
38           xon_int <= 0;\r
39           xoff_int <= 0;\r
40           if(pause_frame_send_en)\r
41             if(countdown == 0)\r
42               if(rx_fifo_space < fc_lwmark)\r
43                 xoff_int <= 1;\r
44               else\r
45                 ;\r
46             else\r
47               if(rx_fifo_space > fc_hwmark)\r
48                 xon_int <= 1;\r
49        end // else: !if(rst)\r
50    \r
51    reg xoff_int_d1, xon_int_d1;\r
52 \r
53    always @(posedge rx_clk)\r
54      xon_int_d1 <= xon_int;\r
55    always @(posedge rx_clk)\r
56      xoff_int_d1 <= xoff_int;\r
57    \r
58    always @ (posedge tx_clk or posedge rst)\r
59      if (rst)\r
60        xoff_gen        <=0;\r
61      else if (xoff_gen_complete)\r
62        xoff_gen        <=0;\r
63      else if (xoff_int | xoff_int_d1)\r
64        xoff_gen        <=1;\r
65    \r
66    always @ (posedge tx_clk or posedge rst)\r
67      if (rst)\r
68        xon_gen     <=0;\r
69      else if (xon_gen_complete)\r
70        xon_gen     <=0;\r
71      else if (xon_int | xon_int_d1)\r
72        xon_gen     <=1;                     \r
73 \r
74    wire [21:0] pq_reduced = {pause_quanta_set,6'd0} - {6'd0,fc_padtime};\r
75    \r
76    always @(posedge tx_clk or posedge rst)\r
77      if(rst)\r
78        countdown <= 0;\r
79      else if(xoff_gen)\r
80        countdown <= pq_reduced;\r
81      else if(xon_gen)\r
82        countdown <= 0;\r
83      else if(countdown != 0)\r
84        countdown <= countdown - 1;\r
85    \r
86 endmodule // flow_ctrl\r