##// END OF EJS Templates
Fixed bug, now minor and major frame pulses have the good width....
Fixed bug, now minor and major frame pulses have the good width. (one sck period and not one word clock period)

File last commit:

r191:cfe9287a48ea JC
r222:b37e19fe4c0b alexis
Show More
leon3mp.vhd
739 lines | 28.4 KiB | text/x-vhdl | VhdlLexer
-----------------------------------------------------------------------------
-- LEON3 Demonstration design
-- Copyright (C) 2004 Jiri Gaisler, Gaisler Research
------------------------------------------------------------------------------
-- This file is a part of the GRLIB VHDL IP LIBRARY
-- Copyright (C) 2010, Aeroflex Gaisler AB - all rights reserved.
--
-- ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
-- ACCORDANCE WITH THE GAISLER LICENSE AGREEMENT AND MUST BE APPROVED
-- IN ADVANCE IN WRITING.
------------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
LIBRARY grlib;
USE grlib.amba.ALL;
USE grlib.stdlib.ALL;
USE GRLIB.DMA2AHB_Package.ALL;
LIBRARY techmap;
USE techmap.gencomp.ALL;
LIBRARY gaisler;
USE gaisler.memctrl.ALL;
USE gaisler.leon3.ALL;
USE gaisler.uart.ALL;
USE gaisler.misc.ALL;
--USE gaisler.pci.ALL;
USE gaisler.net.ALL;
USE gaisler.jtag.ALL;
USE gaisler.spacewire.ALL;
LIBRARY esa;
USE esa.memoryctrl.ALL;
--USE esa.pcicomp.ALL;
USE work.config.ALL;
LIBRARY lpp;
USE lpp.lpp_bootloader_pkg.ALL;
use lpp.lpp_lfr_time_management.all; -- PLE
USE lpp.lpp_dma_pkg.ALL;
USE lpp.lpp_memory.ALL;
USE lpp.lpp_top_lfr_pkg.ALL;
ENTITY leon3mp IS
GENERIC (
fabtech : INTEGER := CFG_FABTECH;
memtech : INTEGER := CFG_MEMTECH;
padtech : INTEGER := CFG_PADTECH;
clktech : INTEGER := CFG_CLKTECH;
ncpu : INTEGER := CFG_NCPU;
disas : INTEGER := CFG_DISAS; -- Enable disassembly to console
dbguart : INTEGER := CFG_DUART; -- Print UART on console
pclow : INTEGER := CFG_PCLOW
);
PORT (
resetn : IN STD_ULOGIC;
clk : IN STD_ULOGIC;
pllref : IN STD_ULOGIC;
errorn : OUT STD_ULOGIC;
address : OUT STD_LOGIC_VECTOR(27 DOWNTO 0);
data : INOUT STD_LOGIC_VECTOR(31 DOWNTO 0);
dsutx : OUT STD_ULOGIC; -- DSU tx data
dsurx : IN STD_ULOGIC; -- DSU rx data
dsuen : IN STD_ULOGIC;
dsubre : IN STD_ULOGIC;
dsuact : OUT STD_ULOGIC;
txd1 : OUT STD_ULOGIC; -- UART1 tx data
rxd1 : IN STD_ULOGIC; -- UART1 rx data
txd2 : OUT STD_ULOGIC; -- UART2 tx data
rxd2 : IN STD_ULOGIC; -- UART2 rx data
ramsn : OUT STD_LOGIC_VECTOR (4 DOWNTO 0);
ramoen : OUT STD_LOGIC_VECTOR (4 DOWNTO 0);
rwen : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
oen : OUT STD_ULOGIC;
writen : OUT STD_ULOGIC;
read : OUT STD_ULOGIC;
iosn : OUT STD_ULOGIC;
romsn : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
gpio : INOUT STD_LOGIC_VECTOR(CFG_GRGPIO_WIDTH-1 DOWNTO 0); -- I/O port
emddis : OUT STD_LOGIC;
epwrdwn : OUT STD_ULOGIC;
ereset : OUT STD_ULOGIC;
esleep : OUT STD_ULOGIC;
epause : OUT STD_ULOGIC;
pci_rst : INOUT STD_LOGIC; -- PCI bus
pci_clk : IN STD_ULOGIC;
pci_gnt : IN STD_ULOGIC;
pci_idsel : IN STD_ULOGIC;
pci_lock : INOUT STD_ULOGIC;
pci_ad : INOUT STD_LOGIC_VECTOR(31 DOWNTO 0);
pci_cbe : INOUT STD_LOGIC_VECTOR(3 DOWNTO 0);
pci_frame : INOUT STD_ULOGIC;
pci_irdy : INOUT STD_ULOGIC;
pci_trdy : INOUT STD_ULOGIC;
pci_devsel : INOUT STD_ULOGIC;
pci_stop : INOUT STD_ULOGIC;
pci_perr : INOUT STD_ULOGIC;
pci_par : INOUT STD_ULOGIC;
pci_req : INOUT STD_ULOGIC;
pci_serr : INOUT STD_ULOGIC;
pci_host : IN STD_ULOGIC;
pci_66 : IN STD_ULOGIC;
pci_arb_req : IN STD_LOGIC_VECTOR(0 TO 3);
pci_arb_gnt : OUT STD_LOGIC_VECTOR(0 TO 3);
spw_clk : IN STD_ULOGIC;
spw_rxd : IN STD_LOGIC_VECTOR(0 TO 2);
spw_rxdn : IN STD_LOGIC_VECTOR(0 TO 2);
spw_rxs : IN STD_LOGIC_VECTOR(0 TO 2);
spw_rxsn : IN STD_LOGIC_VECTOR(0 TO 2);
spw_txd : OUT STD_LOGIC_VECTOR(0 TO 2);
spw_txdn : OUT STD_LOGIC_VECTOR(0 TO 2);
spw_txs : OUT STD_LOGIC_VECTOR(0 TO 2);
spw_txsn : OUT STD_LOGIC_VECTOR(0 TO 2);
ramclk : OUT STD_LOGIC;
nBWa : OUT STD_LOGIC;
nBWb : OUT STD_LOGIC;
nBWc : OUT STD_LOGIC;
nBWd : OUT STD_LOGIC;
nBWE : OUT STD_LOGIC;
nADSC : OUT STD_LOGIC;
nADSP : OUT STD_LOGIC;
nADV : OUT STD_LOGIC;
nGW : OUT STD_LOGIC;
nCE1 : OUT STD_LOGIC;
CE2 : OUT STD_LOGIC;
nCE3 : OUT STD_LOGIC;
nOE : OUT STD_LOGIC;
MODE : OUT STD_LOGIC;
SSRAM_CLK : OUT STD_LOGIC;
ZZ : OUT STD_LOGIC;
tck, tms, tdi : IN STD_ULOGIC;
tdo : OUT STD_ULOGIC;
-- waveform picker------
clk49_152MHz : in std_ulogic;
sdo_adc : in std_logic_vector(7 downto 0);
cnv_ch1 : out std_logic;
sck_ch1 : out std_logic;
Bias_Fails : out std_logic
);
END;
ARCHITECTURE rtl OF leon3mp IS
CONSTANT blength : INTEGER := 12;
CONSTANT maxahbmsp : INTEGER := NCPU+CFG_AHB_UART+
CFG_GRETH+CFG_AHB_JTAG+log2x(CFG_PCI);
CONSTANT maxahbm : INTEGER := (CFG_SPW_NUM*CFG_SPW_EN) + maxahbmsp + 2; -- +LPP_DMA
SIGNAL vcc, gnd : STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL memi : memory_in_type;
SIGNAL memo : memory_out_type;
SIGNAL wpo : wprot_out_type;
SIGNAL sdi : sdctrl_in_type;
SIGNAL sdo : sdram_out_type;
SIGNAL sdo2, sdo3 : sdctrl_out_type;
SIGNAL apbi : apb_slv_in_type;
SIGNAL apbo : apb_slv_out_vector := (OTHERS => apb_none);
SIGNAL ahbsi : ahb_slv_in_type;
SIGNAL ahbso : ahb_slv_out_vector := (OTHERS => ahbs_none);
SIGNAL ahbmi : ahb_mst_in_type;
SIGNAL ahbmo : ahb_mst_out_vector := (OTHERS => ahbm_none);
SIGNAL clkm, rstn, rstraw, pciclk, sdclkl, spw_lclk : STD_ULOGIC;
SIGNAL cgi : clkgen_in_type;
SIGNAL cgo : clkgen_out_type;
SIGNAL u1i, u2i, dui : uart_in_type;
SIGNAL u1o, u2o, duo : uart_out_type;
SIGNAL irqi : irq_in_vector(0 TO NCPU-1);
SIGNAL irqo : irq_out_vector(0 TO NCPU-1);
SIGNAL dbgi : l3_debug_in_vector(0 TO NCPU-1);
SIGNAL dbgo : l3_debug_out_vector(0 TO NCPU-1);
SIGNAL dsui : dsu_in_type;
SIGNAL dsuo : dsu_out_type;
-- SIGNAL pcii : pci_in_type;
-- SIGNAL pcio : pci_out_type;
SIGNAL ethi, ethi1, ethi2 : eth_in_type;
SIGNAL etho, etho1, etho2 : eth_out_type;
SIGNAL gpti : gptimer_in_type;
SIGNAL gpioi : gpio_in_type;
SIGNAL gpioo : gpio_out_type;
SIGNAL lclk, pci_lclk : STD_ULOGIC := '0';
SIGNAL pci_arb_req_n, pci_arb_gnt_n : STD_LOGIC_VECTOR(0 TO 3);
SIGNAL spwi : grspw_in_type_vector(0 TO 2);
SIGNAL spwo : grspw_out_type_vector(0 TO 2);
SIGNAL spw_rx_clk : STD_ULOGIC;
ATTRIBUTE sync_set_reset : STRING;
ATTRIBUTE sync_set_reset OF rstn : SIGNAL IS "true";
CONSTANT BOARD_FREQ : INTEGER := 40000; -- Board frequency in KHz
CONSTANT CPU_FREQ : INTEGER := BOARD_FREQ * CFG_CLKMUL / CFG_CLKDIV;
CONSTANT IOAEN : INTEGER := CFG_SDCTRL;
CONSTANT CFG_SDEN : INTEGER := CFG_SDCTRL + CFG_MCTRL_SDEN;
CONSTANT sysfreq : INTEGER := (CFG_CLKMUL/CFG_CLKDIV)*40000;
-----------------------------------------------------------------------------
SIGNAL fifo_data : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL fifo_empty : STD_LOGIC;
SIGNAL fifo_ren : STD_LOGIC;
SIGNAL dma_data : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL dma_empty : STD_LOGIC;
SIGNAL dma_ren : STD_LOGIC;
SIGNAL header : STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL header_val : STD_LOGIC;
SIGNAL header_ack : STD_LOGIC;
SIGNAL lclk2x : STD_ULOGIC;
SIGNAL clk2x : STD_ULOGIC;
CONSTANT boardfreq : INTEGER := 50000;
signal coarse_time : std_logic_vector(31 downto 0);
signal fine_time : std_logic_vector(31 downto 0);
BEGIN
----------------------------------------------------------------------
--- Reset and Clock generation -------------------------------------
----------------------------------------------------------------------
vcc <= (OTHERS => '1');
gnd <= (OTHERS => '0');
cgi.pllctrl <= "00";
cgi.pllrst <= rstraw;
pllref_pad : clkpad GENERIC MAP (tech => padtech) PORT MAP (pllref, cgi.pllref);
clk_pad : clkpad GENERIC MAP (tech => padtech) PORT MAP (clk, lclk2x);
PROCESS(lclk2x)
BEGIN
IF lclk2x'EVENT AND lclk2x = '1' THEN
lclk <= NOT lclk;
END IF;
END PROCESS;
pci_clk_pad : clkpad GENERIC MAP (tech => padtech, level => pci33) PORT MAP (pci_clk, pci_lclk);
clkgen0 : clkgen -- clock generator
GENERIC MAP (clktech, CFG_CLKMUL, CFG_CLKDIV, CFG_MCTRL_SDEN, CFG_CLK_NOFB, 0, 0, 0, boardfreq, 0, 0, CFG_OCLKDIV)
PORT MAP (lclk, lclk, clkm, OPEN, clk2x, sdclkl, pciclk, cgi, cgo);
ramclk <= clkm;
rst0 : rstgen -- reset generator
PORT MAP (resetn, clkm, cgo.clklock, rstn, rstraw);
----------------------------------------------------------------------
--- AHB CONTROLLER --------------------------------------------------
----------------------------------------------------------------------
ahb0 : ahbctrl -- AHB arbiter/multiplexer
GENERIC MAP (defmast => CFG_DEFMST, split => CFG_SPLIT,
rrobin => CFG_RROBIN, ioaddr => CFG_AHBIO,
ioen => IOAEN, nahbm => maxahbm, nahbs => 8)
PORT MAP (rstn, clkm, ahbmi, ahbmo, ahbsi, ahbso);
----------------------------------------------------------------------
--- LEON3 processor and DSU -----------------------------------------
----------------------------------------------------------------------
l3 : IF CFG_LEON3 = 1 GENERATE
cpu : FOR i IN 0 TO NCPU-1 GENERATE
u0 : leon3s -- LEON3 processor
GENERIC MAP (i, fabtech, memtech, CFG_NWIN, CFG_DSU, CFG_FPU, CFG_V8,
0, CFG_MAC, pclow, 0, CFG_NWP, CFG_ICEN, CFG_IREPL, CFG_ISETS, CFG_ILINE,
CFG_ISETSZ, CFG_ILOCK, CFG_DCEN, CFG_DREPL, CFG_DSETS, CFG_DLINE, CFG_DSETSZ,
CFG_DLOCK, CFG_DSNOOP, CFG_ILRAMEN, CFG_ILRAMSZ, CFG_ILRAMADDR, CFG_DLRAMEN,
CFG_DLRAMSZ, CFG_DLRAMADDR, CFG_MMUEN, CFG_ITLBNUM, CFG_DTLBNUM, CFG_TLB_TYPE, CFG_TLB_REP,
CFG_LDDEL, disas, CFG_ITBSZ, CFG_PWD, CFG_SVT, CFG_RSTADDR, NCPU-1, CFG_DFIXED)
PORT MAP (clkm, rstn, ahbmi, ahbmo(i), ahbsi, ahbso,
irqi(i), irqo(i), dbgi(i), dbgo(i));
END GENERATE;
errorn_pad : odpad GENERIC MAP (tech => padtech) PORT MAP (errorn, dbgo(0).error);
dsugen : IF CFG_DSU = 1 GENERATE
dsu0 : dsu3 -- LEON3 Debug Support Unit
GENERIC MAP (hindex => 2, haddr => 16#900#, hmask => 16#F00#,
ncpu => NCPU, tbits => 30, tech => memtech, irq => 0, kbytes => CFG_ATBSZ)
PORT MAP (rstn, clkm, ahbmi, ahbsi, ahbso(2), dbgo, dbgi, dsui, dsuo);
dsuen_pad : inpad GENERIC MAP (tech => padtech) PORT MAP (dsuen, dsui.enable);
dsubre_pad : inpad GENERIC MAP (tech => padtech) PORT MAP (dsubre, dsui.break);
dsuact_pad : outpad GENERIC MAP (tech => padtech) PORT MAP (dsuact, dsuo.active);
END GENERATE;
END GENERATE;
nodsu : IF CFG_DSU = 0 GENERATE
ahbso(2) <= ahbs_none; dsuo.tstop <= '0'; dsuo.active <= '0';
END GENERATE;
dcomgen : IF CFG_AHB_UART = 1 GENERATE
dcom0 : ahbuart -- Debug UART
GENERIC MAP (hindex => NCPU, pindex => 7, paddr => 7)
PORT MAP (rstn, clkm, dui, duo, apbi, apbo(7), ahbmi, ahbmo(NCPU));
dsurx_pad : inpad GENERIC MAP (tech => padtech) PORT MAP (dsurx, dui.rxd);
dsutx_pad : outpad GENERIC MAP (tech => padtech) PORT MAP (dsutx, duo.txd);
END GENERATE;
nouah : IF CFG_AHB_UART = 0 GENERATE apbo(7) <= apb_none; END GENERATE;
ahbjtaggen0 : IF CFG_AHB_JTAG = 1 GENERATE
ahbjtag0 : ahbjtag GENERIC MAP(tech => fabtech, hindex => NCPU+CFG_AHB_UART)
PORT MAP(rstn, clkm, tck, tms, tdi, tdo, ahbmi, ahbmo(NCPU+CFG_AHB_UART),
OPEN, OPEN, OPEN, OPEN, OPEN, OPEN, OPEN, gnd(0));
END GENERATE;
----------------------------------------------------------------------
--- Memory controllers ----------------------------------------------
----------------------------------------------------------------------
-- LEON2 memory controller
sr1 : mctrl
GENERIC MAP (
hindex => 0,
pindex => 0,
romaddr => 16#000#,
rommask => 16#E00#,
ioaddr => 16#200#,
iomask => 16#E00#,
ramaddr => 16#400#,
rammask => 16#C00#,
paddr => 0,
pmask => 16#fff#,
wprot => 0,
invclk => 0,
fast => 0,
romasel => 28,
sdrasel => 29,
srbanks => 4,
ram8 => 0,
ram16 => 0,
sden => 0,
sepbus => 0,
sdbits => 32,
sdlsb => 2, -- set to 12 for the GE-HPE board
oepol => 0,
syncrst => 0,
pageburst => 0,
scantest => 0,
mobile => 0
)
PORT MAP (
rst => rstn,
clk => clkm,
memi => memi,
memo => memo,
ahbsi => ahbsi,
ahbso => ahbso(0),
apbi => apbi,
apbo => apbo(0),
wpo => wpo,
sdo => sdo
);
memi.brdyn <= '1'; memi.bexcn <= '1';
memi.writen <= '1'; memi.wrn <= "1111"; memi.bwidth <= "10";
mgpads : IF (CFG_SRCTRL = 1) OR (CFG_MCTRL_LEON2 = 1) GENERATE -- prom/sram pads
addr_pad : outpadv GENERIC MAP (width => 28, tech => padtech) PORT MAP (address, memo.address(27 DOWNTO 0));
rams_pad : outpadv GENERIC MAP (width => 5, tech => padtech) PORT MAP (ramsn, memo.ramsn(4 DOWNTO 0));
roms_pad : outpadv GENERIC MAP (width => 2, tech => padtech) PORT MAP (romsn, memo.romsn(1 DOWNTO 0));
oen_pad : outpad GENERIC MAP (tech => padtech) PORT MAP (oen, memo.oen);
rwen_pad : outpadv GENERIC MAP (width => 4, tech => padtech) PORT MAP (rwen, memo.wrn);
roen_pad : outpadv GENERIC MAP (width => 5, tech => padtech) PORT MAP (ramoen, memo.ramoen(4 DOWNTO 0));
wri_pad : outpad GENERIC MAP (tech => padtech) PORT MAP (writen, memo.writen);
read_pad : outpad GENERIC MAP (tech => padtech) PORT MAP (read, memo.read);
iosn_pad : outpad GENERIC MAP (tech => padtech) PORT MAP (iosn, memo.iosn);
bdr : FOR i IN 0 TO 3 GENERATE
data_pad : iopadv GENERIC MAP (tech => padtech, width => 8)
PORT MAP (data(31-i*8 DOWNTO 24-i*8), memo.data(31-i*8 DOWNTO 24-i*8),
memo.bdrive(i), memi.data(31-i*8 DOWNTO 24-i*8));
END GENERATE;
END GENERATE;
SSRAM_0 : ssram_plugin
GENERIC MAP (tech => padtech)
PORT MAP (lclk2x, memo, SSRAM_CLK,
nBWa, nBWb, nBWc, nBWd, nBWE, nADSC, nADSP, nADV, nGW, nCE1, CE2, nCE3, nOE, MODE, ZZ);
----------------------------------------------------------------------
--- APB Bridge and various periherals -------------------------------
----------------------------------------------------------------------
apb0 : apbctrl -- AHB/APB bridge
GENERIC MAP (hindex => 1, haddr => CFG_APBADDR)
PORT MAP (rstn, clkm, ahbsi, ahbso(1), apbi, apbo);
ua1 : IF CFG_UART1_ENABLE /= 0 GENERATE
uart1 : apbuart -- UART 1
GENERIC MAP (pindex => 1, paddr => 1, pirq => 2, console => dbguart,
fifosize => CFG_UART1_FIFO)
PORT MAP (rstn, clkm, apbi, apbo(1), u1i, u1o);
u1i.rxd <= rxd1; u1i.ctsn <= '0'; u1i.extclk <= '0'; txd1 <= u1o.txd;
END GENERATE;
noua0 : IF CFG_UART1_ENABLE = 0 GENERATE apbo(1) <= apb_none; END GENERATE;
ua2 : IF CFG_UART2_ENABLE /= 0 GENERATE
uart2 : apbuart -- UART 2
GENERIC MAP (pindex => 9, paddr => 9, pirq => 3, fifosize => CFG_UART2_FIFO)
PORT MAP (rstn, clkm, apbi, apbo(9), u2i, u2o);
u2i.rxd <= rxd2; u2i.ctsn <= '0'; u2i.extclk <= '0'; txd2 <= u2o.txd;
END GENERATE;
noua1 : IF CFG_UART2_ENABLE = 0 GENERATE apbo(9) <= apb_none; END GENERATE;
irqctrl : IF CFG_IRQ3_ENABLE /= 0 GENERATE
irqctrl0 : irqmp -- interrupt controller
GENERIC MAP (pindex => 2, paddr => 2, ncpu => NCPU)
PORT MAP (rstn, clkm, apbi, apbo(2), irqo, irqi);
END GENERATE;
irq3 : IF CFG_IRQ3_ENABLE = 0 GENERATE
x : FOR i IN 0 TO NCPU-1 GENERATE
irqi(i).irl <= "0000";
END GENERATE;
apbo(2) <= apb_none;
END GENERATE;
gpt : IF CFG_GPT_ENABLE /= 0 GENERATE
timer0 : gptimer -- timer unit
GENERIC MAP (pindex => 3, paddr => 3, pirq => CFG_GPT_IRQ,
sepirq => CFG_GPT_SEPIRQ, sbits => CFG_GPT_SW, ntimers => CFG_GPT_NTIM,
nbits => CFG_GPT_TW, wdog => CFG_GPT_WDOG)
PORT MAP (rstn, clkm, apbi, apbo(3), gpti, OPEN);
gpti.dhalt <= dsuo.tstop; gpti.extclk <= '0';
END GENERATE;
notim : IF CFG_GPT_ENABLE = 0 GENERATE apbo(3) <= apb_none; END GENERATE;
gpio0 : IF CFG_GRGPIO_ENABLE /= 0 GENERATE -- GR GPIO unit
grgpio0 : grgpio
GENERIC MAP(pindex => 11, paddr => 11, imask => CFG_GRGPIO_IMASK,
nbits => CFG_GRGPIO_WIDTH)
PORT MAP(rstn, clkm, apbi, apbo(11), gpioi, gpioo);
pio_pads : FOR i IN 0 TO CFG_GRGPIO_WIDTH-1 GENERATE
pio_pad : iopad GENERIC MAP (tech => padtech)
PORT MAP (gpio(i), gpioo.dout(i), gpioo.oen(i), gpioi.din(i));
END GENERATE;
END GENERATE;
-----------------------------------------------------------------------
--- PCI ------------------------------------------------------------
-----------------------------------------------------------------------
--pp : IF CFG_PCI /= 0 GENERATE
-- pci_gr0 : IF CFG_PCI = 1 GENERATE -- simple target-only
-- pci0 : pci_target GENERIC MAP (hindex => NCPU+CFG_AHB_UART+CFG_AHB_JTAG,
-- device_id => CFG_PCIDID, vendor_id => CFG_PCIVID)
-- PORT MAP (rstn, clkm, pciclk, pcii, pcio, ahbmi, ahbmo(NCPU+CFG_AHB_UART+CFG_AHB_JTAG));
-- END GENERATE;
-- pci_mtf0 : IF CFG_PCI = 2 GENERATE -- master/target with fifo
-- pci0 : pci_mtf GENERIC MAP (memtech => memtech, hmstndx => NCPU+CFG_AHB_UART+CFG_AHB_JTAG,
-- fifodepth => log2(CFG_PCIDEPTH), device_id => CFG_PCIDID, vendor_id => CFG_PCIVID,
-- hslvndx => 4, pindex => 4, paddr => 4, haddr => 16#E00#,
-- ioaddr => 16#400#, nsync => 2, hostrst => 1)
-- PORT MAP (rstn, clkm, pciclk, pcii, pcio, apbi, apbo(4),
-- ahbmi, ahbmo(NCPU+CFG_AHB_UART+CFG_AHB_JTAG), ahbsi, ahbso(4));
-- END GENERATE;
-- pci_mtf1 : IF CFG_PCI = 3 GENERATE -- master/target with fifo and DMA
-- dma : pcidma GENERIC MAP (memtech => memtech, dmstndx => NCPU+CFG_AHB_UART+CFG_AHB_JTAG+1,
-- dapbndx => 5, dapbaddr => 5, blength => blength, mstndx => NCPU+CFG_AHB_UART+CFG_AHB_JTAG,
-- fifodepth => log2(CFG_PCIDEPTH), device_id => CFG_PCIDID, vendor_id => CFG_PCIVID,
-- slvndx => 4, apbndx => 4, apbaddr => 4, haddr => 16#E00#, ioaddr => 16#800#,
-- nsync => 2, hostrst => 1)
-- PORT MAP (rstn, clkm, pciclk, pcii, pcio, apbo(5), ahbmo(NCPU+CFG_AHB_UART+CFG_AHB_JTAG+1),
-- apbi, apbo(4), ahbmi, ahbmo(NCPU+CFG_AHB_UART+CFG_AHB_JTAG), ahbsi, ahbso(4));
-- END GENERATE;
-- pci_trc0 : IF CFG_PCITBUFEN /= 0 GENERATE -- PCI trace buffer
-- pt0 : pcitrace GENERIC MAP (depth => (6 + log2(CFG_PCITBUF/256)),
-- memtech => memtech, pindex => 8, paddr => 16#100#, pmask => 16#f00#)
-- PORT MAP (rstn, clkm, pciclk, pcii, apbi, apbo(8));
-- END GENERATE;
-- pcia0 : IF CFG_PCI_ARB = 1 GENERATE -- PCI arbiter
-- pciarb0 : pciarb GENERIC MAP (pindex => 10, paddr => 10,
-- apb_en => CFG_PCI_ARBAPB)
-- PORT MAP (clk => pciclk, rst_n => pcii.rst,
-- req_n => pci_arb_req_n, frame_n => pcii.frame,
-- gnt_n => pci_arb_gnt_n, pclk => clkm,
-- prst_n => rstn, apbi => apbi, apbo => apbo(10)
-- );
-- pgnt_pad : outpadv GENERIC MAP (tech => padtech, width => 4)
-- PORT MAP (pci_arb_gnt, pci_arb_gnt_n);
-- preq_pad : inpadv GENERIC MAP (tech => padtech, width => 4)
-- PORT MAP (pci_arb_req, pci_arb_req_n);
-- END GENERATE;
-- pcipads0 : pcipads GENERIC MAP (padtech => padtech) -- PCI pads
-- PORT MAP (pci_rst, pci_gnt, pci_idsel, pci_lock, pci_ad, pci_cbe,
-- pci_frame, pci_irdy, pci_trdy, pci_devsel, pci_stop, pci_perr,
-- pci_par, pci_req, pci_serr, pci_host, pci_66, pcii, pcio);
--END GENERATE;
-- nop1 : IF CFG_PCI <= 1 GENERATE apbo(4) <= apb_none; END GENERATE;
-- nop2 : IF CFG_PCI <= 2 GENERATE apbo(5) <= apb_none; END GENERATE;
nop3 : IF CFG_PCI <= 1 GENERATE ahbso(4) <= ahbs_none; END GENERATE;
notrc : IF CFG_PCITBUFEN = 0 GENERATE apbo(8) <= apb_none; END GENERATE;
noarb : IF CFG_PCI_ARB = 0 GENERATE apbo(10) <= apb_none; END GENERATE;
pci_rst <= '0';
pci_lock <= '0';
pci_ad <= (OTHERS => '0');
pci_cbe <= (OTHERS => '0');
pci_frame <= '0';
pci_irdy <= '0';
pci_trdy <= '0';
pci_devsel <= '0';
pci_stop <= '0';
pci_perr <= '0';
pci_par <= '0';
pci_req <= '0';
pci_serr <= '0';
pci_arb_gnt <= (OTHERS => '0');
-- ahbso(6) <= ahbs_none;
-----------------------------------------------------------------------
--- AHB RAM ----------------------------------------------------------
-----------------------------------------------------------------------
ocram : IF CFG_AHBRAMEN = 1 GENERATE
ahbram0 : ahbram GENERIC MAP (hindex => 7, haddr => CFG_AHBRADDR,
tech => CFG_MEMTECH, kbytes => CFG_AHBRSZ)
PORT MAP (rstn, clkm, ahbsi, ahbso(7));
END GENERATE;
nram : IF CFG_AHBRAMEN = 0 GENERATE ahbso(7) <= ahbs_none; END GENERATE;
-----------------------------------------------------------------------
--- SPACEWIRE -------------------------------------------------------
-----------------------------------------------------------------------
--This template does NOT currently support grspw2 so only use grspw1
spw : IF CFG_SPW_EN > 0 GENERATE
spw_rx_clk <= '0';
spw_clk_pad : clkpad GENERIC MAP (tech => padtech) PORT MAP (spw_clk, spw_lclk);
swloop : FOR i IN 0 TO CFG_SPW_NUM-1 GENERATE
sw0 : grspwm GENERIC MAP(tech => memtech, netlist => CFG_SPW_NETLIST,
hindex => maxahbmsp+i, pindex => 12+i, paddr => 12+i, pirq => 10+i,
sysfreq => sysfreq, nsync => 1, rmap => 0, ports => 1, dmachan => 1,
fifosize1 => CFG_SPW_AHBFIFO, fifosize2 => CFG_SPW_RXFIFO,
rxclkbuftype => 1, spwcore => CFG_SPW_GRSPW)
PORT MAP(resetn, clkm, spw_rx_clk, spw_rx_clk, spw_lclk, spw_lclk,
ahbmi, ahbmo(maxahbmsp+i),
apbi, apbo(12+i), spwi(i), spwo(i));
spwi(i).tickin <= '0'; spwi(i).rmapen <= '1';
spwi(i).clkdiv10 <= conv_std_logic_vector(sysfreq/10000-1, 8);
spw_rxd_pad : inpad_ds GENERIC MAP (padtech, lvds, x25v)
PORT MAP (spw_rxd(i), spw_rxdn(i), spwi(i).d(0));
spw_rxs_pad : inpad_ds GENERIC MAP (padtech, lvds, x25v)
PORT MAP (spw_rxs(i), spw_rxsn(i), spwi(i).s(0));
spw_txd_pad : outpad_ds GENERIC MAP (padtech, lvds, x25v)
PORT MAP (spw_txd(i), spw_txdn(i), spwo(i).d(0), gnd(0));
spw_txs_pad : outpad_ds GENERIC MAP (padtech, lvds, x25v)
PORT MAP (spw_txs(i), spw_txsn(i), spwo(i).s(0), gnd(0));
END GENERATE;
END GENERATE;
no_spw: IF CFG_SPW_EN = 0 GENERATE
spw_txd <= (OTHERS => '0');
spw_txdn <= (OTHERS => '0');
spw_txs <= (OTHERS => '0');
spw_txsn <= (OTHERS => '0');
END GENERATE no_spw;
-------------------------------------------------------------------------------
-- BOOT MEMORY AND REGISTER
-------------------------------------------------------------------------------
lpp_bootloader_1 : lpp_bootloader
GENERIC MAP (
pindex => 13,
paddr => 13,
pmask => 16#fff#,
hindex => 6,
haddr => 16#900#,
hmask => 16#F00#)
PORT MAP (
HCLK => clkm,
HRESETn => resetn,
apbi => apbi,
apbo => apbo(13),
ahbsi => ahbsi,
ahbso => ahbso(6));
-------------------------------------------------------------------------------
-- AHB DMA
-------------------------------------------------------------------------------
--lpp_dma_1 : lpp_dma
-- GENERIC MAP (
-- tech => fabtech,
-- hindex => 2,
-- pindex => 14,
-- paddr => 14,
-- pmask => 16#fff#,
-- pirq => 0)
-- PORT MAP (
-- HCLK => clkm,
-- HRESETn => resetn,
-- apbi => apbi,
-- apbo => apbo(14),
-- AHB_Master_In => ahbmi,
-- AHB_Master_Out => ahbmo(2),
-- fifo_data => fifo_data, --dma_data,
-- fifo_empty => fifo_empty, --dma_empty,
-- fifo_ren => fifo_ren, --dma_ren,
-- header => header,
-- header_val => header_val,
-- header_ack => header_ack);
--fifo_test_dma_1 : fifo_test_dma
-- GENERIC MAP (
-- tech => fabtech,
-- pindex => 15,
-- paddr => 15,
-- pmask => 16#fff#)
-- PORT MAP (
-- HCLK => clkm,
-- HRESETn => resetn,
-- apbi => apbi,
-- apbo => apbo(15),
-- fifo_data => fifo_data,
-- fifo_empty => fifo_empty,
-- fifo_ren => fifo_ren,
-- header => header,
-- header_val => header_val,
-- header_ack => header_ack);
--------------------------
-- APB_LFR_TIME_MANAGEMENT
--------------------------
lfrtimemanagement_0 : apb_lfr_time_management
generic map(
pindex => 15,
paddr => 15,
pmask => 16#fff#,
masterclk => 25000000,
timeclk => 49152000,
finetimeclk => 65536,
pirq => 12) -- the IP uses 2 consecutive IRQ lines
port map(
clkm,
clk49_152MHz,
rstn,
'0',
apbi,
apbo(15),
coarse_time,
fine_time);
------------------
-- WAVEFORM PICKER
------------------
waveform_picker0 : lpp_top_lfr_wf_picker
GENERIC MAP(
hindex => 3,
pindex => 14,
paddr => 14,
pmask => 16#fff#,
pirq => 15,
tech => CFG_FABTECH,
nb_burst_available_size => 11, -- size of the register holding the nb of burst
nb_snapshot_param_size => 11, -- size of the register holding the snapshots size
delta_snapshot_size => 16, -- snapshots period
delta_f2_f0_size => 10, -- initialize the counter when the f2 snapshot starts
delta_f2_f1_size => 10 -- nb f0 ticks before starting the f1 snapshot
)
PORT MAP(
-- ADS7886
cnv_run => '1', -- stop the sampling request
cnv => cnv_ch1,
sck => sck_ch1,
sdo => sdo_adc,
--
cnv_clk => clk49_152MHz,
cnv_rstn => rstn,
-- AMBA AHB system signals
HCLK => clkm,
HRESETn => rstn,
-- AMBA APB Slave Interface
apbi => apbi,
apbo => apbo(14),
-- AMBA AHB Master Interface
AHB_Master_In => ahbmi,
AHB_Master_Out => ahbmo(3),
--
coarse_time_0 => coarse_time(0), -- bit 0 of the coarse time
--
data_shaping_BW => Bias_Fails
);
-----------------------------------------------------------------------
--- Boot message ----------------------------------------------------
-----------------------------------------------------------------------
-- pragma translate_off
x : report_version
GENERIC MAP (
msg1 => "LEON3 MP Demonstration design",
msg2 => "GRLIB Version " & tost(LIBVHDL_VERSION/1000) & "." & tost((LIBVHDL_VERSION MOD 1000)/100)
& "." & tost(LIBVHDL_VERSION MOD 100) & ", build " & tost(LIBVHDL_BUILD),
msg3 => "Target technology: " & tech_table(fabtech) & ", memory library: " & tech_table(memtech),
mdel => 1
);
-- pragma translate_on
END;