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

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [soc/] [rtl/] [flash_sram/] [sram_top.v] - Blame information for rev 12

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 xianfeng
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  XESS SRAM interface                                         ////
4
////                                                              ////
5
////  This file is part of the OR1K test application              ////
6
////  http://www.opencores.org/cores/or1k/                        ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Connects the SoC to SRAM. It does RMW for byte accesses     ////
10
////  because XSV board has WEs on a 16-bit basis.                ////
11
////                                                              ////
12
////  To Do:                                                      ////
13
////   - nothing really                                           ////
14
////                                                              ////
15
////  Author(s):                                                  ////
16
////      - Simon Srot, simons@opencores.org                      ////
17
////      - Igor Mohor, igorm@opencores.org                       ////
18
////                                                              ////
19
//////////////////////////////////////////////////////////////////////
20
////                                                              ////
21
//// Copyright (C) 2001 Authors                                   ////
22
////                                                              ////
23
//// This source file may be used and distributed without         ////
24
//// restriction provided that this copyright statement is not    ////
25
//// removed from the file and that any derivative work contains  ////
26
//// the original copyright notice and the associated disclaimer. ////
27
////                                                              ////
28
//// This source file is free software; you can redistribute it   ////
29
//// and/or modify it under the terms of the GNU Lesser General   ////
30
//// Public License as published by the Free Software Foundation; ////
31
//// either version 2.1 of the License, or (at your option) any   ////
32
//// later version.                                               ////
33
////                                                              ////
34
//// This source is distributed in the hope that it will be       ////
35
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
36
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
37
//// PURPOSE.  See the GNU Lesser General Public License for more ////
38
//// details.                                                     ////
39
////                                                              ////
40
//// You should have received a copy of the GNU Lesser General    ////
41
//// Public License along with this source; if not, download it   ////
42
//// from http://www.opencores.org/lgpl.shtml                     ////
43
////                                                              ////
44
//////////////////////////////////////////////////////////////////////
45
//
46
// CVS Revision History
47
//
48
// $Log: sram_top.v,v $
49
// Revision 1.7  2004/04/05 08:44:55  lampret
50
// Merged branch_qmem into main tree.
51
//
52
// Revision 1.5  2002/09/16 02:51:23  lampret
53
// Delayed wb_err_o. Disabled wb_ack_o when wb_err_o is asserted.
54
//
55
// Revision 1.4  2002/08/18 19:55:30  lampret
56
// Added variable delay for SRAM.
57
//
58
// Revision 1.3  2002/08/14 06:24:43  lampret
59
// Fixed size of generic flash/sram to exactly 2MB
60
//
61
// Revision 1.2  2002/08/12 05:34:06  lampret
62
// Added SRAM_GENERIC
63
//
64
// Revision 1.1.1.1  2002/03/21 16:55:44  lampret
65
// First import of the "new" XESS XSV environment.
66
//
67
//
68
// Revision 1.3  2002/01/23 07:50:44  lampret
69
// Added wb_err_o to flash and sram i/f for testing the buserr exception.
70
//
71
// Revision 1.2  2002/01/14 06:18:22  lampret
72
// Fixed mem2reg bug in FAST implementation. Updated debug unit to work with new genpc/if.
73
//
74
// Revision 1.1.1.1  2001/11/04 19:00:09  lampret
75
// First import.
76
//
77
//
78
 
79
// synopsys translate_off
80
//`include "timescale.v"
81
// synopsys translate_on
82
`define SRAM_GENERIC
83
 
84
`ifdef SRAM_GENERIC
85
 
86
module sram_top (
87
  wb_clk_i, wb_rst_i,
88
 
89
  wb_dat_i, wb_dat_o, wb_adr_i, wb_sel_i, wb_we_i, wb_cyc_i,
90
  wb_stb_i, wb_ack_o, wb_err_o,
91
 
92
  r_cen, r0_wen, r1_wen, r_oen, r_a, r_d_i, r_d_o, d_oe,
93
  l_cen, l0_wen, l1_wen, l_oen, l_a, l_d_i, l_d_o
94
);
95
 
96
//
97
// Paraneters
98
//
99
parameter               aw = 19;
100
 
101
//
102
// I/O Ports
103
//
104
input                   wb_clk_i;
105
input                   wb_rst_i;
106
 
107
//
108
// WB slave i/f
109
//
110
input   [31:0]           wb_dat_i;
111
output  [31:0]           wb_dat_o;
112
input   [31:0]           wb_adr_i;
113
input   [3:0]            wb_sel_i;
114
input                   wb_we_i;
115
input                   wb_cyc_i;
116
input                   wb_stb_i;
117
output                  wb_ack_o;
118
output                  wb_err_o;
119
 
120
//
121
// Right SRAM bank
122
//
123
output                  r_oen;
124
output                  r0_wen;
125
output                  r1_wen;
126
output                  r_cen;
127
input   [15:0]           r_d_i;
128
output  [15:0]           r_d_o;
129
output  [aw-1:0] r_a;
130
 
131
//
132
// Left SRAM bank
133
//
134
output                  l_oen;
135
output                  l0_wen;
136
output                  l1_wen;
137
output                  l_cen;
138
input   [15:0]           l_d_i;
139
output  [15:0]           l_d_o;
140
output  [aw-1:0] l_a;
141
 
142
//
143
// Common SRAM signals
144
//
145
output                  d_oe;
146
 
147
//
148
// Internal wires and regs
149
//
150
reg     [7:0]           mem [16*1024*1024-1:0];
151
integer                 i;
152
wire    [31:0]          adr;
153
`ifdef SRAM_GENERIC_REGISTERED
154
reg                     wb_err_o;
155
reg     [31:0]           prev_adr;
156
reg     [1:0]            delay;
157
`else
158
wire    [1:0]            delay;
159
`endif
160
wire                    wb_err;
161
 
162
//
163
// Aliases and simple assignments
164
//
165
assign wb_err = wb_cyc_i & wb_stb_i & (delay == 2'd0) & (|wb_adr_i[26:24]);     // If Access to > 16MB (8-bit leading prefix ignored)
166
assign adr = {5'b00000, wb_adr_i[26:2], 2'b00};
167
 
168
//
169
// Reading from SRAM model
170
//
171
assign wb_dat_o[7:0] = mem[adr+3];
172
assign wb_dat_o[15:8] = mem[adr+2];
173
assign wb_dat_o[23:16] = mem[adr+1];
174
assign wb_dat_o[31:24] = mem[adr+0];
175
 
176
//
177
// Writing to SRAM model
178
//
179
always @(posedge wb_rst_i or posedge wb_clk_i)
180
        if (wb_cyc_i & wb_stb_i & wb_we_i) begin
181
                if (wb_sel_i[0])
182
                        mem[adr+3] <= #1 wb_dat_i[7:0];
183
                if (wb_sel_i[1])
184
                        mem[adr+2] <= #1 wb_dat_i[15:8];
185
                if (wb_sel_i[2])
186
                        mem[adr+1] <= #1 wb_dat_i[23:16];
187
                if (wb_sel_i[3])
188
                        mem[adr+0] <= #1 wb_dat_i[31:24];
189
        end
190
 
191
`ifdef SRAM_GENERIC_REGISTERED
192
//
193
// WB Acknowledge
194
//
195
always @(posedge wb_clk_i or posedge wb_rst_i)
196
        if (wb_rst_i) begin
197
                delay <= #1 2'd3;
198
                prev_adr <= #1 32'h0000_0000;
199
        end
200
        else if (delay && (wb_adr_i == prev_adr) && wb_cyc_i && wb_stb_i)
201
                delay <= #1 delay - 2'd1;
202
        else if (wb_ack_o || wb_err_o || (wb_adr_i != prev_adr) || ~wb_stb_i) begin
203
                delay <= #1 2'd2;       // delay ... can range from 3 to 0
204
                prev_adr <= #1 wb_adr_i;
205
        end
206
`else
207
assign delay = 2'd0;
208
`endif
209
 
210
assign wb_ack_o = wb_cyc_i & wb_stb_i & ~wb_err & (delay == 2'd0)
211
`ifdef SRAM_GENERIC_REGISTERED
212
        & (wb_adr_i == prev_adr)
213
`endif
214
        ;
215
 
216
`ifdef SRAM_GENERIC_REGISTERED
217
//
218
// WB Error
219
//
220
always @(posedge wb_clk_i or posedge wb_rst_i)
221
        if (wb_rst_i)
222
                wb_err_o <= #1 1'b0;
223
        else
224
                wb_err_o <= #1 wb_err & !wb_err_o;
225
`else
226
assign wb_err_o = wb_err;
227
`endif
228
 
229
//
230
// SRAM i/f monitor
231
//
232
// synopsys translate_off
233
integer fsram;
234
initial begin
235
        fsram = $fopen("sram.log");
236
 
237
        $display("Cleaning SRAM.....");
238
//      for (i = 0; i < 16777216; i = i + 1)
239
//              mem[i] = 0;
240
 
241
        $readmemh("../src/sram.in", mem, 0);
242
end
243
always @(posedge wb_clk_i)
244
        if (wb_cyc_i)
245
                if (wb_stb_i & wb_we_i) begin
246
                        if (wb_sel_i[3])
247
                                mem[{wb_adr_i[23:2], 2'b00}+0] = wb_dat_i[31:24];
248
                        if (wb_sel_i[2])
249
                                mem[{wb_adr_i[23:2], 2'b00}+1] = wb_dat_i[23:16];
250
                        if (wb_sel_i[1])
251
                                mem[{wb_adr_i[23:2], 2'b00}+2] = wb_dat_i[15:8];
252
                        if (wb_sel_i[0])
253
                                mem[{wb_adr_i[23:2], 2'b00}+3] = wb_dat_i[7:0];
254
                        $fdisplay(fsram, "%t [%h] <- write %h, byte sel %b", $time, wb_adr_i, wb_dat_i, wb_sel_i);
255
                end else if (wb_ack_o)
256
                        $fdisplay(fsram, "%t [%h] -> read %h", $time, wb_adr_i, wb_dat_o);
257
// synopsys translate_on
258
 
259
endmodule
260
 
261
`else
262
 
263
module sram_top (
264
  wb_clk_i, wb_rst_i,
265
 
266
  wb_dat_i, wb_dat_o, wb_adr_i, wb_sel_i, wb_we_i, wb_cyc_i,
267
  wb_stb_i, wb_ack_o, wb_err_o,
268
 
269
  r_cen, r0_wen, r1_wen, r_oen, r_a, r_d_i, r_d_o, d_oe,
270
  l_cen, l0_wen, l1_wen, l_oen, l_a, l_d_i, l_d_o
271
);
272
 
273
//
274
// Paraneters
275
//
276
parameter               aw = 19;
277
 
278
//
279
// I/O Ports
280
//
281
input                   wb_clk_i;
282
input                   wb_rst_i;
283
 
284
//
285
// WB slave i/f
286
//
287
input   [31:0]           wb_dat_i;
288
output  [31:0]           wb_dat_o;
289
input   [31:0]           wb_adr_i;
290
input   [3:0]            wb_sel_i;
291
input                   wb_we_i;
292
input                   wb_cyc_i;
293
input                   wb_stb_i;
294
output                  wb_ack_o;
295
output                  wb_err_o;
296
 
297
//
298
// Right SRAM bank
299
//
300
output                  r_oen;
301
output                  r0_wen;
302
output                  r1_wen;
303
output                  r_cen;
304
input   [15:0]           r_d_i;
305
output  [15:0]           r_d_o;
306
output  [aw-1:0] r_a;
307
 
308
//
309
// Left SRAM bank
310
//
311
output                  l_oen;
312
output                  l0_wen;
313
output                  l1_wen;
314
output                  l_cen;
315
input   [15:0]           l_d_i;
316
output  [15:0]           l_d_o;
317
output  [aw-1:0] l_a;
318
 
319
//
320
// Common SRAM signals
321
//
322
output                  d_oe;
323
 
324
//
325
// Internal regs and wires
326
//
327
reg     [15:0]           r_data;
328
reg     [15:0]           l_data;
329
reg                     l0_wen;
330
wire                    l1_wen = l0_wen;
331
reg                     r0_wen;
332
wire                    r1_wen = r0_wen;
333
reg     [31:0]           latch_data;
334
reg                     ack_we;
335
wire                    l_oe;
336
wire                    r_oe;
337
wire                    r_ack;
338
reg                     Mux;
339
reg     [aw-1:0] LatchedAddr;
340
reg     [15:0]           l_read;
341
reg     [15:0]           r_read;
342
reg                     d_oe;
343
reg     [15:0]           l_mux;
344
reg     [15:0]           r_mux;
345
 
346
//
347
// Aliases and simple assignments
348
//
349
assign wb_dat_o = {r_d_i, l_d_i};
350
assign l_oen = ~l_oe;
351
assign r_oen = ~r_oe;
352
assign l_a = Mux ? LatchedAddr : wb_adr_i[aw+1:2];
353
assign r_a = l_a;
354
assign l_d_o = l_mux;
355
assign r_d_o = r_mux;
356
assign l_oe = wb_cyc_i & wb_stb_i & l0_wen;
357
assign r_oe = wb_cyc_i & wb_stb_i & r0_wen;
358
assign l_cen = ~(wb_cyc_i & wb_stb_i);
359
assign r_cen = l_cen;
360
assign wb_ack_o = (wb_cyc_i & wb_stb_i & ~wb_err & ~wb_we_i) | ack_we;
361
assign wb_err_o = wb_cyc_i & wb_stb_i & (|wb_adr_i[27:21]);     // If Access to > 2MB (4-bit leading prefix ignored)
362
 
363
//
364
// RMW mux control
365
//
366
always @ (negedge wb_clk_i or posedge wb_rst_i)
367
begin
368
  if (wb_rst_i)
369
    Mux <= 1'b0;
370
  else
371
  if (ack_we)
372
    Mux <= #1 1'b1;
373
  else
374
    Mux <= #1 1'b0;
375
end
376
 
377
//
378
// Latch address
379
//
380
always @ (negedge wb_clk_i or posedge wb_rst_i)
381
begin
382
  if (wb_rst_i)
383
    LatchedAddr <= 'h0;
384
  else
385
  if (wb_cyc_i & wb_stb_i)
386
    LatchedAddr <= #1 wb_adr_i[aw+1:2];
387
end
388
 
389
//
390
// Latch data from RAM (read data)
391
//
392
always @ (posedge wb_clk_i or posedge wb_rst_i)
393
begin
394
  if (wb_rst_i)
395
    begin
396
      l_read <= 16'h0;
397
      r_read <= 16'h0;
398
    end
399
  else
400
  if (wb_cyc_i & wb_stb_i)
401
    begin
402
      l_read <= #1 l_d_i[15:0];
403
      r_read <= #1 r_d_i[15:0];
404
    end
405
end
406
 
407
//
408
// Mux and latch data for writing left SRAM bank (bytes 0 and 1)
409
//
410
always @ (negedge wb_clk_i or posedge wb_rst_i)
411
begin
412
  if (wb_rst_i)
413
    l_mux <= 16'h0;
414
  else
415
  if (~l0_wen)
416
    begin
417
      if (wb_sel_i[0])
418
        l_mux[7:0]  <= #1 wb_dat_i[7:0];
419
      else
420
        l_mux[7:0]  <= #1 l_read[7:0];
421
      if (wb_sel_i[1])
422
        l_mux[15:8] <= #1 wb_dat_i[15:8];
423
      else
424
        l_mux[15:8] <= #1 l_read[15:8];
425
    end
426
  else
427
    l_mux[15:0]  <= #1 16'hz;
428
end
429
 
430
//
431
// Mux and latch data for writing right SRAM bank (bytes 2 and 3)
432
//
433
always @ (negedge wb_clk_i or posedge wb_rst_i)
434
begin
435
  if (wb_rst_i)
436
    r_mux <= 16'h0;
437
  else
438
  if (~r0_wen)
439
    begin
440
      if (wb_sel_i[2])
441
        r_mux[7:0]  <= #1 wb_dat_i[23:16];
442
      else
443
        r_mux[7:0]  <= #1 r_read[7:0];
444
      if (wb_sel_i[3])
445
        r_mux[15:8]  <= #1 wb_dat_i[31:24];
446
      else
447
        r_mux[15:8]  <= #1 r_read[15:8];
448
    end
449
  else
450
    r_mux <= #1 16'hz;
451
end
452
 
453
//
454
// Left WE
455
//
456
always @ (posedge wb_clk_i or posedge wb_rst_i)
457
begin
458
  if (wb_rst_i)
459
    l0_wen <= 1'b1;
460
  else
461
  if (wb_cyc_i & wb_stb_i & wb_we_i & (|wb_sel_i[1:0]) & ~wb_ack_o)
462
    l0_wen <= #1 1'b0;
463
  else
464
    l0_wen <= #1 1'b1;
465
end
466
 
467
//
468
// Right WE
469
//
470
always @ (posedge wb_clk_i or posedge wb_rst_i)
471
begin
472
  if (wb_rst_i)
473
    r0_wen <= 1'b1;
474
  else
475
  if (wb_cyc_i & wb_stb_i & wb_we_i & (|wb_sel_i[3:2]) & ~wb_ack_o)
476
    r0_wen <= #1 1'b0;
477
  else
478
    r0_wen <= #1 1'b1;
479
end
480
 
481
//
482
// Write acknowledge
483
//
484
always @ (posedge wb_clk_i or posedge wb_rst_i)
485
begin
486
  if (wb_rst_i)
487
    ack_we <= 1'b0;
488
  else
489
  if (wb_cyc_i & wb_stb_i & wb_we_i & ~ack_we)
490
    ack_we <= #1 1'b1;
491
  else
492
    ack_we <= #1 1'b0;
493
end
494
 
495
//
496
// Generate d_oe signal (tristate control)
497
//
498
always @ (negedge wb_clk_i or posedge wb_rst_i)
499
begin
500
  if (wb_rst_i)
501
    d_oe <= 1'b0;
502
  else
503
  if (~l0_wen | ~r0_wen)
504
    d_oe <= 1'b1;
505
  else
506
    d_oe <= 1'b0;
507
end
508
 
509
//
510
// SRAM i/f monitor
511
//
512
// synopsys translate_off
513
integer fsram;
514
initial fsram = $fopen("sram.log");
515
always @(posedge wb_clk_i)
516
begin
517
  if (~l0_wen | ~r0_wen)
518
    $fdisplay(fsram, "%t [%h] <- write %h", $time, wb_adr_i, {r_d_o, l_d_o});
519
  else
520
  if ((l_oe | r_oe) & ~wb_we_i)
521
    $fdisplay(fsram, "%t [%h] -> read %h", $time, wb_adr_i, {r_d_i, l_d_i});
522
end
523
// synopsys translate_on
524
 
525
endmodule
526
 
527
`endif

powered by: WebSVN 2.1.0

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