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

Subversion Repositories eco32

[/] [eco32/] [trunk/] [fpga/] [mc/] [src/] [ram/] [ddr/] [ram.v] - Blame information for rev 291

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 219 hellwig
//
2 290 hellwig
// ram.v -- external RAM interface, using DDR SDRAM
3
//          16M x 32 bit = 64 MB
4 219 hellwig
//
5
 
6
 
7 290 hellwig
`timescale 1ns/10ps
8
`default_nettype none
9
 
10
 
11 219 hellwig
module ram(ddr_clk_0, ddr_clk_90, ddr_clk_180,
12 290 hellwig
           ddr_clk_270, ddr_clk_ok, clk, rst,
13
           stb, we, addr, data_in, data_out, ack,
14 219 hellwig
           sdram_ck_p, sdram_ck_n, sdram_cke,
15
           sdram_cs_n, sdram_ras_n, sdram_cas_n,
16
           sdram_we_n, sdram_ba, sdram_a,
17
           sdram_udm, sdram_ldm,
18
           sdram_udqs, sdram_ldqs, sdram_dq);
19
    // internal interface signals
20
    input ddr_clk_0;
21
    input ddr_clk_90;
22
    input ddr_clk_180;
23
    input ddr_clk_270;
24
    input ddr_clk_ok;
25
    input clk;
26 290 hellwig
    input rst;
27
    input stb;
28
    input we;
29
    input [25:2] addr;
30 219 hellwig
    input [31:0] data_in;
31 290 hellwig
    output [31:0] data_out;
32
    output ack;
33 219 hellwig
    // DDR SDRAM interface signals
34
    output sdram_ck_p;
35
    output sdram_ck_n;
36
    output sdram_cke;
37
    output sdram_cs_n;
38
    output sdram_ras_n;
39
    output sdram_cas_n;
40
    output sdram_we_n;
41
    output [1:0] sdram_ba;
42
    output [12:0] sdram_a;
43
    output sdram_udm;
44
    output sdram_ldm;
45
    inout sdram_udqs;
46
    inout sdram_ldqs;
47
    inout [15:0] sdram_dq;
48
 
49 291 hellwig
  //----------------------------------------------------
50
 
51
  // This is a hack. The synthesizer detected setup timing
52
  // violations on wDAT_I that resulted from crossing the
53
  // 50 MHz to 100 MHz clock domain border. The circuit would
54
  // have functioned perfectly ok, because the signals are
55
  // used only on the following 100 MHz clock edge, a fact
56
  // that the synthesizer was unable to deduce. Instead of
57
  // tolerating formal errors during synthesis, I tried to
58
  // insert a register that is clocked with the trailing
59
  // edge of the 50 MHz clock. Surprisingly, this worked.
60
 
61
  reg [31:0] data_in_buf;
62
 
63
  always @(negedge clk) begin
64
    data_in_buf[31:0] <= data_in[31:0];
65
  end
66
 
67
  //----------------------------------------------------
68
 
69 290 hellwig
  ddr_sdram ddr_sdram_1(
70 219 hellwig
    .sd_CK_P(sdram_ck_p),
71
    .sd_CK_N(sdram_ck_n),
72
    .sd_A_O(sdram_a[12:0]),
73
    .sd_BA_O(sdram_ba[1:0]),
74
    .sd_D_IO(sdram_dq[15:0]),
75
    .sd_RAS_O(sdram_ras_n),
76
    .sd_CAS_O(sdram_cas_n),
77
    .sd_WE_O(sdram_we_n),
78
    .sd_UDM_O(sdram_udm),
79
    .sd_LDM_O(sdram_ldm),
80
    .sd_UDQS_IO(sdram_udqs),
81
    .sd_LDQS_IO(sdram_ldqs),
82
    .sd_CS_O(sdram_cs_n),
83
    .sd_CKE_O(sdram_cke),
84
    .clk0(ddr_clk_0),
85
    .clk90(ddr_clk_90),
86
    .clk180(ddr_clk_180),
87
    .clk270(ddr_clk_270),
88
    .reset(~ddr_clk_ok),
89
    .wADR_I(addr[25:2]),
90 290 hellwig
    .wSTB_I(stb),
91
    .wWE_I(we),
92
    .wWRB_I(4'b1111),
93 291 hellwig
    .wDAT_I(data_in_buf[31:0]),
94 290 hellwig
    .wDAT_O(data_out[31:0]),
95 219 hellwig
    .wACK_O(ack)
96
  );
97
 
98
endmodule

powered by: WebSVN 2.1.0

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