13
13
// -----------------------------------------------------------------------------
14
14
15
15
module ram # (
16
- parameter WIDTH = 64 ,
17
- parameter DEPTH = 32 ,
16
+ parameter WIDTH = 64 ,
17
+ parameter DEPTH = 32 ,
18
18
parameter ADDR_BITS = $clog2(DEPTH )
19
19
) (
20
- input logic clock,
21
- input logic we ,
22
- input logic [0 : ADDR_BITS - 1 ] wr_addr,
23
- input logic [0 : WIDTH - 1 ] data_in,
24
- input logic [0 : ADDR_BITS - 1 ] rd_addr,
25
- output logic [0 : WIDTH - 1 ] data_out
20
+ input logic clock ,
21
+ input logic we ,
22
+ input logic [0 : ADDR_BITS - 1 ] wr_addr ,
23
+ input logic [ 0 : WIDTH - 1 ] data_in ,
24
+ input logic [0 : ADDR_BITS - 1 ] rd_addr ,
25
+ output logic [ 0 : WIDTH - 1 ] data_out
26
26
);
27
- logic [0 : WIDTH - 1 ] memory [0 : DEPTH - 1 ];
27
+ logic [0 : WIDTH - 1 ] memory[0 : DEPTH - 1 ];
28
+
29
+ initial
30
+ begin : initialization
31
+ integer i;
32
+ for (i = 0 ; i < DEPTH ; i = i + 1 )
33
+ begin
34
+ memory[i] = 0 ;
35
+ end
36
+ end
28
37
29
38
always @ (posedge clock) begin
30
39
if (we)
31
40
memory[wr_addr] <= data_in;
32
41
end
33
42
34
43
always @ (posedge clock) begin
35
- data_out <= memory[rd_addr];
44
+ data_out <= memory[rd_addr];
36
45
end
37
46
endmodule
38
47
@@ -41,95 +50,93 @@ endmodule
41
50
42
51
43
52
module ram_2xrd # (
44
- parameter WIDTH = 64 ,
45
- parameter DEPTH = 32 ,
53
+ parameter WIDTH = 64 ,
54
+ parameter DEPTH = 32 ,
46
55
parameter ADDR_BITS = $clog2(DEPTH )
47
56
) (
48
- input logic clock,
49
- input logic we ,
50
- input logic [0 : ADDR_BITS - 1 ] wr_addr,
51
- input logic [0 : WIDTH - 1 ] data_in ,
52
- input logic [0 : ADDR_BITS - 1 ] rd_addr1,
53
- output logic [0 : WIDTH - 1 ] data_out1,
54
- input logic [0 : ADDR_BITS - 1 ] rd_addr2,
55
- output logic [0 : WIDTH - 1 ] data_out2
57
+ input logic clock ,
58
+ input logic we ,
59
+ input logic [0 : ADDR_BITS - 1 ] wr_addr ,
60
+ input logic [ 0 : WIDTH - 1 ] data_in ,
61
+ input logic [0 : ADDR_BITS - 1 ] rd_addr1 ,
62
+ output logic [ 0 : WIDTH - 1 ] data_out1,
63
+ input logic [0 : ADDR_BITS - 1 ] rd_addr2 ,
64
+ output logic [ 0 : WIDTH - 1 ] data_out2
56
65
);
57
66
58
67
ram # (
59
- .WIDTH ( WIDTH ),
60
- .DEPTH ( DEPTH )
61
- )ram1_instant
62
- (
63
- .clock ( clock ),
64
- .we ( we ),
65
- .wr_addr ( wr_addr ),
66
- .data_in ( data_in ),
67
-
68
- .rd_addr ( rd_addr1 ),
69
- .data_out ( data_out1 )
68
+ .WIDTH (WIDTH ),
69
+ .DEPTH (DEPTH )
70
+ ) ram1_instant (
71
+ .clock (clock ),
72
+ .we (we ),
73
+ .wr_addr (wr_addr ),
74
+ .data_in (data_in ),
75
+
76
+ .rd_addr (rd_addr1 ),
77
+ .data_out (data_out1)
70
78
);
71
79
72
80
73
81
ram # (
74
- .WIDTH ( WIDTH ),
75
- .DEPTH ( DEPTH )
76
- )ram2_instant
77
- (
78
- .clock ( clock ),
79
- .we ( we ),
80
- .wr_addr ( wr_addr ),
81
- .data_in ( data_in ),
82
-
83
- .rd_addr ( rd_addr2 ),
84
- .data_out ( data_out2 )
82
+ .WIDTH (WIDTH ),
83
+ .DEPTH (DEPTH )
84
+ ) ram2_instant (
85
+ .clock (clock ),
86
+ .we (we ),
87
+ .wr_addr (wr_addr ),
88
+ .data_in (data_in ),
89
+
90
+ .rd_addr (rd_addr2 ),
91
+ .data_out (data_out2)
85
92
);
86
93
87
94
endmodule
88
95
89
96
// Quartus Prime SystemVerilog Template
90
- //
97
+ //
91
98
// Mixed-width RAM with separate read and write addresses and data widths
92
99
// that are controlled by the parameters RW and WW. RW and WW must specify a
93
100
// read/write ratio supported by the memory blocks in your target device.
94
101
// Otherwise, Quartus Prime will not infer a RAM.
95
102
96
- module mixed_width_ram
97
- # ( parameter int
98
- WORDS = 256 ,
99
- RW = 8 ,
100
- WW = 32 )
101
- (
102
- input we,
103
- input clock,
104
- input [0 : $clog2((RW < WW ) ? WORDS : (WORDS * RW )/ WW ) - 1 ] wr_addr,
105
- input [0 : WW - 1 ] data_in,
106
- input [0 : $clog2((RW < WW ) ? (WORDS * WW )/ RW : WORDS ) - 1 ] rd_addr,
103
+ module mixed_width_ram # (
104
+ parameter int
105
+ WORDS = 256 ,
106
+ RW = 8 ,
107
+ WW = 32
108
+ ) (
109
+ input we ,
110
+ input clock ,
111
+ input [0 : $clog2((RW < WW ) ? WORDS : (WORDS * RW )/ WW ) - 1 ] wr_addr,
112
+ input [0 : WW - 1 ] data_in ,
113
+ input [0 : $clog2((RW < WW ) ? (WORDS * WW )/ RW : WORDS ) - 1 ] rd_addr,
107
114
output logic [0 : RW - 1 ] data_out
108
115
);
109
-
116
+
110
117
// Use a multi-dimensional packed array to model the different read/write
111
118
// width
112
- localparam int R = (RW < WW ) ? WW / RW : RW / WW ;
113
- localparam int B = (RW < WW ) ? RW : WW ;
119
+ localparam int R = (RW < WW ) ? WW / RW : RW / WW ;
120
+ localparam int B = (RW < WW ) ? RW : WW ;
114
121
115
122
logic [0 : R - 1 ][0 : B - 1 ] ram[0 : WORDS - 1 ];
116
123
117
124
generate if (RW < WW ) begin
118
- // Smaller read?
119
- always_ff @ (posedge clock)
120
- begin
121
- if (we) ram[wr_addr] <= data_in;
122
- data_out <= ram[rd_addr / R ][rd_addr % R ];
123
- end
124
- end
125
- else begin
126
- // Smaller write?
127
- always_ff @ (posedge clock)
128
- begin
129
- if (we) ram[wr_addr / R ][wr_addr % R ] <= data_in;
130
- data_out <= ram[rd_addr];
131
- end
132
- end
133
- endgenerate
134
-
135
- endmodule : mixed_width_ram
125
+ // Smaller read?
126
+ always_ff @ (posedge clock)
127
+ begin
128
+ if (we) ram[wr_addr] <= data_in;
129
+ data_out <= ram[rd_addr / R ][rd_addr % R ];
130
+ end
131
+ end
132
+ else begin
133
+ // Smaller write?
134
+ always_ff @ (posedge clock)
135
+ begin
136
+ if (we) ram[wr_addr / R ][wr_addr % R ] <= data_in;
137
+ data_out <= ram[rd_addr];
138
+ end
139
+ end
140
+ endgenerate
141
+
142
+ endmodule : mixed_width_ram
0 commit comments