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

Subversion Repositories ata

[/] [ata/] [trunk/] [rtl/] [verilog/] [ocidec-1/] [atahost_controller.v] - Blame information for rev 22

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

Line No. Rev Author Line
1 22 rherveille
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  OCIDEC-1 ATA Controller                                    ////
4
////  Main Controller                                            ////
5
////                                                             ////
6
////  Author: Richard Herveille                                  ////
7
////          richard@asics.ws                                   ////
8
////          www.asics.ws                                       ////
9
////                                                             ////
10
/////////////////////////////////////////////////////////////////////
11
////                                                             ////
12
//// Copyright (C) 2001, 2002 Richard Herveille                  ////
13
////                          richard@asics.ws                   ////
14
////                                                             ////
15
//// This source file may be used and distributed without        ////
16
//// restriction provided that this copyright statement is not   ////
17
//// removed from the file and that any derivative work contains ////
18
//// the original copyright notice and the associated disclaimer.////
19
////                                                             ////
20
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
21
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
22
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
23
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
24
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
25
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
26
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
27
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
28
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
29
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
30
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
31
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
32
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
33
////                                                             ////
34
/////////////////////////////////////////////////////////////////////
35 15 rherveille
 
36 22 rherveille
//  CVS Log
37 15 rherveille
//
38 22 rherveille
//  $Id: atahost_controller.v,v 1.2 2002-02-16 10:42:17 rherveille Exp $
39
//
40
//  $Date: 2002-02-16 10:42:17 $
41
//  $Revision: 1.2 $
42
//  $Author: rherveille $
43
//  $Locker:  $
44
//  $State: Exp $
45
//
46
// Change History:
47
//               rev.: 1.0  june  28th, 2001. Initial Verilog release
48
//               rev.: 1.1  July   3rd, 2001. Rewrote "IORDY" and "INTRQ" capture section.
49
//               rev.: 1.2  July   9th, 2001. Added "timescale". Undid "IORDY & INTRQ" rewrite.
50
//               rev.: 1.3  July  11th, 2001. Changed PIOreq & PIOack generation (made them synchronous). 
51
//               rev.: 1.4  July  26th, 2001. Fixed non-blocking assignments.
52
//
53
//               $Log: not supported by cvs2svn $
54
//
55
//
56 15 rherveille
 
57
`include "timescale.v"
58
 
59
module atahost_controller (clk, nReset, rst, irq, IDEctrl_rst, IDEctrl_IDEen,
60
                        PIO_cmdport_T1, PIO_cmdport_T2, PIO_cmdport_T4, PIO_cmdport_Teoc, PIO_cmdport_IORDYen,
61
                        PIOreq, PIOack, PIOa, PIOd, PIOq, PIOwe,
62
                        RESETn, DDi, DDo, DDoe, DA, CS0n, CS1n, DIORn, DIOWn, IORDY, INTRQ);
63
        //
64
        // parameter declarations
65
        //
66
        parameter TWIDTH = 8;              // counter width
67
        // PIO mode 0 timing settings @100MHz master clock
68
        parameter PIO_mode0_T1   = 6;      // 70ns
69
        parameter PIO_mode0_T2   = 28;     // 290ns
70
        parameter PIO_mode0_T4   = 2;      // 30ns
71
        parameter PIO_mode0_Teoc = 23;     // 240ns ==> T0 - T1 - T2 = 600 - 70 - 290 = 240
72
        //
73
        // inputs & outputs
74
        //
75
        input  clk; //master clock
76
        input  nReset; // asynchronous active low reset
77
        input  rst; // synchronous active high reset
78
 
79
        output irq; // interrupt request signal
80
        reg irq;
81
 
82
        // control bits
83
        input  IDEctrl_rst;
84
        input  IDEctrl_IDEen;
85
 
86
        // PIO timing registers
87
        input  [7:0] PIO_cmdport_T1;
88
        input  [7:0] PIO_cmdport_T2;
89
        input  [7:0] PIO_cmdport_T4;
90
        input  [7:0] PIO_cmdport_Teoc;
91
        input        PIO_cmdport_IORDYen;
92
 
93
        // PIO control signals
94
        input         PIOreq; // PIO transfer request
95
        output        PIOack; // PIO transfer ended
96
        input  [ 3:0] PIOa;   // PIO address
97
        input  [15:0] PIOd;   // PIO data in
98
        output [15:0] PIOq;   // PIO data out
99
        input         PIOwe;  // PIO direction  bit. 1'b1==write, 1'b0==read
100
 
101
        reg [15:0] PIOq;
102
        reg PIOack;
103
 
104
        // ATA signals
105
        output        RESETn;
106
        input  [15:0] DDi;
107
        output [15:0] DDo;
108
        output        DDoe;
109
        output [ 2:0] DA;
110
        output        CS0n;
111
        output        CS1n;
112
        output        DIORn;
113
        output        DIOWn;
114
        input         IORDY;
115
        input         INTRQ;
116
 
117
        reg        RESETn;
118
        reg [15:0] DDo;
119
        reg        DDoe;
120
        reg [ 2:0] DA;
121
        reg        CS0n;
122
        reg        CS1n;
123
        reg        DIORn;
124
        reg        DIOWn;
125
 
126
        //
127
        // Variable declarations
128
        //
129
 
130
        reg dPIOreq;
131
        reg PIOgo;   // start PIO timing controller
132
        wire PIOdone; // PIO timing controller done
133
 
134
        // PIO signals
135
        wire PIOdior, PIOdiow;
136
        wire PIOoe;
137
 
138
        // Timing settings
139
        wire              dstrb;
140
        wire [TWIDTH-1:0] T1, T2, T4, Teoc;
141
        wire              IORDYen;
142
 
143
        // synchronized ATA inputs
144
        reg sIORDY;
145
 
146
        //
147
        // Module body
148
        //
149
 
150
 
151
        // synchronize incoming signals
152
        reg cIORDY;                               // capture IORDY
153
        reg cINTRQ;                               // capture INTRQ
154
 
155
        always@(posedge clk)
156
        begin : synch_incoming
157
 
158
                cIORDY <= IORDY;
159
                cINTRQ <= INTRQ;
160
 
161
                sIORDY <= cIORDY;
162
                irq <= cINTRQ;
163
        end
164
 
165
        // generate ATA signals
166
        always@(posedge clk or negedge nReset)
167
                if (~nReset)
168
                        begin
169
                                RESETn <= 1'b0;
170
                                DIORn  <= 1'b1;
171
                                DIOWn  <= 1'b1;
172
                                DA     <= 0;  // ????
173
                                CS0n      <= 1'b1;
174
                                CS1n      <= 1'b1;
175
                                DDo    <= 0;
176
                                DDoe   <= 1'b0;
177
                        end
178
                else if (rst)
179
                        begin
180
                                RESETn <= 1'b0;
181
                                DIORn  <= 1'b1;
182
                                DIOWn  <= 1'b1;
183
                                DA     <= 0;  // ????
184
                                CS0n      <= 1'b1;
185
                                CS1n      <= 1'b1;
186
                                DDo    <= 0;
187
                                DDoe   <= 1'b0;
188
                        end
189
                else
190
                        begin
191
                                RESETn <= !IDEctrl_rst;
192
                                DA     <= PIOa[2:0];
193
                                CS0n      <= !( !PIOa[3] & PIOreq); // CS0 asserted when A(3) = '0'
194
                                CS1n      <= !(  PIOa[3] & PIOreq); // CS1 asserted when A(3) = '1'
195
 
196
                                DDo    <= PIOd;
197
                                DDoe   <= PIOoe;
198
                                DIORn  <= !PIOdior;
199
                                DIOWn  <= !PIOdiow;
200
                        end
201
 
202
 
203
        //
204
        //////////////////////////
205
        // PIO transfer control //
206
        //////////////////////////
207
        //
208
        // capture ATA data for PIO access
209
        always@(posedge clk)
210
                if (dstrb)
211
                        PIOq <= DDi;
212
 
213
        // generate PIOgo signal
214
        always@(posedge clk)
215
        begin
216
                dPIOreq <= PIOreq & !PIOack;
217
                PIOgo <= (PIOreq & !dPIOreq) & IDEctrl_IDEen;
218
        end
219
 
220
        // set Timing signals
221
        assign T1      = PIO_cmdport_T1;
222
        assign T2      = PIO_cmdport_T2;
223
        assign T4      = PIO_cmdport_T4;
224
        assign Teoc    = PIO_cmdport_Teoc;
225
        assign IORDYen = PIO_cmdport_IORDYen;
226
 
227
        // hookup timing controller
228
        atahost_pio_tctrl #(TWIDTH, PIO_mode0_T1, PIO_mode0_T2, PIO_mode0_T4, PIO_mode0_Teoc)
229
                PIO_timing_controller (.clk(clk), .nReset(nReset), .rst(rst), .IORDY_en(IORDYen), .T1(T1), .T2(T2), .T4(T4), .Teoc(Teoc),
230
                        .go(PIOgo), .we(PIOwe), .oe(PIOoe), .done(PIOdone), .dstrb(dstrb), .DIOR(PIOdior), .DIOW(PIOdiow), .IORDY(sIORDY) );
231
 
232
        always@(posedge clk)
233
                PIOack <= PIOdone | (PIOreq & !IDEctrl_IDEen); // acknowledge when done or when IDE not enabled (discard request)
234
 
235
endmodule
236 22 rherveille
 

powered by: WebSVN 2.1.0

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