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/] [gaisler/] [ata/] [ocidec2_amba_slave.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
------------------------------------------------------------------------------
2
--  This file is a part of the GRLIB VHDL IP LIBRARY
3
--  Copyright (C) 2003, Gaisler Research
4
--
5
--  This program is free software; you can redistribute it and/or modify
6
--  it under the terms of the GNU General Public License as published by
7
--  the Free Software Foundation; either version 2 of the License, or
8
--  (at your option) any later version.
9
--
10
--  This program is distributed in the hope that it will be useful,
11
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
--  GNU General Public License for more details.
14
--
15
--  You should have received a copy of the GNU General Public License
16
--  along with this program; if not, write to the Free Software
17
--  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
18
-----------------------------------------------------------------------------
19
-- Entity: ocidec2_amba_slave 
20
-- File: ocidec2_amba_slave.vhd
21
-- Author:  Nils-Johan Wessman, Gaisler Research
22
-- Description: ATA controller
23
------------------------------------------------------------------------------
24
 
25
library ieee;
26
use ieee.std_logic_1164.all;
27
--use ieee.std_logic_arith.all;
28
use ieee.numeric_std.all;
29
library grlib;
30
use grlib.amba.all;
31
use grlib.stdlib.all;
32
library gaisler;
33
use grlib.devices.all;
34
use gaisler.memctrl.all;
35
 
36
entity ocidec2_amba_slave is
37
  generic (
38
    hindex  : integer := 0;
39
    haddr   : integer := 0;
40
    hmask   : integer := 16#ff0#;
41
    pirq    : integer := 0;
42
    DeviceID   : integer := 0;
43
    RevisionNo : integer := 0;
44
 
45
    -- PIO mode 0 settings (@100MHz clock)
46
    PIO_mode0_T1 : natural := 6;                -- 70ns
47
    PIO_mode0_T2 : natural := 28;               -- 290ns
48
    PIO_mode0_T4 : natural := 2;                -- 30ns
49
    PIO_mode0_Teoc : natural := 23;             -- 240ns ==> T0 - T1 - T2 = 600 - 70 - 290 = 240
50
 
51
    -- Multiword DMA mode 0 settings (@100MHz clock)
52
    DMA_mode0_Tm : natural := 4;                -- 50ns
53
    DMA_mode0_Td : natural := 21;               -- 215ns
54
    DMA_mode0_Teoc : natural := 21              -- 215ns ==> T0 - Td - Tm = 480 - 50 - 215 = 215
55
  );
56
  port (
57
    rst     : in  std_ulogic;
58
    arst    : in  std_ulogic;
59
    clk     : in  std_ulogic;
60
    ahbsi   : in  ahb_slv_in_type;
61
    ahbso   : out ahb_slv_out_type;
62
    cf_power: out std_logic;
63
    -- ata controller signals
64
 
65
    -- PIO control input
66
    PIOsel     : out std_logic;
67
    PIOtip,                                         -- PIO transfer in progress
68
    PIOack     : in std_logic;                      -- PIO acknowledge signal
69
    PIOq       : in std_logic_vector(15 downto 0);  -- PIO data input
70
    PIOpp_full : in std_logic;                      -- PIO write-ping-pong buffers full
71
    irq        : in std_logic;                      -- interrupt signal input
72
    PIOa       : out std_logic_vector(3 downto 0);
73
    PIOd       : out std_logic_vector(15 downto 0);
74
    PIOwe      : out std_logic;
75
 
76
    -- DMA control inputs
77
    DMAsel    : out std_logic;
78
    DMAtip,                                     -- DMA transfer in progress
79
    DMAack,                                     -- DMA transfer acknowledge
80
    DMARxEmpty,                                 -- DMA receive buffer empty
81
    DMATxFull,                                  -- DMA transmit buffer full
82
    DMA_dmarq : in std_logic;                   -- wishbone DMA request
83
    DMAq      : in std_logic_vector(31 downto 0);
84
 
85
    -- outputs
86
    -- control register outputs
87
    IDEctrl_rst,
88
    IDEctrl_IDEen,
89
    IDEctrl_FATR1,
90
    IDEctrl_FATR0,
91
    IDEctrl_ppen,
92
    DMActrl_DMAen,
93
    DMActrl_dir,
94
    DMActrl_BeLeC0,
95
    DMActrl_BeLeC1 : out std_logic;
96
 
97
    -- CMD port timing registers
98
    PIO_cmdport_T1,
99
    PIO_cmdport_T2,
100
    PIO_cmdport_T4,
101
    PIO_cmdport_Teoc    : out std_logic_vector(7 downto 0);
102
    PIO_cmdport_IORDYen : out std_logic;
103
 
104
    -- data-port0 timing registers
105
    PIO_dport0_T1,
106
    PIO_dport0_T2,
107
    PIO_dport0_T4,
108
    PIO_dport0_Teoc    : out std_logic_vector(7 downto 0);
109
    PIO_dport0_IORDYen : out std_logic;
110
 
111
    -- data-port1 timing registers
112
    PIO_dport1_T1,
113
    PIO_dport1_T2,
114
    PIO_dport1_T4,
115
    PIO_dport1_Teoc    : out std_logic_vector(7 downto 0);
116
    PIO_dport1_IORDYen : out std_logic;
117
 
118
    -- DMA device0 timing registers
119
    DMA_dev0_Tm,
120
    DMA_dev0_Td,
121
    DMA_dev0_Teoc    : out std_logic_vector(7 downto 0);
122
 
123
    -- DMA device1 timing registers
124
    DMA_dev1_Tm,
125
    DMA_dev1_Td,
126
    DMA_dev1_Teoc    : out std_logic_vector(7 downto 0)
127
  );
128
end;
129
 
130
 
131
architecture rtl of ocidec2_amba_slave is
132
 
133
constant VERSION : amba_version_type := 0;
134
constant hconfig : ahb_config_type := (
135
 
136
  4 => ahb_iobar(haddr, hmask),
137
  others => zero32);
138
 
139
type PIOtiming_type is record
140
   T1,T2,T4,Teoc  : std_logic_vector(7 downto 0);
141
end record;
142
type DMAtiming_type is record
143
   Tm,Td,Teoc  : std_logic_vector(7 downto 0);
144
end record;
145
 
146
-- local registers
147
type reg_type is record
148
   -- AHB signal
149
   hready    : std_ulogic;                    -- Hready
150
   hsel      : std_ulogic;                    -- Hsel
151
   hmbsel    : std_logic_vector(0 to 2);      -- Mem map select
152
   haddr     : std_logic_vector(31 downto 0); -- Haddr
153
   hrdata    : std_logic_vector(31 downto 0); -- Hreaddata
154
   hwdata    : std_logic_vector(31 downto 0); -- Hwritedata
155
   hwrite    : std_ulogic;                    -- Hwrite
156
   htrans    : std_logic_vector(1 downto 0);  -- Htrans type
157
   hburst    : std_logic_vector(2 downto 0);  -- Hburst type
158
   hresp     : std_logic_vector(1 downto 0);  -- Hresp type
159
   size      : std_logic_vector(1 downto 0);  -- Part of Hsize
160
   piosel    : std_logic;
161
   irq       : std_logic;
162
   irqv      : std_logic_vector(NAHBIRQ-1 downto 0);
163
   pioack    : std_logic;
164
   atasel    : std_logic;
165
 
166
   -- reg signal
167
   ctrlreg  : std_logic_vector(31 downto 0);
168
   statreg  : std_logic_vector(31 downto 0);
169
 
170
   pio_cmd  : PIOtiming_type;
171
   pio_dp0  : PIOtiming_type;
172
   pio_dp1  : PIOtiming_type;
173
   dma_dev0 : DMAtiming_type;
174
   dma_dev1 : DMAtiming_type;
175
end record;
176
 
177
signal r, ri : reg_type;
178
begin
179
 
180
  ctrl : process(rst, ahbsi, r, PIOack, PIOtip, PIOpp_full, irq, PIOq,
181
        DMAtip, DMARxEmpty, DMATxFull, DMA_dmarq)
182
  variable v      : reg_type;    -- local variables for registers
183
  variable int    : std_logic;
184
  begin
185
 
186
-- Variable default settings to avoid latches
187
   v := r;
188
   v.hresp := HRESP_OKAY;
189
   v.irqv := (others => '0');
190
   int := '1';
191
   v.irq := irq;
192
   v.irqv(pirq) := v.irq and not r.irq;
193
   v.pioack := PIOack;
194
 
195
 
196
   if (ahbsi.hready = '1') and (ahbsi.hsel(hindex) and ahbsi.htrans(1)) = '1' then
197
         v.size   := ahbsi.hsize(1 downto 0);
198
         v.hwrite := ahbsi.hwrite;
199
         v.htrans := ahbsi.htrans;
200
         v.hburst := ahbsi.hburst;
201
         v.hsel   := '1';
202
         v.haddr  := ahbsi.haddr;
203
         v.piosel := ahbsi.haddr(6);
204
         v.atasel := ahbsi.haddr(6);
205
 
206
         if ahbsi.hwrite = '0' or ahbsi.haddr(6) = '1' then -- Read or ATA 
207
            v.hready := '0';
208
         else                                         -- Write
209
            v.hready := '1';
210
         end if;
211
   else
212
         v.hsel := '0';
213
 
214
         if PIOack = '1' then
215
            v.piosel := '0';
216
         end if;
217
 
218
         v.hready := r.pioack or not r.atasel;
219
 
220
         if r.pioack = '1' then
221
            v.atasel := '0';
222
         end if;
223
   end if;
224
 
225
   if r.hsel = '1' and r.atasel = '0' and r.hwrite = '1' then -- Write
226
      case r.haddr(5 downto 2) is
227
      when "0000" =>    -- Control register 0x0
228
         v.ctrlreg := ahbsi.hwdata;
229
      when "0001" =>    -- Status register 0x4
230
         int := ahbsi.hwdata(0); -- irq bit in status reg
231
      when "0010" =>    -- PIO Compatible timing register 0x8
232
         v.pio_cmd.T1 := ahbsi.hwdata(7 downto 0);
233
         v.pio_cmd.T2 := ahbsi.hwdata(15 downto 8);
234
         v.pio_cmd.T4 := ahbsi.hwdata(23 downto 16);
235
         v.pio_cmd.Teoc := ahbsi.hwdata(31 downto 24);
236
      when "0011" =>    -- PIO Fast timing register device 0 0xc
237
         v.pio_dp0.T1 := ahbsi.hwdata(7 downto 0);
238
         v.pio_dp0.T2 := ahbsi.hwdata(15 downto 8);
239
         v.pio_dp0.T4 := ahbsi.hwdata(23 downto 16);
240
         v.pio_dp0.Teoc := ahbsi.hwdata(31 downto 24);
241
      when "0100" =>    -- PIO Fast timing register device 1 0x10
242
         v.pio_dp1.T1 := ahbsi.hwdata(7 downto 0);
243
         v.pio_dp1.T2 := ahbsi.hwdata(15 downto 8);
244
         v.pio_dp1.T4 := ahbsi.hwdata(23 downto 16);
245
         v.pio_dp1.Teoc := ahbsi.hwdata(31 downto 24);
246
      when "0101" =>    -- DMA timing register device 0 0x14
247
         v.dma_dev0.Tm := ahbsi.hwdata(7 downto 0);
248
         v.dma_dev0.Td := ahbsi.hwdata(15 downto 8);
249
         v.dma_dev0.Teoc := ahbsi.hwdata(31 downto 24);
250
      when "0110" =>    -- DMA timing register device 1 0x18
251
         v.dma_dev1.Tm := ahbsi.hwdata(7 downto 0);
252
         v.dma_dev1.Td := ahbsi.hwdata(15 downto 8);
253
         v.dma_dev1.Teoc := ahbsi.hwdata(31 downto 24);
254
      when others => null;
255
      end case;
256
   elsif r.hsel = '1' and r.atasel = '1' and r.hwrite = '1' then  -- ATA IO device 0x40-
257
      v.hwdata := ahbsi.hwdata;
258
   end if;
259
 
260
   if r.hsel = '1' and r.atasel = '0' and r.hwrite = '0' then -- Read
261
      case r.haddr(5 downto 2) is
262
      when "0000" =>    -- Control register 0x0
263
         v.hrdata := r.ctrlreg;
264
      when "0001" =>    -- Status register 0x4
265
         v.hrdata := r.statreg;
266
      when "0010" =>    -- PIO Compatible timing register 0x8
267
         v.hrdata := (r.pio_cmd.Teoc & r.pio_cmd.T4 & r.pio_cmd.T2 &
268
                                     r.pio_cmd.T1);
269
      when "0011" =>    -- PIO Fast timing register device 0 0xc
270
         v.hrdata := (r.pio_dp0.Teoc & r.pio_dp0.T4 & r.pio_dp0.T2 &
271
                                     r.pio_dp0.T1);
272
      when "0100" =>    -- PIO Fast timing register device 1 0x10
273
         v.hrdata := (r.pio_dp1.Teoc & r.pio_dp1.T4 & r.pio_dp1.T2 &
274
                                     r.pio_dp1.T1);
275
      when "0101" =>    -- DMA timing register device 0 0x14
276
         v.hrdata := (r.dma_dev0.Teoc & x"00" & r.dma_dev0.Td &
277
                                     r.dma_dev0.Tm);
278
      when "0110" =>    -- DMA timing register device 1 0x18
279
         v.hrdata := (r.dma_dev1.Teoc & x"00" & r.dma_dev1.Td &
280
                                     r.dma_dev1.Tm);
281
      when others =>
282
         v.hrdata := x"aaaaaaaa";
283
      end case;
284
   elsif r.atasel = '1' then  -- ATA IO device 0x40-
285
      v.hrdata := (x"0000" & PIOq);
286
   end if;
287
 
288
   -- Status register
289
   v.statreg(31 downto 0)  := (others => '0');                -- clear all bits (read unused bits as '0')
290
   v.statreg(31 downto 28) := std_logic_vector(to_unsigned(DeviceId,4));    -- set Device ID
291
   v.statreg(27 downto 24) := std_logic_vector(to_unsigned(RevisionNo,4));  -- set revision number
292
   v.statreg(15) := DMAtip;
293
   v.statreg(10) := DMARxEmpty;
294
   v.statreg(9)  := DMATxFull;
295
   v.statreg(8)  := DMA_dmarq;
296
   v.statreg(7)  := PIOtip;
297
   v.statreg(6)  := PIOpp_full;
298
   v.statreg(0)  := (r.statreg(0) or (v.irq and not r.irq)) and int;
299
 
300
-- reset
301
   if rst = '0' then
302
      v.ctrlreg := (0 => '1', others => '0');
303
      v.statreg(0) := '0';
304
 
305
      v.haddr := (others => '0');
306
      v.hwrite := '0';
307
      v.hready := '1';
308
      v.pioack := '0';
309
      v.atasel := '0';
310
      v.piosel := '0';
311
 
312
      v.pio_cmd.T1 := conv_std_logic_vector(PIO_mode0_T1,8);
313
      v.pio_cmd.T2 := conv_std_logic_vector(PIO_mode0_T2,8);
314
      v.pio_cmd.T4 := conv_std_logic_vector(PIO_mode0_T4,8);
315
      v.pio_cmd.Teoc := conv_std_logic_vector(PIO_mode0_Teoc,8);
316
 
317
      v.pio_dp0.T1 := conv_std_logic_vector(PIO_mode0_T1,8);
318
      v.pio_dp0.T2 := conv_std_logic_vector(PIO_mode0_T2,8);
319
      v.pio_dp0.T4 := conv_std_logic_vector(PIO_mode0_T4,8);
320
      v.pio_dp0.Teoc := conv_std_logic_vector(PIO_mode0_Teoc,8);
321
 
322
      v.pio_dp1.T1 := conv_std_logic_vector(PIO_mode0_T1,8);
323
      v.pio_dp1.T2 := conv_std_logic_vector(PIO_mode0_T2,8);
324
      v.pio_dp1.T4 := conv_std_logic_vector(PIO_mode0_T4,8);
325
      v.pio_dp1.Teoc := conv_std_logic_vector(PIO_mode0_Teoc,8);
326
 
327
      v.dma_dev0.Tm := conv_std_logic_vector(DMA_mode0_Tm,8);
328
      v.dma_dev0.Td := conv_std_logic_vector(DMA_mode0_Td,8);
329
      v.dma_dev0.Teoc := conv_std_logic_vector(DMA_mode0_Teoc,8);
330
 
331
      v.dma_dev1.Tm := conv_std_logic_vector(DMA_mode0_Tm,8);
332
      v.dma_dev1.Td := conv_std_logic_vector(DMA_mode0_Td,8);
333
      v.dma_dev1.Teoc := conv_std_logic_vector(DMA_mode0_Teoc,8);
334
   end if;
335
 
336
   -- assign control bits
337
   cf_power             <= r.ctrlreg(31);
338
   DMActrl_DMAen        <= r.ctrlreg(15);
339
   DMActrl_dir          <= r.ctrlreg(13);
340
   DMActrl_BeLeC1       <= r.ctrlreg(9);
341
   DMActrl_BeLeC0       <= r.ctrlreg(8);
342
   IDEctrl_IDEen        <= r.ctrlreg(7);
343
   IDEctrl_FATR1        <= r.ctrlreg(6);
344
   IDEctrl_FATR0        <= r.ctrlreg(5);
345
   IDEctrl_ppen         <= r.ctrlreg(4);
346
   PIO_dport1_IORDYen   <= r.ctrlreg(3);
347
   PIO_dport0_IORDYen   <= r.ctrlreg(2);
348
   PIO_cmdport_IORDYen  <= r.ctrlreg(1);
349
   IDEctrl_rst          <= r.ctrlreg(0);
350
 
351
   -- CMD port timing
352
   PIO_cmdport_T1 <= r.pio_cmd.T1; PIO_cmdport_T2 <= r.pio_cmd.T2;
353
   PIO_cmdport_T4 <= r.pio_cmd.T4; PIO_cmdport_Teoc <= r.pio_cmd.Teoc;
354
 
355
   -- data-port0 timing
356
   PIO_dport0_T1 <= r.pio_dp0.T1; PIO_dport0_T2 <= r.pio_dp0.T2;
357
   PIO_dport0_T4 <= r.pio_dp0.T4; PIO_dport0_Teoc <= r.pio_dp0.Teoc;
358
 
359
   -- data-port1 timing
360
   PIO_dport1_T1 <= r.pio_dp1.T1; PIO_dport1_T2 <= r.pio_dp1.T2;
361
   PIO_dport1_T4 <= r.pio_dp1.T4; PIO_dport1_Teoc <= r.pio_dp1.Teoc;
362
 
363
   -- DMA device0 timing
364
   DMA_dev0_Tm <= r.dma_dev0.Tm; DMA_dev0_Td <= r.dma_dev0.Td;
365
   DMA_dev0_Teoc <= r.dma_dev0.Teoc;
366
 
367
   -- DMA device1 timing
368
   DMA_dev1_Tm <= r.dma_dev0.Tm; DMA_dev1_Td <= r.dma_dev0.Td;
369
   DMA_dev1_Teoc <= r.dma_dev0.Teoc;
370
 
371
   ri <= v;
372
 
373
   PIOa   <= r.haddr(5 downto 2);
374
   PIOd   <= r.hwdata(15 downto 0);
375
   PIOsel <= r.piosel;
376
   PIOwe  <= r.hwrite;
377
   DMAsel <= '0'; -- temp ***
378
 
379
   ahbso.hready  <= r.hready;
380
   ahbso.hresp   <= r.hresp;
381
   ahbso.hrdata  <= r.hrdata;
382
   ahbso.hconfig <= hconfig;
383
   ahbso.hcache  <= '0';
384
   ahbso.hirq    <= r.irqv;
385
   ahbso.hindex  <= hindex;
386
 
387
  end process;
388
 
389
  regs : process(clk,rst)
390
  begin
391
 
392
   if rising_edge(clk) then
393
      r <= ri;
394
   end if;
395
 
396
    if rst = '0' then
397
    end if;
398
  end process;
399
 
400
end;
401
 

powered by: WebSVN 2.1.0

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