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

Subversion Repositories sparc64soc

[/] [sparc64soc/] [trunk/] [WB2ALTDDR3/] [dram_wb.v] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 dmitryr
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3
// Company:  (C) Athree, 2009
4
// Engineer: Dmitry Rozhdestvenskiy 
5
// Email dmitry.rozhdestvenskiy@srisc.com dmitryr@a3.spb.ru divx4log@narod.ru
6
// 
7
// Design Name:    Bridge from Wishbone to Altera DDR3 controller
8
// Module Name:    wb2altddr3 
9
// Project Name:   SPARC SoC single-core
10
//
11
// LICENSE:
12
// This is a Free Hardware Design; you can redistribute it and/or
13
// modify it under the terms of the GNU General Public License
14
// version 2 as published by the Free Software Foundation.
15
// The above named program is distributed in the hope that it will
16
// be useful, but WITHOUT ANY WARRANTY; without even the implied
17
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18
// See the GNU General Public License for more details.
19
//
20
//////////////////////////////////////////////////////////////////////////////////
21
 
22
module dram_wb(
23
   input             clk200,
24
   input             rup,
25
   input             rdn,
26
 
27
   input             wb_clk_i,
28
   input             wb_rst_i,
29
 
30
   input      [63:0] wb_dat_i,
31
   output reg [63:0] wb_dat_o,
32
   input      [63:0] wb_adr_i,
33
   input      [ 7:0] wb_sel_i,
34
   input             wb_we_i,
35
   input             wb_cyc_i,
36
   input             wb_stb_i,
37
   output            wb_ack_o,
38
   output            wb_err_o,
39
   output            wb_rty_o,
40
   input             wb_cab_i,
41
 
42
   inout      [63:0] ddr3_dq,
43
   inout      [ 7:0] ddr3_dqs,
44
   inout      [ 7:0] ddr3_dqs_n,
45
   inout             ddr3_ck,
46
   inout             ddr3_ck_n,
47
   output            ddr3_reset,
48
   output     [12:0] ddr3_a,
49
   output     [ 2:0] ddr3_ba,
50
   output            ddr3_ras_n,
51
   output            ddr3_cas_n,
52
   output            ddr3_we_n,
53
   output            ddr3_cs_n,
54
   output            ddr3_odt,
55
   output            ddr3_ce,
56
   output     [ 7:0] ddr3_dm,
57
 
58
   output            phy_init_done,
59
 
60
   input             dcm_locked,
61
   input             sysrst
62
);
63
 
64
wire [255:0] rd_data_fifo_out;
65
reg  [255:0] rd_data_cache;
66
reg  [ 23:0] rd_addr_cache;
67
wire [ 71:0] wr_dout;
68
wire [ 31:0] cmd_out;
69
reg          wb_stb_i_d;
70
reg  [ 31:0] mask_data;
71
 
72
wire push_tran;
73
wire fifo_read;
74
wire fifo_empty;
75
reg  push_tran_d;
76
reg  fifo_read_d;
77
reg  fifo_empty_d;
78
 
79
 
80
wire [13:0] parallelterminationcontrol;
81
wire [13:0] seriesterminationcontrol;
82
 
83
dram dram_ctrl(
84
    .pll_ref_clk(clk200),
85
    .global_reset_n(sysrst),  // Resets all
86
    .soft_reset_n(1),    // Resets all but PLL
87
 
88
    .reset_request_n(), // Active when not ready (PLL not locked)
89
    .reset_phy_clk_n(), // Reset input sync to phy_clk
90
 
91
    .phy_clk(ddr_clk),         // User clock
92
    .dll_reference_clk(), // For external DLL
93
 
94
    .dqs_delay_ctrl_export(),
95
    .aux_scan_clk(),
96
    .aux_scan_clk_reset_n(),
97
    .aux_full_rate_clk(),
98
    .aux_half_rate_clk(),
99
 
100
    .oct_ctl_rs_value(seriesterminationcontrol),
101
    .oct_ctl_rt_value(parallelterminationcontrol),
102
 
103
    .local_init_done(phy_init_done),
104
 
105
    .local_ready(dram_ready),
106
    .local_address(cmd_out[25:2]),
107
    .local_burstbegin(push_tran),
108
    .local_read_req(!cmd_out[31] && push_tran),
109
    .local_write_req(cmd_out[31] && push_tran),
110
    .local_wdata_req(),
111
    .local_wdata({wr_dout[63:0],wr_dout[63:0],wr_dout[63:0],wr_dout[63:0]}),
112
    .local_be(mask_data),
113
    .local_size(3'b001),
114
    .local_rdata_valid(rd_data_valid),
115
    .local_rdata(rd_data_fifo_out),
116
    .local_refresh_ack(),
117
 
118
    .mem_clk(ddr3_ck),
119
    .mem_clk_n(ddr3_ck_n),
120
    .mem_reset_n(ddr3_reset),
121
    .mem_dq(ddr3_dq),
122
    .mem_dqs(ddr3_dqs),
123
    .mem_dqsn(ddr3_dqs_n),
124
    .mem_odt(ddr3_odt),
125
    .mem_cs_n(ddr3_cs_n),
126
    .mem_cke(ddr3_ce),
127
    .mem_addr(ddr3_a),
128
    .mem_ba(ddr3_ba),
129
    .mem_ras_n(ddr3_ras_n),
130
    .mem_cas_n(ddr3_cas_n),
131
    .mem_we_n(ddr3_we_n),
132
    .mem_dm(ddr3_dm)
133
);
134
 
135
assign ddr_rst=!phy_init_done;
136
 
137
oct_alt_oct_power_f4c oct
138
(
139
    .parallelterminationcontrol(parallelterminationcontrol),
140
    .seriesterminationcontrol(seriesterminationcontrol),
141
    .rdn(rdn),
142
    .rup(rup)
143
) ;
144
 
145
always @( * )
146
   case(cmd_out[1:0])
147
      2'b00:mask_data<={24'h000000,wr_dout[71:64]};
148
      2'b01:mask_data<={16'h0000,wr_dout[71:64],8'h00};
149
      2'b10:mask_data<={8'h00,wr_dout[71:64],16'h0000};
150
      2'b11:mask_data<={wr_dout[71:64],24'h000000};
151
   endcase
152
 
153
wire [254:0] trig0;
154
 
155
/*ila1 ila1_inst (
156
    .CONTROL(CONTROL),
157
    .CLK(ddr_clk),
158
    .TRIG0(trig0)
159
);*/
160
 
161
assign trig0[127:0]=rd_data_fifo_out;
162
assign trig0[199:128]=wr_dout;
163
assign trig0[231:200]=cmd_out;
164
assign trig0[232]=0;
165
assign trig0[233]=0;
166
assign trig0[234]=rd_data_valid;
167
assign trig0[235]=0;
168
assign trig0[236]=fifo_empty;
169
assign trig0[237]=0;
170
assign trig0[238]=0;
171
assign trig0[254:239]=0;
172
 
173
reg fifo_full_d;
174
 
175
dram_fifo fifo(
176
    .aclr(ddr_rst),
177
 
178
    .wrclk(wb_clk_i),
179
    .rdclk(ddr_clk),
180
 
181
    .data({wb_sel_i,wb_dat_i,wb_we_i,wb_adr_i[33:3]}),
182
    .wrreq(wb_cyc_i && wb_stb_i && (!wb_stb_i_d || fifo_full_d) && !fifo_full && !(rd_addr_cache==wb_adr_i[28:5] && !wb_we_i)),
183
    .wrfull(fifo_full),
184
 
185
    .rdreq(fifo_read),
186
    .q({wr_dout,cmd_out}),
187
    .rdempty(fifo_empty)
188
);
189
 
190
assign fifo_read=cmd_out[31] ? push_tran:rd_data_valid;
191
 
192
reg dram_ready_d;
193
 
194
always @(posedge ddr_clk)
195
   begin
196
      fifo_empty_d<=fifo_empty;
197
      fifo_read_d<=fifo_read;
198
      dram_ready_d<=dram_ready;
199
      fifo_full_d<=fifo_full;
200
   end
201
 
202
// Push transaction to controller FIFO
203
assign push_tran=!fifo_empty && dram_ready && (fifo_empty_d || fifo_read_d || !dram_ready_d);
204
 
205
reg rd_data_valid_stb;
206
reg rd_data_valid_stb_d1;
207
reg rd_data_valid_stb_d2;
208
reg rd_data_valid_stb_d3;
209
reg rd_data_valid_stb_d4;
210
reg [255:0] rd_data_fifo_out_d;
211
reg wb_ack_d;
212
reg wb_ack_d1;
213
 
214
always @( * )
215
   case(wb_adr_i[4:3])
216
      2'b00:wb_dat_o<=rd_data_fifo_out_d[63:0];
217
      2'b01:wb_dat_o<=rd_data_fifo_out_d[127:64];
218
      2'b10:wb_dat_o<=rd_data_fifo_out_d[191:128];
219
      2'b11:wb_dat_o<=rd_data_fifo_out_d[255:192];
220
   endcase
221
 
222
always @(posedge wb_clk_i or posedge wb_rst_i)
223
   if(wb_rst_i)
224
      rd_addr_cache<=24'hFFFFFF;
225
   else
226
   begin
227
      wb_stb_i_d<=wb_stb_i;
228
      if(wb_cyc_i && wb_stb_i)
229
         if(!wb_we_i)
230
            rd_addr_cache<=wb_ack_o ? wb_adr_i[28:5]:rd_addr_cache;
231
         else
232
            if(rd_addr_cache==wb_adr_i[28:5])
233
               rd_addr_cache<=24'hFFFFFF;
234
      rd_data_valid_stb_d1<=rd_data_valid_stb;
235
      rd_data_valid_stb_d2<=rd_data_valid_stb_d1;
236
      rd_data_valid_stb_d3<=rd_data_valid_stb_d2;
237
      rd_data_valid_stb_d4<=rd_data_valid_stb_d3;
238
   end
239
 
240
assign wb_ack_o=wb_we_i ? (wb_cyc_i && wb_stb_i && !fifo_full):rd_data_valid_stb_d2 && !rd_data_valid_stb_d3 || (!wb_we_i && rd_addr_cache==wb_adr_i[28:5]);
241
 
242
always @(posedge ddr_clk)
243
   begin
244
      wb_ack_d<=wb_ack_o;
245
      wb_ack_d1<=wb_ack_d;
246
      if(rd_data_valid)
247
         begin
248
            rd_data_fifo_out_d<=rd_data_fifo_out;
249
            rd_data_valid_stb<=1;
250
         end
251
      else
252
         if(wb_ack_d1)
253
            rd_data_valid_stb<=0;
254
   end
255
 
256
endmodule

powered by: WebSVN 2.1.0

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