Subversion Repositories ngs

Rev

Rev 58 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
58 lvd 1
/*
2
  read sequence
3
 
4
clk   ``\____/````\____/` ..... _/````\____/````\____/` ..... _/````\____/````\____/`
5
             |         |         |         |         |         |         |
6
start XXXX```````````\__ ....... ____________________________________________________
7
             |         |         |         |         |         |         |
8
rnw   XXXXXX```XXXXXXXXX ....... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9
             |         | some    |         |         |         |         |
10
ready XXXXXXX\__________ clocks __/``````````````````  ....... ```````````\__________
11
                         before                                |         |
12
rdat  ------------------ ready  -< cell 0  | cell 1  | ....... |last cell>-----------
13
             |         |         |         |         |         |         |
14
stop  XXXXXXX\__________ ....... _____________________ ....... ___________/``````````
15
                                                                            ^all operations stopped until next start strobe
16
 
17
 
18
 
19
  write sequence
20
 
21
clk   ``\____/````\____/` ..... _/````\____/````\____/````\____/````\____/````\____/````\____/````\____/
22
             |         | some    |         | some    |         |         |         |         |         |
23
start XXXX```````````\__ ....... _____________ .... ______________ .... ________________________________
24
             |         | clocks  |         | clocks  |         |         |         |         |         |
25
rnw   XXXXXX___XXXXXXXXX ....... XXXXXXXXXXXXX .... XXXXXXXXXXXXXX .... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
26
             |         | before  |         | before  |         |         |         |         |         |
27
ready XXXXXXX\__________ ....... _/`````````\_ .... __/`````````\_ .... __/`````````\___________________
28
             |         | first   |         | next    |         |         |         |         |         |
29
wdat  XXXXXXXXXXXXXXXXXXXXXXXXXXXX< cell 0  >X .... XX< cell 1  >X .... XX<last cell>XXXXXXXXXXXXXXXXXXX
30
             |         | ready   |         | ready   |         |         |         |         |         |
31
stop  XXXXXXX\__________ ....... _____________ .... ______________ .... ____________/```````````````````
32
             |         | strobe  |         | strobe  |         |         |         |         |         |
33
 
34
 
35
 
36
 
37
clk   ``\____/````\____/````\____/````\____/````\____/````\____/````\____/````\____/````\____/````\____/````\____/````\____/``
38
             |         |         |         |         |         |         |         |         |         |         |         |
39
ready __________________/`````````\___________________/`````````\___________________/`````````\___________________/`````````\_
40
             |         |         |         |         |         |         |         |         |         |         |         |
41
wdat           cell 0             | cell 1                      | cell 2                      | cell 3                      |
42
             |         |         |         |         |         |         |         |         |         |         |         |
43
sram_adr XXXXXXXXXXXXXXXXXXXXXXXXX| 0                           | 1                           | 2                           |
44
             |         |         |         |         |         |         |         |         |         |         |         |
45
sram_dat XXXXXXXXXXXXXXXXXXXXXXXXX| cell 0                      | cell 1                      | cell 2                      |
46
             |         |         |         |         |         |         |         |         |         |         |         |
47
sram_we_n```````````````````````````````````\_________/```````````````````\_________/```````````````````\_________/``````````
48
             | BEG     | PRE1    | PRE2    |         |         |         |         |         |         |         |         |
49
             |         |         | CYC1    | CYC2    | CYC3    | CYC1    | CYC2    | CYC3    | CYC1    | CYC2    | CYC3    |
50
 
51
 
52
 
53
 
54
 
55
 
56
*/
57
 
58
 
59
module sram_control(
60
 
61
        clk,
62
        clk2, //latching of SRAM data out
63
 
64
        start, // initializing input, address=0
65
 
66
        stop, // when all addresses are done, nothing will happen after stop is set, need another start signal
67
 
68
        rnw, // 1 - read, 0 - write sequence (latched when start=1)
69
 
70
        ready, // strobe. when writing, one mean that data from wdat written to the memory (2^SRAM_ADDR_SIZE strobes total)
71
               // when reading, one mean that data read from memory is on rdat output (2^SRAM_ADDR_SIZE strobes total)
72
 
73
 
74
        wdat, // input, data to be written to memory
75
        rdat, // output, data last read from memory
76
 
77
 
78
 
79
        SRAM_DQ,   // sram inout databus
80
 
81
        SRAM_ADDR, // sram address bus
82
 
83
        SRAM_UB_N, // sram control signals
84
        SRAM_LB_N, //
85
        SRAM_WE_N, //
86
        SRAM_CE_N, //
87
        SRAM_OE_N  //
88
);
89
 
90
parameter SRAM_DATA_SIZE = 16;
91
parameter SRAM_ADDR_SIZE = 18;
92
 
93
 
94
        input clk;
95
        input clk2;
96
 
97
        input start,rnw;
98
 
99
        output stop;
100
        reg    stop;
101
 
102
        output ready;
103
        reg    ready;
104
 
105
        input [SRAM_DATA_SIZE-1:0] wdat;
106
 
107
        output [SRAM_DATA_SIZE-1:0] rdat;
108
        reg    [SRAM_DATA_SIZE-1:0] rdat;
109
 
110
 
111
        inout [SRAM_DATA_SIZE-1:0] SRAM_DQ;
112
        reg   [SRAM_DATA_SIZE-1:0] SRAM_DQ;
113
 
114
        output [SRAM_ADDR_SIZE-1:0] SRAM_ADDR;
115
        wire   [SRAM_ADDR_SIZE-1:0] SRAM_ADDR;
116
 
117
        output SRAM_UB_N,SRAM_LB_N,SRAM_WE_N,SRAM_CE_N,SRAM_OE_N;
118
        reg    SRAM_UB_N,SRAM_LB_N,SRAM_WE_N,SRAM_CE_N,SRAM_OE_N;
119
 
120
 
121
        reg [SRAM_DATA_SIZE-1:0] wdat2;
122
        reg dbin; //data bus direction control
123
 
124
        reg  [SRAM_ADDR_SIZE:0] sram_addr_ctr; // one bit bigger to have stop flag
125
        wire [SRAM_ADDR_SIZE:0] sram_addr_nxt; // next sram address
126
 
127
 
128
        reg [SRAM_DATA_SIZE-1:0] rdat2;
129
 
130
        assign SRAM_ADDR = sram_addr_ctr[SRAM_ADDR_SIZE-1:0];
131
 
132
        assign sram_addr_nxt = sram_addr_ctr + 1;
133
 
134
 
135
        // data bus control
136
        always @*
137
        begin
138
                if( dbin )
139
                        SRAM_DQ <= 'hZ;
140
                else // !dbin
141
                        SRAM_DQ <= wdat2;
142
        end
143
 
144
        always @(posedge clk2) // clk2!!!! late latching
145
        begin
146
                rdat2 <= SRAM_DQ;
147
        end
148
 
149
        always @(posedge clk)
150
        begin
151
                rdat <= rdat2;
152
        end
153
 
154
 
155
        always @(posedge clk)
156
        begin
157
                if( ready ) wdat2 <= wdat;
158
        end
159
 
160
 
161
 
162
 
163
 
164
        reg [3:0] curr_state,next_state;
165
 
166
        parameter START_STATE = 4'd00; // reset state
167
 
168
        parameter INIT_STATE  = 4'd01; // initialization state
169
 
170
        parameter READ_BEG    = 4'd02; // read branch: prepare signals
171
        parameter READ_PRE    = 4'd13;
172
        parameter READ_CYCLE  = 4'd03; // read in progress: increment address, set ready, out data, do so until all addresses done
173
        parameter READ_POST   = 4'd14;
174
        parameter READ_END    = 4'd04; // read end: deassert some signals, go to stop state
175
 
176
        parameter WRITE_BEG   = 4'd05; // prepare signals
177
        parameter WRITE_PRE1  = 4'd06; // assert ready
178
        parameter WRITE_PRE2  = 4'd07; // capture wdat, negate ready, NO INCREMENT address, next state is WRITE_CYC2
179
        parameter WRITE_CYC1  = 4'd08; // capture wdat, negate ready, increment address
180
        parameter WRITE_CYC2  = 4'd09; // assert SRAM_WE_N, go to WRITE_END if sram_addr_nxt is out of memory region
181
        parameter WRITE_CYC3  = 4'd10; // negate SRAM_WE_N, assert ready (wdat will be captured in WRITE_CYC1)
182
        parameter WRITE_END   = 4'd11; // deassert sram control signals, go to STOP_STATE
183
 
184
 
185
        parameter STOP_STATE  = 4'd12; // full stop state
186
 
187
 
188
 
189
        // FSM states
190
        always @*
191
        begin
192
                case( curr_state )
193
 
194
////////////////////////////////////////////////////////////////////////
195
                START_STATE:
196
                        next_state = INIT_STATE;
197
 
198
 
199
////////////////////////////////////////////////////////////////////////
200
                INIT_STATE:
201
                begin
202
                        if( rnw ) // read
203
                                next_state = READ_BEG;
204
                        else // !rnw - write
205
                                next_state = WRITE_BEG;
206
                end
207
 
208
 
209
 
210
 
211
////////////////////////////////////////////////////////////////////////
212
                READ_BEG:
213
                        next_state = READ_PRE;
214
 
215
                READ_PRE:
216
                        next_state = READ_CYCLE;
217
 
218
                READ_CYCLE:
219
                        if( !sram_addr_ctr[SRAM_ADDR_SIZE] )
220
                                next_state = READ_CYCLE;
221
                        else
222
                                next_state = READ_POST;
223
 
224
                READ_POST:
225
                        next_state = READ_END;
226
 
227
                READ_END:
228
                        next_state = STOP_STATE;
229
 
230
 
231
 
232
////////////////////////////////////////////////////////////////////////
233
                WRITE_BEG:
234
                        next_state = WRITE_PRE1;
235
 
236
                WRITE_PRE1:
237
                        next_state = WRITE_PRE2;
238
 
239
                WRITE_PRE2:
240
                        next_state = WRITE_CYC2;
241
 
242
 
243
                WRITE_CYC1:
244
                        next_state = WRITE_CYC2;
245
 
246
                WRITE_CYC2:
247
                        if( !sram_addr_nxt[SRAM_ADDR_SIZE] )
248
                                next_state = WRITE_CYC3;
249
                        else
250
                                next_state = WRITE_END;
251
 
252
                WRITE_CYC3:
253
                        next_state = WRITE_CYC1;
254
 
255
                WRITE_END:
256
                        next_state = STOP_STATE;
257
 
258
 
259
 
260
////////////////////////////////////////////////////////////////////////
261
                STOP_STATE:
262
                        next_state = STOP_STATE;
263
 
264
 
265
 
266
 
267
////////////////////////////////////////////////////////////////////////
268
                default:
269
                        next_state = STOP_STATE;
270
 
271
                endcase
272
 
273
        end
274
 
275
 
276
 
277
        // FSM flip-flops
278
        always @(posedge clk)
279
        begin
280
                if( start )
281
                        curr_state <= START_STATE;
282
                else
283
                        curr_state <= next_state;
284
        end
285
 
286
 
287
        // FSM outputs
288
        always @(posedge clk)
289
        begin
290
                case( next_state )
291
 
292
////////////////////////////////////////////////////////////////////////
293
                INIT_STATE:
294
                begin
295
                        stop <= 1'b0;
296
 
297
                        SRAM_UB_N <= 1'b1;
298
                        SRAM_LB_N <= 1'b1;
299
                        SRAM_CE_N <= 1'b1;
300
                        SRAM_OE_N <= 1'b1;
301
                        SRAM_WE_N <= 1'b1;
302
 
303
                        dbin <= 1'b1;
304
 
305
                        sram_addr_ctr <= 0;
306
 
307
                        ready <= 1'b0;
308
                end
309
 
310
 
311
 
312
////////////////////////////////////////////////////////////////////////
313
                READ_BEG:
314
                begin
315
                        SRAM_UB_N <= 1'b0;
316
                        SRAM_LB_N <= 1'b0;
317
                        SRAM_CE_N <= 1'b0;
318
                        SRAM_OE_N <= 1'b0;
319
                end
320
 
321
                READ_PRE:
322
                begin
323
                  sram_addr_ctr <= sram_addr_nxt;
324
                end
325
 
326
                READ_CYCLE:
327
                begin
328
                        ready <= 1'b1;
329
 
330
                  sram_addr_ctr <= sram_addr_nxt;
331
                end
332
 
333
                READ_POST:
334
                begin
335
                        ready <= 1'b0; // in read sequence, ready and data are 2 cycles past the actual read.
336
                end
337
 
338
                READ_END:
339
                begin
340
                        SRAM_UB_N <= 1'b1;
341
                        SRAM_LB_N <= 1'b1;
342
                        SRAM_CE_N <= 1'b1;
343
                        SRAM_OE_N <= 1'b1;
344
 
345
                        ready <= 1'b0;
346
                end
347
 
348
 
349
 
350
 
351
////////////////////////////////////////////////////////////////////////
352
                WRITE_BEG:
353
                begin
354
                        SRAM_UB_N <= 1'b0;
355
                        SRAM_LB_N <= 1'b0;
356
                        SRAM_CE_N <= 1'b0;
357
 
358
                        dbin <= 1'b0;
359
                end
360
 
361
                WRITE_PRE1:
362
                begin
363
                        ready <= 1'b1;
364
                end
365
 
366
                WRITE_PRE2:
367
                begin
368
                        ready <= 1'b0;
369
                end
370
 
371
 
372
                WRITE_CYC1:
373
                begin
374
                        ready <= 1'b0;
375
 
376
                        sram_addr_ctr <= sram_addr_nxt;
377
                end
378
 
379
                WRITE_CYC2:
380
                begin
381
                        SRAM_WE_N <= 1'b0;
382
                end
383
 
384
                WRITE_CYC3:
385
                begin
386
                        SRAM_WE_N <= 1'b1;
387
 
388
                        ready <= 1'b1;
389
                end
390
 
391
                WRITE_END:
392
                begin
393
                        ready <= 1'b0;
394
 
395
                        SRAM_WE_N <= 1'b1;
396
                        SRAM_UB_N <= 1'b1;
397
                        SRAM_LB_N <= 1'b1;
398
                        SRAM_CE_N <= 1'b1;
399
                end
400
 
401
 
402
////////////////////////////////////////////////////////////////////////
403
                STOP_STATE:
404
                begin
405
                        stop <= 1'b1;
406
                end
407
 
408
                endcase
409
        end
410
 
411
 
412
endmodule
413