OpenCores
URL https://opencores.org/ocsvn/mips_enhanced/mips_enhanced/trunk

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [designs/] [leon3-altera-ep3c25/] [leon3mp.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
------------------------------------------------------------------------------
2
--  LEON3 Demonstration design
3
--  Copyright (C) 2004 Jiri Gaisler, Gaisler Research
4
--
5
--  This program is free software; you can redistribute it and/or modify
6
--  it under the terms of the GNU General Public License as published by
7
--  the Free Software Foundation; either version 2 of the License, or
8
--  (at your option) any later version.
9
--
10
--  This program is distributed in the hope that it will be useful,
11
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
--  GNU General Public License for more details.
14
--
15
--  You should have received a copy of the GNU General Public License
16
--  along with this program; if not, write to the Free Software
17
--  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
 
19
 
20
library ieee;
21
use ieee.std_logic_1164.all;
22
library grlib;
23
use grlib.amba.all;
24
use grlib.stdlib.all;
25
library techmap;
26
use techmap.gencomp.all;
27
library gaisler;
28
use gaisler.memctrl.all;
29
use gaisler.leon3.all;
30
use gaisler.uart.all;
31
use gaisler.misc.all;
32
use gaisler.jtag.all;
33
library esa;
34
use esa.memoryctrl.all;
35
use work.config.all;
36
 
37
entity leon3mp is
38
  generic (
39
    fabtech : integer := CFG_FABTECH;
40
    memtech : integer := CFG_MEMTECH;
41
    padtech : integer := CFG_PADTECH;
42
    clktech : integer := CFG_CLKTECH;
43
    ncpu    : integer := CFG_NCPU;
44
    disas   : integer := CFG_DISAS;     -- Enable disassembly to console
45
    dbguart : integer := CFG_DUART;     -- Print UART on console
46
    pclow   : integer := CFG_PCLOW;
47
    freq    : integer := 50000         -- frequency of main clock (used for PLLs)
48
    );
49
  port (
50
 
51
    resetn  : in  std_ulogic;
52
    clk     : in  std_ulogic;
53
    errorn  : out   std_ulogic;
54
 
55
    -- flash/ssram bus
56
    address : out   std_logic_vector(25 downto 1);
57
    data    : inout std_logic_vector(31 downto 0);
58
    romsn   : out std_ulogic;
59
    oen     : out std_logic;
60
    writen  : out std_logic;
61
    rstoutn     : out std_ulogic;
62
    ssram_cen   : out std_logic;
63
    ssram_wen   : out std_logic;
64
    ssram_bw    : out std_logic_vector (0 to 3);
65
    ssram_oen   : out std_ulogic;
66
    ssram_clk   : out std_ulogic;
67
    ssram_adscn : out std_ulogic;
68
--    ssram_adsp_n : out std_ulogic;
69
--    ssram_adv_n : out std_ulogic;
70
 
71
-- pragma translate_off
72
    iosn    : out   std_ulogic;
73
-- pragma translate_on
74
 
75
    ddr_clk     : out std_logic;
76
    ddr_clkn    : out std_logic;
77
    ddr_cke     : out std_logic;
78
    ddr_csb     : out std_logic;
79
    ddr_web     : out std_ulogic;                       -- ddr write enable
80
    ddr_rasb    : out std_ulogic;                       -- ddr ras
81
    ddr_casb    : out std_ulogic;                       -- ddr cas
82
    ddr_dm      : out std_logic_vector (1 downto 0);    -- ddr dm
83
    ddr_dqs     : inout std_logic_vector (1 downto 0);  -- ddr dqs
84
    ddr_ad      : out std_logic_vector (12 downto 0);   -- ddr address
85
    ddr_ba      : out std_logic_vector (1 downto 0);    -- ddr bank address
86
    ddr_dq      : inout std_logic_vector (15 downto 0); -- ddr data
87
 
88
    -- debug support unit
89
    dsubren             : in  std_ulogic;
90
    dsuact              : out std_ulogic;
91
 
92
    -- console/debug UART
93
    rxd1 : in  std_logic;
94
    txd1 : out std_logic;
95
 
96
    gpio         : in std_logic_vector(CFG_GRGPIO_WIDTH-1 downto 0)      -- I/O port
97
    );
98
end;
99
 
100
architecture rtl of leon3mp is
101
 
102
  constant blength   : integer := 12;
103
  constant fifodepth : integer := 8;
104
 
105
  constant maxahbm : integer := NCPU+CFG_AHB_UART+CFG_AHB_JTAG;
106
 
107
  signal vcc, gnd    : std_logic_vector(7 downto 0);
108
  signal memi, smemi : memory_in_type;
109
  signal memo, smemo : memory_out_type;
110
  signal wpo         : wprot_out_type;
111
 
112
  signal ddsi  : ddrmem_in_type;
113
  signal ddso  : ddrmem_out_type;
114
 
115
  signal ddrclkfb, ssrclkfb, ddr_clkl, ddr_clk90l, ddr_clknl, ddr_clk270l : std_ulogic;
116
  signal ddr_clkv       : std_logic_vector(2 downto 0);
117
  signal ddr_clkbv      : std_logic_vector(2 downto 0);
118
  signal ddr_ckev       : std_logic_vector(1 downto 0);
119
  signal ddr_csbv       : std_logic_vector(1 downto 0);
120
  signal ddr_adl        : std_logic_vector (13 downto 0);
121
  signal clklock, lock, clkml, rst, ndsuact : std_ulogic;
122
  signal tck, tckn, tms, tdi, tdo : std_ulogic;
123
  signal ddrclk, ddrrst : std_ulogic;
124
 
125
 
126
--  attribute syn_keep : boolean;
127
--  attribute syn_preserve : boolean;
128
--  attribute syn_keep of clkml : signal is true;
129
--  attribute syn_preserve of clkml : signal is true;
130
 
131
  signal apbi  : apb_slv_in_type;
132
  signal apbo  : apb_slv_out_vector := (others => apb_none);
133
  signal ahbsi : ahb_slv_in_type;
134
  signal ahbso : ahb_slv_out_vector := (others => ahbs_none);
135
  signal ahbmi : ahb_mst_in_type;
136
  signal ahbmo : ahb_mst_out_vector := (others => ahbm_none);
137
 
138
  signal clkm, rstn, ssram_clkl : std_ulogic;
139
  signal cgi                : clkgen_in_type;
140
  signal cgo                : clkgen_out_type;
141
  signal u1i, dui           : uart_in_type;
142
  signal u1o, duo           : uart_out_type;
143
 
144
  signal irqi : irq_in_vector(0 to NCPU-1);
145
  signal irqo : irq_out_vector(0 to NCPU-1);
146
 
147
  signal dbgi : l3_debug_in_vector(0 to NCPU-1);
148
  signal dbgo : l3_debug_out_vector(0 to NCPU-1);
149
 
150
  signal dsui : dsu_in_type;
151
  signal dsuo : dsu_out_type;
152
 
153
  signal gpti : gptimer_in_type;
154
  signal gpioi : gpio_in_type;
155
  signal gpioo : gpio_out_type;
156
 
157
  constant IOAEN : integer := 1;
158
  constant BOARD_FREQ : integer := 50000;   -- input frequency in KHz
159
  constant CPU_FREQ : integer := BOARD_FREQ * CFG_CLKMUL / CFG_CLKDIV;  -- cpu frequency in KHz
160
 
161
  signal lclk, lclkout  : std_ulogic;
162
 
163
  signal dsubre : std_ulogic;
164
 
165
begin
166
 
167
----------------------------------------------------------------------
168
---  Reset and Clock generation  -------------------------------------
169
----------------------------------------------------------------------
170
 
171
  vcc <= (others => '1'); gnd <= (others => '0');
172
  cgi.pllctrl <= "00"; cgi.pllrst <= not resetn; cgi.pllref <= '0';
173
 
174
  clklock <=  cgo.clklock and lock;
175
  clk_pad : clkpad generic map (tech => padtech) port map (clk, lclk);
176
 
177
  clkgen0 : clkgen  -- clock generator using toplevel generic 'freq'
178
    generic map (tech => CFG_CLKTECH, clk_mul => CFG_CLKMUL,
179
                 clk_div => CFG_CLKDIV, sdramen => 1,
180
                 freq => freq)
181
    port map (clkin => lclk, pciclkin => gnd(0), clk => clkm, clkn => open,
182
              clk2x => open, sdclk => ssram_clkl, pciclk => open,
183
              cgi => cgi, cgo => cgo);
184
 
185
  ssrclk_pad : outpad generic map (tech => padtech, slew => 1, strength => 24)
186
        port map (ssram_clk, ssram_clkl);
187
 
188
  rst0 : rstgen                         -- reset generator
189
    port map (resetn, clkm, clklock, rstn);
190
 
191
  rstoutn <= resetn;
192
 
193
---------------------------------------------------------------------- 
194
---  AHB CONTROLLER --------------------------------------------------
195
----------------------------------------------------------------------
196
 
197
  ahb0 : ahbctrl                -- AHB arbiter/multiplexer
198
  generic map (defmast => CFG_DEFMST, split => CFG_SPLIT,
199
        rrobin => CFG_RROBIN, ioaddr => CFG_AHBIO,
200
        ioen => IOAEN, nahbm => maxahbm, nahbs => 8)
201
  port map (rstn, clkm, ahbmi, ahbmo, ahbsi, ahbso);
202
 
203
----------------------------------------------------------------------
204
---  LEON3 processor and DSU -----------------------------------------
205
----------------------------------------------------------------------
206
 
207
  l3 : if CFG_LEON3 = 1 generate
208
    cpu : for i in 0 to NCPU-1 generate
209
      u0 : leon3s                         -- LEON3 processor
210
        generic map (i, fabtech, memtech, CFG_NWIN, CFG_DSU, CFG_FPU, CFG_V8,
211
                   0, CFG_MAC, pclow, 0, CFG_NWP, CFG_ICEN, CFG_IREPL, CFG_ISETS, CFG_ILINE,
212
                   CFG_ISETSZ, CFG_ILOCK, CFG_DCEN, CFG_DREPL, CFG_DSETS, CFG_DLINE, CFG_DSETSZ,
213
                   CFG_DLOCK, CFG_DSNOOP, CFG_ILRAMEN, CFG_ILRAMSZ, CFG_ILRAMADDR, CFG_DLRAMEN,
214
                   CFG_DLRAMSZ, CFG_DLRAMADDR, CFG_MMUEN, CFG_ITLBNUM, CFG_DTLBNUM, CFG_TLB_TYPE, CFG_TLB_REP,
215
                   CFG_LDDEL, disas, CFG_ITBSZ, CFG_PWD, CFG_SVT, CFG_RSTADDR, NCPU-1)
216
        port map (clkm, rstn, ahbmi, ahbmo(i), ahbsi, ahbso,
217
                irqi(i), irqo(i), dbgi(i), dbgo(i));
218
    end generate;
219
    errorn_pad : outpad generic map (tech => padtech) port map (errorn, dbgo(0).error);
220
 
221
    dsugen : if CFG_DSU = 1 generate
222
      dsu0 : dsu3                         -- LEON3 Debug Support Unit
223
        generic map (hindex => 2, haddr => 16#900#, hmask => 16#F00#,
224
                   ncpu   => NCPU, tbits => 30, tech => memtech, irq => 0, kbytes => CFG_ATBSZ)
225
        port map (rstn, clkm, ahbmi, ahbsi, ahbso(2), dbgo, dbgi, dsui, dsuo);
226
 
227
      dsui.enable <= '1';
228
 
229
      dsubre_pad : inpad generic map (tech  => padtech) port map (dsubre, dsui.break);
230
      dsuact_pad : outpad generic map (tech => padtech) port map (dsuact, dsuo.active);
231
    end generate;
232
  end generate;
233
  nodcom : if CFG_DSU = 0 generate ahbso(2) <= ahbs_none; end generate;
234
 
235
  dcomgen : if CFG_AHB_UART = 1 generate
236
    dcom0 : ahbuart                     -- Debug UART
237
      generic map (hindex => NCPU, pindex => 4, paddr => 7)
238
      port map (rstn, clkm, dui, duo, apbi, apbo(4), ahbmi, ahbmo(NCPU));
239
    dsurx_pad : inpad generic map (tech  => padtech) port map (rxd1, dui.rxd);
240
    dsutx_pad : outpad generic map (tech => padtech) port map (txd1, duo.txd);
241
  end generate;
242
  nouah : if CFG_AHB_UART = 0 generate apbo(4) <= apb_none; end generate;
243
 
244
  ahbjtaggen0 :if CFG_AHB_JTAG = 1 generate
245
    ahbjtag0 : ahbjtag generic map(tech => fabtech, hindex => NCPU+CFG_AHB_UART)
246
      port map(rstn, clkm, tck, tms, tdi, tdo, ahbmi, ahbmo(NCPU+CFG_AHB_UART),
247
               open, open, open, open, open, open, open, gnd(0));
248
  end generate;
249
 
250
----------------------------------------------------------------------
251
---  Memory controllers ----------------------------------------------
252
----------------------------------------------------------------------
253
 
254
  mg2 : if CFG_MCTRL_LEON2 = 1 generate         -- LEON2 memory controller
255
    sr1 :mctrl generic map (hindex => 0, pindex => 0, paddr => 0,
256
        ramaddr => 16#400#+16#600#*CFG_DDRSP, rammask =>16#F00#, srbanks => 1,
257
        sden => 0, ram16 => 1)
258
    port map (rstn, clkm, memi, memo, ahbsi, ahbso(0), apbi, apbo(0), wpo);
259
  end generate;
260
 
261
  memi.brdyn  <= '1'; memi.bexcn <= '1';
262
  memi.writen <= '1'; memi.wrn <= "1111"; memi.bwidth <= "01";
263
 
264
  ssr0 : if CFG_SSCTRL = 1 generate
265
    ssrctrl0 : ssrctrl generic map (hindex => 0, pindex => 0,
266
        iomask => 0, ramaddr => 16#400#+16#600#*CFG_DDRSP,
267
        bus16 => CFG_SSCTRLP16)
268
    port map (rstn, clkm, ahbsi, ahbso(0), apbi, apbo(0), memi, memo);
269
  end generate;
270
 
271
  mg0 : if (CFG_MCTRL_LEON2 + CFG_SSCTRL) = 0 generate   -- no prom/sram pads
272
    apbo(0) <= apb_none; ahbso(0) <= ahbs_none;
273
    roms_pad : outpad generic map (tech => padtech) port map (romsn, vcc(0));
274
  end generate;
275
 
276
  mgpads : if (CFG_MCTRL_LEON2 + CFG_SSCTRL) /= 0 generate       -- prom/sram pads
277
    addr_pad : outpadv generic map (width => 25, tech => padtech)
278
      port map (address, memo.address(25 downto 1));
279
    roms_pad : outpad generic map (tech => padtech)
280
      port map (romsn, memo.romsn(0));
281
    oen_pad : outpad generic map (tech => padtech)
282
      port map (oen, memo.oen);
283
    wri_pad : outpad generic map (tech => padtech)
284
      port map (writen, memo.writen);
285
-- pragma translate_off
286
   iosn_pad : outpad generic map (tech => padtech)
287
      port map (iosn, memo.iosn);
288
-- pragma translate_on
289
 
290
--    ssram_adv_n_pad : outpad generic map (tech => padtech) 
291
--      port map (ssram_adv_n, vcc(0)); 
292
--    ssram_adsp_n_pad : outpad generic map (tech => padtech) 
293
--      port map (ssram_adsp_n, gnd(0)); 
294
    ssram_adscn_pad : outpad generic map (tech => padtech)
295
        port map (ssram_adscn, gnd(0));
296
    ssrams_pad : outpad generic map ( tech => padtech)
297
        port map (ssram_cen, memo.ramsn(0));
298
    ssram_oen_pad  : outpad generic map (tech => padtech)
299
        port map (ssram_oen, memo.oen);
300
    ssram_rwen_pad : outpadv generic map (width => 4, tech => padtech)
301
        port map (ssram_bw, memo.wrn);
302
    ssram_wri_pad  : outpad generic map (tech => padtech)
303
        port map (ssram_wen, memo.writen);
304
    data_pad : iopadvv generic map (tech => padtech, width => 32)
305
        port map (data(31 downto 0), memo.data(31 downto 0),
306
                  memo.vbdrive, memi.data(31 downto 0));
307
  end generate;
308
 
309
  ddrsp0 : if (CFG_DDRSP /= 0) generate
310
    ddrc0 : ddrspa generic map ( fabtech => fabtech, memtech => memtech,
311
        hindex => 3, haddr => 16#400#, hmask => 16#F00#, ioaddr => 1,
312
        pwron => CFG_DDRSP_INIT, MHz => BOARD_FREQ/1000, rskew => CFG_DDRSP_RSKEW,
313
        clkmul => CFG_DDRSP_FREQ/5, clkdiv => 10, ahbfreq => CPU_FREQ/1000,
314
        col => CFG_DDRSP_COL, Mbyte => CFG_DDRSP_SIZE, ddrbits => 16, regoutput => 1)
315
     port map (
316
        resetn, rstn, lclk, clkm, lock, clkml, clkml, ahbsi, ahbso(3),
317
        ddr_clkv, ddr_clkbv, open, gnd(0),
318
        ddr_ckev, ddr_csbv, ddr_web, ddr_rasb, ddr_casb,
319
        ddr_dm, ddr_dqs, ddr_adl, ddr_ba, ddr_dq);
320
        ddr_ad <= ddr_adl(12 downto 0);
321
        ddr_clk <= ddr_clkv(0); ddr_clkn <= ddr_clkbv(0);
322
        ddr_cke <= ddr_ckev(0); ddr_csb <= ddr_csbv(0);
323
  end generate;
324
 
325
  ddrsp1 : if (CFG_DDRSP = 0) generate
326
    ddr_cke <= '0'; ddr_csb <= '1'; lock <= '1';
327
  end generate;
328
 
329
----------------------------------------------------------------------
330
---  APB Bridge and various periherals -------------------------------
331
----------------------------------------------------------------------
332
 
333
  apb0 : apbctrl                        -- AHB/APB bridge
334
    generic map (hindex => 1, haddr => CFG_APBADDR)
335
    port map (rstn, clkm, ahbsi, ahbso(1), apbi, apbo);
336
 
337
  ua1 : if CFG_UART1_ENABLE /= 0 generate
338
    uart1 : apbuart                     -- UART 1
339
      generic map (pindex   => 1, paddr => 1, pirq => 2, console => dbguart,
340
                   fifosize => CFG_UART1_FIFO)
341
      port map (rstn, clkm, apbi, apbo(1), u1i, u1o);
342
    u1i.ctsn <= '0'; u1i.extclk <= '0';
343
    upads : if CFG_AHB_UART = 0 generate
344
      u1i.rxd <= rxd1; txd1 <= u1o.txd;
345
    end generate;
346
  end generate;
347
  noua0 : if CFG_UART1_ENABLE = 0 generate apbo(1) <= apb_none; end generate;
348
 
349
  irqctrl : if CFG_IRQ3_ENABLE /= 0 generate
350
    irqctrl0 : irqmp                    -- interrupt controller
351
      generic map (pindex => 2, paddr => 2, ncpu => NCPU)
352
      port map (rstn, clkm, apbi, apbo(2), irqo, irqi);
353
  end generate;
354
  irq3 : if CFG_IRQ3_ENABLE = 0 generate
355
    x : for i in 0 to NCPU-1 generate
356
      irqi(i).irl <= "0000";
357
    end generate;
358
    apbo(2) <= apb_none;
359
  end generate;
360
 
361
  gpt : if CFG_GPT_ENABLE /= 0 generate
362
    timer0 : gptimer                    -- timer unit
363
      generic map (pindex => 3, paddr => 3, pirq => CFG_GPT_IRQ,
364
        sepirq => CFG_GPT_SEPIRQ, sbits => CFG_GPT_SW, ntimers => CFG_GPT_NTIM,
365
        nbits  => CFG_GPT_TW)
366
      port map (rstn, clkm, apbi, apbo(3), gpti, open);
367
    gpti.dhalt <= dsuo.active; gpti.extclk <= '0';
368
  end generate;
369
  notim : if CFG_GPT_ENABLE = 0 generate apbo(3) <= apb_none; end generate;
370
 
371
  gpio0 : if CFG_GRGPIO_ENABLE /= 0 generate     -- GPIO unit
372
    grgpio0: grgpio
373
    generic map(pindex => 5, paddr => 5, imask => CFG_GRGPIO_IMASK, nbits => CFG_GRGPIO_WIDTH)
374
    port map(rst => rstn, clk => clkm, apbi => apbi, apbo => apbo(5),
375
    gpioi => gpioi, gpioo => gpioo);
376
    pio_pads : for i in 0 to CFG_GRGPIO_WIDTH-1 generate
377
        gpioi.din(i) <= gpio(i);
378
    end generate;
379
  end generate;
380
 
381
-----------------------------------------------------------------------
382
---  AHB ROM ----------------------------------------------------------
383
-----------------------------------------------------------------------
384
 
385
  bpromgen : if CFG_AHBROMEN /= 0 generate
386
    brom : entity work.ahbrom
387
      generic map (hindex => 6, haddr => CFG_AHBRODDR, pipe => CFG_AHBROPIP)
388
      port map ( rstn, clkm, ahbsi, ahbso(6));
389
  end generate;
390
  nobpromgen : if CFG_AHBROMEN = 0 generate
391
     ahbso(6) <= ahbs_none;
392
  end generate;
393
 
394
-----------------------------------------------------------------------
395
---  AHB RAM ----------------------------------------------------------
396
-----------------------------------------------------------------------
397
 
398
  ahbramgen : if CFG_AHBRAMEN = 1 generate
399
    ahbram0 : ahbram generic map (hindex => 7, haddr => CFG_AHBRADDR,
400
                                  tech   => CFG_MEMTECH, kbytes => CFG_AHBRSZ)
401
      port map (rstn, clkm, ahbsi, ahbso(7));
402
  end generate;
403
  nram : if CFG_AHBRAMEN = 0 generate ahbso(7) <= ahbs_none; end generate;
404
 
405
-----------------------------------------------------------------------
406
---  Drive unused bus elements  ---------------------------------------
407
-----------------------------------------------------------------------
408
 
409
  nam1 : for i in (NCPU+CFG_AHB_UART+CFG_AHB_JTAG) to NAHBMST-1 generate
410
    ahbmo(i) <= ahbm_none;
411
  end generate;
412
--  nap0 : for i in 6 to NAPBSLV-1 generate apbo(i) <= apb_none; end generate;
413
--  nah0 : for i in 7 to NAHBSLV-1 generate ahbso(i) <= ahbs_none; end generate;
414
 
415
  -- invert signal for input via a key
416
  dsubre  <= not dsubren;
417
 
418
-----------------------------------------------------------------------
419
---  Boot message  ----------------------------------------------------
420
-----------------------------------------------------------------------
421
 
422
-- pragma translate_off
423
  x : report_version
424
  generic map (
425
   msg1 => "LEON3 Altera EP3C25 SSRAM/DDR Demonstration design",
426
   msg2 => "GRLIB Version " & tost(LIBVHDL_VERSION/1000) & "." & tost((LIBVHDL_VERSION mod 1000)/100)
427
      & "." & tost(LIBVHDL_VERSION mod 100) & ", build " & tost(LIBVHDL_BUILD),
428
   msg3 => "Target technology: " & tech_table(fabtech) & ",  memory library: " & tech_table(memtech),
429
   mdel => 1
430
  );
431
-- pragma translate_on
432
 
433
end;

powered by: WebSVN 2.1.0

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