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

Subversion Repositories mem_ctrl

[/] [mem_ctrl/] [trunk/] [rtl/] [verilog/] [mc_refresh.v] - Blame information for rev 4

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

Line No. Rev Author Line
1 4 rudi
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  WISHBONE Memory Controller                                 ////
4
////  Refresh Module                                             ////
5
////                                                             ////
6
////                                                             ////
7
////  Author: Rudolf Usselmann                                   ////
8
////          rudi@asics.ws                                      ////
9
////                                                             ////
10
////                                                             ////
11
////  Downloaded from: http://www.opencores.org/cores/mem_ctrl/  ////
12
////                                                             ////
13
/////////////////////////////////////////////////////////////////////
14
////                                                             ////
15
//// Copyright (C) 2000 Rudolf Usselmann                         ////
16
////                    rudi@asics.ws                            ////
17
////                                                             ////
18
//// This source file may be used and distributed without        ////
19
//// restriction provided that this copyright statement is not   ////
20
//// removed from the file and that any derivative work contains ////
21
//// the original copyright notice and the associated disclaimer.////
22
////                                                             ////
23
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
24
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
25
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
26
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
27
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
28
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
29
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
30
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
31
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
32
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
33
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
34
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
35
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
36
////                                                             ////
37
/////////////////////////////////////////////////////////////////////
38
 
39
//  CVS Log
40
//
41
//  $Id: mc_refresh.v,v 1.1 2001-07-29 07:34:41 rudi Exp $
42
//
43
//  $Date: 2001-07-29 07:34:41 $
44
//  $Revision: 1.1 $
45
//  $Author: rudi $
46
//  $Locker:  $
47
//  $State: Exp $
48
//
49
// Change History:
50
//               $Log: not supported by cvs2svn $
51
//               Revision 1.3  2001/06/12 15:19:49  rudi
52
//
53
//
54
//               Minor changes after running lint, and a small bug fix reading csr and ba_mask registers.
55
//
56
//               Revision 1.2  2001/06/03 11:37:17  rudi
57
//
58
//
59
//               1) Fixed Chip Select Mask Register
60
//                      - Power On Value is now all ones
61
//                      - Comparison Logic is now correct
62
//
63
//               2) All resets are now asynchronous
64
//
65
//               3) Converted Power On Delay to an configurable item
66
//
67
//               4) Added reset to Chip Select Output Registers
68
//
69
//               5) Forcing all outputs to Hi-Z state during reset
70
//
71
//               Revision 1.1.1.1  2001/05/13 09:39:47  rudi
72
//               Created Directory Structure
73
//
74
//
75
//
76
//
77
 
78
`include "mc_defines.v"
79
 
80
module mc_refresh(clk, rst,
81
                cs_need_rfr, ref_int, rfr_req, rfr_ack,
82
                rfr_ps_val
83
                );
84
 
85
input           clk, rst;
86
input   [7:0]    cs_need_rfr;
87
input   [2:0]    ref_int;
88
output          rfr_req;
89
input           rfr_ack;
90
input   [7:0]    rfr_ps_val;
91
 
92
////////////////////////////////////////////////////////////////////
93
//
94
// Local Registers & Wires
95
//
96
 
97
reg             rfr_en;
98
reg     [7:0]    ps_cnt;
99
wire            ps_cnt_clr;
100
reg             rfr_ce;
101
reg     [7:0]    rfr_cnt;
102
reg             rfr_clr;
103
reg             rfr_req;
104
reg             rfr_early;
105
 
106
/*
107
Refresh generation
108
 
109
The prescaler generates a 0.48828 uS clock enable
110
 
111
The refresh counter generates the following refresh rates:
112
(Actual values are about 0.63% below the desired values).
113
This is for a 200 Mhz WISHBONE Bus.
114
0.970 uS,
115
1.940
116
3.880
117
7.760
118
15.520
119
32.040
120
62.080
121
124.160 uS
122
 
123
(desired values)
124
0.976 uS
125
1.953
126
3.906
127
7.812
128
15.625
129
31.250
130
62.500
131
125.000 uS
132
*/
133
 
134
////////////////////////////////////////////////////////////////////
135
//
136
// Prescaler
137
//
138
 
139
always @(posedge clk)
140
        rfr_en <= #1 |cs_need_rfr;
141
 
142
always @(posedge clk or negedge rst)
143
        if(!rst)                        ps_cnt <= #1 8'h0;
144
        else
145
        if(ps_cnt_clr)                  ps_cnt <= #1 8'h0;
146
        else
147
        if(rfr_en)                      ps_cnt <= #1 ps_cnt + 8'h1;
148
 
149
assign ps_cnt_clr = (ps_cnt == rfr_ps_val) & (rfr_ps_val != 8'h0);
150
 
151
always @(posedge clk)
152
        rfr_early <= #1 (ps_cnt == rfr_ps_val);
153
 
154
////////////////////////////////////////////////////////////////////
155
//
156
// Refresh Counter
157
//
158
 
159
always @(posedge clk)
160
        rfr_ce <= #1 ps_cnt_clr;
161
 
162
always @(posedge clk or negedge rst)
163
        if(!rst)                rfr_cnt <= #1 8'h0;
164
        else
165
        if(rfr_ack)             rfr_cnt <= #1 8'h0;
166
        else
167
        if(rfr_ce)              rfr_cnt <= #1 rfr_cnt + 8'h1;
168
 
169
always @(posedge clk)
170
        case(ref_int)           // synopsys full_case parallel_case
171
           3'h0: rfr_clr <= #1  rfr_cnt[0]   & rfr_early;
172
           3'h1: rfr_clr <= #1 &rfr_cnt[1:0] & rfr_early;
173
           3'h2: rfr_clr <= #1 &rfr_cnt[2:0] & rfr_early;
174
           3'h3: rfr_clr <= #1 &rfr_cnt[3:0] & rfr_early;
175
           3'h4: rfr_clr <= #1 &rfr_cnt[4:0] & rfr_early;
176
           3'h5: rfr_clr <= #1 &rfr_cnt[5:0] & rfr_early;
177
           3'h6: rfr_clr <= #1 &rfr_cnt[6:0] & rfr_early;
178
           3'h7: rfr_clr <= #1 &rfr_cnt[7:0] & rfr_early;
179
        endcase
180
 
181
always @(posedge clk or negedge rst)
182
        if(!rst)                rfr_req <= #1 1'b0;
183
        else
184
        if(rfr_ack)             rfr_req <= #1 1'b0;
185
        else
186
        if(rfr_clr)             rfr_req <= #1 1'b1;
187
 
188
endmodule

powered by: WebSVN 2.1.0

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