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-asic/] [leon3core.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
 
21
library ieee;
22
use ieee.std_logic_1164.all;
23
library grlib;
24
use grlib.amba.all;
25
use grlib.stdlib.all;
26
use grlib.devices.all;
27
library techmap;
28
use techmap.gencomp.all;
29
library gaisler;
30
use gaisler.memctrl.all;
31
use gaisler.leon3.all;
32
use gaisler.uart.all;
33
use gaisler.misc.all;
34
use gaisler.jtag.all;
35
use gaisler.spacewire.all;
36
library esa;
37
use esa.memoryctrl.all;
38
 
39
use work.config.all;
40
 
41
entity leon3core is
42
  generic (
43
    fabtech   : integer := CFG_FABTECH;
44
    memtech   : integer := CFG_MEMTECH;
45
    padtech   : integer := CFG_PADTECH;
46
    clktech   : integer := CFG_CLKTECH;
47
    disas     : integer := CFG_DISAS;   -- Enable disassembly to console
48
    dbguart   : integer := CFG_DUART;   -- Print UART on console
49
    pclow     : integer := CFG_PCLOW;
50
    scantest  : integer := CFG_SCAN
51
  );
52
  port (
53
    resetn      : in  std_ulogic;
54
    clksel      : in  std_logic_vector(1 downto 0);
55
    clk         : in  std_ulogic;
56
    clklock     : in  std_ulogic;
57
    errorn      : out std_ulogic;
58
    address     : out std_logic_vector(27 downto 0);
59
    datain      : in std_logic_vector(31 downto 0);
60
    dataout     : out std_logic_vector(31 downto 0);
61
    dataen      : out std_logic_vector(31 downto 0);
62
    cbin        : in std_logic_vector(7 downto 0);
63
    cbout       : out std_logic_vector(7 downto 0);
64
    cben        : out std_logic_vector(7 downto 0);
65
    sdcsn       : out std_logic_vector (1 downto 0);    -- sdram chip select
66
    sdwen       : out std_ulogic;                       -- sdram write enable
67
    sdrasn      : out std_ulogic;                       -- sdram ras
68
    sdcasn      : out std_ulogic;                       -- sdram cas
69
    sddqm       : out std_logic_vector (3 downto 0);    -- sdram dqm
70
    dsutx       : out std_ulogic;                       -- DSU tx data
71
    dsurx       : in  std_ulogic;                       -- DSU rx data
72
    dsuen       : in std_ulogic;
73
    dsubre      : in std_ulogic;
74
    dsuact      : out std_ulogic;
75
    txd1        : out std_ulogic;                       -- UART1 tx data
76
    rxd1        : in  std_ulogic;                       -- UART1 rx data
77
    txd2        : out std_ulogic;                       -- UART2 tx data
78
    rxd2        : in  std_ulogic;                       -- UART2 rx data
79
    ramsn       : out std_logic_vector (4 downto 0);
80
    ramoen      : out std_logic_vector (4 downto 0);
81
    rwen        : out std_logic_vector (3 downto 0);
82
    oen         : out std_ulogic;
83
    writen      : out std_ulogic;
84
    read        : out std_ulogic;
85
    iosn        : out std_ulogic;
86
    romsn       : out std_logic_vector (1 downto 0);
87
    brdyn       : in  std_ulogic;
88
    bexcn       : in  std_ulogic;
89
    wdogn       : out std_ulogic;
90
    gpioin      : in std_logic_vector(CFG_GRGPIO_WIDTH-1 downto 0);      -- I/O port
91
    gpioout     : out std_logic_vector(CFG_GRGPIO_WIDTH-1 downto 0);     -- I/O port
92
    gpioen      : out std_logic_vector(CFG_GRGPIO_WIDTH-1 downto 0);     -- I/O port
93
    prom32      : in  std_ulogic;
94
    promedac    : in  std_ulogic;
95
 
96
    spw_clksel  : in  std_logic_vector(1 downto 0);
97
    spw_clk     : in  std_ulogic;
98
    spw_rxd     : in  std_logic_vector(0 to CFG_SPW_NUM-1);
99
    spw_rxs     : in  std_logic_vector(0 to CFG_SPW_NUM-1);
100
    spw_txd     : out std_logic_vector(0 to CFG_SPW_NUM-1);
101
    spw_txs     : out std_logic_vector(0 to CFG_SPW_NUM-1);
102
    spw_ten     : out std_logic_vector(0 to CFG_SPW_NUM-1);
103
 
104
    scanen      : in  std_ulogic;
105
    testen      : in  std_ulogic;
106
    testrst     : in  std_ulogic;
107
    testoen     : in  std_ulogic
108
        );
109
end;
110
 
111
architecture rtl of leon3core is
112
 
113
constant is_asic : integer := 1 - is_fpga(fabtech);
114
constant blength : integer := 12;
115
 
116
constant CFG_NCLKS : integer := 7;
117
constant maxahbmsp : integer := CFG_NCPU+CFG_AHB_UART+CFG_AHB_JTAG;
118
constant maxahbm : integer := (CFG_SPW_NUM*CFG_SPW_EN) + maxahbmsp;
119
 
120
signal vcc, gnd : std_logic_vector(4 downto 0);
121
signal memi  : memory_in_type;
122
signal memo  : memory_out_type;
123
signal wpo   : wprot_out_type;
124
signal sdi   : sdctrl_in_type;
125
signal sdo   : sdram_out_type;
126
signal sdo2, sdo3 : sdctrl_out_type;
127
 
128
signal apbi  : apb_slv_in_type;
129
signal apbo  : apb_slv_out_vector := (others => apb_none);
130
signal ahbsi : ahb_slv_in_type;
131
signal ahbso : ahb_slv_out_vector := (others => ahbs_none);
132
signal ahbmi : ahb_mst_in_type;
133
signal ahbmo : ahb_mst_out_vector := (others => ahbm_none);
134
 
135
signal rstn, rstraw : std_ulogic;
136
signal u1i, u2i, dui : uart_in_type;
137
signal u1o, u2o, duo : uart_out_type;
138
 
139
signal irqi : irq_in_vector(0 to CFG_NCPU-1);
140
signal irqo : irq_out_vector(0 to CFG_NCPU-1);
141
 
142
signal dbgi : l3_debug_in_vector(0 to CFG_NCPU-1);
143
signal dbgo : l3_debug_out_vector(0 to CFG_NCPU-1);
144
 
145
signal dsui : dsu_in_type;
146
signal dsuo : dsu_out_type;
147
 
148
signal gpti : gptimer_in_type;
149
signal gpto : gptimer_out_type;
150
 
151
signal gpioi, gpioi2 : gpio_in_type;
152
signal gpioo, gpioo2 : gpio_out_type;
153
 
154
signal tck, tms, tdi, tdo : std_ulogic;
155
 
156
signal spwi : grspw_in_type_vector(0 to CFG_SPW_NUM-1);
157
signal spwo : grspw_out_type_vector(0 to CFG_SPW_NUM-1);
158
signal stati : ahbstat_in_type;
159
 
160
constant IOAEN : integer := 0;
161
constant CFG_SDEN : integer := CFG_MCTRL_LEON2;
162
constant CFG_INVCLK : integer := CFG_MCTRL_INVCLK;
163
 
164
constant BOARD_FREQ : integer := 50000; -- Board frequency in KHz
165
 
166
constant sysfreq : integer := (CFG_CLKMUL/CFG_CLKDIV)*40000;
167
constant OEPOL : integer := padoen_polarity(padtech);
168
constant notag : integer := 0;
169
constant CPU_FREQ : integer := 100000;
170
 
171
begin
172
 
173
----------------------------------------------------------------------
174
---  Reset and Clock generation  -------------------------------------
175
----------------------------------------------------------------------
176
 
177
  vcc <= (others => '1'); gnd <= (others => '0');
178
  wpo.wprothit <= '0'; -- no write protection
179
 
180
  rstgen0 : rstgen                      -- reset generator
181
  generic map (syncrst => CFG_NOASYNC, scanen => scantest)
182
  port map (resetn, clk, clklock, rstn, rstraw, testrst);
183
 
184
----------------------------------------------------------------------
185
---  AHB CONTROLLER --------------------------------------------------
186
----------------------------------------------------------------------
187
 
188
  ahbctrl0 : ahbctrl            -- AHB arbiter/multiplexer
189
  generic map (defmast => CFG_DEFMST, split => CFG_SPLIT,
190
        rrobin => CFG_RROBIN, ioaddr => CFG_AHBIO, devid => GAISLER_DARE1,
191
        ioen => IOAEN, nahbm => maxahbm, nahbs => 8)
192
  port map (rstn, clk, ahbmi, ahbmo, ahbsi, ahbso,
193
                testen, testrst, scanen, testoen);
194
 
195
----------------------------------------------------------------------
196
---  LEON3 processor and DSU -----------------------------------------
197
----------------------------------------------------------------------
198
 
199
  cpu : for i in 0 to CFG_NCPU-1 generate
200
      leon3s0 : leon3cg                 -- LEON3 processor      
201
      generic map (i, fabtech, memtech, CFG_NWIN, CFG_DSU, CFG_FPU, CFG_V8,
202
        0, CFG_MAC, pclow, 0, CFG_NWP, CFG_ICEN, CFG_IREPL, CFG_ISETS, CFG_ILINE,
203
        CFG_ISETSZ, CFG_ILOCK, CFG_DCEN, CFG_DREPL, CFG_DSETS, CFG_DLINE, CFG_DSETSZ,
204
        CFG_DLOCK, CFG_DSNOOP, CFG_ILRAMEN, CFG_ILRAMSZ, CFG_ILRAMADDR, CFG_DLRAMEN,
205
        CFG_DLRAMSZ, CFG_DLRAMADDR, CFG_MMUEN, CFG_ITLBNUM, CFG_DTLBNUM, CFG_TLB_TYPE, CFG_TLB_REP,
206
        CFG_LDDEL, disas, CFG_ITBSZ, CFG_PWD, CFG_SVT, CFG_RSTADDR, CFG_NCPU-1)
207
      port map (clk, rstn, ahbmi, ahbmo(i), ahbsi, ahbso,
208
                irqi(i), irqo(i), dbgi(i), dbgo(i), clk);
209
  end generate;
210
  errorn <= dbgo(0).error when OEPOL = 0 else not dbgo(0).error;
211
 
212
  dsugen : if CFG_DSU = 1 generate
213
    dsu0 : dsu3                 -- LEON3 Debug Support Unit
214
    generic map (hindex => 2, haddr => 16#900#, hmask => 16#F00#,
215
       ncpu => CFG_NCPU, tbits => 30, tech => memtech, irq => 0, kbytes => CFG_ATBSZ)
216
    port map (rstn, clk, ahbmi, ahbsi, ahbso(2), dbgo, dbgi, dsui, dsuo);
217
    dsui.enable <= dsuen; dsui.break <= dsubre; dsuact <= dsuo.active;
218
  end generate;
219
  nodsu : if CFG_DSU = 0 generate
220
    ahbso(2) <= ahbs_none; dsuo.tstop <= '0'; dsuo.active <= '0';
221
  end generate;
222
 
223
  dcomgen : if CFG_AHB_UART = 1 generate
224
    ahbuart0: ahbuart           -- Debug UART
225
    generic map (hindex => CFG_NCPU, pindex => 7, paddr => 7)
226
    port map (rstn, clk, dui, duo, apbi, apbo(7), ahbmi, ahbmo(CFG_NCPU));
227
    dui.rxd <= dsurx; dsutx <= duo.txd;
228
  end generate;
229
  nouah : if CFG_AHB_UART = 0 generate apbo(7) <= apb_none; end generate;
230
 
231
  ahbjtaggen0 :if CFG_AHB_JTAG = 1 generate
232
    ahbjtag0 : ahbjtag generic map(tech => fabtech, part => JTAG_UT699RH,
233
        hindex => CFG_NCPU+CFG_AHB_UART, scantest => scantest)
234
      port map(rstn, clk, tck, tms, tdi, tdo, ahbmi, ahbmo(CFG_NCPU+CFG_AHB_UART),
235
               open, open, open, open, open, open, open, gnd(0));
236
  end generate;
237
 
238
----------------------------------------------------------------------
239
---  Memory controllers ----------------------------------------------
240
----------------------------------------------------------------------
241
 
242
  address <= memo.address(27 downto 0);
243
  ramsn <= memo.ramsn(4 downto 0); romsn <= memo.romsn(1 downto 0);
244
  oen <= memo.oen; rwen <= memo.wrn; ramoen <= memo.ramoen(4 downto 0);
245
  writen <= memo.writen; read <= memo.read; iosn <= memo.iosn;
246
  dataout <= memo.data(31 downto 0); dataen <= memo.vbdrive(31 downto 0);
247
  memi.data(31 downto 0) <= datain;
248
  sdwen <= sdo.sdwen; sdrasn <= sdo.rasn; sdcasn <= sdo.casn;
249
  sddqm <= sdo.dqm(3 downto 0); sdcsn <= sdo.sdcsn;
250
  cbout <= memo.cb(7 downto 0); cben <= memo.vcdrive(7 downto 0);
251
  memi.bwidth <= prom32 & '0';
252
 
253
  mg2 : if CFG_MCTRL_LEON2 = 1 generate         -- LEON2 memory controller
254
    mctrl0 : mctrl generic map (hindex => 0, pindex => 0, paddr => 0,
255
        srbanks => 4+CFG_MCTRL_5CS, sden => CFG_MCTRL_SDEN,
256
        ram8 => CFG_MCTRL_RAM8BIT, ram16 => CFG_MCTRL_RAM16BIT,
257
        invclk => CFG_MCTRL_INVCLK, sepbus => CFG_MCTRL_SEPBUS,
258
        sdbits => 32 + 32*CFG_MCTRL_SD64, pageburst => CFG_MCTRL_PAGE,
259
        oepol => OEPOL)
260
    port map (rstn, clk, memi, memo, ahbsi, ahbso(0), apbi, apbo(0), wpo, sdo);
261
  end generate;
262
 
263
  nosd0 : if (CFG_SDEN = 0) generate     -- no SDRAM controller
264
    sdo.sdcsn <= (others => '1');
265
  end generate;
266
 
267
  memi.writen <= '1'; memi.wrn <= "1111";
268
  memi.brdyn <= brdyn; memi.bexcn <= bexcn;
269
 
270
  mg0 : if CFG_MCTRL_LEON2 = 0 generate  -- None PROM/SRAM controller
271
    apbo(0) <= apb_none; ahbso(0) <= ahbs_none;
272
    memo.ramsn <= (others => '1'); memo.romsn <= (others => '1');
273
  end generate;
274
 
275
 
276
----------------------------------------------------------------------
277
---  APB Bridge and various periherals -------------------------------
278
----------------------------------------------------------------------
279
 
280
  apbctrl0 : apbctrl                            -- AHB/APB bridge
281
  generic map (hindex => 1, haddr => CFG_APBADDR)
282
  port map (rstn, clk, ahbsi, ahbso(1), apbi, apbo );
283
 
284
  ua1 : if CFG_UART1_ENABLE /= 0 generate
285
    apbuart0 : apbuart                  -- UART 1
286
    generic map (pindex => 1, paddr => 1,  pirq => 2, console => dbguart,
287
        fifosize => CFG_UART1_FIFO)
288
    port map (rstn, clk, apbi, apbo(1), u1i, u1o);
289
    u1i.ctsn <= '0'; u1i.extclk <= '0';
290
    txd1 <= u1o.txd; u1i.rxd <= rxd1;
291
  end generate;
292
  noua0 : if CFG_UART1_ENABLE = 0 generate apbo(1) <= apb_none; end generate;
293
 
294
  ua2 : if CFG_UART2_ENABLE /= 0 generate
295
    uart2 : apbuart                     -- UART 2
296
    generic map (pindex => 9, paddr => 9,  pirq => 3, fifosize => CFG_UART2_FIFO)
297
    port map (rstn, clk, apbi, apbo(9), u2i, u2o);
298
    u2i.rxd <= rxd2; u2i.ctsn <= '0'; u2i.extclk <= '0'; txd2 <= u2o.txd;
299
  end generate;
300
  noua1 : if CFG_UART2_ENABLE = 0 generate apbo(9) <= apb_none; end generate;
301
 
302
  irqctrl : if CFG_IRQ3_ENABLE /= 0 generate
303
    irqctrl0 : irqmp                    -- interrupt controller
304
    generic map (pindex => 2, paddr => 2, ncpu => CFG_NCPU)
305
    port map (rstn, clk, apbi, apbo(2), irqo, irqi);
306
  end generate;
307
  irq3 : if CFG_IRQ3_ENABLE = 0 generate
308
    x : for i in 0 to CFG_NCPU-1 generate
309
      irqi(i).irl <= "0000";
310
    end generate;
311
    apbo(2) <= apb_none;
312
  end generate;
313
 
314
  gpt : if CFG_GPT_ENABLE /= 0 generate
315
    gptimer0 : gptimer                  -- timer unit
316
    generic map (pindex => 3, paddr => 3, pirq => CFG_GPT_IRQ,
317
        sepirq => CFG_GPT_SEPIRQ, sbits => CFG_GPT_SW, ntimers => CFG_GPT_NTIM,
318
        nbits => CFG_GPT_TW, wdog => CFG_GPT_WDOGEN*CFG_GPT_WDOG)
319
    port map (rstn, clk, apbi, apbo(3), gpti, gpto);
320
    gpti.dhalt <= dsuo.tstop; gpti.extclk <= '0';
321
    wdogn <= gpto.wdogn when OEPOL = 0 else gpto.wdog;
322
  end generate;
323
  notim : if CFG_GPT_ENABLE = 0 generate apbo(3) <= apb_none; end generate;
324
 
325
  gpio0 : if CFG_GRGPIO_ENABLE /= 0 generate     -- GR GPIO unit
326
    grgpio0: grgpio
327
      generic map( pindex => 6, paddr => 6, imask => CFG_GRGPIO_IMASK,
328
        nbits => CFG_GRGPIO_WIDTH, oepol => OEPOL, syncrst => CFG_NOASYNC)
329
      port map( rstn, clk, apbi, apbo(6), gpioi, gpioo);
330
    gpioout <= gpioo.dout(CFG_GRGPIO_WIDTH-1 downto 0);
331
    gpioen <= gpioo.oen(CFG_GRGPIO_WIDTH-1 downto 0);
332
    gpioi.din(CFG_GRGPIO_WIDTH-1 downto 0) <= gpioin;
333
  end generate;
334
  nogpio : if CFG_GRGPIO_ENABLE = 0 generate apbo(5) <= apb_none; end generate;
335
 
336
  ahbs : if CFG_AHBSTAT = 1 generate    -- AHB status register
337
    stati.cerror(0) <= memo.ce;
338
    ahbstat0 : ahbstat generic map (pindex => 15, paddr => 15, pirq => 1,
339
        nftslv => CFG_AHBSTATN)
340
      port map (rstn, clk, ahbmi, ahbsi, stati, apbi, apbo(15));
341
  end generate;
342
  nop2 : if CFG_AHBSTAT = 0 generate apbo(15) <= apb_none; end generate;
343
 
344
-----------------------------------------------------------------------
345
---  SPACEWIRE  -------------------------------------------------------
346
-----------------------------------------------------------------------
347
 
348
  spw : if CFG_SPW_EN > 0 generate
349
    swloop : for i in 0 to CFG_SPW_NUM-1 generate
350
        spwi(i).clkdiv10 <=
351
        "000"   & gpioo.val(10 downto 8) & "11" when spw_clksel(1 downto 0) = "11" else
352
        "0000"  & gpioo.val(10 downto 8) & '1'  when spw_clksel(1 downto 0) = "10" else
353
        "00000" & gpioo.val(10 downto 8);
354
 
355
      spwi(i).timerrstval <=
356
        '0'   & gpioo.val(15 downto 11) & "111111" when clksel(1 downto 0) = "11" else
357
        "00"  & gpioo.val(15 downto 11) & "11111"  when clksel(1 downto 0) = "10" else
358
        "000" & gpioo.val(15 downto 11) & "1111";
359
 
360
      spwi(i).dcrstval <=
361
        "00"   & gpioo.val(15 downto 11) & "111" when clksel(1 downto 0) = "11" else
362
        "000"  & gpioo.val(15 downto 11) & "10"  when clksel(1 downto 0) = "10" else
363
        "0000" & gpioo.val(15 downto 11) & '0';
364
 
365
     grspw0 : grspw generic map(tech => fabtech,
366
        hindex => maxahbmsp+i, pindex => 10+i, paddr => 10+i, pirq => 10+i,
367
        sysfreq => sysfreq, nsync => 1, rmap => CFG_SPW_RMAP,
368
        rmapbufs => CFG_SPW_RMAPBUF, usegen => 0,
369
        rmapcrc => CFG_SPW_RMAPCRC, fifosize1 => CFG_SPW_AHBFIFO,
370
        fifosize2 => CFG_SPW_RXFIFO, rxclkbuftype => 1, ft => CFG_SPW_FT,
371
        scantest => scantest, techfifo => 0, ports => 1, memtech => 0*memtech)
372
     port map(rstn, clk, spw_clk, ahbmi, ahbmo(maxahbmsp+i),
373
                apbi, apbo(10+i), spwi(i), spwo(i));
374
     spwi(i).tickin <= '0'; spwi(i).rmapen <= '1';
375
     spwi(i).d(0) <= spw_rxd(i); spwi(i).s(0) <= spw_rxs(i);
376
     spw_txd(i) <= spwo(i).d(0); spw_txs(i) <= spwo(i).s(0);
377
     spw_ten(i) <= spwo(i).linkdis when OEPOL = 0 else not spwo(i).linkdis;
378
    end generate;
379
  end generate;
380
 
381
-----------------------------------------------------------------------
382
---  Drive unused bus elements  ---------------------------------------
383
-----------------------------------------------------------------------
384
 
385
  noam1 : for i in maxahbm to NAHBMST-1 generate
386
    ahbmo(i) <= ahbm_none;
387
  end generate;
388
--  noap0 : for i in 12+(CFG_SPW_NUM*CFG_SPW_EN) to NAPBSLV-1-CFG_AHBSTAT 
389
--      generate apbo(i) <= apb_none; end generate;
390
  noah0 : for i in 9 to NAHBSLV-1 generate ahbso(i) <= ahbs_none; end generate;
391
 
392
-----------------------------------------------------------------------
393
---  Boot message  ----------------------------------------------------
394
-----------------------------------------------------------------------
395
 
396
-- pragma translate_off
397
  x : report_version
398
  generic map (
399
   msg1 => "LEON3 ASIC Demonstration design",
400
   msg2 => "GRLIB Version " & tost(LIBVHDL_VERSION/1000) & "." & tost((LIBVHDL_VERSION mod 1000)/100)
401
        & "." & tost(LIBVHDL_VERSION mod 100) & ", build " & tost(LIBVHDL_BUILD),
402
   msg3 => "Target technology: " & tech_table(fabtech) & ",  memory library: " & tech_table(memtech),
403
   mdel => 1
404
 
405
  );
406
-- pragma translate_on
407
end;

powered by: WebSVN 2.1.0

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