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-digilent-xc3s1000/] [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
 
21
library ieee;
22
use ieee.std_logic_1164.all;
23
library grlib, techmap;
24
use grlib.amba.all;
25
use grlib.stdlib.all;
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
-- pragma translate_off
34
use gaisler.sim.all;
35
-- pragma translate_on
36
 
37
library esa;
38
use esa.memoryctrl.all;
39
 
40
use work.config.all;
41
 
42
entity leon3mp is
43
  generic (
44
    fabtech       : integer := CFG_FABTECH;
45
    memtech       : integer := CFG_MEMTECH;
46
    padtech       : integer := CFG_PADTECH;
47
    clktech       : integer := CFG_CLKTECH;
48
    disas         : integer := CFG_DISAS;       -- Enable disassembly to console
49
    dbguart       : integer := CFG_DUART;       -- Print UART on console
50
    pclow         : integer := CFG_PCLOW
51
  );
52
  port (
53
    reset         : in  std_ulogic;
54
    clk           : in  std_ulogic;     -- 50 MHz main clock
55
    error         : out std_ulogic;
56
    address       : out std_logic_vector(19 downto 2);
57
    data          : inout std_logic_vector(31 downto 0);
58
    ramsn         : out std_logic_vector (1 downto 0);
59
    mben          : out std_logic_vector (3 downto 0);
60
    oen           : out std_ulogic;
61
    writen        : out std_ulogic;
62
 
63
    dsubre        : in std_ulogic;
64
    dsuact        : out std_ulogic;
65
 
66
    txd1          : out std_ulogic;                     -- UART1 tx data
67
    rxd1          : in  std_ulogic;                     -- UART1 rx data
68
 
69
    pio           : inout std_logic_vector(17 downto 0);         -- I/O port
70
--    switch        : in std_logic_vector(7 downto 0);  -- switches
71
--    button        : in std_logic_vector(2 downto 0);  -- buttons
72
 
73
    ps2clk        : inout std_logic;
74
    ps2data       : inout std_logic;
75
 
76
    vid_hsync     : out std_ulogic;
77
    vid_vsync     : out std_ulogic;
78
    vid_r         : out std_logic;
79
    vid_g         : out std_logic;
80
    vid_b         : out std_logic
81
 
82
        );
83
end;
84
 
85
architecture rtl of leon3mp is
86
 
87
constant blength : integer := 12;
88
constant fifodepth : integer := 8;
89
constant maxahbm : integer := CFG_NCPU+
90
        CFG_AHB_JTAG+CFG_SVGA_ENABLE;
91
 
92
signal vcc, gnd   : std_logic_vector(4 downto 0);
93
signal memi  : memory_in_type;
94
signal memo  : memory_out_type;
95
signal wpo   : wprot_out_type;
96
signal sdi   : sdctrl_in_type;
97
signal sdo   : sdram_out_type;
98
signal sdo2, sdo3 : sdctrl_out_type;
99
 
100
signal apbi  : apb_slv_in_type;
101
signal apbo  : apb_slv_out_vector := (others => apb_none);
102
signal ahbsi : ahb_slv_in_type;
103
signal ahbso : ahb_slv_out_vector := (others => ahbs_none);
104
signal ahbmi : ahb_mst_in_type;
105
signal ahbmo : ahb_mst_out_vector := (others => ahbm_none);
106
 
107
signal clkm, rstn, rstraw, nerror : std_ulogic;
108
signal cgi   : clkgen_in_type;
109
signal cgo   : clkgen_out_type;
110
signal u1i, u2i, dui : uart_in_type;
111
signal u1o, u2o, duo : uart_out_type;
112
 
113
signal irqi : irq_in_vector(0 to CFG_NCPU-1);
114
signal irqo : irq_out_vector(0 to CFG_NCPU-1);
115
 
116
signal dbgi : l3_debug_in_vector(0 to CFG_NCPU-1);
117
signal dbgo : l3_debug_out_vector(0 to CFG_NCPU-1);
118
 
119
signal dsui : dsu_in_type;
120
signal dsuo : dsu_out_type;
121
 
122
signal gpti : gptimer_in_type;
123
 
124
signal gpioi : gpio_in_type;
125
signal gpioo : gpio_out_type;
126
 
127
signal lclk, rst : std_ulogic;
128
signal tck, tckn, tms, tdi, tdo : std_ulogic;
129
 
130
signal kbdi  : ps2_in_type;
131
signal kbdo  : ps2_out_type;
132
signal vgao  : apbvga_out_type;
133
signal clkval : std_logic_vector(1 downto 0);
134
 
135
 
136
constant BOARD_FREQ : integer := 50000;   -- input frequency in KHz
137
constant CPU_FREQ : integer := BOARD_FREQ * CFG_CLKMUL / CFG_CLKDIV;  -- cpu frequency in KHz
138
constant IOAEN : integer := 0;
139
 
140
signal stati : ahbstat_in_type;
141
 
142
signal dac_clk, clk1x, vid_clock, video_clk, clkvga : std_logic;  -- signals to vga_clkgen.
143
signal clk_sel : std_logic_vector(1 downto 0);
144
 
145
attribute keep : boolean;
146
attribute syn_keep : boolean;
147
attribute syn_preserve : boolean;
148
attribute syn_keep of video_clk : signal is true;
149
attribute syn_preserve of video_clk : signal is true;
150
attribute keep of video_clk : signal is true;
151
 
152
begin
153
 
154
----------------------------------------------------------------------
155
---  Reset and Clock generation  -------------------------------------
156
----------------------------------------------------------------------
157
 
158
  vcc <= (others => '1'); gnd <= (others => '0');
159
  cgi.pllctrl <= "00"; cgi.pllrst <= rstraw;
160
 
161
  clk_pad : clkpad generic map (tech => padtech) port map (clk, lclk);
162
  clkgen0 : clkgen              -- clock generator
163
    generic map (clktech, CFG_CLKMUL, CFG_CLKDIV, CFG_MCTRL_SDEN,
164
        CFG_CLK_NOFB, 0, 0, 0, BOARD_FREQ)
165
    port map (lclk, lclk, clkm, open, open, open, open, cgi, cgo, open, clk1x);
166
 
167
  resetn_pad : inpad generic map (tech => padtech) port map (reset, rst);
168
  rst0 : rstgen                 -- reset generator
169
  generic map (acthigh => 1)
170
  port map (rst, clkm, cgo.clklock, rstn, rstraw);
171
 
172
----------------------------------------------------------------------
173
---  AHB CONTROLLER --------------------------------------------------
174
----------------------------------------------------------------------
175
 
176
  ahb0 : ahbctrl                -- AHB arbiter/multiplexer
177
  generic map (defmast => CFG_DEFMST, split => CFG_SPLIT,
178
        rrobin => CFG_RROBIN, ioaddr => CFG_AHBIO,
179
        ioen => IOAEN, nahbm => maxahbm, nahbs => 8)
180
  port map (rstn, clkm, ahbmi, ahbmo, ahbsi, ahbso);
181
 
182
----------------------------------------------------------------------
183
---  LEON3 processor and DSU -----------------------------------------
184
----------------------------------------------------------------------
185
 
186
  l3 : if CFG_LEON3 = 1 generate
187
    cpu : for i in 0 to CFG_NCPU-1 generate
188
      u0 : leon3s                       -- LEON3 processor      
189
      generic map (i, fabtech, memtech, CFG_NWIN, CFG_DSU, CFG_FPU, CFG_V8,
190
        0, CFG_MAC, pclow, 0, CFG_NWP, CFG_ICEN, CFG_IREPL, CFG_ISETS, CFG_ILINE,
191
        CFG_ISETSZ, CFG_ILOCK, CFG_DCEN, CFG_DREPL, CFG_DSETS, CFG_DLINE, CFG_DSETSZ,
192
        CFG_DLOCK, CFG_DSNOOP, CFG_ILRAMEN, CFG_ILRAMSZ, CFG_ILRAMADDR, CFG_DLRAMEN,
193
          CFG_DLRAMSZ, CFG_DLRAMADDR, CFG_MMUEN, CFG_ITLBNUM, CFG_DTLBNUM, CFG_TLB_TYPE, CFG_TLB_REP,
194
          CFG_LDDEL, disas, CFG_ITBSZ, CFG_PWD, CFG_SVT, CFG_RSTADDR, CFG_NCPU-1)
195
      port map (clkm, rstn, ahbmi, ahbmo(i), ahbsi, ahbso,
196
                irqi(i), irqo(i), dbgi(i), dbgo(i));
197
    end generate;
198
    nerror <= not dbgo(0).error;
199
    error_pad : outpad generic map (tech => padtech) port map (error, nerror);
200
 
201
    dsugen : if CFG_DSU = 1 generate
202
      dsu0 : dsu3                       -- LEON3 Debug Support Unit
203
      generic map (hindex => 2, haddr => 16#900#, hmask => 16#F00#,
204
         ncpu => CFG_NCPU, tbits => 30, tech => memtech, irq => 0, kbytes => CFG_ATBSZ)
205
      port map (rstn, clkm, ahbmi, ahbsi, ahbso(2), dbgo, dbgi, dsui, dsuo);
206
      dsui.enable <= '1';
207
      dsubre_pad : inpad generic map (tech => padtech) port map (dsubre, dsui.break);
208
      dsuact_pad : outpad generic map (tech => padtech) port map (dsuact, dsuo.active);
209
    end generate;
210
  end generate;
211
  nodsu : if CFG_DSU = 0 generate
212
    dsuo.tstop <= '0'; dsuo.active <= '0';
213
  end generate;
214
 
215
--  dcomgen : if CFG_AHB_UART = 1 generate
216
--    dcom0: ahbuart            -- Debug UART
217
--    generic map (hindex => CFG_NCPU, pindex => 7, paddr => 7)
218
--    port map (rstn, clkm, dui, duo, apbi, apbo(7), ahbmi, ahbmo(CFG_NCPU));
219
--    dsurx_pad : inpad generic map (tech => padtech) port map (rxd2, dui.rxd); 
220
--    dsutx_pad : outpad generic map (tech => padtech) port map (txd2, duo.txd);
221
--  end generate;
222
--  nouah : if CFG_AHB_UART = 0 generate apbo(7) <= apb_none; end generate;
223
 
224
  ahbjtaggen0 :if CFG_AHB_JTAG = 1 generate
225
    ahbjtag0 : ahbjtag generic map(tech => fabtech, hindex => CFG_NCPU)
226
      port map(rstn, clkm, tck, tms, tdi, tdo, ahbmi, ahbmo(CFG_NCPU),
227
               open, open, open, open, open, open, open, gnd(0));
228
  end generate;
229
 
230
----------------------------------------------------------------------
231
---  Memory controllers ----------------------------------------------
232
----------------------------------------------------------------------
233
 
234
  memi.writen <= '1'; memi.wrn <= "1111"; memi.bwidth <= "00";
235
 
236
  mctrl0 : mctrl generic map (hindex => 0, pindex => 0,
237
        rommask => 16#000#, iomask => 16#000#,
238
        paddr => 0, srbanks => 1, ram8 => CFG_MCTRL_RAM8BIT,
239
        ram16 => CFG_MCTRL_RAM16BIT, sden => CFG_MCTRL_SDEN,
240
        invclk => CFG_CLK_NOFB, sepbus => CFG_MCTRL_SEPBUS)
241
  port map (rstn, clkm, memi, memo, ahbsi, ahbso(0), apbi, apbo(0), wpo, sdo);
242
 
243
  addr_pad : outpadv generic map (width => 18, tech => padtech)
244
        port map (address, memo.address(19 downto 2));
245
  ramsa_pad : outpad generic map (tech => padtech)
246
        port map (ramsn(0), memo.ramsn(0));
247
  ramsb_pad : outpad generic map (tech => padtech)
248
        port map (ramsn(1), memo.ramsn(0));
249
  oen_pad  : outpad generic map (tech => padtech)
250
        port map (oen, memo.oen);
251
  wri_pad  : outpad generic map (tech => padtech)
252
        port map (writen, memo.writen);
253
  mben_pads : outpadv generic map (tech => padtech, width => 4)
254
        port map (mben, memo.mben);
255
 
256
  data_pads : iopadvv generic map (tech => padtech, width => 32)
257
      port map (data, memo.data(31 downto 0),
258
        memo.vbdrive(31 downto 0), memi.data(31 downto 0));
259
 
260
----------------------------------------------------------------------
261
---  APB Bridge and various periherals -------------------------------
262
----------------------------------------------------------------------
263
 
264
  bpromgen : if CFG_AHBROMEN /= 0 generate
265
    brom : entity work.ahbrom
266
      generic map (hindex => 6, haddr => CFG_AHBRODDR, pipe => CFG_AHBROPIP)
267
      port map ( rstn, clkm, ahbsi, ahbso(6));
268
  end generate;
269
 
270
----------------------------------------------------------------------
271
---  APB Bridge and various periherals -------------------------------
272
----------------------------------------------------------------------
273
 
274
  apb0 : apbctrl                                -- AHB/APB bridge
275
  generic map (hindex => 1, haddr => CFG_APBADDR, nslaves => 16)
276
  port map (rstn, clkm, ahbsi, ahbso(1), apbi, apbo );
277
 
278
  ua1 : if CFG_UART1_ENABLE /= 0 generate
279
    uart1 : apbuart                     -- UART 1
280
    generic map (pindex => 1, paddr => 1,  pirq => 2, console => dbguart,
281
        fifosize => CFG_UART1_FIFO)
282
    port map (rstn, clkm, apbi, apbo(1), u1i, u1o);
283
    u1i.extclk <= '0';
284
    rxd1_pad : inpad generic map (tech => padtech) port map (rxd1, u1i.rxd);
285
    txd1_pad : outpad generic map (tech => padtech) port map (txd1, u1o.txd);
286
  end generate;
287
  noua0 : if CFG_UART1_ENABLE = 0 generate apbo(1) <= apb_none; end generate;
288
 
289
  irqctrl : if CFG_IRQ3_ENABLE /= 0 generate
290
    irqctrl0 : irqmp                    -- interrupt controller
291
    generic map (pindex => 2, paddr => 2, ncpu => CFG_NCPU)
292
    port map (rstn, clkm, apbi, apbo(2), irqo, irqi);
293
  end generate;
294
  irq3 : if CFG_IRQ3_ENABLE = 0 generate
295
    x : for i in 0 to CFG_NCPU-1 generate
296
      irqi(i).irl <= "0000";
297
    end generate;
298
    apbo(2) <= apb_none;
299
  end generate;
300
 
301
  gpt : if CFG_GPT_ENABLE /= 0 generate
302
    timer0 : gptimer                    -- timer unit
303
    generic map (pindex => 3, paddr => 3, pirq => CFG_GPT_IRQ,
304
        sepirq => CFG_GPT_SEPIRQ, sbits => CFG_GPT_SW, ntimers => CFG_GPT_NTIM,
305
        nbits => CFG_GPT_TW)
306
    port map (rstn, clkm, apbi, apbo(3), gpti, open);
307
    gpti.dhalt <= dsuo.tstop; gpti.extclk <= '0';
308
  end generate;
309
 
310
  nogpt : if CFG_GPT_ENABLE = 0 generate apbo(3) <= apb_none; end generate;
311
 
312
  kbd : if CFG_KBD_ENABLE /= 0 generate
313
    ps20 : apbps2 generic map(pindex => 5, paddr => 5, pirq => 5)
314
      port map(rstn, clkm, apbi, apbo(5), kbdi, kbdo);
315
  end generate;
316
  nokbd : if CFG_KBD_ENABLE = 0 generate
317
        apbo(5) <= apb_none; kbdo <= ps2o_none;
318
  end generate;
319
  kbdclk_pad : iopad generic map (tech => padtech)
320
      port map (ps2clk,kbdo.ps2_clk_o, kbdo.ps2_clk_oe, kbdi.ps2_clk_i);
321
  kbdata_pad : iopad generic map (tech => padtech)
322
        port map (ps2data, kbdo.ps2_data_o, kbdo.ps2_data_oe, kbdi.ps2_data_i);
323
 
324
  clkdiv : process(clk1x, rstn)
325
    begin
326
        if rstn = '0' then clkval <= "00";
327
        elsif rising_edge(clk1x) then
328
          clkval <= clkval + 1;
329
        end if;
330
  end process;
331
 
332
  vga : if CFG_VGA_ENABLE /= 0 generate
333
    vga0 : apbvga generic map(memtech => memtech, pindex => 6, paddr => 6)
334
       port map(rstn, clkm, video_clk, apbi, apbo(6), vgao);
335
    video_clock_pad : outpad generic map ( tech => padtech)
336
        port map (vid_clock, dac_clk);
337
    dac_clk <= not video_clk;
338
    b1 : techbuf generic map (2, virtex2) port map (clkval(0), video_clk);
339
   end generate;
340
 
341
  svga : if CFG_SVGA_ENABLE /= 0 generate
342
    clkvga <= clkval(1) when clk_sel = "00" else clkval(0) when clk_sel = "01" else clkm;
343
    b1 : techbuf generic map (2, virtex2) port map (clkvga, video_clk);
344
    svga0 : svgactrl generic map(memtech => memtech, pindex => 6, paddr => 6,
345
                hindex => CFG_NCPU+CFG_AHB_JTAG,
346
                clk0 => 40000, clk1 => 20000, clk2 => 25000)
347
       port map(rstn, clkm, video_clk, apbi, apbo(6), vgao, ahbmi,
348
                ahbmo(CFG_NCPU+CFG_AHB_JTAG), clk_sel);
349
    dac_clk <= not video_clk;
350
    video_clock_pad : outpad generic map ( tech => padtech)
351
        port map (vid_clock, dac_clk);
352
  end generate;
353
 
354
  novga : if (CFG_VGA_ENABLE = 0 and CFG_SVGA_ENABLE = 0) generate
355
    apbo(6) <= apb_none; vgao <= vgao_none;
356
  end generate;
357
 
358
  vert_sync_pad : outpad generic map (tech => padtech)
359
        port map (vid_vsync, vgao.vsync);
360
  horiz_sync_pad : outpad generic map (tech => padtech)
361
        port map (vid_hsync, vgao.hsync);
362
  video_out_r_pad : outpad generic map (tech => padtech)
363
        port map (vid_r, vgao.video_out_r(7));
364
  video_out_g_pad : outpad generic map (tech => padtech)
365
        port map (vid_g, vgao.video_out_g(7));
366
  video_out_b_pad : outpad generic map (tech => padtech)
367
        port map (vid_b, vgao.video_out_b(7));
368
 
369
  gpio0 : if CFG_GRGPIO_ENABLE /= 0 generate     -- GPIO unit
370
    grgpio0: grgpio
371
    generic map(pindex => 8, paddr => 8, imask => CFG_GRGPIO_IMASK, nbits => 18)
372
    port map(rst => rstn, clk => clkm, apbi => apbi, apbo => apbo(8),
373
    gpioi => gpioi, gpioo => gpioo);
374
    pio_pads : iopadvv generic map (width => 18, tech => padtech)
375
            port map (pio, gpioo.dout(17 downto 0), gpioo.oen(17 downto 0),
376
        gpioi.din(17 downto 0));
377
 
378
  end generate;
379
 
380
-----------------------------------------------------------------------
381
---  AHB RAM ----------------------------------------------------------
382
-----------------------------------------------------------------------
383
 
384
  ocram : if CFG_AHBRAMEN = 1 generate
385
    ahbram0 : ahbram generic map (hindex => 7, haddr => CFG_AHBRADDR,
386
        tech => CFG_MEMTECH, kbytes => CFG_AHBRSZ)
387
    port map ( rstn, clkm, ahbsi, ahbso(7));
388
  end generate;
389
 
390
-----------------------------------------------------------------------
391
---  Drive unused bus elements  ---------------------------------------
392
-----------------------------------------------------------------------
393
 
394
--  nam1 : for i in (CFG_NCPU+FG_AHB_UART+CFG_GRETH+CFG_AHB_JTAG) to NAHBMST-1 generate
395
--    ahbmo(i) <= ahbm_none;
396
--  end generate;
397
--  nap0 : for i in 11 to NAPBSLV-1 generate apbo(i) <= apb_none; end generate;
398
--  nah0 : for i in 8 to NAHBSLV-1 generate ahbso(i) <= ahbs_none; end generate;
399
 
400
-----------------------------------------------------------------------
401
---  Test report module  ----------------------------------------------
402
-----------------------------------------------------------------------
403
 
404
-- pragma translate_off
405
 
406
  test0 : ahbrep generic map (hindex => 4, haddr => 16#200#)
407
        port map (rstn, clkm, ahbsi, ahbso(4));
408
 
409
-- pragma translate_on
410
 
411
-----------------------------------------------------------------------
412
---  Boot message  ----------------------------------------------------
413
-----------------------------------------------------------------------
414
 
415
-- pragma translate_off
416
  x : report_version
417
  generic map (
418
   msg1 => "LEON3 Digilent XC3S1000 Demonstration design",
419
      msg2 => "GRLIB Version " & tost(LIBVHDL_VERSION/1000) & "." & tost((LIBVHDL_VERSION mod 1000)/100)
420
        & "." & tost(LIBVHDL_VERSION mod 100) & ", build " & tost(LIBVHDL_BUILD),
421
   msg3 => "Target technology: " & tech_table(fabtech) & ",  memory library: " & tech_table(memtech),
422
   mdel => 1
423
  );
424
-- pragma translate_on
425
end;

powered by: WebSVN 2.1.0

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