OSDN Git Service

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