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

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [lib/] [opencores/] [ata/] [ata_device_oc.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  ATA (IDE) Device Model                                     ////
4
////  This Model Supports PIO cycles only !                      ////
5
////                                                             ////
6
////                                                             ////
7
////  Author: Rudolf Usselmann                                   ////
8
////          rudi@asics.ws                                      ////
9
////                                                             ////
10
////                                                             ////
11
////  Downloaded from: http://www.opencores.org/cores/ata/       ////
12
////                                                             ////
13
/////////////////////////////////////////////////////////////////////
14
////                                                             ////
15
//// Copyright (C) 2001 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: ata_device.v,v 1.2 2002/02/25 06:07:21 rherveille Exp $
42
//
43
//  $Date: 2002/02/25 06:07:21 $
44
//  $Revision: 1.2 $
45
//  $Author: rherveille $
46
//  $Locker:  $
47
//  $State: Exp $
48
//
49
// Change History:
50
//               $Log: ata_device.v,v $
51
//               Revision 1.2  2002/02/25 06:07:21  rherveille
52
//               Fixed data-latch bug (posedge ata_diow instead of negedge ata_diow).
53
//
54
//               Revision 1.1  2001/08/16 10:01:05  rudi
55
//
56
//               - Added Test Bench
57
//               - Added Synthesis scripts for Design Compiler
58
//               - Fixed minor bug in atahost_top
59
//
60
//
61
//
62
//
63
//                        
64
 
65
// Modified by Nils-Johan Wessman 
66
 
67
`timescale 1ns / 10ps
68
 
69
module ata_device_oc(   ata_rst_n, ata_data, ata_da, ata_cs0, ata_cs1,
70
         ata_dior_n, ata_diow_n, ata_iordy, ata_intrq );
71
input    ata_rst_n;
72
inout [15:0]   ata_data;
73
input [2:0] ata_da;
74
input    ata_cs0, ata_cs1;
75
input    ata_dior_n, ata_diow_n;
76
output      ata_iordy;
77
output      ata_intrq;
78
 
79
integer     mode;
80
integer     n;
81
reg      ata_iordy;
82
reg      iordy_enable;
83
reg      ata_intrq;
84
integer     iordy_delay;
85
 
86
reg   [15:0]   mem[32:0];
87
reg   [15:0]   dout;
88
reg      dout_en;
89
wire     ata_rst_m0, ata_rst_m1, ata_rst_m2, ata_rst_m3, ata_rst_m4;
90
wire  [4:0] addr;
91
wire     ata_dior, ata_diow;
92
 
93
initial
94
   begin
95
   dout_en = 0;
96
   mode = 0;
97
   iordy_enable = 0;
98
   iordy_delay  = 0;
99
   ata_iordy    = 1;
100
   ata_intrq    = 0;
101
   end
102
 
103
assign ata_dior = !ata_dior_n;
104
assign ata_diow = !ata_diow_n;
105
 
106
//assign ata_intrq = 0;
107
 
108
assign ata_data = dout_en ? dout : 16'hzzzz;
109
 
110
assign addr = {~ata_cs1, ~ata_cs0, ata_da};
111
 
112
always @(posedge ata_rst_n)
113
   dout_en = 0;
114
 
115
always @(posedge ata_dior)
116
   begin
117
   dout = mem[ addr ];
118
   dout_en = 1;
119
   ata_intrq = 1;
120
   end
121
 
122
//always @(posedge ata_dior)
123
always @(negedge ata_dior)
124
   begin
125
   dout_en = 0;
126
   ata_intrq = 0;
127
   end
128
 
129
always @(posedge ata_diow)
130
   begin
131
   mem[ addr ] = ata_data;
132
   end
133
 
134
always @(posedge ata_dior or posedge ata_diow)
135
   begin
136
   ata_iordy = 1'b0;
137
   #(iordy_delay);
138
   ata_iordy = 1'b1;
139
   end
140
 
141
task init_mem;
142
 
143
begin
144
 
145
for(n=0;n<32;n=n+1)
146
   mem[n] = n;
147
end
148
endtask
149
 
150
assign ata_rst_m0 = ata_rst_n & (mode==0);
151
assign ata_rst_m1 = ata_rst_n & (mode==1);
152
assign ata_rst_m2 = ata_rst_n & (mode==2);
153
assign ata_rst_m3 = ata_rst_n & (mode==3);
154
assign ata_rst_m4 = ata_rst_n & (mode==4);
155
 
156
specify
157
        specparam // ATA Mode 0 Timing
158
         M0_DioCycle = 600,         // T0
159
            M0_AddrSetup   = 70,       // T1
160
         M0_DioHigh  = 290,         // T2
161
         M0_WrSetup  = 60,       // T3
162
         M0_WrHold   = 30,       // T4
163
         M0_DoutSetup   = 50,       // T5
164
         M0_DoutHold = 5,        // T6
165
            M0_AddrHold = 20,       // T9
166
 
167
         // ATA Mode 1 Timing
168
         M1_DioCycle = 383,         // T0
169
            M1_AddrSetup   = 50,       // T1
170
         M1_DioHigh  = 290,         // T2
171
         M1_WrSetup  = 45,       // T3
172
         M1_WrHold   = 20,       // T4
173
         M1_DoutSetup   = 35,       // T5
174
         M1_DoutHold = 5,        // T6
175
            M1_AddrHold = 15,       // T9
176
 
177
         // ATA Mode 2 Timing
178
         M2_DioCycle = 330,         // T0
179
            M2_AddrSetup   = 30,       // T1
180
         M2_DioHigh  = 290,         // T2
181
         M2_WrSetup  = 30,       // T3
182
         M2_WrHold   = 15,       // T4
183
         M2_DoutSetup   = 20,       // T5
184
         M2_DoutHold = 5,        // T6
185
            M2_AddrHold = 10,       // T9
186
 
187
         // ATA Mode 3 Timing
188
         M3_DioCycle = 180,         // T0
189
            M3_AddrSetup   = 30,       // T1
190
         M3_DioHigh  = 80,       // T2
191
         M3_DioLow   = 70,       // T2i
192
         M3_WrSetup  = 30,       // T3
193
         M3_WrHold   = 10,       // T4
194
         M3_DoutSetup   = 20,       // T5
195
         M3_DoutHold = 5,        // T6
196
            M3_AddrHold = 10,       // T9
197
 
198
         // ATA Mode 4 Timing
199
         M4_DioCycle = 120,         // T0
200
            M4_AddrSetup   = 25,       // T1
201
         M4_DioHigh  = 70,       // T2
202
         M4_DioLow   = 25,       // T2i
203
         M4_WrSetup  = 20,       // T3
204
         M4_WrHold   = 10,       // T4
205
         M4_DoutSetup   = 20,       // T5
206
         M4_DoutHold = 5,        // T6
207
            M4_AddrHold = 10;       // T9
208
 
209
 
210
 
211
   /////////////////////////////////////////////////////
212
   // ATA Mode 0 Timing                               //
213
   /////////////////////////////////////////////////////
214
 
215
   // Output Delay Path
216
   if(mode==0) (ata_dior_n => ata_data) = //(01,10,0z,z1,1z,z0)
217
               (0,0,
218
               M0_DoutHold, (M0_DioHigh - M0_DoutSetup),
219
               M0_DoutHold, (M0_DioHigh - M0_DoutSetup) );
220
 
221
   // Write Data Setup/Hold Check
222
   $setuphold(negedge ata_diow, ata_data, M0_WrSetup, M0_WrHold, , ,ata_rst_m0 );
223
 
224
   // DioX Active time Check
225
   $width(posedge ata_dior &&& ata_rst_m0, M0_DioHigh );
226
   $width(posedge ata_diow &&& ata_rst_m0, M0_DioHigh );
227
 
228
   // DioX Min Cycle Width Check
229
   $period(posedge ata_dior &&& ata_rst_m0, M0_DioCycle );
230
   $period(posedge ata_diow &&& ata_rst_m0, M0_DioCycle );
231
 
232
   // Address Setup Hold Checks
233
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m0, M0_AddrSetup);
234
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m0, M0_AddrSetup);
235
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m0, M0_AddrSetup);
236
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m0, M0_AddrSetup);
237
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m0, M0_AddrSetup);
238
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m0, M0_AddrSetup);
239
 
240
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m0, M0_AddrHold);
241
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m0, M0_AddrHold);
242
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m0, M0_AddrHold);
243
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m0, M0_AddrHold);
244
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m0, M0_AddrHold);
245
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m0, M0_AddrHold);
246
 
247
 
248
   /////////////////////////////////////////////////////
249
   // ATA Mode 1 Timing                               //
250
   /////////////////////////////////////////////////////
251
 
252
   // Output Delay Path
253
   if(mode==1) (ata_dior_n => ata_data) = //(01,10,0z,z1,1z,z0)
254
               (0,0,
255
               M1_DoutHold, (M1_DioHigh - M1_DoutSetup),
256
               M1_DoutHold, (M1_DioHigh - M1_DoutSetup) );
257
 
258
   // Write Data Setup/Hold Check
259
   $setuphold(negedge ata_diow, ata_data, M1_WrSetup, M1_WrHold, , ,ata_rst_m1 );
260
 
261
   // DioX Active time Check
262
   $width(posedge ata_dior &&& ata_rst_m1, M1_DioHigh );
263
   $width(posedge ata_diow &&& ata_rst_m1, M1_DioHigh );
264
 
265
   // DioX Min Cycle Width Check
266
   $period(posedge ata_dior &&& ata_rst_m1, M1_DioCycle );
267
   $period(posedge ata_diow &&& ata_rst_m1, M1_DioCycle );
268
 
269
   // Address Setup Hold Checks
270
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m1, M1_AddrSetup);
271
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m1, M1_AddrSetup);
272
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m1, M1_AddrSetup);
273
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m1, M1_AddrSetup);
274
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m1, M1_AddrSetup);
275
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m1, M1_AddrSetup);
276
 
277
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m1, M1_AddrHold);
278
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m1, M1_AddrHold);
279
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m1, M1_AddrHold);
280
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m1, M1_AddrHold);
281
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m1, M1_AddrHold);
282
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m1, M1_AddrHold);
283
 
284
 
285
   /////////////////////////////////////////////////////
286
   // ATA Mode 2 Timing                               //
287
   /////////////////////////////////////////////////////
288
 
289
   // Output Delay Path
290
   if(mode==2) (ata_dior_n => ata_data) = //(01,10,0z,z1,1z,z0)
291
               (0,0,
292
               M2_DoutHold, (M2_DioHigh - M2_DoutSetup),
293
               M2_DoutHold, (M2_DioHigh - M2_DoutSetup) );
294
 
295
   // Write Data Setup/Hold Check
296
   $setuphold(negedge ata_diow, ata_data, M2_WrSetup, M2_WrHold, , ,ata_rst_m2 );
297
 
298
   // DioX Active time Check
299
   $width(posedge ata_dior &&& ata_rst_m2, M2_DioHigh );
300
   $width(posedge ata_diow &&& ata_rst_m2, M2_DioHigh );
301
 
302
   // DioX Min Cycle Width Check
303
   $period(posedge ata_dior &&& ata_rst_m2, M2_DioCycle );
304
   $period(posedge ata_diow &&& ata_rst_m2, M2_DioCycle );
305
 
306
   // Address Setup Hold Checks
307
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m2, M2_AddrSetup);
308
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m2, M2_AddrSetup);
309
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m2, M2_AddrSetup);
310
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m2, M2_AddrSetup);
311
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m2, M2_AddrSetup);
312
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m2, M2_AddrSetup);
313
 
314
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m2, M2_AddrHold);
315
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m2, M2_AddrHold);
316
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m2, M2_AddrHold);
317
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m2, M2_AddrHold);
318
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m2, M2_AddrHold);
319
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m2, M2_AddrHold);
320
 
321
   /////////////////////////////////////////////////////
322
   // ATA Mode 3 Timing                               //
323
   /////////////////////////////////////////////////////
324
 
325
   // Output Delay Path
326
   if(mode==3) (ata_dior_n => ata_data) = //(01,10,0z,z1,1z,z0)
327
               (0,0,
328
               M3_DoutHold, (M3_DioHigh - M3_DoutSetup),
329
               M3_DoutHold, (M3_DioHigh - M3_DoutSetup) );
330
 
331
   // Write Data Setup/Hold Check
332
   $setuphold(negedge ata_diow, ata_data, M3_WrSetup, M3_WrHold, , ,ata_rst_m3 );
333
 
334
   // DioX Active time Check
335
   $width(posedge ata_dior &&& ata_rst_m3, M3_DioHigh );
336
   $width(posedge ata_diow &&& ata_rst_m3, M3_DioHigh );
337
 
338
   $width(negedge ata_dior &&& ata_rst_m3, M3_DioLow );
339
   $width(negedge ata_diow &&& ata_rst_m3, M3_DioLow );
340
 
341
   // DioX Min Cycle Width Check
342
   $period(posedge ata_dior &&& ata_rst_m3, M3_DioCycle );
343
   $period(posedge ata_diow &&& ata_rst_m3, M3_DioCycle );
344
 
345
   // Address Setup Hold Checks
346
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m3, M3_AddrSetup);
347
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m3, M3_AddrSetup);
348
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m3, M3_AddrSetup);
349
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m3, M3_AddrSetup);
350
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m3, M3_AddrSetup);
351
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m3, M3_AddrSetup);
352
 
353
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m3, M3_AddrHold);
354
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m3, M3_AddrHold);
355
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m3, M3_AddrHold);
356
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m3, M3_AddrHold);
357
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m3, M3_AddrHold);
358
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m3, M3_AddrHold);
359
 
360
 
361
   /////////////////////////////////////////////////////
362
   // ATA Mode 4 Timing                               //
363
   /////////////////////////////////////////////////////
364
 
365
   // Output Delay Path
366
   if(mode==4) (ata_dior_n => ata_data) = //(01,10,0z,z1,1z,z0)
367
               (0,0,
368
               M4_DoutHold, (M4_DioHigh - M4_DoutSetup),
369
               M4_DoutHold, (M4_DioHigh - M4_DoutSetup) );
370
 
371
   // Write Data Setup/Hold Check
372
   $setuphold(negedge ata_diow, ata_data, M4_WrSetup, M4_WrHold, , ,ata_rst_m4 );
373
 
374
   // DioX Active time Check
375
   $width(posedge ata_dior &&& ata_rst_m4, M4_DioHigh );
376
   $width(posedge ata_diow &&& ata_rst_m4, M4_DioHigh );
377
 
378
   $width(negedge ata_dior &&& ata_rst_m4, M4_DioLow );
379
   $width(negedge ata_diow &&& ata_rst_m4, M4_DioLow );
380
 
381
   // DioX Min Cycle Width Check
382
   $period(posedge ata_dior &&& ata_rst_m4, M4_DioCycle );
383
   $period(posedge ata_diow &&& ata_rst_m4, M4_DioCycle );
384
 
385
   // Address Setup Hold Checks
386
        $setup(ata_da,  posedge ata_dior &&& ata_rst_m4, M4_AddrSetup);
387
        $setup(ata_cs0, posedge ata_dior &&& ata_rst_m4, M4_AddrSetup);
388
        $setup(ata_cs1, posedge ata_dior &&& ata_rst_m4, M4_AddrSetup);
389
        $setup(ata_da,  posedge ata_diow &&& ata_rst_m4, M4_AddrSetup);
390
        $setup(ata_cs0, posedge ata_diow &&& ata_rst_m4, M4_AddrSetup);
391
        $setup(ata_cs1, posedge ata_diow &&& ata_rst_m4, M4_AddrSetup);
392
 
393
        $hold(ata_da,  negedge ata_dior &&& ata_rst_m4, M4_AddrHold);
394
        $hold(ata_cs0, negedge ata_dior &&& ata_rst_m4, M4_AddrHold);
395
        $hold(ata_cs1, negedge ata_dior &&& ata_rst_m4, M4_AddrHold);
396
        $hold(ata_da,  negedge ata_diow &&& ata_rst_m4, M4_AddrHold);
397
        $hold(ata_cs0, negedge ata_diow &&& ata_rst_m4, M4_AddrHold);
398
        $hold(ata_cs1, negedge ata_diow &&& ata_rst_m4, M4_AddrHold);
399
 
400
 
401
 
402
endspecify
403
 
404
 
405
endmodule
406
 
407
 

powered by: WebSVN 2.1.0

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