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

Subversion Repositories ram_wb

[/] [ram_wb/] [trunk/] [rtl/] [verilog/] [ram_wb_sc_dw.v] - Blame information for rev 5

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

Line No. Rev Author Line
1 5 unneback
// True dual port RAM as found in ACTEL proasic3 devices
2
module ram_sc_dw (d_a, q_a, adr_a, we_a, q_b, adr_b, d_b, we_b, clk);
3 2 unneback
 
4 5 unneback
   parameter dat_width = 32;
5
   parameter adr_width = 11;
6
   parameter mem_size  = 2048;
7
 
8
   input [dat_width-1:0]      d_a;
9
   input [adr_width-1:0]      adr_a;
10
   input [adr_width-1:0]      adr_b;
11
   input                      we_a;
12
   output reg [dat_width-1:0] q_b;
13
   input [dat_width-1:0]      d_b;
14
   output reg [dat_width-1:0] q_a;
15
   input                      we_b;
16
   input                      clk;
17
 
18
   reg [dat_width-1:0]         ram [0:mem_size - 1] ;
19
 
20 2 unneback
   always @ (posedge clk)
21
     begin
22
        q_a <= ram[adr_a];
23
        if (we_a)
24 5 unneback
          ram[adr_a] <= d_a;
25 2 unneback
     end
26
   always @ (posedge clk)
27
     begin
28 5 unneback
        q_b <= ram[adr_b];
29 2 unneback
        if (we_b)
30
          ram[adr_b] <= d_b;
31
     end
32 5 unneback
 
33 2 unneback
endmodule
34 5 unneback
 
35
// wrapper for the above dual port RAM
36
module ram (dat_i, dat_o, adr_i, we_i, rst, clk );
37
 
38
   parameter dat_width = 32;
39
   parameter adr_width = 11;
40
   parameter mem_size  = 2048;
41
 
42
   input [dat_width-1:0]      dat_i;
43
   input [adr_width-1:0]      adr_i;
44
   input                      we_i;
45
   output [dat_width-1:0]     dat_o;
46
   input                      rst;
47
   input                      clk;
48
 
49
   reg                        sel;
50
   wire [dat_width-1:0]       q_a, q_b;
51
 
52
   // when adr_i[adr_width-1] = 0 => use a side
53
   // when adr_i[adr_width-1] = 1 => use b side
54
   // delay one clock cycle since read has one pipeline stage
55
   always @ (posedge clk or posedge rst)
56
     if (rst)
57
       sel <= 1'b0;
58
     else
59
       sel <= adr_i[adr_width-1];
60
 
61
   assign dat_o = !sel ? q_a : q_b;
62
 
63
   ram_sc_dw
64
     #
65
     (
66
      .dat_width(dat_width),
67
      .adr_width(adr_width-1),
68
      .mem_size(mem_size/2)
69
      )
70
     ram0
71
     (
72
      .d_a(dat_i),
73
      .q_a(q_a),
74
      .adr_a(adr_i[adr_width-2:0]),
75
      .we_a(we_i & !adr_i[adr_width-1]),
76
      .q_b(q_b),
77
      .adr_b(adr_i[adr_width-2:0]),
78
      .d_b(dat_i),
79
      .we_b(we_i & adr_i[adr_width-1]),
80
      .clk(clk)
81
      );
82
 
83
endmodule // ram

powered by: WebSVN 2.1.0

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