7ded9e08b2c52ac82e9a6ffb9093ab103d8b7d7b
[debian/gnuradio] / usrp2 / fpga / simple_gemac / 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    // From MAC_rx_ctrl\r
12    input        rx_clk,\r
13    input [15:0] rx_fifo_space,\r
14    // MAC_tx_ctrl\r
15    input        tx_clk,\r
16    output reg   xoff_gen,\r
17    output reg   xon_gen,\r
18    input        xoff_gen_complete,\r
19    input        xon_gen_complete\r
20    );\r
21    \r
22    // ******************************************************************************        \r
23    // Force our TX to send a PAUSE frame because our RX is nearly full\r
24    // ******************************************************************************\r
25 \r
26    reg xon_int, xoff_int;\r
27    reg [21:0] countdown;\r
28  \r
29    always @(posedge rx_clk or posedge rst)\r
30      if(rst)\r
31        begin\r
32           xon_int <= 0;\r
33           xoff_int <= 0;\r
34        end\r
35      else \r
36        begin\r
37           xon_int <= 0;\r
38           xoff_int <= 0;\r
39           if(pause_frame_send_en)\r
40             if(countdown == 0)\r
41               if(rx_fifo_space < fc_lwmark)\r
42                 xoff_int <= 1;\r
43               else\r
44                 ;\r
45             else\r
46               if(rx_fifo_space > fc_hwmark)\r
47                 xon_int <= 1;\r
48        end // else: !if(rst)\r
49    \r
50    reg xoff_int_d1, xon_int_d1;\r
51 \r
52    always @(posedge rx_clk)\r
53      xon_int_d1 <= xon_int;\r
54    always @(posedge rx_clk)\r
55      xoff_int_d1 <= xoff_int;\r
56    \r
57    always @ (posedge tx_clk or posedge rst)\r
58      if (rst)\r
59        xoff_gen        <=0;\r
60      else if (xoff_gen_complete)\r
61        xoff_gen        <=0;\r
62      else if (xoff_int | xoff_int_d1)\r
63        xoff_gen        <=1;\r
64    \r
65    always @ (posedge tx_clk or posedge rst)\r
66      if (rst)\r
67        xon_gen     <=0;\r
68      else if (xon_gen_complete)\r
69        xon_gen     <=0;\r
70      else if (xon_int | xon_int_d1)\r
71        xon_gen     <=1;                     \r
72 \r
73    wire [15:0] pq_reduced = pause_quanta_set - 2;\r
74    \r
75    always @(posedge tx_clk or posedge rst)\r
76      if(rst)\r
77        countdown <= 0;\r
78      else if(xoff_gen)\r
79        countdown <= {pq_reduced,6'd0};\r
80      else if(xon_gen)\r
81        countdown <= 0;\r
82      else if(countdown != 0)\r
83        countdown <= countdown - 1;\r
84    \r
85 endmodule // flow_ctrl\r