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

Subversion Repositories srdydrdy_lib

[/] [srdydrdy_lib/] [trunk/] [rtl/] [verilog/] [utility/] [sd_bpdrop.v] - Rev 28

Compare with Previous | Blame | View Log

//----------------------------------------------------------------------
// Srdy/drdy backpressure drop (control path only)
//
// Monitors the srdy/drdy signals and looks for backpressure on the
// consumer interface which exceeds a certain time (in clocks).  If
// the time threshold is exceeded, sinks the packet until the end
// of a token frame.
//
// Naming convention: c = consumer, p = producer, 
// n = non-timing closed (combintorial) output
//----------------------------------------------------------------------
//  Author: Guy Hutchison
//
// This block is uncopyrighted and released into the public domain.
//----------------------------------------------------------------------
 
// Clocking statement for synchronous blocks.  Default is for
// posedge clocking and positive async reset
`ifndef SDLIB_CLOCKING 
 `define SDLIB_CLOCKING posedge clk or posedge reset
`endif
 
// delay unit for nonblocking assigns, default is to #1
`ifndef SDLIB_DELAY 
 `define SDLIB_DELAY #1 
`endif
 
module sd_bpdrop
  #(parameter cnt_sz = 3)
  (
   input               clk,
   input               reset,
 
   input               g_enable,
   input [cnt_sz-1:0]  g_max_count,
   output reg          g_drop,     // token frame was sunk
 
   input               c_srdy,
   input               c_fr_start, // start of frame signal
   input               c_fr_end,   // end of frame signal
   output reg          nc_drdy,
 
   output reg          np_srdy,
   input               p_drdy
   );
 
  localparam s_idle = 2'b00, s_xfer = 2'b01, s_sink = 2'b11;
 
  reg [1:0]            state, nxt_state;
  reg [cnt_sz-1:0]     count, nxt_count;
 
  always @*
    begin
      nc_drdy = 0;
      np_srdy = 0;
      nxt_state = state;
      nxt_count = count;
      g_drop = 0;
 
      case (state)
        s_idle :
          begin
            if (!g_enable)
              begin
                nc_drdy = p_drdy;
                np_srdy = c_srdy;
              end
            else if (c_srdy & c_fr_start)
              begin
                np_srdy = 1;
                if (p_drdy)
                  begin
                    nc_drdy = 1;
                    nxt_state = s_xfer;
                  end
                else
                  begin
                    nxt_count = count + 1;
                    if (count >= g_max_count)
                      begin
                        nc_drdy = 1;
                        nxt_state = s_sink;
                        g_drop = 1;
                      end
                  end
              end
            else
              begin
                nxt_count = 0;
 
                // if data other than c_fr_start shows up sink it
                if (c_srdy)
                  nc_drdy = 1;
              end
          end // case: s_idle
 
        s_xfer :
          begin
            nxt_count = 0;
            np_srdy = c_srdy;
            nc_drdy = p_drdy;
            if (c_srdy & p_drdy & c_fr_end)
              nxt_state = s_idle;
         end // case: s_xfer
 
        s_sink :
          begin
            nc_drdy = 1;
            nxt_count = 0;
 
            if (c_srdy & c_fr_end)
              nxt_state = s_idle;
          end
 
        default : nxt_state = s_idle;
      endcase // case (state)
    end // always @ *
 
  always @(`SDLIB_CLOCKING)
    begin
      if (reset)
        begin
          state <= `SDLIB_DELAY s_idle;
          count <= `SDLIB_DELAY 0;
        end
      else
        begin
          state <= `SDLIB_DELAY nxt_state;
          count <= `SDLIB_DELAY nxt_count;
        end
    end // always @ (`SDLIB_CLOCKING)
 
 
endmodule // sd_rrmux
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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