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

Subversion Repositories turbo8051

[/] [turbo8051/] [trunk/] [rtl/] [lib/] [wb_rd_mem2mem.v] - Diff between revs 50 and 57

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

Rev 50 Rev 57
Line 97... Line 97...
 
 
parameter IDLE      = 0;
parameter IDLE      = 0;
parameter DESC_RD   = 1;
parameter DESC_RD   = 1;
parameter DATA_WAIT = 2;
parameter DATA_WAIT = 2;
parameter TXFR      = 3;
parameter TXFR      = 3;
 
parameter MEM_WRITE2   = 4;
 
parameter MEM_WRITE3   = 5;
 
parameter MEM_WRITE4   = 6;
 
 
 
 
//-------------------------------------------
//-------------------------------------------
// Input Declaration
// Input Declaration
//------------------------------------------
//------------------------------------------
Line 197... Line 200...
 
 
//----------------------------------------
//----------------------------------------
// Register Declration
// Register Declration
//----------------------------------------
//----------------------------------------
 
 
reg  [1:0]          state       ;
reg  [2:0]          state       ;
reg  [15:0]         cnt         ;
reg  [15:0]         cnt         ;
reg  [TAR_WD-1:0]   wbo_taddr   ;
reg  [TAR_WD-1:0]   wbo_taddr   ;
reg  [ADR_WD-1:0]   wbo_addr    ;
reg  [ADR_WD-1:0]   wbo_addr    ;
reg                 wbo_stb     ;
reg                 wbo_stb     ;
reg                 wbo_we      ;
reg                 wbo_we      ;
reg  [BE_WD-1:0]    wbo_be      ;
reg  [BE_WD-1:0]    wbo_be      ;
reg                 wbo_cyc     ;
reg                 wbo_cyc     ;
reg [15:0]          mem_addr    ;
reg [15:0]          mem_addr    ;
 
 
wire           mem_wr       = (state == TXFR) ? wbo_ack: 1'b0 ;
 
 
 
// Generate Next Address, to fix the read to address inc issue
 
wire [15:0]    taddr   = mem_addr+1;
 
 
 
assign mem_din[7:0]  = (mem_addr[1:0] == 2'b00) ? wbo_dout[7:0] :
 
                       (mem_addr[1:0] == 2'b01) ? wbo_dout[15:8] :
 
                       (mem_addr[1:0] == 2'b10) ? wbo_dout[23:16] : wbo_dout[31:24]  ;
 
 
 
assign mem_din[8]    = (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
 
 
 
reg [3:0]   desc_ptr;
reg [3:0]   desc_ptr;
 
reg [23:0]  tWrData; // Temp Write Data
 
reg [8:0]   mem_din;
 
reg         mem_wr;
 
 
always @(negedge rst_n or posedge clk) begin
always @(negedge rst_n or posedge clk) begin
   if(rst_n == 0) begin
   if(rst_n == 0) begin
      state       <= IDLE;
      state       <= IDLE;
      wbo_taddr   <= 0;
      wbo_taddr   <= 0;
Line 231... Line 229...
      wbo_we      <= 0;
      wbo_we      <= 0;
      wbo_be      <= 0;
      wbo_be      <= 0;
      wbo_cyc     <= 0;
      wbo_cyc     <= 0;
      desc_ptr    <= 0;
      desc_ptr    <= 0;
      mem_addr    <= 0;
      mem_addr    <= 0;
 
      mem_din     <= 0;
 
      tWrData     <= 0;
 
      mem_wr      <= 0;
   end
   end
   else begin
   else begin
      case(state)
      case(state)
         IDLE: begin
         IDLE: begin
 
            mem_wr      <= 0;
            // Check for Descriptor Q not empty
            // Check for Descriptor Q not empty
            if(!desc_q_empty) begin
            if(!desc_q_empty) begin
               wbo_taddr   <= mem_taddr;
               wbo_taddr   <= mem_taddr;
               wbo_addr  <= {cfg_desc_baddr[15:6],desc_ptr[3:0]};
               wbo_addr  <= {cfg_desc_baddr[15:6],desc_ptr[3:0]};
               wbo_be    <= 4'hF;
               wbo_be    <= 4'hF;
Line 260... Line 262...
              state     <= DATA_WAIT;
              state     <= DATA_WAIT;
          end
          end
       end
       end
 
 
         DATA_WAIT: begin
         DATA_WAIT: begin
 
            mem_wr          <= 0; // Reset the write for handling interburst
            // check for internal memory not full and initiate
            // check for internal memory not full and initiate
            // the transfer
            // the transfer
            if(!mem_full) begin
            if(!(mem_full || mem_afull)) begin
                wbo_taddr   <= mem_taddr;
                wbo_taddr   <= mem_taddr;
                wbo_addr    <= mem_addr[14:2];
                wbo_addr    <= mem_addr[14:2];
                wbo_stb     <= 1'b1;
                wbo_stb     <= 1'b1;
                wbo_we      <= 1'b0;
                wbo_we      <= 1'b0;
                wbo_be      <= 4'hF;
                wbo_be      <= 4'hF;
Line 274... Line 277...
                state       <= TXFR;
                state       <= TXFR;
            end
            end
         end
         end
         TXFR: begin
         TXFR: begin
            if(wbo_ack) begin
            if(wbo_ack) begin
               mem_addr     <= mem_addr+1;
               wbo_cyc      <= 1'b0;
 
               wbo_stb      <= 1'b0;
 
               mem_addr     <= mem_addr+4;
 
               mem_din[7:0] <= wbo_dout[7:0]; // Write First Byte
 
               tWrData      <= wbo_dout[31:8];
 
               mem_din[8]   <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
 
               mem_wr       <= 1;
               cnt          <= cnt-1;
               cnt          <= cnt-1;
               wbo_addr     <= taddr[14:2];
 
               wbo_be       <= 4'hF;
 
               if(cnt == 1) begin
               if(cnt == 1) begin
                  wbo_stb   <= 1'b0;
 
                  wbo_cyc   <= 1'b0;
 
                  state     <= IDLE;
                  state     <= IDLE;
 
               end else begin
 
                  state     <= MEM_WRITE2;
               end
               end
               else if(mem_afull) begin // to handle the interburst fifo  full case
 
                  wbo_cyc   <= 1'b0;
 
                  wbo_stb   <= 1'b0;
 
               end
               end
            end else if(!mem_full) begin // to handle interbust fifo full cases
         end
                wbo_cyc     <= 1'b1;
         MEM_WRITE2: begin // Write 2nd Byte
                wbo_stb     <= 1'b1;
            if(!(mem_full || mem_afull)) begin // to handle the interburst fifo  full case
 
                mem_din[7:0] <= tWrData[7:0];
 
                mem_din[8]   <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
 
                mem_wr       <= 1;
 
                cnt          <= cnt-1;
 
                if(cnt == 1) begin
 
                   state     <= IDLE;
 
                end else begin
 
                  state     <= MEM_WRITE3;
 
                end
 
            end else begin
 
               mem_wr        <= 0;
 
            end
 
         end
 
         MEM_WRITE3: begin // Write 3rd Byte
 
            if(!(mem_full || mem_afull)) begin // to handle the interburst fifo  full case
 
                mem_din[7:0] <= tWrData[15:8];
 
                mem_din[8]   <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
 
                mem_wr       <= 1;
 
                cnt          <= cnt-1;
 
                if(cnt == 1) begin
 
                   state     <= IDLE;
 
                end else begin
 
                  state     <= MEM_WRITE4;
 
                end
 
            end else begin
 
               mem_wr        <= 0;
 
            end
 
         end
 
         MEM_WRITE4: begin // Write 4th Byte
 
            if(!(mem_full || mem_afull)) begin // to handle the interburst fifo  full case
 
                mem_din[7:0] <= tWrData[23:16];
 
                mem_din[8]   <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
 
                mem_wr       <= 1;
 
                cnt          <= cnt-1;
 
                if(cnt == 1) begin
 
                   state     <= IDLE;
 
                end else begin
 
                  state     <= DATA_WAIT;
 
                end
 
            end else begin
 
               mem_wr        <= 0;
            end
            end
         end
         end
      endcase
      endcase
   end
   end
end
end

powered by: WebSVN 2.1.0

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