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

Subversion Repositories turbo8051

[/] [turbo8051/] [trunk/] [rtl/] [lib/] [wb_wr_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 85... Line 85...
parameter BE_WD   = 2;  // Byte Enable
parameter BE_WD   = 2;  // Byte Enable
parameter ADR_WD  = 28; // Address Width
parameter ADR_WD  = 28; // Address Width
parameter TAR_WD  = 4;  // Target Width
parameter TAR_WD  = 4;  // Target Width
 
 
// State Machine
// State Machine
parameter   IDLE       = 2'h0;
parameter   IDLE       = 3'h0;
parameter   XFR        = 2'h1;
parameter   RD_BYTE1   = 3'h1;
parameter   DESC_WAIT  = 2'h2;
parameter   RD_BYTE2   = 3'h2;
parameter   DESC_XFR   = 2'h3;
parameter   RD_BYTE3   = 3'h3;
 
parameter   RD_BYTE4   = 3'h4;
 
parameter   WB_XFR     = 3'h5;
 
parameter   DESC_WAIT  = 3'h6;
 
parameter   DESC_XFR   = 3'h7;
 
 
input               clk      ;  // CLK_I The clock input [CLK_I] coordinates all activities 
input               clk      ;  // CLK_I The clock input [CLK_I] coordinates all activities 
                                // for the internal logic within the WISHBONE interconnect. 
                                // for the internal logic within the WISHBONE interconnect. 
                                // All WISHBONE output signals are registered at the 
                                // All WISHBONE output signals are registered at the 
                                // rising edge of [CLK_I]. 
                                // rising edge of [CLK_I]. 
Line 195... Line 199...
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 [D_WD-1:0]       wbo_din   ;
reg [D_WD-1:0]       wbo_din   ;
reg [1:0]            state     ;
reg [2:0]            state     ;
 
 
reg                  mem_rd    ;
reg                  mem_rd    ;
reg [3:0]            desc_ptr  ; // descriptor pointer, in 32 bit mode
reg [3:0]            desc_ptr  ; // descriptor pointer, in 32 bit mode
reg                  mem_eop_l ; // delayed eop signal
reg                  mem_eop_l ; // delayed eop signal
reg                  desc_ack  ; // delayed eop signal
reg                  desc_ack  ; // delayed eop signal
 
 
 
reg  [23:0]  tWrData; // Temp 24 Bit Data
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
      wbo_taddr <= 0;
      wbo_taddr <= 0;
      wbo_addr  <= 0;
      wbo_addr  <= 0;
      wbo_stb   <= 0;
      wbo_stb   <= 0;
Line 215... Line 220...
      wbo_din   <= 0;
      wbo_din   <= 0;
      mem_rd    <= 0;
      mem_rd    <= 0;
      desc_ptr  <= 0;
      desc_ptr  <= 0;
      mem_eop_l <= 0;
      mem_eop_l <= 0;
      desc_ack  <= 0;
      desc_ack  <= 0;
 
      tWrData   <= 0;
      state     <= IDLE;
      state     <= IDLE;
   end
   end
   else begin
   else begin
      case(state)
      case(state)
       IDLE: begin
       IDLE: begin
          desc_ack <= 0;
          desc_ack <= 0;
          if(!mem_empty) begin
          if(!mem_empty) begin
 
             mem_rd         <= 1;
 
             mem_eop_l      <= 0;
 
             tWrData[7:0]   <= mem_dout[7:0];
 
             state          <= RD_BYTE1;
 
          end
 
       end
 
       RD_BYTE1: begin // End of First Transfer
 
          if(mem_rd && mem_eop) begin
 
             mem_rd    <= 0;
 
             mem_eop_l <= mem_eop;
             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'b1;
             wbo_we    <= 1'b1;
             wbo_be    <= 1 << mem_addr[1:0];
             wbo_be    <= 4'h1; // Assigned Aligned 32bit address
 
             wbo_din   <= {24'h0,mem_dout[7:0]};
             wbo_cyc   <= 1;
             wbo_cyc   <= 1;
             wbo_din   <= {mem_dout,mem_dout,mem_dout,mem_dout};
             state     <= WB_XFR;
 
          end else if(!(mem_empty || (mem_rd && mem_aempty))) begin
 
             mem_rd    <= 1;
 
             state     <= RD_BYTE2;
 
          end else begin
 
             mem_rd    <= 0;
 
          end
 
          if(mem_rd) begin
 
             tWrData[7:0]   <= mem_dout[7:0];
 
          end
 
       end
 
 
 
       RD_BYTE2: begin // End of Second Transfer
 
          if(mem_rd && mem_eop) begin
 
             mem_rd    <= 0;
             mem_eop_l <= mem_eop;
             mem_eop_l <= mem_eop;
 
             wbo_taddr <= mem_taddr;
 
             wbo_addr  <= mem_addr[14:2];
 
             wbo_stb   <= 1'b1;
 
             wbo_we    <= 1'b1;
 
             wbo_be    <= 4'h3; // Assigned Aligned 32bit address
 
             wbo_din   <= {16'h0,mem_dout[7:0],tWrData[7:0]};
 
             wbo_cyc   <= 1;
 
             state     <= WB_XFR;
 
          end else if(!(mem_empty || (mem_rd && mem_aempty))) begin
             mem_rd    <= 1;
             mem_rd    <= 1;
             state     <= XFR;
             state     <= RD_BYTE3;
 
          end else begin
 
             mem_rd    <= 0;
          end
          end
 
          if(mem_rd) begin
 
             tWrData[15:8]   <= mem_dout[7:0];
       end
       end
       XFR: begin
       end
          if(wbo_ack) begin
 
 
 
 
       RD_BYTE3: begin // End of Third Transfer
 
          if(mem_rd && mem_eop) begin
 
             mem_rd    <= 0;
             mem_eop_l <= mem_eop;
             mem_eop_l <= mem_eop;
 
             wbo_taddr <= mem_taddr;
             wbo_addr  <= mem_addr[14:2];
             wbo_addr  <= mem_addr[14:2];
             wbo_be    <= 1 << mem_addr[1:0];
             wbo_stb   <= 1'b1;
             wbo_din   <= {mem_dout,mem_dout,mem_dout,mem_dout};
             wbo_we    <= 1'b1;
             if(mem_eop_l) begin
             wbo_be    <= 4'h7; // Assigned Aligned 32bit address
                state <= DESC_WAIT;
             wbo_din   <= {8'h0,mem_dout[7:0],tWrData[15:0]};
 
             wbo_cyc   <= 1;
 
             state     <= WB_XFR;
 
          end else if(!(mem_empty || (mem_rd && mem_aempty))) begin
 
             mem_rd    <= 1;
 
             state     <= RD_BYTE4;
 
          end else begin
 
             mem_rd    <= 0;
 
          end
 
          if(mem_rd) begin
 
             tWrData[23:16]   <= mem_dout[7:0];
 
          end
 
       end
 
 
 
       RD_BYTE4: begin // End of Fourth Transfer
 
             mem_rd    <= 0;
 
             mem_eop_l <= mem_eop;
 
             wbo_taddr <= mem_taddr;
 
             wbo_addr  <= mem_addr[14:2];
 
             wbo_stb   <= 1'b1;
 
             wbo_we    <= 1'b1;
 
             wbo_be    <= 4'hF; // Assigned Aligned 32bit address
 
             wbo_din   <= {mem_dout[7:0],tWrData[23:0]};
 
             wbo_cyc   <= 1;
 
             state     <= WB_XFR;
             end
             end
             else if(mem_aempty || mem_empty) begin
 
                wbo_stb   <= 1'b0;
       WB_XFR: begin
 
          if(wbo_ack) begin
 
             wbo_stb   <= 0;
                wbo_cyc   <= 0;
                wbo_cyc   <= 0;
                state     <= IDLE;
             if(mem_eop_l) begin
 
                state     <= DESC_WAIT;
             end else begin
             end else begin
               mem_rd <= 1;
                state     <= IDLE; // Next Byte
             end
             end
          end else begin
 
             mem_rd <= 0;
 
          end
          end
       end
       end
 
 
 
 
       DESC_WAIT: begin
       DESC_WAIT: begin
          if(desc_req) begin
          if(desc_req) begin
             desc_ack    <= 1;
             desc_ack    <= 1;
             if(desc_disccard) begin // if the Desc is discarded
             if(desc_disccard) begin // if the Desc is discarded
                state     <= IDLE;
                state     <= IDLE;

powered by: WebSVN 2.1.0

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