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
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.
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.
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
25 -------------------------------------------------------------------------------
29 use ieee.std_logic_1164.all;
30 library grlib, techmap;
33 use techmap.gencomp.all;
35 use gaisler.memctrl.all;
36 use gaisler.leon3.all;
42 use gaisler.spacewire.all;
43 use gaisler.grusb.all;
47 use esa.memoryctrl.all;
52 -- pragma translate_off
56 -- pragma translate_on
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
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);
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
99 -- dsuen : in std_ulogic;
100 -- dsubre : in std_ulogic;
101 dsuact : out std_ulogic;
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
112 pio : inout std_logic_vector(17 downto 0); -- I/O port
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;
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);
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);
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);
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;
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;
189 -- adding uart enable for BLANCA
190 uart_en : out std_logic
197 architecture rtl of leon3mp is
200 -- Adding DCM component for BLANCA sdclk
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
221 CLKFB : in std_logic;
222 CLKIN : in std_logic;
223 DSSEN : in std_logic;
224 PSCLK : in std_logic;
226 PSINCDEC : 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));
242 component BUFG port (O : out std_logic; I : in std_logic); end component;
244 attribute syn_netlist_hierarchy : boolean;
245 attribute syn_netlist_hierarchy of rtl : architecture is false;
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;
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;
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);
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;
274 signal irqi : irq_in_vector(0 to CFG_NCPU-1);
275 signal irqo : irq_out_vector(0 to CFG_NCPU-1);
277 signal dbgi : l3_debug_in_vector(0 to CFG_NCPU-1);
278 signal dbgo : l3_debug_out_vector(0 to CFG_NCPU-1);
280 signal dsui : dsu_in_type;
281 signal dsuo : dsu_out_type;
283 signal ethi, ethi1, ethi2 : eth_in_type;
284 signal etho, etho1, etho2 : eth_out_type;
286 signal gpti : gptimer_in_type;
287 signal gpto : gptimer_out_type;
289 signal gpioi : gpio_in_type;
290 signal gpioo : gpio_out_type;
292 signal can_lrx, can_ltx : std_logic_vector(0 to 7);
294 signal lclk, rst, ndsuact, wdogl : std_ulogic;
295 signal tck, tckn, tms, tdi, tdo : std_ulogic;
297 signal ethclk : std_ulogic;
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;
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;
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;
318 signal uclk : std_ulogic;
319 signal usbi : grusb_in_type;
320 signal usbo : grusb_out_type;
322 signal idei : ata_in_type;
323 signal ideo : ata_out_type;
325 constant SPW_LOOP_BACK : integer := 0;
327 signal dac_clk, video_clk, clk50 : std_logic; -- signals to vga_clkgen.
328 signal clk_sel : std_logic_vector(1 downto 0);
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;
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;
352 ----------------------------------------------------------------------
353 --- Reset and Clock generation -------------------------------------
354 ----------------------------------------------------------------------
356 vcc <= (others => '1'); gnd <= (others => '0');
357 cgi.pllctrl <= "00"; cgi.pllrst <= rstraw;
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);
368 -- sddll_rst <= not cgo.clklock;
370 rstdff : process(sdclkl, cgo.clklock)
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';
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);
383 --sdclkl2 <= not sdclkl;
384 sdclk_pad : outpad generic map (tech => padtech, slew => 1, strength => 24)
385 port map (sdclk, sdclkl2);
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);
391 ----------------------------------------------------------------------
392 --- AHB CONTROLLER --------------------------------------------------
393 ----------------------------------------------------------------------
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);
401 ----------------------------------------------------------------------
402 --- LEON3 processor and DSU -----------------------------------------
403 ----------------------------------------------------------------------
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));
418 errorn_pad : odpad generic map (tech => padtech) port map (errorn, dbgo(0).error);
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);
429 dsuact_pad : outpad generic map (tech => padtech) port map (dsuact, ndsuact);
430 ndsuact <= not dsuo.active;
433 nodsu : if CFG_DSU = 0 generate
434 dsuo.tstop <= '0'; dsuo.active <= '0';
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);
444 nouah : if CFG_AHB_UART = 0 generate apbo(7) <= apb_none; end generate;
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));
452 ----------------------------------------------------------------------
453 --- Memory controllers ----------------------------------------------
454 ----------------------------------------------------------------------
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);
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));
476 sdcsn_pad : outpadv generic map (width =>2, tech => padtech)
477 port map (sdcsn, sdo.sdcsn);
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));
503 ----------------------------------------------------------------------
504 --- APB Bridge and various periherals -------------------------------
505 ----------------------------------------------------------------------
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));
513 ----------------------------------------------------------------------
514 --- APB Bridge and various periherals -------------------------------
515 ----------------------------------------------------------------------
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 );
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);
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);
532 noua0 : if CFG_UART1_ENABLE = 0 generate apbo(1) <= apb_none; end generate;
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);
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);
544 noua1 : if CFG_UART2_ENABLE = 0 generate
545 apbo(9) <= apb_none; rtsn2 <= '0';
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);
553 irq3 : if CFG_IRQ3_ENABLE = 0 generate
554 x : for i in 0 to CFG_NCPU-1 generate
555 irqi(i).irl <= "0000";
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';
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);
572 wddis : if CFG_GPT_WDOGEN = 0 generate
573 wdogn_pad : odpad generic map (tech => padtech) port map (wdogn, vcc(0));
576 nogpt : if CFG_GPT_ENABLE = 0 generate apbo(3) <= apb_none; end generate;
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);
584 nokbd : if CFG_KBD_ENABLE = 0 generate
585 apbo(4) <= apb_none; mouo <= ps2o_none;
586 apbo(5) <= apb_none; kbdo <= ps2o_none;
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);
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;
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);
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);
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);
668 gpio0 : if CFG_GRGPIO_ENABLE /= 0 generate -- GPIO unit
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));
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));
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));
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));
702 -----------------------------------------------------------------------
703 --- ETHERNET ---------------------------------------------------------
704 -----------------------------------------------------------------------
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,
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);
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);
734 port map (I => etx_clk2, O => ethi.tx_clk);
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);
741 port map (I => erx_clk2, O => ethi.rx_clk);
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);
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);
766 -----------------------------------------------------------------------
767 --- AHB RAM ----------------------------------------------------------
768 -----------------------------------------------------------------------
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));
776 -----------------------------------------------------------------------
777 --- Multi-core CAN ---------------------------------------------------
778 -----------------------------------------------------------------------
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));
797 -- standby controlled by pio(3) and pio(0)
799 -----------------------------------------------------------------------
800 --- SPACEWIRE -------------------------------------------------------
801 -----------------------------------------------------------------------
803 spw : if CFG_SPW_EN > 0 generate
804 core0: if CFG_SPW_GRSPW = 1 generate
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,
813 port map (clk3, clk3, spw_clkl, spw_clkln, open, open, open, cgi2, cgo2, open, open);
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
822 input_type => CFG_SPW_INPUT)
826 rxclkin => spw_clkln,
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));
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);
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);
858 core1 : if CFG_SPW_GRSPW = 2 generate
859 dtmp(i) <= spwo(i).d(0); stmp(i) <= spwo(i).s(0);
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);
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));
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 -----------------------------------------------------------------------------
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);
892 usb_d_pad: iopadv generic map(tech => padtech, width => 16, slew => 1)
893 port map (usb_d, usbo.dataout, usbo.oen, usbi.datain);
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);
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);
921 usb_validh_pad:iopad generic map(tech => padtech, slew => 1)
922 port map (usb_validh, usbo.txvalidh, usbo.oen, usbi.rxvalidh);
926 -----------------------------------------------------------------------------
927 -- USB 2.0 Device Controller
928 -----------------------------------------------------------------------------
929 usbdc0: if CFG_GRUSBDC = 1 generate
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,
961 ahbmo => ahbmo(CFG_NCPU+CFG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG+
962 CFG_SVGA_ENABLE+CFG_SPW_NUM*CFG_SPW_EN),
968 -----------------------------------------------------------------------------
970 -----------------------------------------------------------------------------
971 usb_dcl0: if CFG_GRUSB_DCL = 1 generate
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)
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;
983 -----------------------------------------------------------------------
984 --- AHB ATA ----------------------------------------------------------
985 -----------------------------------------------------------------------
987 ata0 : if CFG_ATA = 1 generate
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+
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
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);
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);
1034 -------------------------------------------------------------------------------
1035 -- upsample YCC-RGB translation module ---------------------------------------
1036 -------------------------------------------------------------------------------
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)
1051 -------------------------------------------------------------------------------
1053 -------------------------------------------------------------------------------
1055 uart_en_pad : outpad generic map (tech => padtech)
1056 port map (uart_en, uart_ensig);
1058 sdcke_pad : outpad generic map (tech => padtech)
1059 port map (sdcke, sdckesig);
1062 -----------------------------------------------------------------------
1063 --- Drive unused bus elements ---------------------------------------
1064 -----------------------------------------------------------------------
1066 -- nam1 : for i in (CFG_NCPU+CFG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG) to NAHBMST-1 generate
1067 -- ahbmo(i) <= ahbm_none;
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;
1072 -----------------------------------------------------------------------
1073 --- Boot message ----------------------------------------------------
1074 -----------------------------------------------------------------------
1076 -- pragma translate_off
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),
1085 -- pragma translate_on