OSDN Git Service

b8f76afbafc66d77817d63349b8764ec2b032108
[fpga-leon-mjpeg/leon-mjpeg.git] / grlib-gpl-1.0.22-b4095 / designs / BLANCA-AVP / leon3mp.vhd
1 -----------------------------------------------------------------------------
2 --  LEON3 Demonstration design
3 --  Copyright (C) 2004 Jiri Gaisler, Gaisler Research
4 ------------------------------------------------------------------------------
5 --  This file is a part of the GRLIB VHDL IP LIBRARY
6 --  Copyright (C) 2003 - 2008, Gaisler Research
7 --  Copyright (C) 2008 - 2010, Aeroflex Gaisler
8 --
9 --  This program is free software; you can redistribute it and/or modify
10 --  it under the terms of the GNU General Public License as published by
11 --  the Free Software Foundation; either version 2 of the License, or
12 --  (at your option) any later version.
13 --
14 --  This program is distributed in the hope that it will be useful,
15 --  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 --  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 --  GNU General Public License for more details.
18 --
19 --  You should have received a copy of the GNU General Public License
20 --  along with this program; if not, write to the Free Software
21 --  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
22 ------------------------------------------------------------------------------
23 --  Modified by Kenichi Kurimoto
24 --    for BLANCA board
25 -------------------------------------------------------------------------------
26
27
28 library ieee;
29 use ieee.std_logic_1164.all;
30 library grlib, techmap;
31 use grlib.amba.all;
32 use grlib.stdlib.all;
33 use techmap.gencomp.all;
34 library gaisler;
35 use gaisler.memctrl.all;
36 use gaisler.leon3.all;
37 use gaisler.uart.all;
38 use gaisler.misc.all;
39 use gaisler.can.all;
40 use gaisler.net.all;
41 use gaisler.jtag.all;
42 use gaisler.spacewire.all;
43 use gaisler.grusb.all;
44 use gaisler.ata.all;
45
46 library esa;
47 use esa.memoryctrl.all;
48
49
50 use work.config.all;
51
52 entity leon3mp is
53   generic (
54     fabtech       : integer := CFG_FABTECH;
55     memtech       : integer := CFG_MEMTECH;
56     padtech       : integer := CFG_PADTECH;
57     clktech       : integer := CFG_CLKTECH;
58     disas         : integer := CFG_DISAS;       -- Enable disassembly to console
59     dbguart       : integer := CFG_DUART;       -- Print UART on console
60     pclow         : integer := CFG_PCLOW
61   );
62   port (
63     resetn        : in  std_ulogic;
64     clk           : in  std_ulogic;     -- 50 MHz main clock
65     clk3          : in  std_ulogic;     -- 25 MHz ethernet clock
66     pllref        : in  std_ulogic; 
67     errorn        : out std_ulogic;
68     wdogn         : out std_ulogic;
69  -- Adding SDCKE for BLANCA
70     sdcke         : out std_ulogic;
71     address       : out std_logic_vector(27 downto 0);
72     data          : inout std_logic_vector(31 downto 0);
73     ramsn         : out std_logic_vector (4 downto 0);
74     ramoen        : out std_logic_vector (4 downto 0);
75     rwen          : out std_logic_vector (3 downto 0);
76     oen           : out std_ulogic;
77     writen        : out std_ulogic;
78     read          : out std_ulogic;
79     iosn          : out std_ulogic;
80     bexcn         : in  std_ulogic;                     -- DSU rx data
81     brdyn         : in  std_ulogic;                     -- DSU rx data
82     romsn         : out std_logic_vector (1 downto 0);
83     sdclk         : out std_ulogic;
84     sdcsn         : out std_logic_vector (1 downto 0);    -- sdram chip select
85     sdwen         : out std_ulogic;                       -- sdram write enable
86     sdrasn        : out std_ulogic;                       -- sdram ras
87     sdcasn        : out std_ulogic;                       -- sdram cas
88     sddqm         : out std_logic_vector (3 downto 0);    -- sdram dqm
89
90  --   dsuen       : in std_ulogic;
91  --   dsubre      : in std_ulogic;
92     dsuact        : out std_ulogic;
93
94     txd1          : out std_ulogic;                     -- UART1 tx data
95     rxd1          : in  std_ulogic;                     -- UART1 rx data
96     ctsn1         : in  std_ulogic;                     -- UART1 rx data
97     rtsn1         : out std_ulogic;                     -- UART1 rx data
98     txd2          : out std_ulogic;                     -- UART2 tx data
99     rxd2          : in  std_ulogic;                     -- UART2 rx data
100     ctsn2         : in  std_ulogic;                     -- UART1 rx data
101     rtsn2         : out std_ulogic;                     -- UART1 rx data
102
103     pio           : inout std_logic_vector(17 downto 0);        -- I/O port
104
105     --emdio               : inout std_logic;            -- ethernet PHY interface
106     emdio_ip      : in std_ulogic;
107     emdio_op      : out std_ulogic;
108     emdio_oep     : out std_ulogic; 
109     etx_clk       : in std_ulogic;
110     erx_clk       : in std_ulogic;
111     erxd          : in std_logic_vector(3 downto 0);   
112     erx_dv        : in std_ulogic; 
113     erx_er        : in std_ulogic; 
114     erx_col       : in std_ulogic;
115     erx_crs       : in std_ulogic;
116 --    emdint        : in std_ulogic;
117     etxd          : out std_logic_vector(3 downto 0);   
118     etx_en        : out std_ulogic; 
119     etx_er        : out std_ulogic; 
120     emdc          : out std_ulogic;
121
122  --   ps2clk        : inout std_logic_vector(1 downto 0);
123     ps2clk_ip     : in std_logic_vector(1 downto 0);
124     ps2clk_op     : out std_logic_vector(1 downto 0);
125     ps2clk_oep    : out std_logic_vector(1 downto 0);
126 --    ps2data       : inout std_logic_vector(1 downto 0);
127     ps2data_ip    : in std_logic_vector(1 downto 0);
128     ps2data_op    : out std_logic_vector(1 downto 0);
129     ps2data_oep   : out std_logic_vector(1 downto 0);
130     
131     vid_clock     : out std_ulogic;
132     vid_blankn    : out std_ulogic;
133     vid_syncn     : out std_ulogic;
134     vid_hsync     : out std_ulogic;
135     vid_vsync     : out std_ulogic;
136     vid_r         : out std_logic_vector(7 downto 0);
137     vid_g         : out std_logic_vector(7 downto 0);
138     vid_b         : out std_logic_vector(7 downto 0);
139
140     spw_clk       : in  std_ulogic;
141     spw_rxdp      : in  std_logic_vector(0 to 2);
142     spw_rxdn      : in  std_logic_vector(0 to 2);
143     spw_rxsp      : in  std_logic_vector(0 to 2);
144     spw_rxsn      : in  std_logic_vector(0 to 2);
145     spw_txdp      : out std_logic_vector(0 to 2);
146     spw_txdn      : out std_logic_vector(0 to 2);
147     spw_txsp      : out std_logic_vector(0 to 2);
148     spw_txsn      : out std_logic_vector(0 to 2);
149
150     usb_clkout    : in std_ulogic;
151     usb_d         : inout std_logic_vector(15 downto 0);
152     usb_linestate : in std_logic_vector(1 downto 0);
153     usb_opmode    : out std_logic_vector(1 downto 0);
154     usb_reset     : out std_ulogic;
155     usb_rxactive  : in std_ulogic;
156     usb_rxerror   : in std_ulogic;
157     usb_rxvalid   : in std_ulogic;
158     usb_suspend   : out std_ulogic;
159     usb_termsel   : out std_ulogic;
160     usb_txready   : in std_ulogic;
161     usb_txvalid   : out std_ulogic;
162     usb_validh    : inout std_ulogic;
163     usb_xcvrsel   : out std_ulogic;
164     usb_vbus      : in std_ulogic;
165
166     ata_rstn  : out std_logic; 
167     ata_data  : inout std_logic_vector(15 downto 0);
168     ata_da    : out std_logic_vector(2 downto 0);  
169     ata_cs0   : out std_logic;
170     ata_cs1   : out std_logic;
171     ata_dior  : out std_logic;
172     ata_diow  : out std_logic;
173     ata_iordy : in std_logic;
174     ata_intrq : in std_logic;
175     ata_dmarq : in std_logic; 
176     ata_dmack : out std_logic;
177     --ata_dasp  : in std_logic
178     ata_csel  : out std_logic;
179
180     -- adding uart enable for BLANCA
181     uart_en   : out std_logic
182
183
184     
185         );
186 end;
187
188 architecture rtl of leon3mp is
189
190
191   -- Adding DCM component for BLANCA sdclk
192   
193   component DCM
194     generic (
195       CLKDV_DIVIDE : real := 2.0;
196       CLKFX_DIVIDE : integer := 1;
197       CLKFX_MULTIPLY : integer := 4;
198       CLKIN_DIVIDE_BY_2 : boolean := false;
199       CLKIN_PERIOD : real := 10.0;
200       CLKOUT_PHASE_SHIFT : string := "NONE";
201       CLK_FEEDBACK : string := "1X";
202       DESKEW_ADJUST : string := "SYSTEM_SYNCHRONOUS";
203       DFS_FREQUENCY_MODE : string := "LOW";
204       DLL_FREQUENCY_MODE : string := "LOW";
205       DSS_MODE : string := "NONE";
206       DUTY_CYCLE_CORRECTION : boolean := true;
207       FACTORY_JF : bit_vector := X"C080";
208       PHASE_SHIFT : integer := 0;
209       STARTUP_WAIT : boolean := false 
210     );
211     port (
212       CLKFB    : in  std_logic;
213       CLKIN    : in  std_logic;
214       DSSEN    : in  std_logic;
215       PSCLK    : in  std_logic;
216       PSEN     : in  std_logic;
217       PSINCDEC : in  std_logic;
218       RST      : in  std_logic;
219       CLK0     : out std_logic;
220       CLK90    : out std_logic;
221       CLK180   : out std_logic;
222       CLK270   : out std_logic;
223       CLK2X    : out std_logic;
224       CLK2X180 : out std_logic;
225       CLKDV    : out std_logic;
226       CLKFX    : out std_logic;
227       CLKFX180 : out std_logic;
228       LOCKED   : out std_logic;
229       PSDONE   : out std_logic;
230       STATUS   : out std_logic_vector (7 downto 0));
231   end component;
232
233 component BUFG port (O : out std_logic; I : in std_logic); end component;
234   
235 attribute syn_netlist_hierarchy : boolean;
236 attribute syn_netlist_hierarchy of rtl : architecture is false;
237
238 constant blength : integer := 12;
239 constant fifodepth : integer := 8;
240 constant maxahbm : integer := CFG_NCPU+CFG_AHB_UART+CFG_GRETH+
241         CFG_AHB_JTAG+CFG_SPW_NUM*CFG_SPW_EN+CFG_GRUSB_DCL+CFG_SVGA_ENABLE+
242         CFG_ATA+CFG_GRUSBDC;
243
244 signal vcc, gnd   : std_logic_vector(4 downto 0);
245 signal memi  : memory_in_type;
246 signal memo  : memory_out_type;
247 signal wpo   : wprot_out_type;
248 signal sdi   : sdctrl_in_type;
249 signal sdo   : sdram_out_type;
250 signal sdo2, sdo3 : sdctrl_out_type;
251
252 signal apbi  : apb_slv_in_type;
253 signal apbo  : apb_slv_out_vector := (others => apb_none);
254 signal ahbsi : ahb_slv_in_type;
255 signal ahbso : ahb_slv_out_vector := (others => ahbs_none);
256 signal ahbmi : ahb_mst_in_type;
257 signal ahbmo : ahb_mst_out_vector := (others => ahbm_none);
258
259 signal clkm, rstn, rstraw, sdclkl : std_ulogic;
260 signal cgi, cgi2   : clkgen_in_type;
261 signal cgo, cgo2   : clkgen_out_type;
262 signal u1i, u2i, dui : uart_in_type;
263 signal u1o, u2o, duo : uart_out_type;
264
265 signal irqi : irq_in_vector(0 to CFG_NCPU-1);
266 signal irqo : irq_out_vector(0 to CFG_NCPU-1);
267
268 signal dbgi : l3_debug_in_vector(0 to CFG_NCPU-1);
269 signal dbgo : l3_debug_out_vector(0 to CFG_NCPU-1);
270
271 signal dsui : dsu_in_type;
272 signal dsuo : dsu_out_type; 
273
274 signal ethi, ethi1, ethi2 : eth_in_type;
275 signal etho, etho1, etho2 : eth_out_type;
276
277 signal gpti : gptimer_in_type;
278 signal gpto : gptimer_out_type;
279
280 signal gpioi : gpio_in_type;
281 signal gpioo : gpio_out_type;
282
283 signal can_lrx, can_ltx   : std_logic_vector(0 to 7);
284
285 signal lclk, rst, ndsuact, wdogl : std_ulogic;
286 signal tck, tckn, tms, tdi, tdo : std_ulogic;
287
288 signal ethclk : std_ulogic;
289
290 signal kbdi  : ps2_in_type;
291 signal kbdo  : ps2_out_type;
292 signal moui  : ps2_in_type;
293 signal mouo  : ps2_out_type;
294 signal vgao  : apbvga_out_type;
295
296 constant BOARD_FREQ : integer := 25000;   -- input frequency in KHz
297 constant CPU_FREQ : integer := BOARD_FREQ * CFG_CLKMUL / CFG_CLKDIV;  -- cpu frequency in KHz
298 constant IOAEN : integer := CFG_CAN + CFG_ATA + CFG_GRUSBDC;
299
300 signal spwi : grspw_in_type_vector(0 to 2);
301 signal spwo : grspw_out_type_vector(0 to 2);
302 signal dtmp    : std_logic_vector(2 downto 0);
303 signal stmp    : std_logic_vector(2 downto 0);
304 signal spw_clkl   : std_ulogic;
305 signal spw_clkln  : std_ulogic;
306 signal rxclko     : std_logic_vector(CFG_SPW_NUM-1 downto 0);
307 signal stati : ahbstat_in_type;
308
309 signal uclk : std_ulogic;
310 signal usbi : grusb_in_type;
311 signal usbo : grusb_out_type;
312
313 signal idei : ata_in_type;
314 signal ideo : ata_out_type;
315
316 constant SPW_LOOP_BACK : integer := 0;
317
318 signal dac_clk, video_clk, clk50 : std_logic;  -- signals to vga_clkgen.
319 signal clk_sel : std_logic_vector(1 downto 0);
320
321 -- Add for BLANCA
322 signal sdckesig : std_ulogic;
323 signal uart_ensig : std_ulogic;
324 signal sdclkl2 : std_ulogic;
325 signal sddll_rst : std_ulogic;
326 signal sigzero : std_logic;
327 signal fbackdll : std_ulogic;
328 signal erx_clk2 : std_ulogic;
329 signal etx_clk2 : std_ulogic; 
330   
331 attribute keep : boolean;
332 attribute syn_keep : boolean;
333 attribute syn_preserve : boolean;
334 attribute syn_keep of clk50 : signal is true;
335 attribute syn_preserve of clk50 : signal is true;
336 attribute keep of clk50 : signal is true;
337 attribute syn_keep of video_clk : signal is true;
338 attribute syn_preserve of video_clk : signal is true;
339 attribute keep of video_clk : signal is true;
340
341 begin
342
343 ----------------------------------------------------------------------
344 ---  Reset and Clock generation  -------------------------------------
345 ----------------------------------------------------------------------
346   
347   vcc <= (others => '1'); gnd <= (others => '0');
348   cgi.pllctrl <= "00"; cgi.pllrst <= rstraw;
349
350   pllref_pad : clkpad generic map (tech => padtech) port map (pllref, cgi.pllref); 
351   ethclk_pad : inpad generic map (tech => padtech) port map(clk3, ethclk);
352   clk_pad : clkpad generic map (tech => padtech) port map (clk, lclk); 
353   clkgen0 : clkgen              -- clock generator
354     generic map (clktech, CFG_CLKMUL, CFG_CLKDIV, CFG_MCTRL_SDEN,
355         CFG_CLK_NOFB, 0, 0, 0, BOARD_FREQ)
356     port map (lclk, lclk, clkm, open, open, sdclkl, open, cgi, cgo, open, clk50);
357
358 sigzero <= '0';         
359   sddll_rst <= not cgo.clklock;
360   dllsdclk : DCM 
361     generic map (CLKFX_MULTIPLY => 2, CLKFX_DIVIDE => 2, CLKOUT_PHASE_SHIFT => "FIXED", PHASE_SHIFT => -60)
362     port map ( CLKIN => sdclkl, CLKFB => fbackdll, DSSEN => sigzero, PSCLK => sigzero,
363     PSEN => sigzero, PSINCDEC => sigzero, RST => sddll_rst, CLK0 => fbackdll,
364     CLKFX => sdclkl2, CLK2X => open, CLKFX180 => open, LOCKED => open);
365   
366   --sdclkl2 <= not sdclkl;
367   sdclk_pad : outpad generic map (tech => padtech, slew => 1, strength => 24) 
368         port map (sdclk, sdclkl2);
369
370   resetn_pad : inpad generic map (tech => padtech) port map (resetn, rst); 
371   rst0 : rstgen                 -- reset generator
372   port map (rst, clkm, cgo.clklock, rstn, rstraw);
373
374 ----------------------------------------------------------------------
375 ---  AHB CONTROLLER --------------------------------------------------
376 ----------------------------------------------------------------------
377
378   ahb0 : ahbctrl                -- AHB arbiter/multiplexer
379   generic map (defmast => CFG_DEFMST, split => CFG_SPLIT, 
380         rrobin => CFG_RROBIN, ioaddr => CFG_AHBIO,
381         ioen => IOAEN, nahbm => maxahbm, nahbs => 8)
382   port map (rstn, clkm, ahbmi, ahbmo, ahbsi, ahbso);
383
384 ----------------------------------------------------------------------
385 ---  LEON3 processor and DSU -----------------------------------------
386 ----------------------------------------------------------------------
387
388   l3 : if CFG_LEON3 = 1 generate
389     cpu : for i in 0 to CFG_NCPU-1 generate
390       u0 : leon3s                       -- LEON3 processor      
391       generic map (i, fabtech, memtech, CFG_NWIN, CFG_DSU, CFG_FPU, CFG_V8, 
392         0, CFG_MAC, pclow, 0, CFG_NWP, CFG_ICEN, CFG_IREPL, CFG_ISETS, CFG_ILINE, 
393         CFG_ISETSZ, CFG_ILOCK, CFG_DCEN, CFG_DREPL, CFG_DSETS, CFG_DLINE, CFG_DSETSZ,
394         CFG_DLOCK, CFG_DSNOOP, CFG_ILRAMEN, CFG_ILRAMSZ, CFG_ILRAMADDR, CFG_DLRAMEN,
395         CFG_DLRAMSZ, CFG_DLRAMADDR, CFG_MMUEN, CFG_ITLBNUM, CFG_DTLBNUM, CFG_TLB_TYPE, CFG_TLB_REP, 
396         CFG_LDDEL, disas, CFG_ITBSZ, CFG_PWD, CFG_SVT, CFG_RSTADDR, CFG_NCPU-1, 0, 0,
397         CFG_MMU_PAGE, CFG_BP)
398       port map (clkm, rstn, ahbmi, ahbmo(i), ahbsi, ahbso, 
399                 irqi(i), irqo(i), dbgi(i), dbgo(i));
400     end generate;
401     errorn_pad : odpad generic map (tech => padtech) port map (errorn, dbgo(0).error);
402     
403     dsugen : if CFG_DSU = 1 generate
404       dsu0 : dsu3                       -- LEON3 Debug Support Unit
405       generic map (hindex => 2, haddr => 16#900#, hmask => 16#F00#, 
406          ncpu => CFG_NCPU, tbits => 30, tech => memtech, irq => 0, kbytes => CFG_ATBSZ)
407       port map (rstn, clkm, ahbmi, ahbsi, ahbso(2), dbgo, dbgi, dsui, dsuo);
408 --      dsuen_pad : inpad generic map (tech => padtech) port map (dsuen, dsui.enable); 
409 --      dsubre_pad : inpad generic map (tech => padtech) port map (dsubre, dsui.break);
410         dsui.enable <= '1';
411         dsui.break <= '0';
412       dsuact_pad : outpad generic map (tech => padtech) port map (dsuact, ndsuact);
413       ndsuact <= not dsuo.active;
414     end generate;
415   end generate;
416   nodsu : if CFG_DSU = 0 generate 
417     dsuo.tstop <= '0'; dsuo.active <= '0';
418   end generate;
419
420   dcomgen : if CFG_AHB_UART = 1 generate
421     dcom0: ahbuart              -- Debug UART
422     generic map (hindex => CFG_NCPU, pindex => 7, paddr => 7)
423     port map (rstn, clkm, dui, duo, apbi, apbo(7), ahbmi, ahbmo(CFG_NCPU));
424     dsurx_pad : inpad generic map (tech => padtech) port map (rxd2, dui.rxd); 
425     dsutx_pad : outpad generic map (tech => padtech) port map (txd2, duo.txd);
426   end generate;
427   nouah : if CFG_AHB_UART = 0 generate apbo(7) <= apb_none; end generate;
428
429   ahbjtaggen0 :if CFG_AHB_JTAG = 1 generate
430     ahbjtag0 : ahbjtag generic map(tech => fabtech, hindex => CFG_NCPU+CFG_AHB_UART)
431       port map(rstn, clkm, tck, tms, tdi, tdo, ahbmi, ahbmo(CFG_NCPU+CFG_AHB_UART),
432                open, open, open, open, open, open, open, gnd(0));
433   end generate;
434   
435 ----------------------------------------------------------------------
436 ---  Memory controllers ----------------------------------------------
437 ----------------------------------------------------------------------
438
439   memi.writen <= '1'; memi.wrn <= "1111"; memi.bwidth <= "00";
440   brdyn_pad : inpad generic map (tech => padtech) port map (brdyn, memi.brdyn);
441   bexcn_pad : inpad generic map (tech => padtech) port map (bexcn, memi.bexcn);
442
443   mctrl0 : mctrl generic map (hindex => 0, pindex => 0,
444         paddr => 0, srbanks => 2, ram8 => CFG_MCTRL_RAM8BIT, 
445         ram16 => CFG_MCTRL_RAM16BIT, sden => CFG_MCTRL_SDEN, 
446         invclk => CFG_CLK_NOFB, sepbus => CFG_MCTRL_SEPBUS,
447         pageburst => CFG_MCTRL_PAGE)
448   port map (rstn, clkm, memi, memo, ahbsi, ahbso(0), apbi, apbo(0), wpo, sdo);
449   sdpads : if CFG_MCTRL_SDEN = 1 generate               -- SDRAM controller
450       sdwen_pad : outpad generic map (tech => padtech) 
451            port map (sdwen, sdo.sdwen);
452       sdras_pad : outpad generic map (tech => padtech) 
453            port map (sdrasn, sdo.rasn);
454       sdcas_pad : outpad generic map (tech => padtech) 
455            port map (sdcasn, sdo.casn);
456       sddqm_pad : outpadv generic map (width =>4, tech => padtech) 
457            port map (sddqm, sdo.dqm(3 downto 0));
458   end generate;
459   sdcsn_pad : outpadv generic map (width =>2, tech => padtech) 
460            port map (sdcsn, sdo.sdcsn); 
461
462   addr_pad : outpadv generic map (width => 28, tech => padtech) 
463         port map (address, memo.address(27 downto 0)); 
464   rams_pad : outpadv generic map (width => 5, tech => padtech) 
465         port map (ramsn, memo.ramsn(4 downto 0)); 
466   roms_pad : outpadv generic map (width => 2, tech => padtech) 
467         port map (romsn, memo.romsn(1 downto 0)); 
468   oen_pad  : outpad generic map (tech => padtech) 
469         port map (oen, memo.oen);
470   rwen_pad : outpadv generic map (width => 4, tech => padtech) 
471         port map (rwen, memo.wrn); 
472   roen_pad : outpadv generic map (width => 5, tech => padtech) 
473         port map (ramoen, memo.ramoen(4 downto 0));
474   wri_pad  : outpad generic map (tech => padtech) 
475         port map (writen, memo.writen);
476   read_pad : outpad generic map (tech => padtech) 
477         port map (read, memo.read); 
478   iosn_pad : outpad generic map (tech => padtech) 
479         port map (iosn, memo.iosn);
480   bdr : for i in 0 to 3 generate
481       data_pad : iopadv generic map (tech => padtech, width => 8)
482       port map (data(31-i*8 downto 24-i*8), memo.data(31-i*8 downto 24-i*8),
483         memo.bdrive(i), memi.data(31-i*8 downto 24-i*8));
484   end generate;
485
486 ----------------------------------------------------------------------
487 ---  APB Bridge and various periherals -------------------------------
488 ----------------------------------------------------------------------
489
490   bpromgen : if CFG_AHBROMEN /= 0 generate
491     brom : entity work.ahbrom
492       generic map (hindex => 6, haddr => CFG_AHBRODDR, pipe => CFG_AHBROPIP)
493       port map ( rstn, clkm, ahbsi, ahbso(6));
494   end generate;
495
496 ----------------------------------------------------------------------
497 ---  APB Bridge and various periherals -------------------------------
498 ----------------------------------------------------------------------
499
500   apb0 : apbctrl                                -- AHB/APB bridge
501   generic map (hindex => 1, haddr => CFG_APBADDR, nslaves => 16)
502   port map (rstn, clkm, ahbsi, ahbso(1), apbi, apbo );
503
504   ua1 : if CFG_UART1_ENABLE /= 0 generate
505     uart1 : apbuart                     -- UART 1
506     generic map (pindex => 1, paddr => 1,  pirq => 2, console => dbguart,
507         fifosize => CFG_UART1_FIFO)
508     port map (rstn, clkm, apbi, apbo(1), u1i, u1o);
509     u1i.extclk <= '0';
510     rxd1_pad : inpad generic map (tech => padtech) port map (rxd1, u1i.rxd); 
511     txd1_pad : outpad generic map (tech => padtech) port map (txd1, u1o.txd);
512     cts1_pad : inpad generic map (tech => padtech) port map (ctsn1, u1i.ctsn); 
513     rts1_pad : outpad generic map (tech => padtech) port map (rtsn1, u1o.rtsn);
514   end generate;
515   noua0 : if CFG_UART1_ENABLE = 0 generate apbo(1) <= apb_none; end generate;
516
517   ua2 : if CFG_UART2_ENABLE /= 0 generate
518     uart2 : apbuart                     -- UART 2
519     generic map (pindex => 9, paddr => 9,  pirq => 3, fifosize => CFG_UART2_FIFO)
520     port map (rstn, clkm, apbi, apbo(9), u2i, u2o);
521     u2i.extclk <= '0';
522     rxd2_pad : inpad generic map (tech => padtech) port map (rxd2, u2i.rxd); 
523     txd2_pad : outpad generic map (tech => padtech) port map (txd2, u2o.txd);
524     cts2_pad : inpad generic map (tech => padtech) port map (ctsn2, u2i.ctsn); 
525     rts2_pad : outpad generic map (tech => padtech) port map (rtsn2, u2o.rtsn);
526   end generate;
527   noua1 : if CFG_UART2_ENABLE = 0 generate 
528     apbo(9) <= apb_none;  rtsn2 <= '0';
529   end generate;
530
531   irqctrl : if CFG_IRQ3_ENABLE /= 0 generate
532     irqctrl0 : irqmp                    -- interrupt controller
533     generic map (pindex => 2, paddr => 2, ncpu => CFG_NCPU)
534     port map (rstn, clkm, apbi, apbo(2), irqo, irqi);
535   end generate;
536   irq3 : if CFG_IRQ3_ENABLE = 0 generate
537     x : for i in 0 to CFG_NCPU-1 generate
538       irqi(i).irl <= "0000";
539     end generate;
540     apbo(2) <= apb_none;
541   end generate;
542
543   gpt : if CFG_GPT_ENABLE /= 0 generate
544     timer0 : gptimer                    -- timer unit
545     generic map (pindex => 3, paddr => 3, pirq => CFG_GPT_IRQ, 
546         sepirq => CFG_GPT_SEPIRQ, sbits => CFG_GPT_SW, ntimers => CFG_GPT_NTIM, 
547         nbits => CFG_GPT_TW, wdog => CFG_GPT_WDOGEN*CFG_GPT_WDOG)
548     port map (rstn, clkm, apbi, apbo(3), gpti, gpto);
549     gpti.dhalt <= dsuo.tstop; gpti.extclk <= '0';
550   end generate;
551   wden : if CFG_GPT_WDOGEN /= 0 generate
552     wdogl <= gpto.wdogn or not rstn;
553     wdogn_pad : odpad generic map (tech => padtech) port map (wdogn, wdogl);
554   end generate;
555   wddis : if CFG_GPT_WDOGEN = 0 generate
556     wdogn_pad : odpad generic map (tech => padtech) port map (wdogn, vcc(0));
557   end generate;
558
559   nogpt : if CFG_GPT_ENABLE = 0 generate apbo(3) <= apb_none; end generate;
560
561   kbd : if CFG_KBD_ENABLE /= 0 generate
562     ps21 : apbps2 generic map(pindex => 4, paddr => 4, pirq => 4)
563       port map(rstn, clkm, apbi, apbo(4), moui, mouo);
564     ps20 : apbps2 generic map(pindex => 5, paddr => 5, pirq => 5)
565       port map(rstn, clkm, apbi, apbo(5), kbdi, kbdo);
566   end generate;
567   nokbd : if CFG_KBD_ENABLE = 0 generate 
568         apbo(4) <= apb_none; mouo <= ps2o_none;
569         apbo(5) <= apb_none; kbdo <= ps2o_none;
570   end generate;
571 --  kbdclk_pad : iopad generic map (tech => padtech)
572 --      port map (ps2clk(0),kbdo.ps2_clk_o, kbdo.ps2_clk_oe, kbdi.ps2_clk_i);
573   kbdclk_ipad : inpad generic map (tech => padtech)
574     port map (ps2clk_ip(0), kbdi.ps2_clk_i);
575   kbdclk_opad : outpad generic map (tech => padtech)
576     port map (ps2clk_op(0), kbdo.ps2_clk_o);
577   kbdclk_oepad : outpad generic map (tech => padtech)
578     port map (ps2clk_oep(0), kbdo.ps2_clk_oe);
579 --  kbdata_pad : iopad generic map (tech => padtech)
580 --        port map (ps2data(0), kbdo.ps2_data_o, kbdo.ps2_data_oe, kbdi.ps2_data_i);
581   kbddata_ipad : inpad generic map (tech => padtech)
582     port map (ps2data_ip(0), kbdi.ps2_data_i);
583   kbddata_opad : outpad generic map (tech => padtech)
584     port map (ps2data_op(0), kbdo.ps2_data_o);
585   kbddata_oepad : outpad generic map (tech => padtech)
586     port map (ps2data_oep(0), kbdo.ps2_data_oe);
587 --  mouclk_pad : iopad generic map (tech => padtech)
588 --      port map (ps2clk(1),mouo.ps2_clk_o, mouo.ps2_clk_oe, moui.ps2_clk_i);
589   mouclk_ipad : inpad generic map (tech => padtech)
590     port map (ps2clk_ip(1), moui.ps2_clk_i);
591   mouclk_opad : outpad generic map (tech => padtech)
592     port map (ps2clk_op(1), mouo.ps2_clk_o);
593   mouclk_oepad : outpad generic map (tech => padtech)
594     port map (ps2clk_oep(1), mouo.ps2_clk_oe);
595 --  mouata_pad : iopad generic map (tech => padtech)
596 --        port map (ps2data(1), mouo.ps2_data_o, mouo.ps2_data_oe, moui.ps2_data_i);
597   moudata_ipad : inpad generic map (tech => padtech)
598     port map (ps2data_ip(1), moui.ps2_data_i);
599   moudata_opad : outpad generic map (tech => padtech)
600     port map (ps2data_op(1), mouo.ps2_data_o);
601   moudata_oepad : outpad generic map (tech => padtech)
602     port map (ps2data_oep(1), mouo.ps2_data_oe);
603
604
605   
606   vga : if CFG_VGA_ENABLE /= 0 generate
607     vga0 : apbvga generic map(memtech => memtech, pindex => 6, paddr => 6)
608        port map(rstn, clkm, ethclk, apbi, apbo(6), vgao);
609     video_clock_pad : outpad generic map ( tech => padtech)
610         port map (vid_clock, video_clk);
611     video_clk <= not ethclk;
612    end generate;
613   
614   svga : if CFG_SVGA_ENABLE /= 0 generate
615     svga0 : svgactrl generic map(memtech => memtech, pindex => 6, paddr => 6,
616         hindex => CFG_NCPU+CFG_AHB_UART+CFG_AHB_JTAG, 
617         clk0 => 40000, clk1 => 1000000000/((BOARD_FREQ * CFG_CLKMUL)/CFG_CLKDIV),
618         clk2 => 20000, clk3 => 15385, burstlen => 6)
619        port map(rstn, clkm, video_clk, apbi, apbo(6), vgao, ahbmi, 
620                 ahbmo(CFG_NCPU+CFG_AHB_UART+CFG_AHB_JTAG), clk_sel);
621     vgaclk0 : entity work.vga_clkgen
622 --       port map (rstn, clk_sel, ethclk, clkm, clk50, video_clk);
623       port map (rstn, clk_sel, lclk, clkm, clk50, video_clk);
624     dac_clk <= not video_clk;
625     video_clock_pad : outpad generic map ( tech => padtech)
626         port map (vid_clock, dac_clk);
627   end generate;
628
629   novga : if (CFG_VGA_ENABLE = 0 and CFG_SVGA_ENABLE = 0) generate
630     apbo(6) <= apb_none; vgao <= vgao_none;
631     video_clk <= not clkm;
632     video_clock_pad : outpad generic map ( tech => padtech)
633         port map (vid_clock, video_clk);
634   end generate;
635   
636   blank_pad : outpad generic map (tech => padtech)
637         port map (vid_blankn, vgao.blank);
638   comp_sync_pad : outpad generic map (tech => padtech)
639         port map (vid_syncn, vgao.comp_sync);
640   vert_sync_pad : outpad generic map (tech => padtech)
641         port map (vid_vsync, vgao.vsync);
642   horiz_sync_pad : outpad generic map (tech => padtech)
643         port map (vid_hsync, vgao.hsync);
644   video_out_r_pad : outpadv generic map (width => 8, tech => padtech)
645         port map (vid_r, vgao.video_out_r);
646   video_out_g_pad : outpadv generic map (width => 8, tech => padtech)
647         port map (vid_g, vgao.video_out_g);
648   video_out_b_pad : outpadv generic map (width => 8, tech => padtech)
649         port map (vid_b, vgao.video_out_b); 
650
651   gpio0 : if CFG_GRGPIO_ENABLE /= 0 generate     -- GPIO unit
652     grgpio0: grgpio
653     generic map(pindex => 8, paddr => 8, imask => CFG_GRGPIO_IMASK, nbits => 18)
654     port map(rst => rstn, clk => clkm, apbi => apbi, apbo => apbo(8),
655     gpioi => gpioi, gpioo => gpioo);
656     p0 : if (CFG_CAN = 0) or (CFG_CAN_NUM = 1) generate
657       pio_pads : for i in 1 to 2 generate
658         pio_pad : iopad generic map (tech => padtech)
659             port map (pio(i), gpioo.dout(i), gpioo.oen(i), gpioi.din(i));
660       end generate;
661     end generate;
662     p1 : if (CFG_CAN = 0) generate
663       pio_pads : for i in 4 to 5 generate
664         pio_pad : iopad generic map (tech => padtech)
665             port map (pio(i), gpioo.dout(i), gpioo.oen(i), gpioi.din(i));
666       end generate;
667     end generate;
668     pio_pad0 : iopad generic map (tech => padtech)
669             port map (pio(0), gpioo.dout(0), gpioo.oen(0), gpioi.din(0));
670     pio_pad1 : iopad generic map (tech => padtech)
671             port map (pio(3), gpioo.dout(3), gpioo.oen(3), gpioi.din(3));
672     pio_pads : for i in 6 to 17 generate
673         pio_pad : iopad generic map (tech => padtech)
674             port map (pio(i), gpioo.dout(i), gpioo.oen(i), gpioi.din(i));
675     end generate;
676
677   end generate;
678
679   ahbs : if CFG_AHBSTAT = 1 generate    -- AHB status register
680     ahbstat0 : ahbstat generic map (pindex => 15, paddr => 15, pirq => 7,
681         nftslv => CFG_AHBSTATN)
682       port map (rstn, clkm, ahbmi, ahbsi, stati, apbi, apbo(15));
683   end generate;
684
685 -----------------------------------------------------------------------
686 ---  ETHERNET ---------------------------------------------------------
687 -----------------------------------------------------------------------
688
689     eth0 : if CFG_GRETH = 1 generate -- Gaisler ethernet MAC
690       e1 : grethm generic map(
691         hindex => CFG_NCPU+CFG_AHB_UART+CFG_AHB_JTAG+CFG_SVGA_ENABLE, 
692         pindex => 13, paddr => 13, pirq => 13, memtech => memtech,
693         mdcscaler => CPU_FREQ/1000, enable_mdio => 1, fifosize => CFG_ETH_FIFO,
694         nsync => 1, edcl => CFG_DSU_ETH, edclbufsz => CFG_ETH_BUF,
695         macaddrh => CFG_ETH_ENM, macaddrl => CFG_ETH_ENL, enable_mdint => 0,
696         ipaddrh => CFG_ETH_IPM, ipaddrl => CFG_ETH_IPL, giga => CFG_GRETH1G,
697         phyrstadr => 6)
698       port map( rst => rstn, clk => clkm, ahbmi => ahbmi,
699         ahbmo => ahbmo(CFG_NCPU+CFG_AHB_UART+CFG_AHB_JTAG+CFG_SVGA_ENABLE), 
700         apbi => apbi, apbo => apbo(13), ethi => ethi, etho => etho); 
701     end generate;
702
703     ethpads : if (CFG_GRETH = 1) generate -- eth pads
704 --      emdio_pad : iopad generic map (tech => padtech) 
705 --      port map (emdio, etho.mdio_o, etho.mdio_oe, ethi.mdio_i);
706       emdio_ipad : inpad generic map (tech => padtech)
707         port map (emdio_ip, ethi.mdio_i);
708       emdio_opad : outpad generic map (tech => padtech)
709         port map (emdio_op, etho.mdio_o);
710       emdio_oepad :outpad generic map (tech => padtech)
711         port map (emdio_oep, etho.mdio_oe);
712 --      etxc_pad : clkpad generic map (tech => padtech, arch => 2) 
713 --      port map (etx_clk, ethi.tx_clk);
714       etxc_pad : inpad generic map (tech => padtech) 
715         port map (etx_clk, etx_clk2);
716       etxclock :BUFG
717         port map (I => etx_clk2, O => ethi.tx_clk);
718       
719 --      erxc_pad : clkpad generic map (tech => padtech, arch => 2) 
720 --      port map (erx_clk, ethi.rx_clk);
721       erxc_pad : inpad generic map (tech => padtech) 
722         port map (erx_clk, erx_clk2);
723       erxclock : BUFG
724         port map (I => erx_clk2, O => ethi.rx_clk);
725
726       erxd_pad : inpadv generic map (tech => padtech, width => 4) 
727         port map (erxd, ethi.rxd(3 downto 0));
728       erxdv_pad : inpad generic map (tech => padtech) 
729         port map (erx_dv, ethi.rx_dv);
730       erxer_pad : inpad generic map (tech => padtech) 
731         port map (erx_er, ethi.rx_er);
732       erxco_pad : inpad generic map (tech => padtech) 
733         port map (erx_col, ethi.rx_col);
734       erxcr_pad : inpad generic map (tech => padtech) 
735         port map (erx_crs, ethi.rx_crs);
736 --      emdint_pad : inpad generic map (tech => padtech) 
737 --      port map (emdint, ethi.mdint);
738 ethi.mdint <= '1';
739       etxd_pad : outpadv generic map (tech => padtech, width => 4) 
740         port map (etxd, etho.txd(3 downto 0));
741       etxen_pad : outpad generic map (tech => padtech) 
742         port map ( etx_en, etho.tx_en);
743       etxer_pad : outpad generic map (tech => padtech) 
744         port map (etx_er, etho.tx_er);
745       emdc_pad : outpad generic map (tech => padtech) 
746         port map (emdc, etho.mdc);
747     end generate;
748
749 -----------------------------------------------------------------------
750 ---  AHB RAM ----------------------------------------------------------
751 -----------------------------------------------------------------------
752
753   ocram : if CFG_AHBRAMEN = 1 generate 
754     ahbram0 : ahbram generic map (hindex => 7, haddr => CFG_AHBRADDR, 
755         tech => CFG_MEMTECH, kbytes => CFG_AHBRSZ)
756     port map ( rstn, clkm, ahbsi, ahbso(7));
757   end generate;
758
759 -----------------------------------------------------------------------
760 ---  Multi-core CAN ---------------------------------------------------
761 -----------------------------------------------------------------------
762
763    can0 : if CFG_CAN = 1 generate 
764      can0 : can_mc generic map (slvndx => 4, ioaddr => CFG_CANIO,
765         iomask => 16#FF0#, irq => CFG_CANIRQ, memtech => memtech,
766         ncores => CFG_CAN_NUM, sepirq => CFG_CANSEPIRQ)
767       port map (rstn, clkm, ahbsi, ahbso(4), can_lrx, can_ltx );
768       can_tx_pad1 : iopad generic map (tech => padtech)
769             port map (pio(5), can_ltx(0), gnd(0), gpioi.din(5));
770       can_rx_pad1 : iopad generic map (tech => padtech)
771             port map (pio(4), gnd(0), vcc(0), can_lrx(0));
772       canpas : if CFG_CAN_NUM = 2 generate 
773         can_tx_pad2 : iopad generic map (tech => padtech)
774             port map (pio(2), can_ltx(1), gnd(0), gpioi.din(2));
775         can_rx_pad2 : iopad generic map (tech => padtech)
776             port map (pio(1), gnd(0), vcc(0), can_lrx(1));
777       end generate;
778    end generate;
779
780    -- standby controlled by pio(3) and pio(0)
781
782 -----------------------------------------------------------------------
783 ---  SPACEWIRE  -------------------------------------------------------
784 -----------------------------------------------------------------------
785
786   spw : if CFG_SPW_EN > 0 generate
787     core0: if CFG_SPW_GRSPW = 1 generate
788       spw_clkl <= clkm;
789     end generate;
790     
791     core1 : if CFG_SPW_GRSPW = 2 generate
792       cgi2.pllctrl <= "00"; cgi2.pllrst <= rstraw;
793       clkgen_spw_rx : clkgen            -- clock generator
794       generic map (clktech, 12, 2, 0,
795         1, 0, 0, 0, 25000)
796       port map (clk3, clk3, spw_clkl, spw_clkln, open, open, open, cgi2, cgo2, open, open);
797     end generate;
798         
799     swloop : for i in 0 to CFG_SPW_NUM-1 generate
800       core1 : if CFG_SPW_GRSPW = 2 generate
801         spw_phy0 : grspw2_phy 
802           generic map(
803             scantest   => 0,
804             tech       => memtech,
805             input_type => CFG_SPW_INPUT)
806           port map(
807             rstn       => rstn,
808             rxclki     => spw_clkl,
809             rxclkin    => spw_clkln,
810             nrxclki    => spw_clkl,
811             di         => dtmp(i),
812             si         => stmp(i),
813             do         => spwi(i).d(1 downto 0),
814             dov        => spwi(i).dv(1 downto 0),
815             dconnect   => spwi(i).dconnect(1 downto 0),
816             rxclko     => rxclko(i));
817       end generate;
818
819       sw0 : grspwm generic map(tech => memtech,
820         hindex => CFG_NCPU+CFG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG+CFG_SVGA_ENABLE+i,
821         sysfreq => CPU_FREQ, usegen => 1,
822         pindex => 10+i, paddr => 10+i, pirq => 10+i, 
823         nsync => 1, rmap => CFG_SPW_RMAP, rxunaligned => CFG_SPW_RXUNAL,
824         rmapcrc => CFG_SPW_RMAPCRC, fifosize1 => CFG_SPW_AHBFIFO, 
825         fifosize2 => CFG_SPW_RXFIFO, rxclkbuftype => 2, dmachan => CFG_SPW_DMACHAN,
826         rmapbufs => CFG_SPW_RMAPBUF, ft => CFG_SPW_FT, ports => CFG_SPW_PORTS,
827         spwcore => CFG_SPW_GRSPW, netlist => CFG_SPW_NETLIST,
828         rxtx_sameclk => CFG_SPW_RTSAME, input_type => CFG_SPW_INPUT,
829         output_type => CFG_SPW_OUTPUT)
830       port map(rstn, clkm, rxclko(i), rxclko(i), spw_clkl, spw_clkl, ahbmi,
831         ahbmo(CFG_NCPU+CFG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG+CFG_SVGA_ENABLE+i), 
832         apbi, apbo(10+i), spwi(i), spwo(i));
833      spwi(i).tickin <= '0'; spwi(i).rmapen <= '1';
834      spwi(i).clkdiv10 <= conv_std_logic_vector(CPU_FREQ/10000-1, 8) when CFG_SPW_GRSPW = 1
835         else conv_std_logic_vector((25*12/20)-1, 8);
836
837      spwlb0 : if SPW_LOOP_BACK = 1 generate
838        core0 : if CFG_SPW_GRSPW = 1 generate
839          spwi(i).d(0) <= spwo(i).d(0); spwi(i).s(0) <= spwo(i).s(0);
840        end generate;
841        core1 : if CFG_SPW_GRSPW = 2 generate
842          dtmp(i) <= spwo(i).d(0); stmp(i) <= spwo(i).s(0);
843        end generate;
844      end generate;
845       
846      nospwlb0 : if SPW_LOOP_BACK = 0 generate
847        core0 : if CFG_SPW_GRSPW = 1 generate
848          spwi(i).d(0) <= dtmp(i); spwi(i).s(0) <= stmp(i);
849        end generate;
850        spw_rxd_pad : inpad_ds generic map (padtech, lvds, x25v)
851          port map (spw_rxdp(i), spw_rxdn(i), dtmp(i));
852        spw_rxs_pad : inpad_ds generic map (padtech, lvds, x25v)
853          port map (spw_rxsp(i), spw_rxsn(i), stmp(i));
854        spw_txd_pad : outpad_ds generic map (padtech, lvds, x25v)
855          port map (spw_txdp(i), spw_txdn(i), spwo(i).d(0), gnd(0));
856        spw_txs_pad : outpad_ds generic map (padtech, lvds, x25v)
857          port map (spw_txsp(i), spw_txsn(i), spwo(i).s(0), gnd(0));
858      end generate;
859    end generate;
860   end generate;
861
862 -------------------------------------------------------------------------------
863 --- USB -----------------------------------------------------------------------
864 -------------------------------------------------------------------------------
865   -- Note that the GRUSBDC and GRUSB_DCL can not be instantiated at the same
866   -- time (board has only one USB transceiver), therefore they share AHB
867   -- master/slave indexes
868   -----------------------------------------------------------------------------
869   -- Shared pads
870   -----------------------------------------------------------------------------
871   usbpads: if (CFG_GRUSBDC + CFG_GRUSB_DCL) /= 0 generate
872     usb_clk_pad : clkpad generic map (tech => padtech, arch => 2)
873       port map (usb_clkout, uclk);
874     
875     usb_d_pad: iopadv generic map(tech => padtech, width => 16, slew => 1)
876       port map (usb_d, usbo.dataout, usbo.oen, usbi.datain);
877   
878     usb_txready_pad : inpad generic map (tech => padtech)
879       port map (usb_txready,usbi.txready);
880     usb_rxvalid_pad : inpad generic map (tech => padtech)
881       port map (usb_rxvalid,usbi.rxvalid);
882     usb_rxerror_pad : inpad generic map (tech => padtech)
883       port map (usb_rxerror,usbi.rxerror);
884     usb_rxactive_pad : inpad generic map (tech => padtech)
885       port map (usb_rxactive,usbi.rxactive);
886     usb_linestate_pad : inpadv generic map (tech => padtech, width => 2)
887       port map (usb_linestate,usbi.linestate);
888     usb_vbus_pad : inpad generic map (tech => padtech)
889       port map (usb_vbus, usbi.vbusvalid);
890     
891     usb_reset_pad : outpad generic map (tech => padtech, slew => 1)
892       port map (usb_reset,usbo.reset);
893     usb_suspend_pad : outpad generic map (tech => padtech, slew => 1)
894       port map (usb_suspend,usbo.suspendm);
895     usb_termsel_pad : outpad generic map (tech => padtech, slew => 1)
896       port map (usb_termsel,usbo.termselect);
897     usb_xcvrsel_pad : outpad generic map (tech => padtech, slew => 1)
898       port map (usb_xcvrsel,usbo.xcvrselect(0));
899     usb_txvalid_pad : outpad generic map (tech => padtech, slew => 1)
900       port map (usb_txvalid,usbo.txvalid);
901     usb_opmode_pad : outpadv generic map (tech =>padtech ,width =>2, slew =>1)
902       port map (usb_opmode,usbo.opmode);
903
904     usb_validh_pad:iopad generic map(tech => padtech, slew => 1)
905       port map (usb_validh, usbo.txvalidh, usbo.oen, usbi.rxvalidh);
906
907   end generate;
908   
909   -----------------------------------------------------------------------------
910   -- USB 2.0 Device Controller
911   -----------------------------------------------------------------------------
912   usbdc0: if CFG_GRUSBDC = 1 generate
913     usbdc0: grusbdc
914       generic map(
915         hsindex => 5, hirq => 9, haddr => 16#004#, hmask => 16#FFC#,        
916         hmindex => CFG_NCPU+CFG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG+
917         CFG_SVGA_ENABLE+CFG_SPW_NUM*CFG_SPW_EN,
918         aiface => CFG_GRUSBDC_AIFACE, uiface => 0, dwidth => CFG_GRUSBDC_DW,
919         nepi => CFG_GRUSBDC_NEPI, nepo => CFG_GRUSBDC_NEPO,
920         i0 => CFG_GRUSBDC_I0, i1 => CFG_GRUSBDC_I1,
921         i2 => CFG_GRUSBDC_I2, i3 => CFG_GRUSBDC_I3,
922         i4 => CFG_GRUSBDC_I4, i5 => CFG_GRUSBDC_I5,
923         i6 => CFG_GRUSBDC_I6, i7 => CFG_GRUSBDC_I7,
924         i8 => CFG_GRUSBDC_I8, i9 => CFG_GRUSBDC_I9,
925         i10 => CFG_GRUSBDC_I10, i11 => CFG_GRUSBDC_I11,
926         i12 => CFG_GRUSBDC_I12, i13 => CFG_GRUSBDC_I13,
927         i14 => CFG_GRUSBDC_I14, i15 => CFG_GRUSBDC_I15,
928         o0 => CFG_GRUSBDC_O0, o1 => CFG_GRUSBDC_O1,
929         o2 => CFG_GRUSBDC_O2, o3 => CFG_GRUSBDC_O3,
930         o4 => CFG_GRUSBDC_O4, o5 => CFG_GRUSBDC_O5,
931         o6 => CFG_GRUSBDC_O6, o7 => CFG_GRUSBDC_O7,
932         o8 => CFG_GRUSBDC_O8, o9 => CFG_GRUSBDC_O9,
933         o10 => CFG_GRUSBDC_O10, o11 => CFG_GRUSBDC_O11,
934         o12 => CFG_GRUSBDC_O12, o13 => CFG_GRUSBDC_O13,
935         o14 => CFG_GRUSBDC_O14, o15 => CFG_GRUSBDC_O15,
936         memtech => memtech)
937       port map(
938         uclk  => uclk,
939         usbi  => usbi,
940         usbo  => usbo,
941         hclk  => clkm,
942         hrst  => rstn,
943         ahbmi => ahbmi,
944         ahbmo => ahbmo(CFG_NCPU+CFG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG+
945                        CFG_SVGA_ENABLE+CFG_SPW_NUM*CFG_SPW_EN),
946         ahbsi => ahbsi,
947         ahbso => ahbso(5)
948         );
949   end generate usbdc0;
950
951   -----------------------------------------------------------------------------
952   -- USB DCL
953   -----------------------------------------------------------------------------
954   usb_dcl0: if CFG_GRUSB_DCL = 1 generate
955     usb_dcl0: grusb_dcl
956       generic map (
957         hindex => CFG_NCPU+CFG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG+
958         CFG_SVGA_ENABLE+CFG_SPW_NUM*CFG_SPW_EN,
959         memtech => memtech, uiface => 0, dwidth => CFG_GRUSB_DCL_DW)
960       port map (
961         uclk, usbi, usbo, clkm, rstn, ahbmi,
962         ahbmo(CFG_NCPU+CFG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG+CFG_SVGA_ENABLE+
963               CFG_SPW_NUM*CFG_SPW_EN));
964   end generate usb_dcl0;
965   
966 -----------------------------------------------------------------------
967 ---  AHB ATA ----------------------------------------------------------
968 -----------------------------------------------------------------------
969
970   ata0 : if CFG_ATA = 1 generate
971     atac0 : atactrl
972       generic map(
973         tech => 0, fdepth => CFG_ATAFIFO,
974         mhindex => CFG_NCPU+CFG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG+
975         CFG_SVGA_ENABLE+CFG_SPW_NUM*CFG_SPW_EN+CFG_GRUSB_DCL+
976         CFG_GRUSBDC,
977         shindex => 3, haddr => 16#A00#, hmask => 16#fff#, pirq  => CFG_ATAIRQ,
978         mwdma => CFG_ATADMA, TWIDTH   => 8,
979         -- PIO mode 0 settings (@100MHz clock)
980         PIO_mode0_T1   => 6,   -- 70ns
981         PIO_mode0_T2   => 28,  -- 290ns
982         PIO_mode0_T4   => 2,   -- 30ns
983         PIO_mode0_Teoc => 23   -- 240ns ==> T0 - T1 - T2 = 600 - 70 - 290 = 240
984         )
985       port map(
986         rst => rstn, arst => vcc(0), clk => clkm, ahbmi => ahbmi,
987         ahbmo => ahbmo(CFG_NCPU+CFG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG+
988                        CFG_SVGA_ENABLE+CFG_SPW_NUM*CFG_SPW_EN+
989                        CFG_GRUSB_DCL+CFG_GRUSBDC),
990         ahbsi => ahbsi, ahbso => ahbso(3), atai => idei, atao => ideo);
991     
992     ata_rstn_pad : outpad generic map (tech => padtech)
993       port map (ata_rstn, ideo.rstn);
994     ata_data_pad : iopadv generic map (tech => padtech, width => 16, oepol => 1)
995       port map (ata_data, ideo.ddo, ideo.oen, idei.ddi);
996     ata_da_pad : outpadv generic map (tech => padtech, width => 3)
997       port map (ata_da, ideo.da);
998     ata_cs0_pad : outpad generic map (tech => padtech)
999       port map (ata_cs0, ideo.cs0);
1000     ata_cs1_pad : outpad generic map (tech => padtech)
1001       port map (ata_cs1, ideo.cs1);
1002     ata_dior_pad : outpad generic map (tech => padtech)
1003       port map (ata_dior, ideo.dior);
1004     ata_diow_pad : outpad generic map (tech => padtech)
1005       port map (ata_diow, ideo.diow);
1006     iordy_pad : inpad generic map (tech => padtech)
1007       port map (ata_iordy, idei.iordy);
1008     intrq_pad : inpad generic map (tech => padtech)
1009       port map (ata_intrq, idei.intrq);
1010     dmarq_pad : inpad generic map (tech => padtech)
1011       port map (ata_dmarq, idei.dmarq);
1012     dmack_pad : outpad generic map (tech => padtech)
1013       port map (ata_dmack, ideo.dmack);
1014     ata_csel <= '0';
1015   end generate;
1016
1017 -------------------------------------------------------------------------------
1018 --  For BLANCA
1019 -------------------------------------------------------------------------------
1020   uart_ensig <= '0';
1021   uart_en_pad : outpad generic map (tech => padtech)
1022       port map (uart_en, uart_ensig);
1023   sdckesig <= '1';
1024   sdcke_pad : outpad generic map (tech => padtech)
1025     port map (sdcke, sdckesig);
1026     
1027   
1028 -----------------------------------------------------------------------
1029 ---  Drive unused bus elements  ---------------------------------------
1030 -----------------------------------------------------------------------
1031
1032 --  nam1 : for i in (CFG_NCPU+CFG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG) to NAHBMST-1 generate
1033 --    ahbmo(i) <= ahbm_none;
1034 --  end generate;
1035 --  nap0 : for i in 11 to NAPBSLV-1 generate apbo(i) <= apb_none; end generate;
1036 --  nah0 : for i in 8 to NAHBSLV-1 generate ahbso(i) <= ahbs_none; end generate;
1037
1038 -----------------------------------------------------------------------
1039 ---  Boot message  ----------------------------------------------------
1040 -----------------------------------------------------------------------
1041
1042 -- pragma translate_off
1043   x : report_version 
1044   generic map (
1045    msg1 => "LEON3 GR-XC3S-1500 Demonstration design",
1046       msg2 => "GRLIB Version " & tost(LIBVHDL_VERSION/1000) & "." & tost((LIBVHDL_VERSION mod 1000)/100)
1047         & "." & tost(LIBVHDL_VERSION mod 100) & ", build " & tost(LIBVHDL_BUILD),
1048    msg3 => "Target technology: " & tech_table(fabtech) & ",  memory library: " & tech_table(memtech),
1049    mdel => 1
1050   );
1051 -- pragma translate_on
1052 end;