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

Subversion Repositories srdydrdy_lib

[/] [srdydrdy_lib/] [trunk/] [examples/] [bridge/] [rtl/] [distributor.v] - Rev 18

Go to most recent revision | Compare with Previous | Blame | View Log

module distributor
  (input         clk,
   input         reset,
 
   input         ptx_srdy,
   output        ptx_drdy,
   input [`PFW_SZ-1:0] ptx_data,
 
   output        p_srdy,
   input         p_drdy,
   output [1:0]  p_code,
   output [7:0]  p_data
   );
 
  reg [7:0]	ic_data;
  reg [1:0]     ic_code;
  wire          ic_drdy;
  reg           ic_srdy;
  wire [`PFW_SZ-1:0] ip_data;
  reg                ip_drdy;
  wire               ip_srdy;
  reg [7:0]          remain, nxt_remain;
 
  sd_input #(`PFW_SZ) sdin
    (
     // Outputs
     .c_drdy				(ptx_drdy),
     .ip_srdy				(ip_srdy),
     .ip_data				(ip_data),
     // Inputs
     .clk				(clk),
     .reset				(reset),
     .c_srdy				(ptx_srdy),
     .c_data				(ptx_data),
     .ip_drdy				(ip_drdy));
 
  always @*
    begin
      nxt_remain = remain;
      ic_srdy = 0;
      ip_drdy = 0;
 
      case (remain)
        0 : ic_data = ip_data[63:56];
        7 : ic_data = ip_data[55:48];
        6 : ic_data = ip_data[47:40];
        5 : ic_data = ip_data[39:32];
        4 : ic_data = ip_data[31:24];
        3 : ic_data = ip_data[23:16];
        2 : ic_data = ip_data[15: 8];
        1 : ic_data = ip_data[ 7: 0];
        default : ic_data = ip_data[63:56];
      endcase
 
      if (ip_srdy & ic_drdy)
        begin
          if (remain == 0)
            begin
              ic_srdy = 1;
              if (ip_data[`PRW_VALID] == 0)
                nxt_remain = 7;
              else
                nxt_remain = ip_data[`PRW_VALID]-1;
 
              if (nxt_remain == 0)
                ip_drdy = 1;
 
              if (ip_data[`PRW_PCC] == `PCC_SOP)
                ic_code = `PCC_SOP;
              else
                ic_code = `PCC_DATA;
            end // if (remain == 0)
          else
            begin
              ic_srdy = 1;
              nxt_remain = remain - 1;
              if (nxt_remain == 0)
                begin
                  ip_drdy = 1;
                  if ((ip_data[`PRW_PCC] == `PCC_EOP) |
                      (ip_data[`PRW_PCC] == `PCC_BADEOP))
                    ic_code = ip_data[`PRW_PCC];
                  else
                    ic_code = `PCC_DATA;
                end
              else
                ic_code = `PCC_DATA;
            end // else: !if(remain == 0)
        end
    end // always @ *
 
  always @(posedge clk)
    begin
      if (reset)
        remain <= #1 0;
      else
        remain <= #1 nxt_remain;
    end
 
  sd_output #(8+2) sdout
    (
     // Outputs
     .ic_drdy				(ic_drdy),
     .p_srdy				(p_srdy),
     .p_data				({p_code,p_data}),
     // Inputs
     .clk				(clk),
     .reset				(reset),
     .ic_srdy				(ic_srdy),
     .ic_data				({ic_code,ic_data}),
     .p_drdy				(p_drdy));
 
endmodule // template_1i1o
 
// Local Variables:
// verilog-library-directories:("." "../../../rtl/verilog/closure" "../../../rtl/verilog/memory" "../../../rtl/verilog/forks")
// End:  
 

Go to most recent revision | 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.