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

Subversion Repositories eco32

[/] [eco32/] [trunk/] [fpga/] [mc/] [src/] [ram/] [ddr/] [ram.v] - Diff between revs 288 and 290

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

Rev 288 Rev 290
Line 1... Line 1...
//
//
// ram_2.v -- main memory, using DDR SDRAM
// ram.v -- external RAM interface, using DDR SDRAM
 
//          16M x 32 bit = 64 MB
//
//
 
 
 
 
 
`timescale 1ns/10ps
 
`default_nettype none
 
 
 
 
module ram(ddr_clk_0, ddr_clk_90, ddr_clk_180,
module ram(ddr_clk_0, ddr_clk_90, ddr_clk_180,
           ddr_clk_270, ddr_clk_ok, clk, reset,
           ddr_clk_270, ddr_clk_ok, clk, rst,
           en, wr, size, addr,
           stb, we, addr, data_in, data_out, ack,
           data_in, data_out, wt,
 
           sdram_ck_p, sdram_ck_n, sdram_cke,
           sdram_ck_p, sdram_ck_n, sdram_cke,
           sdram_cs_n, sdram_ras_n, sdram_cas_n,
           sdram_cs_n, sdram_ras_n, sdram_cas_n,
           sdram_we_n, sdram_ba, sdram_a,
           sdram_we_n, sdram_ba, sdram_a,
           sdram_udm, sdram_ldm,
           sdram_udm, sdram_ldm,
           sdram_udqs, sdram_ldqs, sdram_dq);
           sdram_udqs, sdram_ldqs, sdram_dq);
Line 17... Line 21...
    input ddr_clk_90;
    input ddr_clk_90;
    input ddr_clk_180;
    input ddr_clk_180;
    input ddr_clk_270;
    input ddr_clk_270;
    input ddr_clk_ok;
    input ddr_clk_ok;
    input clk;
    input clk;
    input reset;
    input rst;
    input en;
    input stb;
    input wr;
    input we;
    input [1:0] size;
    input [25:2] addr;
    input [25:0] addr;
 
    input [31:0] data_in;
    input [31:0] data_in;
    output reg [31:0] data_out;
    output [31:0] data_out;
    output wt;
    output ack;
    // DDR SDRAM interface signals
    // DDR SDRAM interface signals
    output sdram_ck_p;
    output sdram_ck_p;
    output sdram_ck_n;
    output sdram_ck_n;
    output sdram_cke;
    output sdram_cke;
    output sdram_cs_n;
    output sdram_cs_n;
Line 41... Line 44...
    output sdram_ldm;
    output sdram_ldm;
    inout sdram_udqs;
    inout sdram_udqs;
    inout sdram_ldqs;
    inout sdram_ldqs;
    inout [15:0] sdram_dq;
    inout [15:0] sdram_dq;
 
 
  wire [31:0] do;
  ddr_sdram ddr_sdram_1(
  reg [31:0] di;
 
  reg [3:0] wb;
 
  wire ack;
 
 
 
  ddr_sdram ddr_sdram1(
 
    .sd_CK_P(sdram_ck_p),
    .sd_CK_P(sdram_ck_p),
    .sd_CK_N(sdram_ck_n),
    .sd_CK_N(sdram_ck_n),
    .sd_A_O(sdram_a[12:0]),
    .sd_A_O(sdram_a[12:0]),
    .sd_BA_O(sdram_ba[1:0]),
    .sd_BA_O(sdram_ba[1:0]),
    .sd_D_IO(sdram_dq[15:0]),
    .sd_D_IO(sdram_dq[15:0]),
Line 67... Line 65...
    .clk90(ddr_clk_90),
    .clk90(ddr_clk_90),
    .clk180(ddr_clk_180),
    .clk180(ddr_clk_180),
    .clk270(ddr_clk_270),
    .clk270(ddr_clk_270),
    .reset(~ddr_clk_ok),
    .reset(~ddr_clk_ok),
    .wADR_I(addr[25:2]),
    .wADR_I(addr[25:2]),
    .wSTB_I(en),
    .wSTB_I(stb),
    .wWE_I(wr),
    .wWE_I(we),
    .wWRB_I(wb[3:0]),
    .wWRB_I(4'b1111),
    .wDAT_I(di[31:0]),
    .wDAT_I(data_in[31:0]),
    .wDAT_O(do[31:0]),
    .wDAT_O(data_out[31:0]),
    .wACK_O(ack)
    .wACK_O(ack)
  );
  );
 
 
  // read multiplexer
 
  always @(*) begin
 
    case (size[1:0])
 
      2'b00:
 
        // byte
 
        begin
 
          data_out[31:24] = 8'hxx;
 
          data_out[23:16] = 8'hxx;
 
          data_out[15: 8] = 8'hxx;
 
          if (addr[1] == 0) begin
 
            if (addr[0] == 0) begin
 
              data_out[ 7: 0] = do[31:24];
 
            end else begin
 
              data_out[ 7: 0] = do[23:16];
 
            end
 
          end else begin
 
            if (addr[0] == 0) begin
 
              data_out[ 7: 0] = do[15: 8];
 
            end else begin
 
              data_out[ 7: 0] = do[ 7: 0];
 
            end
 
          end
 
        end
 
      2'b01:
 
        // halfword
 
        begin
 
          data_out[31:24] = 8'hxx;
 
          data_out[23:16] = 8'hxx;
 
          if (addr[1] == 0) begin
 
            data_out[15: 8] = do[31:24];
 
            data_out[ 7: 0] = do[23:16];
 
          end else begin
 
            data_out[15: 8] = do[15: 8];
 
            data_out[ 7: 0] = do[ 7: 0];
 
          end
 
        end
 
      2'b10:
 
        // word
 
        begin
 
          data_out[31:24] = do[31:24];
 
          data_out[23:16] = do[23:16];
 
          data_out[15: 8] = do[15: 8];
 
          data_out[ 7: 0] = do[ 7: 0];
 
        end
 
      default:
 
        // illegal
 
        begin
 
          data_out[31:24] = 8'hxx;
 
          data_out[23:16] = 8'hxx;
 
          data_out[15: 8] = 8'hxx;
 
          data_out[ 7: 0] = 8'hxx;
 
        end
 
    endcase
 
  end
 
 
 
  // write multiplexer & data masks
 
  always @(*) begin
 
    case (size[1:0])
 
      2'b00:
 
        // byte
 
        begin
 
          di[31:24] = data_in[ 7: 0];
 
          di[23:16] = data_in[ 7: 0];
 
          di[15: 8] = data_in[ 7: 0];
 
          di[ 7: 0] = data_in[ 7: 0];
 
          wb[3] = ~addr[1] & ~addr[0];
 
          wb[2] = ~addr[1] &  addr[0];
 
          wb[1] =  addr[1] & ~addr[0];
 
          wb[0] =  addr[1] &  addr[0];
 
        end
 
      2'b01:
 
        // halfword
 
        begin
 
          di[31:24] = data_in[15: 8];
 
          di[23:16] = data_in[ 7: 0];
 
          di[15: 8] = data_in[15: 8];
 
          di[ 7: 0] = data_in[ 7: 0];
 
          wb[3] = ~addr[1];
 
          wb[2] = ~addr[1];
 
          wb[1] =  addr[1];
 
          wb[0] =  addr[1];
 
        end
 
      2'b10:
 
        // word
 
        begin
 
          di[31:24] = data_in[31:24];
 
          di[23:16] = data_in[23:16];
 
          di[15: 8] = data_in[15: 8];
 
          di[ 7: 0] = data_in[ 7: 0];
 
          wb[3] = 1'b1;
 
          wb[2] = 1'b1;
 
          wb[1] = 1'b1;
 
          wb[0] = 1'b1;
 
        end
 
      default:
 
        // illegal
 
        begin
 
          di[31:24] = 8'hxx;
 
          di[23:16] = 8'hxx;
 
          di[15: 8] = 8'hxx;
 
          di[ 7: 0] = 8'hxx;
 
          wb[3] = 1'b0;
 
          wb[2] = 1'b0;
 
          wb[1] = 1'b0;
 
          wb[0] = 1'b0;
 
        end
 
    endcase
 
  end
 
 
 
  assign wt = ~ack;
 
 
 
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.