OpenCores
URL https://opencores.org/ocsvn/turbo8051/turbo8051/trunk

Subversion Repositories turbo8051

[/] [turbo8051/] [trunk/] [rtl/] [gmac/] [mac/] [g_rx_fsm.v] - Diff between revs 12 and 37

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 12 Rev 37
Line 70... Line 70...
                rx2ap_rx_fsm_dt,
                rx2ap_rx_fsm_dt,
                // Fifo Control Signal to Fifo Management Block
                // Fifo Control Signal to Fifo Management Block
                rx2ap_commit_write,
                rx2ap_commit_write,
                rx2ap_rewind_write,
                rx2ap_rewind_write,
                // To address filtering block
                // To address filtering block
                // Pause control to Tx block
 
                rx2tx_pause_tx,
 
                //commit
                //commit
                commit_write_done,
                commit_write_done,
 
 
                // Global Signals 
                // Global Signals 
                reset_n,
                reset_n,
Line 91... Line 89...
                // Rx fifo management signal to indicate overrun
                // Rx fifo management signal to indicate overrun
                rx_fifo_full,
                rx_fifo_full,
                ap2rx_rx_fifo_err,
                ap2rx_rx_fifo_err,
                // Signal from CRC check block
                // Signal from CRC check block
                rc2rx_crc_ok,
                rc2rx_crc_ok,
                // Signals from Address filtering block
 
                af2rx_pause_frame,
 
                // Signals from Config Management Block
                // Signals from Config Management Block
                cf2rx_max_pkt_sz,
                cf2rx_max_pkt_sz,
                cf2rx_rx_ch_en,
                cf2rx_rx_ch_en,
                cf2rx_strp_pad_en,
                cf2rx_strp_pad_en,
                cf2rx_snd_crc,
                cf2rx_snd_crc,
                cf2rx_pause_en,
 
                cf2rx_rcv_runt_pkt_en,
                cf2rx_rcv_runt_pkt_en,
                cf2rx_gigabit_xfr,
                cf2rx_gigabit_xfr,
      //A200 change Port added for crs based flow control
      //A200 change Port added for crs based flow control
      phy_crs,
      phy_crs
      //A200 change crs flow control enable signal
 
      crs_flow_control_enable,
 
      //A200 change pause detected pulse for counter
 
      pause_frame_detected
 
 
 
                );
                );
 
 
 
 
parameter MIN_FRM_SIZE = 6'h2e        ;
parameter MIN_FRM_SIZE = 6'h2e        ;
Line 133... Line 124...
                                               // has to be sent to application
                                               // has to be sent to application
  output        rx2ap_rewind_write;            // This indicates the previous packet 
  output        rx2ap_rewind_write;            // This indicates the previous packet 
                                               // in the FIFO has a error
                                               // in the FIFO has a error
                                               // Ignore the packet and restart from the
                                               // Ignore the packet and restart from the
                                               // end of previous packet
                                               // end of previous packet
  output        rx2tx_pause_tx;                // pause frame detected pause transmit
 
  output    clr_rx_error_from_rx_fsm;
  output    clr_rx_error_from_rx_fsm;
  output    commit_write_done;
  output    commit_write_done;
 
 
  output    pause_frame_detected; //A200 change bringing out a pulse to count number
 
                                  //pause frames received.
 
 
 
  input         reset_n;                               // reset from mac application interface
  input         reset_n;                               // reset from mac application interface
  input         phy_rx_clk;                    // Reference clock used for RX 
  input         phy_rx_clk;                    // Reference clock used for RX 
 
 
  input         mi2rx_strt_rcv;                // Receive data from the PHY
  input         mi2rx_strt_rcv;                // Receive data from the PHY
  input         mi2rx_rcv_vld;                 // Received nibble is valid
  input         mi2rx_rcv_vld;                 // Received nibble is valid
Line 158... Line 145...
                                               // RX FIFO MGMT block
                                               // RX FIFO MGMT block
 
 
  input         rc2rx_crc_ok;                  // CRC of the receiving packet is OK. 
  input         rc2rx_crc_ok;                  // CRC of the receiving packet is OK. 
                                               // Generated by CRC block
                                               // Generated by CRC block
 
 
  input         af2rx_pause_frame;             // Detected a pause frame
 
 
 
  input [15:0]  cf2rx_max_pkt_sz;              // max packet size
  input [15:0]  cf2rx_max_pkt_sz;              // max packet size
 
 
  input         cf2rx_rx_ch_en;                // Receive Enabled
  input         cf2rx_rx_ch_en;                // Receive Enabled
  input         cf2rx_strp_pad_en;             // Do not Append padding after the data
  input         cf2rx_strp_pad_en;             // Do not Append padding after the data
  input         cf2rx_snd_crc;                 // Append CRC to the data 
  input         cf2rx_snd_crc;                 // Append CRC to the data 
                                               // ( This automatically means padding
                                               // ( This automatically means padding
                                               // will be enabled)
                                               // will be enabled)
  input         cf2rx_pause_en;                // This is set when flow control is enabled
 
  input         cf2rx_rcv_runt_pkt_en;         // Receive needs to receive
  input         cf2rx_rcv_runt_pkt_en;         // Receive needs to receive
  input         cf2rx_gigabit_xfr;
  input         cf2rx_gigabit_xfr;
  input         mi2rx_extend;
  input         mi2rx_extend;
 
 
  //A200 change Port added for crs based flow control
  //A200 change Port added for crs based flow control
  input  phy_crs;
  input  phy_crs;
  //A200 change crs flow control enable signal
 
  input  crs_flow_control_enable;
 
 
 
 
 
  /******* WIRE & REG DECLARATION FOR INPUT AND OUTPUTS ********/
  /******* WIRE & REG DECLARATION FOR INPUT AND OUTPUTS ********/
  reg           rx2ap_commit_write;
  reg           rx2ap_commit_write;
  reg           rx2ap_rewind_write;
  reg           rx2ap_rewind_write;
  reg [8:0]      rx2ap_rx_fsm_dt;
  reg [8:0]      rx2ap_rx_fsm_dt;
  reg           rx2ap_rx_fsm_wrt;
  reg           rx2ap_rx_fsm_wrt;
  wire [31:0]    rx_sts_dt;
  wire [31:0]    rx_sts_dt;
  reg [31:0]     rx_sts;
  reg [31:0]     rx_sts;
  wire          rx2tx_pause_tx;
 
  //Renamed to rx2tx_pause_tx_int as rx2tx_pause_tx is genrated in CRS
 
  //condition also
 
  reg           rx2tx_pause_tx_int;
 
 
 
  /*** REG & WIRE DECLARATIONS FOR LOCAL SIGNALS ***************/
  /*** REG & WIRE DECLARATIONS FOR LOCAL SIGNALS ***************/
  reg           commit_write;
  reg           commit_write;
  reg           rewind_write;
  reg           rewind_write;
  wire          pause_dn;
 
  wire          look_at_length_field;
  wire          look_at_length_field;
  reg           send_crc;
  reg           send_crc;
  reg           rcv_pad_data;
  reg           rcv_pad_data;
  reg           first_dword;
  reg           first_dword;
  wire [15:0]    inc_rcv_byte_count;
  wire [15:0]    inc_rcv_byte_count;
Line 217... Line 194...
  reg           error;
  reg           error;
  reg           error_seen;
  reg           error_seen;
  reg           commit_write_done;
  reg           commit_write_done;
  reg           check_padding;
  reg           check_padding;
  reg           check_padding_in;
  reg           check_padding_in;
  reg           gen_pause_det;
 
  reg       pause_opcode_detected;
 
  reg           ld_pause_quanta_1,ld_pause_quanta_2;
 
  reg [2:0]      padding_len_reg;
  reg [2:0]      padding_len_reg;
  reg [15:0]     rcv_length_reg;
  reg [15:0]     rcv_length_reg;
  reg [15:0]     length_counter;
  reg [15:0]     length_counter;
 
 
  reg [18:0]     rx_fsm_cur_st;
  reg [18:0]     rx_fsm_cur_st;
  reg [18:0]     rx_fsm_nxt_st;
  reg [18:0]     rx_fsm_nxt_st;
  reg [15:0]     pause_quanta;
 
  reg [1:0]      c_pause_ptr;
 
  reg [15:0]     pause_count;
 
  reg [8:0]      pause_quanta_count;
 
  reg           crc_stat_reg;
  reg           crc_stat_reg;
  reg           rx_runt_pkt_reg;
  reg           rx_runt_pkt_reg;
  reg           large_pkt_reg;
  reg           large_pkt_reg;
  reg           rx_fifo_overrun_reg;
  reg           rx_fifo_overrun_reg;
  reg           frm_length_err_reg;
  reg           frm_length_err_reg;
Line 245... Line 215...
  reg [2:0]      bytes_to_fifo;
  reg [2:0]      bytes_to_fifo;
  reg [7:0]      buf_latch4,buf_latch3,buf_latch2,buf_latch1,buf_latch0;
  reg [7:0]      buf_latch4,buf_latch3,buf_latch2,buf_latch1,buf_latch0;
  wire          ld_buf,ld_buf1,ld_buf2,ld_buf3,ld_buf4;
  wire          ld_buf,ld_buf1,ld_buf2,ld_buf3,ld_buf4;
  reg           lengthfield_error;
  reg           lengthfield_error;
  reg           lengthfield_err_reg;
  reg           lengthfield_err_reg;
  reg           pause_frame_detected;
 
  reg           pause_seen;
 
  reg           addr_stat_chk;
  reg           addr_stat_chk;
  reg           clr_rx_error_from_rx_fsm;
  reg           clr_rx_error_from_rx_fsm;
 
 
  wire [15:0]    adj_rcv_length_reg;
  wire [15:0]    adj_rcv_length_reg;
  wire [15:0]    adj_rcv_byte_count;
  wire [15:0]    adj_rcv_byte_count;
Line 264... Line 232...
                rx_fsm_lk4len_byte2_st =      19'b0000000000000001000,
                rx_fsm_lk4len_byte2_st =      19'b0000000000000001000,
                rx_fsm_getdt_nib1_st =        19'b0000000000000010000,
                rx_fsm_getdt_nib1_st =        19'b0000000000000010000,
                rx_fsm_getpaddt_nib1_st =     19'b0000000000000100000,
                rx_fsm_getpaddt_nib1_st =     19'b0000000000000100000,
                rx_fsm_updstat_st =           19'b0000000000001000000,
                rx_fsm_updstat_st =           19'b0000000000001000000,
                rx_fsm_chkval_st =            19'b0000000000010000000,
                rx_fsm_chkval_st =            19'b0000000000010000000,
                rx_fsm_pausectrl_st =         19'b0000000000100000000,
                rx_fsm_extend_st =            19'b0000000100000000000;
                rx_fsm_extend_st =            19'b0000000100000000000,
 
                rx_fsm_pausequanta_byte1_st = 19'b0000001000000000000,
 
                rx_fsm_pausequanta_byte2_st = 19'b0000010000000000000,
 
                rx_fsm_wt4_pause_end_st =     19'b0000100000000000000;
 
 
 
  /***************** WIRE ASSIGNMENTS *************************/
  /***************** WIRE ASSIGNMENTS *************************/
  wire [6:0]     dec_pad_length;
  wire [6:0]     dec_pad_length;
  wire [15:0]    inc_length_counter;
  wire [15:0]    inc_length_counter;
  wire          rx_overrun_error;
  wire          rx_overrun_error;
Line 351... Line 315...
 
 
// configured max packet size should be 16'd1518.
// configured max packet size should be 16'd1518.
assign adj_cf2rx_max_pkt_sz = cf2rx_max_pkt_sz;
assign adj_cf2rx_max_pkt_sz = cf2rx_max_pkt_sz;
 
 
 
 
 always @(posedge phy_rx_clk or negedge reset_n) begin
 
    if(!reset_n)
 
       pause_opcode_detected <= 1'b0;
 
    else
 
    begin
 
       if(rx_fsm_cur_st == rx_fsm_pausequanta_byte1_st)
 
          pause_opcode_detected <= 1'b1;
 
       else if(rx_fsm_cur_st == rx_fsm_idle_st)
 
          pause_opcode_detected <= 1'b0;
 
   end
 
 end
 
 
 
  // Following state machine is to receive nibbles from the RMII/MII
  // Following state machine is to receive nibbles from the RMII/MII
  // block and packetize them to 32 bits with information of EOP and 
  // block and packetize them to 32 bits with information of EOP and 
  // valid bytes. It also discards packets which are less than minimum
  // valid bytes. It also discards packets which are less than minimum
  // frame size. It performs Address validity and Data validity.
  // frame size. It performs Address validity and Data validity.
  always @(rx_fsm_cur_st or mi2rx_strt_rcv or rx_ch_en or cf2rx_strp_pad_en
  always @(rx_fsm_cur_st or mi2rx_strt_rcv or rx_ch_en or cf2rx_strp_pad_en
           or cf2rx_snd_crc or cf2rx_pause_en or look_at_length_field
           or cf2rx_snd_crc or look_at_length_field
           or mi2rx_rcv_vld or first_dword or rc2rx_crc_ok
           or mi2rx_rcv_vld or first_dword or rc2rx_crc_ok
           or mi2rx_end_rcv or mi2rx_rx_byte or mi2rx_extend
           or mi2rx_end_rcv or mi2rx_rx_byte or mi2rx_extend
           or inc_length_counter or rcv_length_reg or commit_write_done
           or inc_length_counter or rcv_length_reg or commit_write_done
           or crc_count or shift_counter or bytes_to_fifo
           or crc_count or shift_counter or bytes_to_fifo
           or af2rx_pause_frame or cf2rx_rcv_runt_pkt_en
            or cf2rx_rcv_runt_pkt_en
           or inc_rcv_byte_count or send_runt_packet
           or inc_rcv_byte_count or send_runt_packet
           or pause_frame_detected or rcv_byte_count or first_dword
           or rcv_byte_count or first_dword
           or commit_condition or rx_fifo_full or ap2rx_rx_fifo_err )
           or commit_condition or rx_fifo_full or ap2rx_rx_fifo_err )
     //or pause_opcode_detected)
 
    begin
    begin
      rx_fsm_nxt_st = rx_fsm_cur_st;
      rx_fsm_nxt_st = rx_fsm_cur_st;
      set_tag1_flag = 1'b0;
      set_tag1_flag = 1'b0;
      set_tag2_flag = 1'b0;
      set_tag2_flag = 1'b0;
      reset_tmp_count = 1'b0;
      reset_tmp_count = 1'b0;
Line 398... Line 350...
      set_incomplete_frm = 1'b0;
      set_incomplete_frm = 1'b0;
      set_frm_lngth_error = 1'b0;
      set_frm_lngth_error = 1'b0;
      gen_eop = 1'b0;
      gen_eop = 1'b0;
      error = 1'b0;
      error = 1'b0;
      byte_boundary= 1'b0;
      byte_boundary= 1'b0;
      gen_pause_det = 1'b0;
 
      ld_pause_quanta_1 = 1'b0;
 
      ld_pause_quanta_2 = 1'b0;
 
      send_crc = 1'b0;
      send_crc = 1'b0;
      rcv_pad_data = 1'b0;
      rcv_pad_data = 1'b0;
      inc_shift_counter = 1'b0;
      inc_shift_counter = 1'b0;
      send_data_to_fifo = 1'b0;
      send_data_to_fifo = 1'b0;
      lengthfield_error = 1'b0;
      lengthfield_error = 1'b0;
      pause_seen = 1'b0;
 
      addr_stat_chk = 1'b0;
      addr_stat_chk = 1'b0;
      clr_rx_error_from_rx_fsm = 1'b0;
      clr_rx_error_from_rx_fsm = 1'b0;
      //pause_opcode_detected = 1'b0;
 
 
 
 
 
      casex(rx_fsm_cur_st)       // synopsys parallel_case full_case
      casex(rx_fsm_cur_st)       // synopsys parallel_case full_case
        rx_fsm_idle_st:
        rx_fsm_idle_st:
          // Waiting for packet from mii block
          // Waiting for packet from mii block
          // Continues accepting data only if
          // Continues accepting data only if
          // receive has been enabled
          // receive has been enabled
          begin
          begin
       //pause_opcode_detected = 1'b0;
 
            if(ap2rx_rx_fifo_err)
            if(ap2rx_rx_fifo_err)
                begin
                begin
                   clr_rx_error_from_rx_fsm = 1'b1;
                   clr_rx_error_from_rx_fsm = 1'b1;
                   rx_fsm_nxt_st = rx_fsm_idle_st;
                   rx_fsm_nxt_st = rx_fsm_idle_st;
                end
                end
Line 458... Line 404...
                  end
                  end
              end // if (mi2rx_end_rcv)
              end // if (mi2rx_end_rcv)
 
 
            else if(mi2rx_rcv_vld && inc_rcv_byte_count[14:0] == 15'd6)
            else if(mi2rx_rcv_vld && inc_rcv_byte_count[14:0] == 15'd6)
              begin
              begin
                if(cf2rx_pause_en && af2rx_pause_frame)
 
                  begin
 
                    pause_seen = 1;
 
                    rx_fsm_nxt_st = rx_fsm_lk4srcad_nib1_st;
 
                    rewind_write = 1'b1;
 
                  end
 
                else
 
                  rx_fsm_nxt_st = rx_fsm_lk4srcad_nib1_st;
                  rx_fsm_nxt_st = rx_fsm_lk4srcad_nib1_st;
              end
              end
            else
            else
              begin
              begin
                rx_fsm_nxt_st = rx_fsm_chkdestad_nib1_st;
                rx_fsm_nxt_st = rx_fsm_chkdestad_nib1_st;
Line 499... Line 438...
                    rewind_write = 1'b1;
                    rewind_write = 1'b1;
                  end
                  end
              end
              end
            else if(mi2rx_rcv_vld && inc_rcv_byte_count[14:0] == 15'd12)
            else if(mi2rx_rcv_vld && inc_rcv_byte_count[14:0] == 15'd12)
              begin
              begin
                if(pause_frame_detected)
 
                  rx_fsm_nxt_st = rx_fsm_pausectrl_st;
 
                else
 
                  rx_fsm_nxt_st = rx_fsm_lk4len_byte1_st;
                  rx_fsm_nxt_st = rx_fsm_lk4len_byte1_st;
              end
              end
            else
            else
              begin
              begin
                rx_fsm_nxt_st = rx_fsm_lk4srcad_nib1_st;
                rx_fsm_nxt_st = rx_fsm_lk4srcad_nib1_st;
Line 786... Line 722...
          begin
          begin
            e_rx_sts_vld = 1'b1;
            e_rx_sts_vld = 1'b1;
            rx_fsm_nxt_st = rx_fsm_idle_st;
            rx_fsm_nxt_st = rx_fsm_idle_st;
          end
          end
 
 
        rx_fsm_pausectrl_st:
 
          // collecting odd nibbles of pause control
 
          // in case of termination of packet
 
          // or carrier sense error then generate eop
 
          // and generate status
 
          begin
 
            if(mi2rx_end_rcv)
 
              begin
 
                set_incomplete_frm = 1'b1;
 
                error = 1'b1;
 
                gen_eop = 1'b1;
 
                rx_fsm_nxt_st = rx_fsm_chkval_st;
 
                if(cf2rx_rcv_runt_pkt_en)
 
                  commit_write = 1'b1;
 
                else
 
                  rewind_write = 1'b1;
 
              end
 
            else if(mi2rx_rcv_vld)
 
              case(inc_rcv_byte_count[1:0])
 
                2'b01 : if(mi2rx_rx_byte != 8'h88)
 
                  rx_fsm_nxt_st = rx_fsm_wt4_pause_end_st;
 
                2'b10 : if(mi2rx_rx_byte != 8'h08)
 
                  rx_fsm_nxt_st = rx_fsm_wt4_pause_end_st;
 
                2'b11 : if(mi2rx_rx_byte != 8'h00)
 
                  rx_fsm_nxt_st = rx_fsm_wt4_pause_end_st;
 
                2'b00 : begin
 
                  if(mi2rx_rx_byte != 8'h01)
 
                    rx_fsm_nxt_st = rx_fsm_wt4_pause_end_st;
 
                  else
 
                    rx_fsm_nxt_st = rx_fsm_pausequanta_byte1_st;
 
                end
 
              endcase
 
            else
 
              rx_fsm_nxt_st = rx_fsm_pausectrl_st;
 
          end // case: rx_fsm_pausectrl_nib1_st
 
 
 
        rx_fsm_pausequanta_byte1_st:
 
          // This state collects the odd nibbles of the receive data
 
          begin
 
       //pause_opcode_detected = 1'b1;
 
            if(ap2rx_rx_fifo_err)
 
              begin
 
                rewind_write = 1'b1;
 
                rx_fsm_nxt_st = rx_fsm_idle_st;
 
              end
 
            else if(mi2rx_end_rcv)
 
              begin
 
                set_incomplete_frm = 1'b1;
 
                error = 1'b1;
 
                gen_eop = 1'b1;
 
                rx_fsm_nxt_st = rx_fsm_chkval_st;
 
                if(cf2rx_rcv_runt_pkt_en)
 
                  commit_write = 1'b1;
 
                else
 
                  rewind_write = 1'b1;
 
              end
 
            else if(mi2rx_rcv_vld)
 
              begin
 
                ld_pause_quanta_1 = 1'b1;
 
                rx_fsm_nxt_st = rx_fsm_pausequanta_byte2_st;
 
              end
 
            else
 
              rx_fsm_nxt_st = rx_fsm_pausequanta_byte1_st;
 
          end // case: rx_fsm_pausequanta_nib1_st
 
 
 
        rx_fsm_pausequanta_byte2_st:
 
          // This state collects the even nibbles of the receive data.
 
          begin
 
       //pause_opcode_detected = 1'b1;
 
            if(ap2rx_rx_fifo_err)
 
              begin
 
                rewind_write = 1'b1;
 
                rx_fsm_nxt_st = rx_fsm_idle_st;
 
              end
 
            else if(mi2rx_end_rcv)
 
              begin
 
                set_incomplete_frm = 1'b1;
 
                error = 1'b1;
 
                gen_eop = 1'b1;
 
                rx_fsm_nxt_st = rx_fsm_chkval_st;
 
              end
 
            else if(mi2rx_rcv_vld )
 
              begin
 
                ld_pause_quanta_2 = 1'b1;
 
                rx_fsm_nxt_st = rx_fsm_wt4_pause_end_st;
 
              end
 
            else
 
              rx_fsm_nxt_st = rx_fsm_pausequanta_byte2_st;
 
          end // case: rx_fsm_pausequanta_nib2_st
 
 
 
        rx_fsm_wt4_pause_end_st:
 
          begin
 
       //pause_opcode_detected = 1'b1;
 
            if(ap2rx_rx_fifo_err)
 
              begin
 
                rewind_write = 1'b1;
 
                rx_fsm_nxt_st = rx_fsm_idle_st;
 
              end
 
            else if(mi2rx_end_rcv)
 
              begin
 
                if(rcv_byte_count[14:0] < 15'd64) // mfilardo
 
                  begin
 
                    lengthfield_error = 1;
 
                    rx_fsm_nxt_st = rx_fsm_idle_st;
 
                  end
 
                else if(rc2rx_crc_ok)
 
                  begin
 
                    gen_pause_det = 1;
 
                    rx_fsm_nxt_st = rx_fsm_idle_st;
 
                  end
 
                else
 
                  rx_fsm_nxt_st = rx_fsm_idle_st;
 
              end
 
            else
 
              rx_fsm_nxt_st = rx_fsm_wt4_pause_end_st;
 
          end // case: rx_fsm_wt4_pause_end_st
 
        default:
        default:
          begin
          begin
            rx_fsm_nxt_st = rx_fsm_idle_st;
            rx_fsm_nxt_st = rx_fsm_idle_st;
          end
          end
      endcase // casex(rx_fsm_cur_st)
      endcase // casex(rx_fsm_cur_st)
Line 961... Line 781...
  assign look_at_length_field = cf2rx_strp_pad_en &&
  assign look_at_length_field = cf2rx_strp_pad_en &&
                                (rcv_length_reg < MIN_FRM_SIZE) && (|rcv_length_reg);
                                (rcv_length_reg < MIN_FRM_SIZE) && (|rcv_length_reg);
  assign send_runt_packet = cf2rx_rcv_runt_pkt_en &&
  assign send_runt_packet = cf2rx_rcv_runt_pkt_en &&
         (rcv_byte_count[15:8] == 8'd0 && rcv_byte_count[7:0] < 8'd64);
         (rcv_byte_count[15:8] == 8'd0 && rcv_byte_count[7:0] < 8'd64);
 
 
  //
 
  // Detect pause  control frame
 
  always @(posedge phy_rx_clk
 
           or negedge reset_n)
 
    begin
 
      if(!reset_n)
 
        pause_frame_detected <= 1'b0;
 
      else if(mi2rx_end_rcv)
 
        pause_frame_detected <= 1'b0;
 
      else if(af2rx_pause_frame && cf2rx_pause_en && pause_seen)
 
        pause_frame_detected <= 1'b1;
 
    end // always @ (posedge phy_rx_clk...
 
 
 
  // counter used for decrementing pause to transmit
 
  always @(posedge phy_rx_clk
 
           or negedge reset_n)
 
    begin
 
      if(!reset_n)
 
        pause_count <= 16'b0;
 
      else
 
        begin
 
     if(~cf2rx_pause_en)
 
        pause_count <= 'h0;
 
          else if(gen_pause_det & pause_opcode_detected)
 
            pause_count <= pause_quanta;
 
          //else if(pause_quanta_count == 9'd511)
 
          else if( ( cf2rx_gigabit_xfr && (pause_quanta_count[5:0] == 6'd63 )) ||
 
                   (~cf2rx_gigabit_xfr && (pause_quanta_count[6:0] == 7'd127)) )  // mfilardo pause bit time fix.  A pause quanta should be 512 bit times.
 
            pause_count <= pause_count - 1;
 
        end // else: !if(!reset_n)
 
    end // always @ (posedge phy_rx_clk...
 
 
 
  // counter used for decrementing pause quanta count
 
  // which is 512 bit times
 
  always @(posedge phy_rx_clk
 
           or negedge reset_n)
 
    begin
 
      if(!reset_n)
 
        pause_quanta_count <= 9'b0;
 
      else
 
        begin
 
          if(pause_dn)
 
            pause_quanta_count <= 9'b0;
 
          else if(rx2tx_pause_tx_int)
 
            pause_quanta_count <= pause_quanta_count + 1;
 
        end // else: !if(!reset_n)
 
    end
 
 
 
  assign pause_dn = ~|pause_count & rx2tx_pause_tx_int;
 
  //A200 change :
 
  //When phy_crs input is asserted rx2tx_pause_tx which stops the 
 
  //frame transmission. Same function has been done on receiving pause 
 
  //frame so phy_crs is ored with pause receive signal when config is
 
  //zero.
 
  assign rx2tx_pause_tx = rx2tx_pause_tx_int |
 
                          (phy_crs & ~crs_flow_control_enable);
 
 
 
  // Generation pause to tx_fsm 
 
  always @(posedge phy_rx_clk
 
           or negedge reset_n)
 
    begin
 
      if(!reset_n)
 
        rx2tx_pause_tx_int <= 1'b0;
 
      else
 
        begin
 
          if(pause_dn)
 
            rx2tx_pause_tx_int <= 1'b0;
 
          else if(gen_pause_det)
 
            rx2tx_pause_tx_int <= 1'b1;
 
        end // else: !if(!reset_n)
 
    end // always @ (posedge phy_rx_clk...
 
 
 
  assign inc_rcv_byte_count = rcv_byte_count + 16'h1;
  assign inc_rcv_byte_count = rcv_byte_count + 16'h1;
 
 
  always @(posedge phy_rx_clk
  always @(posedge phy_rx_clk
           or negedge reset_n)
           or negedge reset_n)
Line 1352... Line 1103...
                end // else: !if(mi2rx_strt_rcv)
                end // else: !if(mi2rx_strt_rcv)
            end // if (rx_ch_en)
            end // if (rx_ch_en)
        end // else: !if(!reset_n)
        end // else: !if(!reset_n)
    end // always @ (posedge phy_rx_clk...
    end // always @ (posedge phy_rx_clk...
 
 
  // This is used load the pause quanta value on received
 
  // pause control frame
 
  always @(posedge phy_rx_clk or negedge reset_n)
 
    begin
 
      if(!reset_n)
 
        begin
 
          pause_quanta <= 16'b0;
 
          c_pause_ptr <= 2'b0;
 
        end // if (reset_n)
 
      else if (rx_ch_en)
 
        begin
 
          if(mi2rx_strt_rcv)
 
            begin
 
              pause_quanta <= 16'b0;
 
              c_pause_ptr <= 2'b0;
 
            end
 
          else
 
            begin
 
              if(ld_pause_quanta_1)
 
                begin
 
                  pause_quanta[15:8] <= mi2rx_rx_byte;
 
                end
 
              else if(ld_pause_quanta_2)
 
                begin
 
                  pause_quanta[7:0] <= mi2rx_rx_byte;
 
                end
 
            end // else: !if(mi2rx_strt_rcv)
 
        end // else: !if(!reset_n)
 
    end
 
 
 
endmodule
endmodule
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.