##// END OF EJS Templates
temp
temp

File last commit:

r100:fc97c34d69e3 martin
r249:279a122aaba5 JC
Show More
spacewire.vhd
593 lines | 22.3 KiB | text/x-vhdl | VhdlLexer
------------------------------------------------------------------------------
-- This file is a part of the GRLIB VHDL IP LIBRARY
-- Copyright (C) 2003 - 2008, Gaisler Research
-- Copyright (C) 2008 - 2010, Aeroflex Gaisler
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-----------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
library grlib;
use grlib.amba.all;
library techmap;
use techmap.gencomp.all;
package spacewire is
type grspw_in_type is record
d : std_logic_vector(3 downto 0);
dv : std_logic_vector(3 downto 0);
s : std_logic_vector(1 downto 0);
dconnect : std_logic_vector(3 downto 0);
tickin : std_ulogic;
tickinraw : std_ulogic;
timein : std_logic_vector(7 downto 0);
clkdiv10 : std_logic_vector(7 downto 0);
rmapen : std_ulogic;
dcrstval : std_logic_vector(9 downto 0);
timerrstval : std_logic_vector(11 downto 0);
end record;
type grspw_out_type is record
d : std_logic_vector(3 downto 0);
s : std_logic_vector(3 downto 0);
tickout : std_ulogic;
tickoutraw : std_ulogic;
tickindone : std_ulogic;
timeout : std_logic_vector(7 downto 0);
linkdis : std_ulogic;
rmapact : std_ulogic;
rxdataout : std_logic_vector(8 downto 0);
rxdav : std_ulogic;
loopback : std_ulogic;
end record;
constant grspw_in_none : grspw_in_type :=
((others => '0'), (others => '0'), (others => '0'),
(others => '0'), '0', '0', (others => '0'), (others => '0'), '0',
(others => '0'), (others => '0'));
constant grspw_out_none : grspw_out_type :=
((others => '0'), (others => '0'), '0', '0', '0', (others => '0'),
'0', '0', (others => '0'), '0', '0');
type grspw_codec_in_type is record
--spw
d : std_logic_vector(3 downto 0);
dv : std_logic_vector(3 downto 0);
dconnect : std_logic_vector(3 downto 0);
--link fsm
linkdisabled : std_ulogic;
linkstart : std_ulogic;
autostart : std_ulogic;
portsel : std_ulogic;
noportforce : std_ulogic;
rdivisor : std_logic_vector(7 downto 0);
idivisor : std_logic_vector(7 downto 0);
--rx iface
rxiread : std_ulogic;
rxififorst : std_ulogic;
--tx iface
txiwrite : std_ulogic;
txichar : std_logic_vector(8 downto 0);
txififorst : std_ulogic;
--time iface
tickin : std_ulogic;
timein : std_logic_vector(7 downto 0);
end record;
type grspw_codec_out_type is record
--spw
do : std_logic_vector(3 downto 0);
so : std_logic_vector(3 downto 0);
--link fsm
state : std_logic_vector(2 downto 0);
actport : std_ulogic;
dconnecterr : std_ulogic;
crederr : std_ulogic;
escerr : std_ulogic;
parerr : std_ulogic;
--rx iface
rxicharav : std_ulogic;
rxicharcnt : std_logic_vector(11 downto 0);
rxichar : std_logic_vector(8 downto 0);
--tx iface
txicharcnt : std_logic_vector(11 downto 0);
txifull : std_ulogic;
txiempty : std_ulogic;
txififorst : std_ulogic;
--time iface
tickin_done : std_ulogic;
tickout : std_ulogic;
timeout : std_logic_vector(7 downto 0);
merror : std_ulogic;
end record;
type grspw_dma_in_type is record
--rx iface
rxiread : std_ulogic;
--tx iface
txiwrite : std_ulogic;
txichar : std_logic_vector(8 downto 0);
txififorst : std_ulogic;
--internal time iface
itickin : std_ulogic;
itimein : std_logic_vector(7 downto 0);
--time iface
tickin : std_ulogic;
timein : std_logic_vector(7 downto 0);
rmapen : std_ulogic;
end record;
type grspw_dma_out_type is record
--rx iface
rxicharav : std_ulogic;
rxichar : std_logic_vector(8 downto 0);
--tx iface
txicharcnt : std_logic_vector(11 downto 0);
txifull : std_ulogic;
txififorst : std_ulogic;
--internal time iface
itickout : std_ulogic;
itimeout : std_logic_vector(7 downto 0);
--time iface
tickin_done : std_ulogic;
tickout : std_ulogic;
timeout : std_logic_vector(7 downto 0);
merror : std_ulogic;
end record;
type grspw_fifo_in_type is record
enbridge : std_ulogic;
--rx iface
rxiread : std_ulogic;
--tx iface
txiwrite : std_ulogic;
txichar : std_logic_vector(8 downto 0);
txififorst : std_ulogic;
--internal time iface
itickin : std_ulogic;
itimein : std_logic_vector(7 downto 0);
--time iface
tickin : std_ulogic;
timein : std_logic_vector(7 downto 0);
enexttime : std_ulogic;
rmapen : std_ulogic;
--external interface
etxwrite : std_ulogic;
etxchar : std_logic_vector(8 downto 0);
erxread : std_ulogic;
end record;
type grspw_fifo_out_type is record
--rx iface
rxicharcnt : std_logic_vector(11 downto 0);
rxicharav : std_ulogic;
rxichar : std_logic_vector(8 downto 0);
--tx iface
txicharcnt : std_logic_vector(11 downto 0);
txifull : std_ulogic;
txififorst : std_ulogic;
--internal time iface
itickout : std_ulogic;
itimeout : std_logic_vector(7 downto 0);
ienexttime : std_ulogic;
--time iface
tickin_done : std_ulogic;
tickout : std_ulogic;
timeout : std_logic_vector(7 downto 0);
--external interface
erxcharav : std_ulogic;
erxaempty : std_ulogic;
etxfull : std_ulogic;
etxafull : std_ulogic;
erxchar : std_logic_vector(8 downto 0);
merror : std_ulogic;
end record;
type grspw_router_fifo_char_type is array (0 to 30) of std_logic_vector(8 downto 0);
type grspw_router_time_type is array (0 to 30) of std_logic_vector(7 downto 0);
type grspw_router_in_type is record
rmapen : std_logic_vector(30 downto 0);
idivisor : std_logic_vector(7 downto 0);
txwrite : std_logic_vector(30 downto 0);
txchar : grspw_router_fifo_char_type;
rxread : std_logic_vector(30 downto 0);
tickin : std_logic_vector(30 downto 0);
timein : grspw_router_time_type;
reload : std_logic_vector(31 downto 0);
reloadn : std_logic_vector(9 downto 0);
timeren : std_ulogic;
timecodeen : std_ulogic;
cfglock : std_ulogic;
selfaddren : std_ulogic;
linkstartreq : std_ulogic;
autodconnect : std_ulogic;
instanceid : std_logic_vector(7 downto 0);
enbridge : std_logic_vector(30 downto 0);
enexttime : std_logic_vector(30 downto 0);
end record;
type grspw_router_out_type is record
rxcharav : std_logic_vector(30 downto 0);
rxaempty : std_logic_vector(30 downto 0);
txfull : std_logic_vector(30 downto 0);
txafull : std_logic_vector(30 downto 0);
rxchar : grspw_router_fifo_char_type;
tickout : std_logic_vector(30 downto 0);
timeout : grspw_router_time_type;
merror : std_ulogic;
gerror : std_ulogic;
lerror : std_ulogic;
linkrun : std_logic_vector(30 downto 0);
--debug
tick : std_ulogic;
timetx : std_logic_vector(5 downto 0);
s0currport : std_logic_vector(3 downto 0);
s1currport : std_logic_vector(3 downto 0);
s0charav : std_ulogic;
s1charav : std_ulogic;
rtvalid : std_ulogic;
pevalid : std_ulogic;
s1char : std_logic_vector(8 downto 0);
p0insel : std_logic_vector(3 downto 0);
p0rxactive : std_ulogic;
p0txactive : std_ulogic;
p0active : std_ulogic;
p0headerdel : std_ulogic;
p0spill : std_ulogic;
p0charav : std_ulogic;
p0invaddr : std_ulogic;
p0bufav : std_ulogic;
p0pktdist : std_ulogic;
p0ports : std_logic_vector(12 downto 0);
p1insel : std_logic_vector(3 downto 0);
p1rxactive : std_ulogic;
p1txactive : std_ulogic;
p1active : std_ulogic;
p1headerdel : std_ulogic;
p1spill : std_ulogic;
p1charav : std_ulogic;
p1invaddr : std_ulogic;
p1bufav : std_ulogic;
p1pktdist : std_ulogic;
p1ports : std_logic_vector(12 downto 0);
rmapstate : std_logic_vector(4 downto 0);
rmapen : std_logic_vector(30 downto 0);
idivisor : std_logic_vector(7 downto 0);
end record;
constant grspw_router_in_none : grspw_router_in_type :=
((others => '0'), (others => '0'), (others => '0'), (others => (others => '0')),
(others => '0'), (others => '0'), (others => (others => '0')), (others => '0'),
(others => '0'), '0', '0', '0', '0', '0', '0', (others => '0'), (others => '0'),
(others => '0'));
constant grspw_router_out_none : grspw_router_out_type :=
((others => '0'), (others => '0'), (others => '0'), (others => '0'),
(others => (others => '0')), (others => '0'), (others => (others => '0')), '0',
'0', '0', (others => '0'), '0', (others => '0'), (others => '0'), (others => '0'),
'0', '0', '0', '0', (others => '0'), (others => '0'), '0', '0', '0', '0', '0',
'0', '0', '0', '0', (others => '0'), (others => '0'), '0', '0', '0', '0', '0',
'0', '0', '0', '0', (others => '0'), (others => '0'), (others => '0'),
(others => '0'));
type spw_ahb_mst_out_vector is array (natural range <>) of
ahb_mst_out_type;
type spw_apb_slv_out_vector is array (natural range <>) of
apb_slv_out_type;
component grspw2_phy is
generic(
scantest : integer;
tech : integer;
input_type : integer --0=xor, 1=sample sdr, 2=sample ddr, 3=aeroflex phy
);
port(
rstn : in std_ulogic;
rxclki : in std_ulogic;
rxclkin : in std_ulogic;
nrxclki : in std_ulogic;
di : in std_ulogic;
si : in std_ulogic; --used as df when input_type=3
do : out std_logic_vector(1 downto 0);
dov : out std_logic_vector(1 downto 0);
dconnect : out std_logic_vector(1 downto 0);
rxclko : out std_ulogic;
testrst : in std_ulogic := '0';
testen : in std_ulogic := '0'
);
end component;
component grspw2 is
generic(
tech : integer range 0 to NTECH := inferred;
hindex : integer range 0 to NAHBMST-1 := 0;
pindex : integer range 0 to NAPBSLV-1 := 0;
paddr : integer range 0 to 16#FFF# := 0;
pmask : integer range 0 to 16#FFF# := 16#FFF#;
pirq : integer range 0 to NAHBIRQ-1 := 0;
rmap : integer range 0 to 1 := 0;
rmapcrc : integer range 0 to 1 := 0;
fifosize1 : integer range 4 to 32 := 32;
fifosize2 : integer range 16 to 64 := 64;
rxclkbuftype : integer range 0 to 2 := 0;
rxunaligned : integer range 0 to 1 := 0;
rmapbufs : integer range 2 to 8 := 4;
ft : integer range 0 to 2 := 0;
scantest : integer range 0 to 1 := 0;
techfifo : integer range 0 to 1 := 1;
ports : integer range 1 to 2 := 1;
dmachan : integer range 1 to 4 := 1;
memtech : integer range 0 to NTECH := DEFMEMTECH;
input_type : integer range 0 to 3 := 0;
output_type : integer range 0 to 2 := 0;
rxtx_sameclk : integer range 0 to 1 := 0;
netlist : integer range 0 to 1 := 0
);
port(
rst : in std_ulogic;
clk : in std_ulogic;
rxclk0 : in std_ulogic;
rxclk1 : in std_ulogic;
txclk : in std_ulogic;
txclkn : in std_ulogic;
ahbmi : in ahb_mst_in_type;
ahbmo : out ahb_mst_out_type;
apbi : in apb_slv_in_type;
apbo : out apb_slv_out_type;
swni : in grspw_in_type;
swno : out grspw_out_type
);
end component;
component grspw is
generic(
tech : integer range 0 to NTECH := DEFFABTECH;
hindex : integer range 0 to NAHBMST-1 := 0;
pindex : integer range 0 to NAPBSLV-1 := 0;
paddr : integer range 0 to 16#FFF# := 0;
pmask : integer range 0 to 16#FFF# := 16#FFF#;
pirq : integer range 0 to NAHBIRQ-1 := 0;
sysfreq : integer := 10000;
usegen : integer range 0 to 1 := 1;
nsync : integer range 1 to 2 := 1;
rmap : integer range 0 to 2 := 0;
rmapcrc : integer range 0 to 1 := 0;
fifosize1 : integer range 4 to 32 := 32;
fifosize2 : integer range 16 to 64 := 64;
rxclkbuftype : integer range 0 to 2 := 0;
rxunaligned : integer range 0 to 1 := 0;
rmapbufs : integer range 2 to 8 := 4;
ft : integer range 0 to 2 := 0;
scantest : integer range 0 to 1 := 0;
techfifo : integer range 0 to 1 := 1;
netlist : integer range 0 to 1 := 0;
ports : integer range 1 to 2 := 1;
memtech : integer range 0 to NTECH := DEFMEMTECH;
nodeaddr : integer range 0 to 255 := 254;
destkey : integer range 0 to 255 := 0
);
port(
rst : in std_ulogic;
clk : in std_ulogic;
txclk : in std_ulogic;
ahbmi : in ahb_mst_in_type;
ahbmo : out ahb_mst_out_type;
apbi : in apb_slv_in_type;
apbo : out apb_slv_out_type;
swni : in grspw_in_type;
swno : out grspw_out_type);
end component;
type grspw_in_type_vector is array (natural range <>) of grspw_in_type;
type grspw_out_type_vector is array (natural range <>) of grspw_out_type;
component grspwm is
generic(
tech : integer range 0 to NTECH := DEFFABTECH;
hindex : integer range 0 to NAHBMST-1 := 0;
pindex : integer range 0 to NAPBSLV-1 := 0;
paddr : integer range 0 to 16#FFF# := 0;
pmask : integer range 0 to 16#FFF# := 16#FFF#;
pirq : integer range 0 to NAHBIRQ-1 := 0;
sysfreq : integer := 10000;
usegen : integer range 0 to 1 := 1;
nsync : integer range 1 to 2 := 1;
rmap : integer range 0 to 2 := 0;
rmapcrc : integer range 0 to 1 := 0;
fifosize1 : integer range 4 to 32 := 32;
fifosize2 : integer range 16 to 64 := 64;
rxclkbuftype : integer range 0 to 2 := 0;
rxunaligned : integer range 0 to 1 := 0;
rmapbufs : integer range 2 to 8 := 4;
ft : integer range 0 to 2 := 0;
scantest : integer range 0 to 1 := 0;
techfifo : integer range 0 to 1 := 1;
netlist : integer range 0 to 1 := 0;
ports : integer range 1 to 2 := 1;
dmachan : integer range 1 to 4 := 1;
memtech : integer range 0 to NTECH := DEFMEMTECH;
spwcore : integer range 1 to 2 := 2;
input_type : integer range 0 to 3 := 0;
output_type : integer range 0 to 2 := 0;
rxtx_sameclk : integer range 0 to 1 := 0
);
port(
rst : in std_ulogic;
clk : in std_ulogic;
rxclk0 : in std_ulogic;
rxclk1 : in std_ulogic;
txclk : in std_ulogic;
txclkn : in std_ulogic;
ahbmi : in ahb_mst_in_type;
ahbmo : out ahb_mst_out_type;
apbi : in apb_slv_in_type;
apbo : out apb_slv_out_type;
swni : in grspw_in_type;
swno : out grspw_out_type
);
end component;
component grspw_codec is
generic(
ports : integer range 1 to 2 := 1;
input_type : integer range 0 to 3 := 0;
output_type : integer range 0 to 2 := 0;
rxtx_sameclk : integer range 0 to 1 := 0;
fifosize : integer range 16 to 2048 := 64;
tech : integer;
scantest : integer range 0 to 1 := 0;
techfifo : integer range 0 to 1 := 0;
ft : integer range 0 to 2 := 0
);
port(
rst : in std_ulogic;
clk : in std_ulogic;
rxclk0 : in std_ulogic;
rxclk1 : in std_ulogic;
txclk : in std_ulogic;
txclkn : in std_ulogic;
testen : in std_ulogic;
testrst : in std_ulogic;
lii : in grspw_codec_in_type;
lio : out grspw_codec_out_type
);
end component;
component grspwrouter is
generic(
input_type : integer range 0 to 3 := 0;
output_type : integer range 0 to 2 := 0;
rxtx_sameclk : integer range 0 to 1 := 0;
fifosize : integer range 16 to 2048 := 64;
tech : integer;
scantest : integer range 0 to 1 := 0;
techfifo : integer range 0 to 1 := 0;
ft : integer range 0 to 2 := 0;
spwen : integer range 0 to 1 := 1;
ambaen : integer range 0 to 1 := 0;
fifoen : integer range 0 to 1 := 0;
spwports : integer range 0 to 31 := 2;
ambaports : integer range 0 to 16 := 0;
fifoports : integer range 0 to 31 := 0;
arbitration : integer range 0 to 1 := 0; --0=rrobin, 1=priority
rmap : integer range 0 to 16#FFFF# := 0;
rmapcrc : integer range 0 to 16#FFFF# := 0;
fifosize2 : integer range 4 to 32 := 32;
almostsize : integer range 1 to 32 := 8;
rxunaligned : integer range 0 to 16#FFFF# := 0;
rmapbufs : integer range 2 to 8 := 4;
dmachan : integer range 1 to 4 := 1;
hindex : integer range 0 to NAHBMST-1 := 0;
pindex : integer range 0 to NAPBSLV-1 := 0;
paddr : integer range 0 to 16#FFF# := 0;
pmask : integer range 0 to 16#FFF# := 16#FFF#;
pirq : integer range 0 to NAHBIRQ-1 := 0;
cfghindex : integer range 0 to NAHBSLV-1 := 0;
cfghaddr : integer range 0 to 16#FFF# := 0;
cfghmask : integer range 0 to 16#FFF# := 16#FF0#;
ahbslven : integer range 0 to 1 := 0;
timerbits : integer range 0 to 31 := 0;
pnp : integer range 0 to 1 := 0;
autoscrub : integer range 0 to 1 := 0;
sim : integer range 0 to 1 := 0;
dualport : integer range 0 to 1 := 0;
charcntbits : integer range 0 to 32 := 0;
pktcntbits : integer range 0 to 32 := 0;
prescalermin : integer := 250
);
port(
rst : in std_ulogic;
clk : in std_ulogic;
rxclk : in std_logic_vector(spwports*(1+dualport)-spwen downto 0);
txclk : in std_ulogic;
txclkn : in std_ulogic;
testen : in std_ulogic;
testrst : in std_ulogic;
testin : in std_ulogic;
di : in std_logic_vector(spwports*(2+2*dualport)-spwen downto 0);
dvi : in std_logic_vector(spwports*(2+2*dualport)-spwen downto 0);
dconnect : in std_logic_vector(spwports*(2+2*dualport)-spwen downto 0);
do : out std_logic_vector(spwports*(2+2*dualport)-spwen downto 0);
so : out std_logic_vector(spwports*(2+2*dualport)-spwen downto 0);
ahbmi : in ahb_mst_in_type;
ahbmo : out spw_ahb_mst_out_vector(0 to ambaports*ambaen-ambaen);
apbi : in apb_slv_in_type;
apbo : out spw_apb_slv_out_vector(0 to ambaports*ambaen-ambaen);
ahbsi : in ahb_slv_in_type;
ahbso : out ahb_slv_out_type;
ri : in grspw_router_in_type;
ro : out grspw_router_out_type
);
end component grspwrouter;
component grspw2_dma is
generic(
hindex : integer range 0 to NAHBMST-1 := 0;
pindex : integer range 0 to NAPBSLV-1:= 0;
pirq : integer range 0 to NAHBIRQ-1 := 0;
paddr : integer range 0 to 16#FFF# := 0;
pmask : integer range 0 to 16#FFF# := 16#FFF#;
rmap : integer range 0 to 1 := 0;
rmapcrc : integer range 0 to 1 := 0;
fifosize1 : integer range 4 to 32 := 32;
fifosize2 : integer range 16 to 2048 := 64;
rxunaligned : integer range 0 to 1 := 0;
rmapbufs : integer range 2 to 8 := 4;
scantest : integer range 0 to 1 := 0;
dmachan : integer range 1 to 4 := 1;
tech : integer range 0 to NTECH := inferred;
techfifo : integer range 0 to 1 := 1;
ft : integer range 0 to 2 := 0
);
port(
rst : in std_ulogic;
clk : in std_ulogic;
--ahb mst
ahbmi : in ahb_mst_in_type;
ahbmo : out ahb_mst_out_type;
--apb
apbi : in apb_slv_in_type;
apbo : out apb_slv_out_type;
--link
lii : in grspw_dma_in_type;
lio : out grspw_dma_out_type;
testrst : in std_ulogic := '0';
testen : in std_ulogic := '0'
);
end component;
component grspw2_fifo is
generic(
fifosize : integer range 16 to 2048 := 64;
almostsize : integer range 1 to 32 := 8;
scantest : integer range 0 to 1 := 0;
tech : integer range 0 to NTECH := inferred;
techfifo : integer range 0 to 1 := 1;
ft : integer range 0 to 2 := 0
);
port(
rst : in std_ulogic;
clk : in std_ulogic;
--link
lii : in grspw_fifo_in_type;
lio : out grspw_fifo_out_type;
testrst : in std_ulogic := '0';
testen : in std_ulogic := '0'
);
end component;
end package;