OSDN Git Service

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