commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r7093 - in usrp2/trunk/fpga/eth/rtl/verilog: . MAC_rx


From: matt
Subject: [Commit-gnuradio] r7093 - in usrp2/trunk/fpga/eth/rtl/verilog: . MAC_rx MAC_tx
Date: Sun, 9 Dec 2007 22:46:31 -0700 (MST)

Author: matt
Date: 2007-12-09 22:46:30 -0700 (Sun, 09 Dec 2007)
New Revision: 7093

Added:
   usrp2/trunk/fpga/eth/rtl/verilog/flow_ctrl_rx.v
   usrp2/trunk/fpga/eth/rtl/verilog/flow_ctrl_tx.v
Removed:
   usrp2/trunk/fpga/eth/rtl/verilog/MAC_tx/flow_ctrl.v
Modified:
   usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx.v
   usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx/MAC_rx_FF.v
   usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx/MAC_rx_ctrl.v
   usrp2/trunk/fpga/eth/rtl/verilog/MAC_top.v
   usrp2/trunk/fpga/eth/rtl/verilog/MAC_tx.v
   usrp2/trunk/fpga/eth/rtl/verilog/MAC_tx/MAC_tx_ctrl.v
   usrp2/trunk/fpga/eth/rtl/verilog/Reg_int.v
Log:
massive changes to fix flow control.  flow_ctrl_rx.v is not complete yet


Modified: usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx/MAC_rx_FF.v
===================================================================
--- usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx/MAC_rx_FF.v 2007-12-10 04:38:23 UTC 
(rev 7092)
+++ usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx/MAC_rx_FF.v 2007-12-10 05:46:30 UTC 
(rev 7093)
@@ -61,63 +61,36 @@
 
 `include "header.vh"
 
-module MAC_rx_FF (
-  Reset,
-  Clk_MAC,
-  Clk_SYS,
-
-  // MAC_rx_ctrl interface
-  Fifo_data,
-  Fifo_data_en,
-  Fifo_full,
-  Fifo_data_err,
-  Fifo_data_drop,
-  Fifo_data_end,
-
-  // CPU
-  Rx_Hwmark,
-  Rx_Lwmark,
-  RX_APPEND_CRC,
-
-  // User interface
-  Rx_mac_ra,
-  Rx_mac_rd,
-  Rx_mac_data,
-  Rx_mac_BE,
-  Rx_mac_sop,
-  Rx_mac_pa,
-  Rx_mac_err,
-  Rx_mac_eop
-);
-
-  input         Reset;
-  input         Clk_MAC;
-  input         Clk_SYS;
-
-  // MAC_rx_ctrl interface 
-  input   [7:0] Fifo_data;
-  input         Fifo_data_en;
-  output        Fifo_full;
-  input         Fifo_data_err;
-  input         Fifo_data_drop;
-  input         Fifo_data_end;
-
-  // CPU
-  input         RX_APPEND_CRC;
-  input [4:0]   Rx_Hwmark;
-  input [4:0]   Rx_Lwmark;
-
-  // User interface 
-  output        Rx_mac_ra;
-  input         Rx_mac_rd;
-  output [31:0] Rx_mac_data;
-  output [1:0]  Rx_mac_BE;
-  output        Rx_mac_pa;
-  output        Rx_mac_sop;
-  output        Rx_mac_err;
-  output        Rx_mac_eop;
-
-   parameter   RX_FF_DEPTH = 9;
+module MAC_rx_FF 
+  #(parameter RX_FF_DEPTH = 9)
+    (input         Reset,
+     input         Clk_MAC,
+     input         Clk_SYS,
+     
+     // MAC_rx_ctrl interface 
+     input   [7:0] Fifo_data,
+     input         Fifo_data_en,
+     output        Fifo_full,
+     input         Fifo_data_err,
+     input         Fifo_data_drop,
+     input         Fifo_data_end,
+     output [15:0] Fifo_space,
+     
+     // CPU
+     input         RX_APPEND_CRC,
+     input [4:0]   Rx_Hwmark,
+     input [4:0]   Rx_Lwmark,
+     
+     // User interface 
+     output        Rx_mac_ra,
+     input         Rx_mac_rd,
+     output [31:0] Rx_mac_data,
+     output [1:0]  Rx_mac_BE,
+     output        Rx_mac_pa,
+     output        Rx_mac_sop,
+     output        Rx_mac_err,
+     output        Rx_mac_eop );
+   
   //-------------------------------------------------------------------------
   // Internal signals                                                          
    
   //-------------------------------------------------------------------------
@@ -368,7 +341,9 @@
 
   assign Fifo_full = Almost_full;
 
-  //
+   wire [RX_FF_DEPTH-1:0] Fifo_space_int =  (Add_rd_ungray - Add_wr);
+   assign                Fifo_space = 
{{(16-RX_FF_DEPTH){1'b0}},Fifo_space_int};
+       
   always @( posedge Clk_MAC or posedge Reset )
     if ( Reset )
       begin

Modified: usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx/MAC_rx_ctrl.v
===================================================================
--- usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx/MAC_rx_ctrl.v       2007-12-10 
04:38:23 UTC (rev 7092)
+++ usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx/MAC_rx_ctrl.v       2007-12-10 
05:46:30 UTC (rev 7093)
@@ -632,7 +632,9 @@
         pause_quanta        <=0;
     else if(Pause_current==Pause_quanta_lo)
         pause_quanta        <={pause_quanta_h,RxD_dl1};
-        
+
+   // The following 2 always blocks are a strange way of holding
+   // pause_quanta_val high for 2 cycles
 always @ (posedge Clk or posedge Reset)
     if (Reset)      
         pause_quanta_val_tmp    <=0;

Modified: usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx.v
===================================================================
--- usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx.v   2007-12-10 04:38:23 UTC (rev 
7092)
+++ usrp2/trunk/fpga/eth/rtl/verilog/MAC_rx.v   2007-12-10 05:46:30 UTC (rev 
7093)
@@ -64,8 +64,9 @@
 input   [7:0]   MRxD    ,       
 input           MRxErr  ,       
                 //flow_control signals  
-output  [15:0]  pause_quanta        ,   
-output          pause_quanta_val    ,   
+output  [15:0]  pause_quanta,   
+output          pause_quanta_val,   
+output  [15:0]  rx_fifo_space,
                 //user interface 
 output          Rx_mac_ra   ,
 input           Rx_mac_rd   ,
@@ -111,9 +112,6 @@
                 //broadcast_filter
 wire            broadcast_ptr           ;
 wire            broadcast_drop          ;
-                //flow_control signals  
-//wire    [15:0]  pause_quanta        ;   
-//wire            pause_quanta_val    ;
                 //MAC_rx_ctrl interface 
 wire    [7:0]   Fifo_data       ;
 wire            Fifo_data_en    ;
@@ -179,6 +177,7 @@
 .Fifo_data_err               (Fifo_data_err             ),
 .Fifo_data_drop              (Fifo_data_drop            ),
 .Fifo_data_end               (Fifo_data_end             ),
+.Fifo_space                  (rx_fifo_space             ),                     
                             
  //CPU                       (//CPU                     ),
 .Rx_Hwmark                   (Rx_Hwmark                 ),
 .Rx_Lwmark                   (Rx_Lwmark                 ),

Modified: usrp2/trunk/fpga/eth/rtl/verilog/MAC_top.v
===================================================================
--- usrp2/trunk/fpga/eth/rtl/verilog/MAC_top.v  2007-12-10 04:38:23 UTC (rev 
7092)
+++ usrp2/trunk/fpga/eth/rtl/verilog/MAC_top.v  2007-12-10 05:46:30 UTC (rev 
7093)
@@ -128,10 +128,14 @@
   wire [7:0]  MRxD;
   wire        MRxErr;
 
-  // Flow-control signals
-  wire [15:0] pause_quanta;
-  wire        pause_quanta_val;
-
+   // Flow-control signals
+   wire [15:0] pause_quanta;
+   wire        pause_quanta_val;
+   wire [15:0] rx_fifo_space;
+   wire        pause_apply, pause_quanta_sub;
+   wire        xon_gen, xoff_gen, xon_gen_complete, xoff_gen_complete;
+   wire [15:0] fc_hwmark, fc_lwmark;
+   
   //PHY interface
   wire [7:0]  MTxD;
   wire        MTxEn;
@@ -156,8 +160,6 @@
   wire [2:0]  MAC_tx_add_prom_add;
   wire        MAC_tx_add_prom_wr;
   wire        tx_pause_en;
-  wire        xoff_cpu;
-  wire        xon_cpu;
 
   // Rx host interface
   wire        MAC_rx_add_chk_en;
@@ -219,7 +221,8 @@
     // Flow-control signals
     .pause_quanta             ( pause_quanta              ),
     .pause_quanta_val         ( pause_quanta_val          ),
-
+    .rx_fifo_space            ( rx_fifo_space             ),
+             
     // User interface
     .Rx_mac_ra                ( Rx_mac_ra                 ),
     .Rx_mac_rd                ( Rx_mac_rd                 ),
@@ -281,8 +284,6 @@
     // Host interface
     .Tx_Hwmark           ( Tx_Hwmark            ),
     .Tx_Lwmark           ( Tx_Lwmark            ),
-    .pause_frame_send_en ( pause_frame_send_en  ),
-    .pause_quanta_set    ( pause_quanta_set     ),
     .MAC_tx_add_en       ( MAC_tx_add_en        ),
     .FullDuplex          ( FullDuplex           ),
     .MaxRetry            ( MaxRetry             ),
@@ -290,15 +291,48 @@
     .MAC_add_prom_data   ( MAC_tx_add_prom_data ),
     .MAC_add_prom_add    ( MAC_tx_add_prom_add  ),
     .MAC_add_prom_wr     ( MAC_tx_add_prom_wr   ),
-    .tx_pause_en         ( tx_pause_en          ),
-    .xoff_cpu            ( xoff_cpu             ),
-    .xon_cpu             ( xon_cpu              ),
 
-    // MAC_rx_flow
-    .pause_quanta        ( pause_quanta         ),
-    .pause_quanta_val    ( pause_quanta_val     )
+    .pause_apply         ( pause_apply          ),
+    .pause_quanta_sub    ( pause_quanta_sub     ),
+    .pause_quanta_set    ( pause_quanta_set     ),
+    .xoff_gen            ( xoff_gen             ),
+    .xon_gen             ( xon_gen              ),
+    .xoff_gen_complete   ( xoff_gen_complete    ),
+    .xon_gen_complete    ( xon_gen_complete     )
     );
 
+   // Flow control outbound -- when other side sends PAUSE, we wait
+   flow_ctrl_tx flow_ctrl_tx
+     (.rst(Reset), 
+      .tx_clk(MAC_tx_clk_div), 
+      // Setting
+      .tx_pause_en              ( tx_pause_en               ),
+      // From RX side
+      .pause_quanta (pause_quanta), 
+      .pause_quanta_val(pause_quanta_val), // Other guy sent a PAUSE
+      // To TX side
+      .pause_apply (pause_apply),          // To TX, stop sending new frames
+      .pause_quanta_sub (pause_quanta_sub) // From TX, indicates we have used 
up 1 quanta
+      );
+   
+   flow_ctrl_rx flow_ctrl_rx  //  When we are running out of RX space, send a 
PAUSE
+     (.rst(Reset), 
+      // Settings
+      .pause_frame_send_en      ( pause_frame_send_en       ),
+      .pause_quanta_set         ( pause_quanta_set          ),
+      .fc_hwmark (fc_hwmark),
+      .fc_lwmark (fc_lwmark),
+      // From RX side
+      .rx_clk(MAC_rx_clk_div),
+      .rx_fifo_space (rx_fifo_space),    // Decide if we need to send a PAUSE
+      // To TX side
+      .tx_clk(MAC_tx_clk_div), 
+      .xoff_gen (xoff_gen), 
+      .xon_gen(xon_gen),  // Tell our TX to send PAUSE frames
+      .xoff_gen_complete (xoff_gen_complete), 
+      .xon_gen_complete(xon_gen_complete)
+      );
+   
   RMON U_RMON(
     .Clk                 ( CLK_I                ),
     .Reset               ( Reset                ),
@@ -408,8 +442,6 @@
     // Tx host interface
     .Tx_Hwmark                ( Tx_Hwmark                 ),
     .Tx_Lwmark                ( Tx_Lwmark                 ),
-    .pause_frame_send_en      ( pause_frame_send_en       ),
-    .pause_quanta_set         ( pause_quanta_set          ),
     .MAC_tx_add_en            ( MAC_tx_add_en             ),
     .FullDuplex               ( FullDuplex                ),
     .MaxRetry                 ( MaxRetry                  ),
@@ -417,9 +449,6 @@
     .MAC_tx_add_prom_data     ( MAC_tx_add_prom_data      ),
     .MAC_tx_add_prom_add      ( MAC_tx_add_prom_add       ),
     .MAC_tx_add_prom_wr       ( MAC_tx_add_prom_wr        ),
-    .tx_pause_en              ( tx_pause_en               ),
-    .xoff_cpu                 ( xoff_cpu                  ),
-    .xon_cpu                  ( xon_cpu                   ),
 
     // Rx host interface
     .MAC_rx_add_chk_en        ( MAC_rx_add_chk_en         ),
@@ -437,6 +466,13 @@
     .RX_MAX_LENGTH            ( RX_MAX_LENGTH             ),
     .RX_MIN_LENGTH            ( RX_MIN_LENGTH             ),
 
+    // Flow Control settings
+    .pause_frame_send_en      ( pause_frame_send_en       ),
+    .pause_quanta_set         ( pause_quanta_set          ),
+    .tx_pause_en              ( tx_pause_en               ),
+    .fc_hwmark                ( fc_hwmark                 ),
+    .fc_lwmark                ( fc_lwmark                 ),
+                   
     // RMON host interface
     .CPU_rd_addr              ( CPU_rd_addr               ),
     .CPU_rd_apply             ( CPU_rd_apply              ),

Modified: usrp2/trunk/fpga/eth/rtl/verilog/MAC_tx/MAC_tx_ctrl.v
===================================================================
--- usrp2/trunk/fpga/eth/rtl/verilog/MAC_tx/MAC_tx_ctrl.v       2007-12-10 
04:38:23 UTC (rev 7092)
+++ usrp2/trunk/fpga/eth/rtl/verilog/MAC_tx/MAC_tx_ctrl.v       2007-12-10 
05:46:30 UTC (rev 7093)
@@ -101,7 +101,6 @@
 Tx_apply_rmon       ,
 Tx_pkt_err_type_rmon,
 //CPU  
-pause_frame_send_en ,
 pause_quanta_set    ,              
 MAC_tx_add_en       ,  
 FullDuplex          ,
@@ -153,7 +152,6 @@
 output          Tx_apply_rmon       ;
 output  [2:0]   Tx_pkt_err_type_rmon;   
                 //CPU
-input           pause_frame_send_en ;               
 input   [15:0]  pause_quanta_set    ;
 input           MAC_tx_add_en       ;               
 input           FullDuplex          ;
@@ -210,7 +208,6 @@
 reg             PktDrpEvenPtr       ;
 reg [7:0]       pause_counter       ;
 reg             pause_quanta_sub    ;
-reg             pause_frame_send_en_dl1 ;               
 reg [15:0]      pause_quanta_set_dl1    ;
 reg             xoff_gen_complete   ;
 reg             xon_gen_complete    ;
@@ -220,12 +217,10 @@
 always @(posedge Clk or posedge Reset)
     if (Reset)
         begin  
-        pause_frame_send_en_dl1         <=0;
         pause_quanta_set_dl1            <=0;
         end
     else
         begin  
-        pause_frame_send_en_dl1         <=pause_frame_send_en   ;
         pause_quanta_set_dl1            <=pause_quanta_set      ;
         end     
 
//******************************************************************************
    
@@ -235,14 +230,6 @@
 
 always @(posedge Clk or posedge Reset)
     if (Reset)
-        pause_counter   <=0;
-    else if (Current_state!=StatePause)
-        pause_counter   <=0;
-    else 
-        pause_counter   <=pause_counter+1;
-        
-always @(posedge Clk or posedge Reset)
-    if (Reset)
         IPLengthCounter     <=0;
     else if (Current_state==StateDefer)
         IPLengthCounter     <=0;    
@@ -282,7 +269,7 @@
                     Next_state=StateDefer;
                 else if (pause_apply)
                     Next_state=StatePause;          
-                else if 
((FullDuplex&&Fifo_ra)||(!FullDuplex&&!CRS&&Fifo_ra)||(pause_frame_send_en_dl1&&(xoff_gen||xon_gen)))
+                else if (((FullDuplex||~CRS)&&Fifo_ra)||(xoff_gen||xon_gen))
                     Next_state=StatePreamble;
                 else
                     Next_state=Current_state;   
@@ -301,7 +288,7 @@
             StateSFD:
                 if (!FullDuplex&&Collision)
                     Next_state=StateJam;
-                else if (pause_frame_send_en_dl1&&(xoff_gen||xon_gen))
+                else if (xoff_gen||xon_gen)
                     Next_state=StateSendPauseFrame;
                 else 
                     Next_state=StateData;
@@ -438,7 +425,7 @@
 //data have one cycle delay after fifo read signals  
 always @ (*)
     if (Current_state==StateData ||
-        
Current_state==StateSFD&&!(pause_frame_send_en_dl1&&(xoff_gen||xon_gen))  ||
+        Current_state==StateSFD&&!(xoff_gen||xon_gen)  ||
         Current_state==StateJamDrop&&PktDrpEvenPtr||
         Current_state==StateFFEmptyDrop&&PktDrpEvenPtr )
         Fifo_rd     =1;
@@ -604,11 +591,12 @@
     else
         MAC_tx_addr_rd  <=0;
 
-always @ (Tx_pkt_length_rmon or Fifo_rd)
-    if ((Tx_pkt_length_rmon==3)&&Fifo_rd)
-        MAC_tx_addr_init=1;
-    else
-        MAC_tx_addr_init=0;
+   always @*
+     //if ((Tx_pkt_length_rmon==3)&&Fifo_rd)
+     if (Current_state==StatePreamble)
+       MAC_tx_addr_init=1;
+     else
+       MAC_tx_addr_init=0;
 
 
//**************************************************************************************************************
 // CFH: this implementation delays the time it sends an entire Ethernet frame 
with 512 bits for every pause
@@ -618,6 +606,14 @@
 
//**************************************************************************************************************
 
 //flow control
+always @(posedge Clk or posedge Reset)
+    if (Reset)
+        pause_counter   <=0;
+    else if (Current_state!=StatePause)
+        pause_counter   <=0;
+    else 
+        pause_counter   <=pause_counter+1;
+        
 always @ (posedge Clk or posedge Reset)
     if (Reset)
         pause_quanta_sub    <=0;
@@ -626,11 +622,12 @@
     else
         pause_quanta_sub    <=0;
 
- 
+// FIXME  The below probably won't work if the pause request comes when we are 
in the wrong state
+   wire clear_xonxoff = (Current_state==StateSendPauseFrame) & 
(IPLengthCounter==17);
 always @ (posedge Clk or posedge Reset)
     if (Reset) 
         xoff_gen_complete   <=0;
-    else if(Current_state==StateDefer&&xoff_gen)
+    else if(clear_xonxoff & xoff_gen)
         xoff_gen_complete   <=1;
     else
         xoff_gen_complete   <=0;
@@ -639,7 +636,7 @@
 always @ (posedge Clk or posedge Reset)
     if (Reset) 
         xon_gen_complete    <=0;
-    else if(Current_state==StateDefer&&xon_gen)
+    else if(clear_xonxoff & xon_gen)
         xon_gen_complete    <=1;
     else
         xon_gen_complete    <=0;

Deleted: usrp2/trunk/fpga/eth/rtl/verilog/MAC_tx/flow_ctrl.v

Modified: usrp2/trunk/fpga/eth/rtl/verilog/MAC_tx.v
===================================================================
--- usrp2/trunk/fpga/eth/rtl/verilog/MAC_tx.v   2007-12-10 04:38:23 UTC (rev 
7092)
+++ usrp2/trunk/fpga/eth/rtl/verilog/MAC_tx.v   2007-12-10 05:46:30 UTC (rev 
7093)
@@ -78,8 +78,6 @@
                 //host interface 
 input   [4:0]   Tx_Hwmark           ,
 input   [4:0]   Tx_Lwmark           ,   
-input           pause_frame_send_en ,               
-input   [15:0]  pause_quanta_set    ,
 input           MAC_tx_add_en       ,               
 input           FullDuplex          ,
 input   [3:0]   MaxRetry            ,
@@ -87,17 +85,20 @@
 input   [7:0]   MAC_add_prom_data   ,
 input   [2:0]   MAC_add_prom_add    ,
 input           MAC_add_prom_wr     ,
-input           tx_pause_en         ,
-input           xoff_cpu            ,
-input           xon_cpu             ,
-                //MAC_rx_flow       ,
-input   [15:0]  pause_quanta        ,   
-input           pause_quanta_val       
+                // Flow control stuff
+input           pause_apply         ,
+output          pause_quanta_sub,
+input   [15:0]  pause_quanta_set    ,
+input           xoff_gen,
+input           xon_gen,
+output          xoff_gen_complete,
+output          xon_gen_complete
 );
-//******************************************************************************
        
-//internal signals                                                             
 
-//******************************************************************************
   
-                //CRC_gen Interface 
+
+   // 
******************************************************************************  
      
+   // internal signals                                                         
     
+   // 
******************************************************************************  
 
+   //CRC_gen Interface 
 wire            CRC_init            ;
 wire[7:0]       Frame_data          ;
 wire            Data_en             ;
@@ -109,12 +110,6 @@
 wire[3:0]       RetryCnt            ;
 wire            Random_time_meet    ;//levle hight indicate random time passed 
away
                 //flow control
-wire            pause_apply         ;
-wire            pause_quanta_sub    ;
-wire            xoff_gen            ;
-wire            xoff_gen_complete   ;
-wire            xon_gen             ;
-wire            xon_gen_complete    ;               
                 //MAC_rx_FF
 wire[7:0]       Fifo_data           ;
 wire            Fifo_rd             ;
@@ -178,7 +173,6 @@
 .Tx_apply_rmon            (Tx_apply_rmon          ),            
 .Tx_pkt_err_type_rmon     (Tx_pkt_err_type_rmon   ),           
  //CPU                    (//CPU                  ),           
-.pause_frame_send_en      (pause_frame_send_en    ),            
 .pause_quanta_set         (pause_quanta_set       ),                
 .MAC_tx_add_en            (MAC_tx_add_en          ),            
 .FullDuplex               (FullDuplex             ),            
@@ -197,32 +191,13 @@
 .CRC_end                  (CRC_end                )
 );
 
-flow_ctrl U_flow_ctrl(
-.Reset                    (Reset                  ),
-.Clk                      (Clk                    ),
- //host processor         (//host processor       ),
-.tx_pause_en              (tx_pause_en            ),
-.xoff_cpu                 (xoff_cpu               ),
-.xon_cpu                  (xon_cpu                ),
- //MAC_rx_flow            (//MAC_rx_flow          ),
-.pause_quanta             (pause_quanta           ),
-.pause_quanta_val         (pause_quanta_val       ),
- //MAC_tx_ctrl            (//MAC_tx_ctrl          ),
-.pause_apply              (pause_apply            ),
-.pause_quanta_sub         (pause_quanta_sub       ),
-.xoff_gen                 (xoff_gen               ),
-.xoff_gen_complete        (xoff_gen_complete      ),
-.xon_gen                  (xon_gen                ),
-.xon_gen_complete         (xon_gen_complete       )
-);
-
    MAC_tx_addr_add U_MAC_tx_addr_add
      (.Reset                    (Reset                  ),
       .Clk                      (Clk                    ),
       .MAC_tx_addr_rd           (MAC_tx_addr_rd         ),
       .MAC_tx_addr_init         (MAC_tx_addr_init       ),
       .MAC_tx_addr_data         (MAC_tx_addr_data       ),
-      //CPU                    (//CPU                  ),
+      //CPU
       .MAC_add_prom_data        (MAC_add_prom_data      ),
       .MAC_add_prom_add         (MAC_add_prom_add       ),
       .MAC_add_prom_wr          (MAC_add_prom_wr        )

Modified: usrp2/trunk/fpga/eth/rtl/verilog/Reg_int.v
===================================================================
--- usrp2/trunk/fpga/eth/rtl/verilog/Reg_int.v  2007-12-10 04:38:23 UTC (rev 
7092)
+++ usrp2/trunk/fpga/eth/rtl/verilog/Reg_int.v  2007-12-10 05:46:30 UTC (rev 
7093)
@@ -13,8 +13,6 @@
   // Tx host interface 
   output [4:0]      Tx_Hwmark,
   output [4:0]      Tx_Lwmark,   
-  output            pause_frame_send_en,
-  output [15:0]     pause_quanta_set,
   output            MAC_tx_add_en,
   output            FullDuplex,
   output [3:0]      MaxRetry,
@@ -22,9 +20,6 @@
   output [7:0]      MAC_tx_add_prom_data,
   output [2:0]      MAC_tx_add_prom_add,
   output            MAC_tx_add_prom_wr,
-  output            tx_pause_en,
-  output            xoff_cpu,
-  output            xon_cpu,
 
   // Rx host interface     
   output            MAC_rx_add_chk_en,
@@ -42,6 +37,13 @@
   output [15:0]     RX_MAX_LENGTH, // Default 1518
   output [6:0]      RX_MIN_LENGTH, // Default 64
 
+  // Flow control settings
+  output            pause_frame_send_en,
+  output [15:0]     pause_quanta_set,
+  output            tx_pause_en,
+  output [15:0]     fc_hwmark,
+  output [15:0]     fc_lwmark,
+               
   // RMON host interface
   output [5:0]      CPU_rd_addr,
   output            CPU_rd_apply,
@@ -70,42 +72,6 @@
   input             UpdateMIIRX_DATAReg // Updates MII RX_DATA register with 
read data
 );
 
-  wire [4:0]  Tx_Hwmark_int;
-  wire [4:0]  Tx_Lwmark_int;
-  wire [0:0]  pause_frame_send_en_int;
-  wire [15:0] pause_quanta_set_int;
-  wire [5:0]  IFGset_int;
-  wire [0:0]  FullDuplex_int;
-  wire [3:0]  MaxRetry_int;
-  wire [0:0]  MAC_tx_add_en_int;
-  wire [7:0]  MAC_tx_add_prom_data_int;
-  wire [2:0]  MAC_tx_add_prom_add_int;
-  wire [0:0]  MAC_tx_add_prom_wr_int;
-  wire [0:0]  tx_pause_en_int;
-  wire [0:0]  xoff_cpu_int;
-  wire [0:0]  xon_cpu_int;
-  wire [0:0]  MAC_rx_add_chk_en_int;
-  wire [7:0]  MAC_rx_add_prom_data_int;
-  wire [2:0]  MAC_rx_add_prom_add_int;
-  wire [0:0]  MAC_rx_add_prom_wr_int;
-  wire [0:0]  broadcast_filter_en_int;
-  wire [15:0] broadcast_bucket_depth_int;
-  wire [15:0] broadcast_bucket_interval_int;
-  wire [0:0]  RX_APPEND_CRC_int;
-  wire [4:0]  Rx_Hwmark_int;
-  wire [4:0]  Rx_Lwmark_int;
-  wire [0:0]  CRC_chk_en_int;
-  wire [5:0]  RX_IFG_SET_int;
-  wire [15:0] RX_MAX_LENGTH_int;
-  wire [6:0]  RX_MIN_LENGTH_int;
-  wire [5:0]  CPU_rd_addr_int;
-  wire [0:0]  CPU_rd_apply_int;
-//wire [0:0]  CPU_rd_grant_int;
-//wire [15:0] CPU_rd_dout_l_int;
-//wire [15:0] CPU_rd_dout_h_int;
-  wire [0:0]  Line_loop_en_int;
-  wire [2:0]  Speed_int;
-
   // New registers for controlling the MII interface
   wire [8:0]  MIIMODER;
   reg  [2:0]  MIICOMMAND;
@@ -114,42 +80,6 @@
   reg  [15:0] MIIRX_DATA;
   wire [2:0]  MIISTATUS;
 
-  assign Tx_Hwmark                 = Tx_Hwmark_int;
-  assign Tx_Lwmark                 = Tx_Lwmark_int;
-  assign pause_frame_send_en       = pause_frame_send_en_int;
-  assign pause_quanta_set          = pause_quanta_set_int;
-  assign IFGset                    = IFGset_int;  
-  assign FullDuplex                = FullDuplex_int;
-  assign MaxRetry                  = MaxRetry_int;
-  assign MAC_tx_add_en             = MAC_tx_add_en_int;
-  assign MAC_tx_add_prom_data      = MAC_tx_add_prom_data_int;
-  assign MAC_tx_add_prom_add       = MAC_tx_add_prom_add_int;
-  assign MAC_tx_add_prom_wr        = MAC_tx_add_prom_wr_int;
-  assign tx_pause_en               = tx_pause_en_int;
-  assign xoff_cpu                  = xoff_cpu_int;
-  assign xon_cpu                   = xon_cpu_int;
-  assign MAC_rx_add_chk_en         = MAC_rx_add_chk_en_int;
-  assign MAC_rx_add_prom_data      = MAC_rx_add_prom_data_int;
-  assign MAC_rx_add_prom_add       = MAC_rx_add_prom_add_int;
-  assign MAC_rx_add_prom_wr        = MAC_rx_add_prom_wr_int;
-  assign broadcast_filter_en       = broadcast_filter_en_int;
-  assign broadcast_bucket_depth    = broadcast_bucket_depth_int;
-  assign broadcast_bucket_interval = broadcast_bucket_interval_int;
-  assign RX_APPEND_CRC             = RX_APPEND_CRC_int;
-  assign Rx_Hwmark                 = Rx_Hwmark_int;
-  assign Rx_Lwmark                 = Rx_Lwmark_int;
-  assign CRC_chk_en                = CRC_chk_en_int;
-  assign RX_IFG_SET                = RX_IFG_SET_int;
-  assign RX_MAX_LENGTH             = RX_MAX_LENGTH_int;  
-  assign RX_MIN_LENGTH             = RX_MIN_LENGTH_int;
-  assign CPU_rd_addr               = CPU_rd_addr_int;
-  assign CPU_rd_apply              = CPU_rd_apply_int;
-//assign CPU_rd_grant              = CPU_rd_grant_int;
-//assign CPU_rd_dout_l             = CPU_rd_dout_l_int;
-//assign CPU_rd_dout_h             = CPU_rd_dout_h_int;
-  assign Line_loop_en              = Line_loop_en_int;
-  assign Speed                     = Speed_int;
-
   // New registers for controlling the MII interface
 
   // MIIMODER
@@ -169,41 +99,41 @@
 
   wire Wr;
   
-  RegCPUData #( 5  ) U_0_000( Tx_Hwmark_int                , 7'd000, 5'h09,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[4:0]  );
-  RegCPUData #( 5  ) U_0_001( Tx_Lwmark_int                , 7'd001, 5'h08,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[4:0]  );
-  RegCPUData #( 1  ) U_0_002( pause_frame_send_en_int      , 7'd002, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 16 ) U_0_003( pause_quanta_set_int         , 7'd003, 16'h0000, 
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
-  RegCPUData #( 6  ) U_0_004( IFGset_int                   , 7'd004, 6'h0c,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[5:0]  );
-  RegCPUData #( 1  ) U_0_005( FullDuplex_int               , 7'd005, 1'h1,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 4  ) U_0_006( MaxRetry_int                 , 7'd006, 4'h2,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[3:0]  );
-  RegCPUData #( 1  ) U_0_007( MAC_tx_add_en_int            , 7'd007, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 8  ) U_0_008( MAC_tx_add_prom_data_int     , 7'd008, 8'h00,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[7:0]  );
-  RegCPUData #( 3  ) U_0_009( MAC_tx_add_prom_add_int      , 7'd009, 3'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[2:0]  );
-  RegCPUData #( 1  ) U_0_010( MAC_tx_add_prom_wr_int       , 7'd010, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 1  ) U_0_011( tx_pause_en_int              , 7'd011, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 1  ) U_0_012( xoff_cpu_int                 , 7'd012, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 1  ) U_0_013( xon_cpu_int                  , 7'd013, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 1  ) U_0_014( MAC_rx_add_chk_en_int        , 7'd014, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 8  ) U_0_015( MAC_rx_add_prom_data_int     , 7'd015, 8'h00,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[7:0]  );
-  RegCPUData #( 3  ) U_0_016( MAC_rx_add_prom_add_int      , 7'd016, 3'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[2:0]  );
-  RegCPUData #( 1  ) U_0_017( MAC_rx_add_prom_wr_int       , 7'd017, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 1  ) U_0_018( broadcast_filter_en_int      , 7'd018, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 16 ) U_0_019( broadcast_bucket_depth_int   , 7'd019, 16'h0000, 
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
-  RegCPUData #( 16 ) U_0_020( broadcast_bucket_interval_int, 7'd020, 16'h0000, 
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
-  RegCPUData #( 1  ) U_0_021( RX_APPEND_CRC_int            , 7'd021, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 5  ) U_0_022( Rx_Hwmark_int                , 7'd022, 5'h1a,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[4:0]  );
-  RegCPUData #( 5  ) U_0_023( Rx_Lwmark_int                , 7'd023, 5'h10,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[4:0]  );
-  RegCPUData #( 1  ) U_0_024( CRC_chk_en_int               , 7'd024, 1'h1,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 6  ) U_0_025( RX_IFG_SET_int               , 7'd025, 6'h0c,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[5:0]  );
-  RegCPUData #( 16 ) U_0_026( RX_MAX_LENGTH_int            , 7'd026, 16'h2710, 
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
-  RegCPUData #( 7  ) U_0_027( RX_MIN_LENGTH_int            , 7'd027, 7'h40,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[6:0]  );
-  RegCPUData #( 6  ) U_0_028( CPU_rd_addr_int              , 7'd028, 6'h00,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[5:0]  );
-  RegCPUData #( 1  ) U_0_029( CPU_rd_apply_int             , 7'd029, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-//RegCPUData #( 1  ) U_0_030( CPU_rd_grant_int             , 7'd030, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-//RegCPUData #( 16 ) U_0_031( CPU_rd_dout_l_int            , 7'd031, 16'h0000, 
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
-//RegCPUData #( 16 ) U_0_032( CPU_rd_dout_h_int            , 7'd032, 16'h0000, 
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
-  RegCPUData #( 1  ) U_0_033( Line_loop_en_int             , 7'd033, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
-  RegCPUData #( 3  ) U_0_034( Speed_int                    , 7'd034, 3'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[2:0]  );
+  RegCPUData #( 5  ) U_0_000( Tx_Hwmark                    , 7'd000, 5'h09,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[4:0]  );
+  RegCPUData #( 5  ) U_0_001( Tx_Lwmark                    , 7'd001, 5'h08,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[4:0]  );
+  RegCPUData #( 1  ) U_0_002( pause_frame_send_en          , 7'd002, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+  RegCPUData #( 16 ) U_0_003( pause_quanta_set             , 7'd003, 16'h01af, 
   RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
+  RegCPUData #( 6  ) U_0_004( IFGset                       , 7'd004, 6'h0c,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[5:0]  );
+  RegCPUData #( 1  ) U_0_005( FullDuplex                   , 7'd005, 1'h1,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+  RegCPUData #( 4  ) U_0_006( MaxRetry                     , 7'd006, 4'h2,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[3:0]  );
+  RegCPUData #( 1  ) U_0_007( MAC_tx_add_en                , 7'd007, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+  RegCPUData #( 8  ) U_0_008( MAC_tx_add_prom_data         , 7'd008, 8'h00,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[7:0]  );
+  RegCPUData #( 3  ) U_0_009( MAC_tx_add_prom_add          , 7'd009, 3'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[2:0]  );
+  RegCPUData #( 1  ) U_0_010( MAC_tx_add_prom_wr           , 7'd010, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+  RegCPUData #( 1  ) U_0_011( tx_pause_en                  , 7'd011, 1'h1,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+  RegCPUData #( 16 ) U_0_012( fc_hwmark                    , 7'd012, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
+  RegCPUData #( 16 ) U_0_013( fc_lwmark                    , 7'd013, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
+  RegCPUData #( 1  ) U_0_014( MAC_rx_add_chk_en            , 7'd014, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+  RegCPUData #( 8  ) U_0_015( MAC_rx_add_prom_data         , 7'd015, 8'h00,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[7:0]  );
+  RegCPUData #( 3  ) U_0_016( MAC_rx_add_prom_add          , 7'd016, 3'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[2:0]  );
+  RegCPUData #( 1  ) U_0_017( MAC_rx_add_prom_wr           , 7'd017, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+  RegCPUData #( 1  ) U_0_018( broadcast_filter_en          , 7'd018, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+  RegCPUData #( 16 ) U_0_019( broadcast_bucket_depth       , 7'd019, 16'h0000, 
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
+  RegCPUData #( 16 ) U_0_020( broadcast_bucket_interval    , 7'd020, 16'h0000, 
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
+  RegCPUData #( 1  ) U_0_021( RX_APPEND_CRC                , 7'd021, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+  RegCPUData #( 5  ) U_0_022( Rx_Hwmark                    , 7'd022, 5'h1a,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[4:0]  );
+  RegCPUData #( 5  ) U_0_023( Rx_Lwmark                    , 7'd023, 5'h10,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[4:0]  );
+  RegCPUData #( 1  ) U_0_024( CRC_chk_en                   , 7'd024, 1'h1,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+  RegCPUData #( 6  ) U_0_025( RX_IFG_SET                   , 7'd025, 6'h0c,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[5:0]  );
+  RegCPUData #( 16 ) U_0_026( RX_MAX_LENGTH                , 7'd026, 16'h2710, 
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
+  RegCPUData #( 7  ) U_0_027( RX_MIN_LENGTH                , 7'd027, 7'h40,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[6:0]  );
+  RegCPUData #( 6  ) U_0_028( CPU_rd_addr                  , 7'd028, 6'h00,    
RST_I, CLK_I, Wr, ADR_I, DAT_I[5:0]  );
+  RegCPUData #( 1  ) U_0_029( CPU_rd_apply                 , 7'd029, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+//RegCPUData #( 1  ) U_0_030( CPU_rd_grant                 , 7'd030, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+//RegCPUData #( 16 ) U_0_031( CPU_rd_dout_l                , 7'd031, 16'h0000, 
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
+//RegCPUData #( 16 ) U_0_032( CPU_rd_dout_h                , 7'd032, 16'h0000, 
RST_I, CLK_I, Wr, ADR_I, DAT_I[15:0] );
+  RegCPUData #( 1  ) U_0_033( Line_loop_en                 , 7'd033, 1'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[0:0]  );
+  RegCPUData #( 3  ) U_0_034( Speed                        , 7'd034, 3'h0,     
RST_I, CLK_I, Wr, ADR_I, DAT_I[2:0]  );
 
   // New registers for controlling the MDIO interface
   RegCPUData #( 9  ) U_0_035( MIIMODER                     , 7'd035, 9'h064,   
RST_I, CLK_I, Wr, ADR_I, DAT_I[8:0]  );
@@ -270,8 +200,8 @@
             7'd09: DAT_O <= MAC_tx_add_prom_add;
             7'd10: DAT_O <= MAC_tx_add_prom_wr;
             7'd11: DAT_O <= tx_pause_en;
-            7'd12: DAT_O <= xoff_cpu;
-            7'd13: DAT_O <= xon_cpu;
+           7'd12: DAT_O <= fc_hwmark;
+           7'd13: DAT_O <= fc_lwmark;
             7'd14: DAT_O <= MAC_rx_add_chk_en;
             7'd15: DAT_O <= MAC_rx_add_prom_data;
             7'd16: DAT_O <= MAC_rx_add_prom_add;

Added: usrp2/trunk/fpga/eth/rtl/verilog/flow_ctrl_rx.v
===================================================================
--- usrp2/trunk/fpga/eth/rtl/verilog/flow_ctrl_rx.v                             
(rev 0)
+++ usrp2/trunk/fpga/eth/rtl/verilog/flow_ctrl_rx.v     2007-12-10 05:46:30 UTC 
(rev 7093)
@@ -0,0 +1,94 @@
+
+// RX side of flow control -- when we are running out of RX space, send a PAUSE
+
+module flow_ctrl_rx
+  (input        rst,
+   //host processor
+   input        pause_frame_send_en,
+   input [15:0] pause_quanta_set,
+   input [15:0] fc_hwmark,
+   input [15:0] fc_lwmark,
+   // From MAC_rx_ctrl
+   input        rx_clk,
+   input [15:0] rx_fifo_space,
+   // MAC_tx_ctrl
+   input        tx_clk,
+   output       xoff_gen,
+   output       xon_gen,
+   input        xoff_gen_complete,
+   input        xon_gen_complete
+   );
+   
+   // 
******************************************************************************
+   // internal signals                                                         
     
+   // 
******************************************************************************  
+   reg [15:0]  pause_quanta_dl1        ;
+   reg                 pause_quanta_val_dl1    ;
+   reg                 pause_quanta_val_dl2    ;       
+   reg                 pause_apply             ;
+   reg                 xoff_gen                ;
+   reg                 xon_gen                 ;
+   reg [15:0]  pause_quanta_counter    ;
+   reg                 tx_pause_en_dl1         ;
+   reg                 tx_pause_en_dl2         ;
+
+   // 
******************************************************************************  
      
+   // Force our TX to send a PAUSE frame because our RX is nearly full
+   // 
******************************************************************************
+
+   reg xon_int, xoff_int;
+   reg [15:0] countdown;
+ 
+   always @(posedge rx_clk)
+     if(rst)
+       begin
+         xon_int <= 0;
+         xoff_int <= 0;
+         countdown <= 0;
+       end
+     else 
+       begin
+         xon_int <= 0;
+         xoff_int <= 0;
+         if(countdown == 0)
+           if(rx_fifo_space < fc_lwmark)
+             begin
+                xon_int <= 1;
+                countdown <= 250;
+             end
+           else
+             ;
+         else
+           if(rx_fifo_space > fc_hwmark)
+             begin
+                xoff_int <= 1;
+                countdown <= 0;
+             end
+           else
+             countdown <= countdown - 1;
+       end // else: !if(rst)
+
+   reg xoff_int_d1, xon_int_d1;
+
+   always @(posedge rx_clk)
+     xon_int_d1 <= xon_int;
+   always @(posedge rx_clk)
+     xoff_int_d1 <= xoff_int;
+   
+   always @ (posedge tx_clk or posedge rst)
+     if (rst)
+       xoff_gen        <=0;
+     else if (xoff_gen_complete)
+       xoff_gen        <=0;
+     else if (xoff_int | xoff_int_d1)
+       xoff_gen        <=1;
+   
+   always @ (posedge tx_clk or posedge rst)
+     if (rst)
+       xon_gen     <=0;
+     else if (xon_gen_complete)
+       xon_gen     <=0;
+     else if (xon_int | xon_int_d1)
+       xon_gen     <=1;                     
+
+endmodule // flow_ctrl

Added: usrp2/trunk/fpga/eth/rtl/verilog/flow_ctrl_tx.v
===================================================================
--- usrp2/trunk/fpga/eth/rtl/verilog/flow_ctrl_tx.v                             
(rev 0)
+++ usrp2/trunk/fpga/eth/rtl/verilog/flow_ctrl_tx.v     2007-12-10 05:46:30 UTC 
(rev 7093)
@@ -0,0 +1,33 @@
+
+// TX side of flow control -- when other side sends PAUSE, we wait
+
+module flow_ctrl_tx
+  (input        rst,
+   input        tx_clk,
+   //host processor
+   input        tx_pause_en,
+   // From MAC_rx_ctrl
+   input [15:0] pause_quanta,
+   input        pause_quanta_val,
+   // MAC_tx_ctrl
+   output       pause_apply,
+   input        pause_quanta_sub);
+     
+   // 
******************************************************************************  
      
+   // Inhibit our TX from transmitting because they sent us a PAUSE frame
+   // 
******************************************************************************
+
+   reg [15:0]  pause_quanta_counter;
+   reg                 pqval_d1, pqval_d2;             
+   
+   always @ (posedge tx_clk)
+     if (rst)
+       pause_quanta_counter <= 0;
+     else if (pqval_d1 & ~pqval_d2)
+       pause_quanta_counter <= pause_quanta; 
+     else if((pause_quanta_counter!=0) & pause_quanta_sub)
+       pause_quanta_counter <= pause_quanta_counter - 1;
+
+   assign      pause_apply = tx_pause_en & (pause_quanta_counter != 0);
+   
+endmodule // flow_ctrl





reply via email to

[Prev in Thread] Current Thread [Next in Thread]