|
|
------------------------------------------------------------------------------
|
|
|
-- 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
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- Package: misc
|
|
|
-- File: misc.vhd
|
|
|
-- Author: Jiri Gaisler - Gaisler Research
|
|
|
-- Description: Misc models
|
|
|
------------------------------------------------------------------------------
|
|
|
|
|
|
library ieee;
|
|
|
use ieee.std_logic_1164.all;
|
|
|
|
|
|
library grlib;
|
|
|
use grlib.amba.all;
|
|
|
use grlib.devices.all;
|
|
|
use grlib.stdlib.all;
|
|
|
library techmap;
|
|
|
use techmap.gencomp.all;
|
|
|
library gaisler;
|
|
|
|
|
|
package misc is
|
|
|
|
|
|
-- reset generator with filter
|
|
|
|
|
|
component rstgen
|
|
|
generic (acthigh : integer := 0; syncrst : integer := 0;
|
|
|
scanen : integer := 0);
|
|
|
port (
|
|
|
rstin : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
clklock : in std_ulogic;
|
|
|
rstout : out std_ulogic;
|
|
|
rstoutraw : out std_ulogic;
|
|
|
testrst : in std_ulogic := '0';
|
|
|
testen : in std_ulogic := '0');
|
|
|
end component;
|
|
|
|
|
|
type gptimer_in_type is record
|
|
|
dhalt : std_ulogic;
|
|
|
extclk : std_ulogic;
|
|
|
wdogen : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
type gptimer_in_vector is array (natural range <>) of gptimer_in_type;
|
|
|
|
|
|
type gptimer_out_type is record
|
|
|
tick : std_logic_vector(0 to 7);
|
|
|
timer1 : std_logic_vector(31 downto 0);
|
|
|
wdogn : std_ulogic;
|
|
|
wdog : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
type gptimer_out_vector is array (natural range <>) of gptimer_out_type;
|
|
|
|
|
|
constant gptimer_in_none : gptimer_in_type := ('0', '0', '0');
|
|
|
|
|
|
constant gptimer_out_none : gptimer_out_type :=
|
|
|
((others => '0'), (others => '0'), '1', '0');
|
|
|
|
|
|
component gptimer
|
|
|
generic (
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#;
|
|
|
pirq : integer := 0;
|
|
|
sepirq : integer := 0; -- use separate interrupts for each timer
|
|
|
sbits : integer := 16; -- scaler bits
|
|
|
ntimers : integer range 1 to 7 := 1; -- number of timers
|
|
|
nbits : integer := 32; -- timer bits
|
|
|
wdog : integer := 0;
|
|
|
ewdogen : integer := 0
|
|
|
);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
gpti : in gptimer_in_type;
|
|
|
gpto : out gptimer_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
-- 32-bit ram with AHB interface
|
|
|
|
|
|
component ahbram
|
|
|
generic (
|
|
|
hindex : integer := 0;
|
|
|
haddr : integer := 0;
|
|
|
hmask : integer := 16#fff#;
|
|
|
tech : integer := DEFMEMTECH;
|
|
|
kbytes : integer := 1;
|
|
|
pipe : integer := 0;
|
|
|
maccsz : integer := AHBDW);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbsi : in ahb_slv_in_type;
|
|
|
ahbso : out ahb_slv_out_type);
|
|
|
end component;
|
|
|
|
|
|
type ahbram_out_type is record
|
|
|
ce : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
component ftahbram is
|
|
|
generic (
|
|
|
hindex : integer := 0;
|
|
|
haddr : integer := 0;
|
|
|
hmask : integer := 16#fff#;
|
|
|
tech : integer := DEFMEMTECH;
|
|
|
kbytes : integer := 1;
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#;
|
|
|
edacen : integer := 1;
|
|
|
autoscrub : integer := 0;
|
|
|
errcnten : integer := 0;
|
|
|
cntbits : integer range 1 to 8 := 1;
|
|
|
ahbpipe : integer := 0);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbsi : in ahb_slv_in_type;
|
|
|
ahbso : out ahb_slv_out_type;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
aramo : out ahbram_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
component ftahbram2 is
|
|
|
generic (
|
|
|
hindex : integer := 0;
|
|
|
haddr : integer := 0;
|
|
|
hmask : integer := 16#fff#;
|
|
|
tech : integer := DEFMEMTECH;
|
|
|
kbytes : integer := 1;
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#;
|
|
|
testen : integer := 0);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbsi : in ahb_slv_in_type;
|
|
|
ahbso : out ahb_slv_out_type;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
aramo : out ahbram_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
component ahbdpram
|
|
|
generic (
|
|
|
hindex : integer := 0;
|
|
|
haddr : integer := 0;
|
|
|
hmask : integer := 16#fff#;
|
|
|
tech : integer := 2;
|
|
|
abits : integer range 8 to 19 := 8;
|
|
|
bytewrite : integer range 0 to 1 := 0
|
|
|
);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbsi : in ahb_slv_in_type;
|
|
|
ahbso : out ahb_slv_out_type;
|
|
|
clkdp : in std_ulogic;
|
|
|
address : in std_logic_vector((abits -1) downto 0);
|
|
|
datain : in std_logic_vector(31 downto 0);
|
|
|
dataout : out std_logic_vector(31 downto 0);
|
|
|
enable : in std_ulogic; -- active high chip select
|
|
|
write : in std_logic_vector(0 to 3) -- active high byte write enable
|
|
|
); -- big-endian write: bwrite(0) => data(31:24)
|
|
|
end component;
|
|
|
|
|
|
|
|
|
component ahbtrace is
|
|
|
generic (
|
|
|
hindex : integer := 0;
|
|
|
ioaddr : integer := 16#000#;
|
|
|
iomask : integer := 16#E00#;
|
|
|
tech : integer := DEFMEMTECH;
|
|
|
irq : integer := 0;
|
|
|
kbytes : integer := 1;
|
|
|
ahbfilt : integer := 0);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbmi : in ahb_mst_in_type;
|
|
|
ahbsi : in ahb_slv_in_type;
|
|
|
ahbso : out ahb_slv_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
component ahbtrace_mb is
|
|
|
generic (
|
|
|
hindex : integer := 0;
|
|
|
ioaddr : integer := 16#000#;
|
|
|
iomask : integer := 16#E00#;
|
|
|
tech : integer := DEFMEMTECH;
|
|
|
irq : integer := 0;
|
|
|
kbytes : integer := 1;
|
|
|
ahbfilt : integer := 0);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbsi : in ahb_slv_in_type; -- Register interface
|
|
|
ahbso : out ahb_slv_out_type;
|
|
|
tahbmi : in ahb_mst_in_type; -- Trace
|
|
|
tahbsi : in ahb_slv_in_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
component ahbtrace_mmb is
|
|
|
generic (
|
|
|
hindex : integer := 0;
|
|
|
ioaddr : integer := 16#000#;
|
|
|
iomask : integer := 16#E00#;
|
|
|
tech : integer := DEFMEMTECH;
|
|
|
irq : integer := 0;
|
|
|
kbytes : integer := 1;
|
|
|
ahbfilt : integer := 0;
|
|
|
ntrace : integer range 1 to 8 := 1);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbsi : in ahb_slv_in_type; -- Register interface
|
|
|
ahbso : out ahb_slv_out_type;
|
|
|
tahbmiv : in ahb_mst_in_vector_type(0 to ntrace-1); -- Trace
|
|
|
tahbsiv : in ahb_slv_in_vector_type(0 to ntrace-1)
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
|
|
|
type ahb_dma_in_type is record
|
|
|
address : std_logic_vector(31 downto 0);
|
|
|
wdata : std_logic_vector(AHBDW-1 downto 0);
|
|
|
start : std_ulogic;
|
|
|
burst : std_ulogic;
|
|
|
write : std_ulogic;
|
|
|
busy : std_ulogic;
|
|
|
irq : std_ulogic;
|
|
|
size : std_logic_vector(2 downto 0);
|
|
|
end record;
|
|
|
|
|
|
type ahb_dma_out_type is record
|
|
|
start : std_ulogic;
|
|
|
active : std_ulogic;
|
|
|
ready : std_ulogic;
|
|
|
retry : std_ulogic;
|
|
|
mexc : std_ulogic;
|
|
|
haddr : std_logic_vector(9 downto 0);
|
|
|
rdata : std_logic_vector(AHBDW-1 downto 0);
|
|
|
end record;
|
|
|
|
|
|
component ahbmst
|
|
|
generic (
|
|
|
hindex : integer := 0;
|
|
|
hirq : integer := 0;
|
|
|
venid : integer := VENDOR_GAISLER;
|
|
|
devid : integer := 0;
|
|
|
version : integer := 0;
|
|
|
chprot : integer := 3;
|
|
|
incaddr : integer := 0);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
dmai : in ahb_dma_in_type;
|
|
|
dmao : out ahb_dma_out_type;
|
|
|
ahbi : in ahb_mst_in_type;
|
|
|
ahbo : out ahb_mst_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
type ahbmst2_request is record
|
|
|
req: std_logic; -- Request enable bit
|
|
|
wr: std_logic;
|
|
|
hsize: std_logic_vector(2 downto 0);
|
|
|
hburst: std_logic_vector(2 downto 0);
|
|
|
hprot: std_logic_vector(3 downto 0);
|
|
|
addr: std_logic_vector(32-1 downto 0);
|
|
|
burst_cont: std_logic; -- Set for all except the first request in a burst
|
|
|
burst_wrap: std_logic; -- High for the request where wrap occurs
|
|
|
end record;
|
|
|
|
|
|
constant ahbmst2_request_none: ahbmst2_request := (
|
|
|
req => '0', wr => '0', hsize => "010", hburst => "000", burst_cont => '0',
|
|
|
burst_wrap => '0', addr => (others => '0'), hprot => "0011");
|
|
|
|
|
|
type ahbmst2_in_type is record
|
|
|
request: ahbmst2_request;
|
|
|
wrdata: std_logic_vector(AHBDW-1 downto 0);
|
|
|
-- For back-to-back transfers or bursts, this must be set when done is high
|
|
|
-- and then copied over to request after the rising edge of clk.
|
|
|
next_request: ahbmst2_request;
|
|
|
-- Insert busy cycle, must only be asserted when request and next_request
|
|
|
-- are both part of the same burst.
|
|
|
busy: std_logic;
|
|
|
hlock: std_logic; -- Lock signal, passed through directly to AMBA.
|
|
|
keepreq: std_logic; -- Keep bus request high even when no request needs it.
|
|
|
end record;
|
|
|
|
|
|
type ahbmst2_out_type is record
|
|
|
done: std_logic;
|
|
|
flip: std_logic;
|
|
|
fail: std_logic;
|
|
|
rddata: std_logic_vector(AHBDW-1 downto 0);
|
|
|
end record;
|
|
|
|
|
|
component ahbmst2 is
|
|
|
generic (
|
|
|
hindex: integer := 0;
|
|
|
venid: integer;
|
|
|
devid: integer;
|
|
|
version: integer;
|
|
|
dmastyle: integer range 1 to 3 := 3;
|
|
|
syncrst: integer range 0 to 1 := 1
|
|
|
);
|
|
|
port (
|
|
|
clk: in std_logic;
|
|
|
rst: in std_logic;
|
|
|
ahbi: in ahb_mst_in_type;
|
|
|
ahbo: out ahb_mst_out_type;
|
|
|
m2i: in ahbmst2_in_type;
|
|
|
m2o: out ahbmst2_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
type gpio_in_type is record
|
|
|
din : std_logic_vector(31 downto 0);
|
|
|
sig_in : std_logic_vector(31 downto 0);
|
|
|
sig_en : std_logic_vector(31 downto 0);
|
|
|
end record;
|
|
|
|
|
|
type gpio_out_type is record
|
|
|
dout : std_logic_vector(31 downto 0);
|
|
|
oen : std_logic_vector(31 downto 0);
|
|
|
val : std_logic_vector(31 downto 0);
|
|
|
sig_out : std_logic_vector(31 downto 0);
|
|
|
end record;
|
|
|
|
|
|
component grgpio
|
|
|
generic (
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#;
|
|
|
imask : integer := 16#0000#;
|
|
|
nbits : integer := 16; -- GPIO bits
|
|
|
oepol : integer := 0; -- Output enable polarity
|
|
|
syncrst : integer := 0;
|
|
|
bypass : integer := 16#0000#;
|
|
|
scantest : integer := 0;
|
|
|
bpdir : integer := 16#0000#;
|
|
|
pirq : integer := 0;
|
|
|
irqgen : integer := 0
|
|
|
);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
gpioi : in gpio_in_type;
|
|
|
gpioo : out gpio_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
type ahb2ahb_ctrl_type is record
|
|
|
slck : std_ulogic;
|
|
|
blck : std_ulogic;
|
|
|
mlck : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
constant ahb2ahb_ctrl_none : ahb2ahb_ctrl_type := ('0', '0', '0');
|
|
|
|
|
|
type ahb2ahb_ifctrl_type is record
|
|
|
mstifen : std_ulogic;
|
|
|
slvifen : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
constant ahb2ahb_ifctrl_none : ahb2ahb_ifctrl_type := ('1', '1');
|
|
|
|
|
|
component ahb2ahb
|
|
|
generic(
|
|
|
memtech : integer := 0;
|
|
|
hsindex : integer := 0;
|
|
|
hmindex : integer := 0;
|
|
|
slv : integer range 0 to 1 := 0;
|
|
|
dir : integer range 0 to 1 := 0; -- 0 - down, 1 - up
|
|
|
ffact : integer range 0 to 15:= 2;
|
|
|
pfen : integer range 0 to 1 := 0;
|
|
|
wburst : integer range 2 to 32 := 8;
|
|
|
iburst : integer range 4 to 8 := 8;
|
|
|
rburst : integer range 2 to 32 := 8;
|
|
|
irqsync : integer range 0 to 2 := 0;
|
|
|
bar0 : integer range 0 to 1073741823 := 0;
|
|
|
bar1 : integer range 0 to 1073741823 := 0;
|
|
|
bar2 : integer range 0 to 1073741823 := 0;
|
|
|
bar3 : integer range 0 to 1073741823 := 0;
|
|
|
sbus : integer := 0;
|
|
|
mbus : integer := 0;
|
|
|
ioarea : integer := 0;
|
|
|
ibrsten : integer := 0;
|
|
|
lckdac : integer range 0 to 2 := 0;
|
|
|
slvmaccsz : integer range 32 to 256 := 32;
|
|
|
mstmaccsz : integer range 32 to 256 := 32;
|
|
|
rdcomb : integer range 0 to 2 := 0;
|
|
|
wrcomb : integer range 0 to 2 := 0;
|
|
|
combmask : integer := 16#ffff#;
|
|
|
allbrst : integer range 0 to 1 := 0;
|
|
|
ifctrlen : integer range 0 to 1 := 0;
|
|
|
fcfs : integer range 0 to NAHBMST := 0;
|
|
|
fcfsmtech : integer range 0 to NTECH := inferred;
|
|
|
scantest : integer range 0 to 1 := 0;
|
|
|
split : integer range 0 to 1 := 1);
|
|
|
port (
|
|
|
rstn : in std_ulogic;
|
|
|
hclkm : in std_ulogic;
|
|
|
hclks : in std_ulogic;
|
|
|
ahbsi : in ahb_slv_in_type;
|
|
|
ahbso : out ahb_slv_out_type;
|
|
|
ahbmi : in ahb_mst_in_type;
|
|
|
ahbmo : out ahb_mst_out_type;
|
|
|
ahbso2 : in ahb_slv_out_vector;
|
|
|
lcki : in ahb2ahb_ctrl_type;
|
|
|
lcko : out ahb2ahb_ctrl_type;
|
|
|
ifctrl : in ahb2ahb_ifctrl_type := ahb2ahb_ifctrl_none
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
component ahbbridge
|
|
|
generic(
|
|
|
memtech : integer := 0;
|
|
|
ffact : integer range 0 to 15 := 2;
|
|
|
-- high-speed bus
|
|
|
hsb_hsindex : integer := 0;
|
|
|
hsb_hmindex : integer := 0;
|
|
|
hsb_iclsize : integer range 4 to 8 := 8;
|
|
|
hsb_bank0 : integer range 0 to 1073741823 := 0;
|
|
|
hsb_bank1 : integer range 0 to 1073741823 := 0;
|
|
|
hsb_bank2 : integer range 0 to 1073741823 := 0;
|
|
|
hsb_bank3 : integer range 0 to 1073741823 := 0;
|
|
|
hsb_ioarea : integer := 0;
|
|
|
-- low-speed bus
|
|
|
lsb_hsindex : integer := 0;
|
|
|
lsb_hmindex : integer := 0;
|
|
|
lsb_rburst : integer range 16 to 32 := 16;
|
|
|
lsb_wburst : integer range 2 to 32 := 8;
|
|
|
lsb_bank0 : integer range 0 to 1073741823 := 0;
|
|
|
lsb_bank1 : integer range 0 to 1073741823 := 0;
|
|
|
lsb_bank2 : integer range 0 to 1073741823 := 0;
|
|
|
lsb_bank3 : integer range 0 to 1073741823 := 0;
|
|
|
lsb_ioarea : integer := 0;
|
|
|
--
|
|
|
lckdac : integer range 0 to 2 := 2;
|
|
|
maccsz : integer range 32 to 256 := 32;
|
|
|
rdcomb : integer range 0 to 2 := 0;
|
|
|
wrcomb : integer range 0 to 2 := 0;
|
|
|
combmask : integer := 16#ffff#;
|
|
|
allbrst : integer range 0 to 1 := 0;
|
|
|
fcfs : integer range 0 to NAHBMST := 0;
|
|
|
scantest : integer range 0 to 1 := 0);
|
|
|
port (
|
|
|
rstn : in std_ulogic;
|
|
|
hsb_clk : in std_ulogic;
|
|
|
lsb_clk : in std_ulogic;
|
|
|
hsb_ahbsi : in ahb_slv_in_type;
|
|
|
hsb_ahbso : out ahb_slv_out_type;
|
|
|
hsb_ahbsov : in ahb_slv_out_vector;
|
|
|
hsb_ahbmi : in ahb_mst_in_type;
|
|
|
hsb_ahbmo : out ahb_mst_out_type;
|
|
|
lsb_ahbsi : in ahb_slv_in_type;
|
|
|
lsb_ahbso : out ahb_slv_out_type;
|
|
|
lsb_ahbsov : in ahb_slv_out_vector;
|
|
|
lsb_ahbmi : in ahb_mst_in_type;
|
|
|
lsb_ahbmo : out ahb_mst_out_type);
|
|
|
end component;
|
|
|
|
|
|
function ahb2ahb_membar(memaddr : ahb_addr_type; prefetch, cache : std_ulogic;
|
|
|
addrmask : ahb_addr_type)
|
|
|
return integer;
|
|
|
|
|
|
function ahb2ahb_iobar(memaddr : ahb_addr_type; addrmask : ahb_addr_type)
|
|
|
return integer;
|
|
|
|
|
|
type ahbstat_in_type is record
|
|
|
cerror : std_logic_vector(0 to NAHBSLV-1);
|
|
|
end record;
|
|
|
|
|
|
component ahbstat is
|
|
|
generic(
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#FFF#;
|
|
|
pirq : integer := 0;
|
|
|
nftslv : integer range 1 to NAHBSLV - 1 := 3);
|
|
|
port(
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbmi : in ahb_mst_in_type;
|
|
|
ahbsi : in ahb_slv_in_type;
|
|
|
stati : in ahbstat_in_type;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
type nuhosp3_in_type is record
|
|
|
flash_d : std_logic_vector(15 downto 0);
|
|
|
smsc_data : std_logic_vector(31 downto 0);
|
|
|
smsc_ardy : std_ulogic;
|
|
|
smsc_intr : std_ulogic;
|
|
|
smsc_nldev : std_ulogic;
|
|
|
lcd_data : std_logic_vector(7 downto 0);
|
|
|
end record;
|
|
|
|
|
|
type nuhosp3_out_type is record
|
|
|
flash_a : std_logic_vector(20 downto 0);
|
|
|
flash_d : std_logic_vector(15 downto 0);
|
|
|
flash_oen : std_ulogic;
|
|
|
flash_wen : std_ulogic;
|
|
|
flash_cen : std_ulogic;
|
|
|
smsc_addr : std_logic_vector(14 downto 0);
|
|
|
smsc_data : std_logic_vector(31 downto 0);
|
|
|
smsc_nbe : std_logic_vector(3 downto 0);
|
|
|
smsc_resetn : std_ulogic;
|
|
|
smsc_nrd : std_ulogic;
|
|
|
smsc_nwr : std_ulogic;
|
|
|
smsc_ncs : std_ulogic;
|
|
|
smsc_aen : std_ulogic;
|
|
|
smsc_lclk : std_ulogic;
|
|
|
smsc_wnr : std_ulogic;
|
|
|
smsc_rdyrtn : std_ulogic;
|
|
|
smsc_cycle : std_ulogic;
|
|
|
smsc_nads : std_ulogic;
|
|
|
smsc_ben : std_ulogic;
|
|
|
lcd_data : std_logic_vector(7 downto 0);
|
|
|
lcd_rs : std_ulogic;
|
|
|
lcd_rw : std_ulogic;
|
|
|
lcd_en : std_ulogic;
|
|
|
lcd_backl : std_ulogic;
|
|
|
lcd_ben : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
component nuhosp3
|
|
|
generic (
|
|
|
hindex : integer := 0;
|
|
|
haddr : integer := 0;
|
|
|
hmask : integer := 16#fff#;
|
|
|
ioaddr : integer := 16#200#;
|
|
|
iomask : integer := 16#fff#);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbsi : in ahb_slv_in_type;
|
|
|
ahbso : out ahb_slv_out_type;
|
|
|
nui : in nuhosp3_in_type;
|
|
|
nuo : out nuhosp3_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
-- On-chip Logic Analyzer
|
|
|
|
|
|
component logan is
|
|
|
|
|
|
generic (
|
|
|
dbits : integer range 0 to 256 := 32; -- Number of traced signals
|
|
|
depth : integer range 256 to 16384 := 1024; -- Depth of trace buffer
|
|
|
trigl : integer range 1 to 63 := 1; -- Number of trigger levels
|
|
|
usereg : integer range 0 to 1 := 1; -- Use input register
|
|
|
usequal : integer range 0 to 1 := 0;
|
|
|
usediv : integer range 0 to 1 := 1;
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#F00#;
|
|
|
memtech : integer := DEFMEMTECH);
|
|
|
port (
|
|
|
rstn : in std_logic;
|
|
|
clk : in std_logic;
|
|
|
tclk : in std_logic;
|
|
|
apbi : in apb_slv_in_type; -- APB in record
|
|
|
apbo : out apb_slv_out_type; -- APB out record
|
|
|
signals : in std_logic_vector(dbits - 1 downto 0)); -- Traced signals
|
|
|
|
|
|
end component;
|
|
|
|
|
|
type ps2_in_type is record
|
|
|
ps2_clk_i : std_ulogic;
|
|
|
ps2_data_i : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
type ps2_out_type is record
|
|
|
ps2_clk_o : std_ulogic;
|
|
|
ps2_clk_oe : std_ulogic;
|
|
|
ps2_data_o : std_ulogic;
|
|
|
ps2_data_oe : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
component apbps2
|
|
|
generic(
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#;
|
|
|
pirq : integer := 0;
|
|
|
fKHz : integer := 50000;
|
|
|
fixed : integer := 0;
|
|
|
oepol : integer range 0 to 1 := 0);
|
|
|
port(
|
|
|
rst : in std_ulogic; -- Global asynchronous reset
|
|
|
clk : in std_ulogic; -- Global clock
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
ps2i : in ps2_in_type;
|
|
|
ps2o : out ps2_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
type apbvga_out_type is record
|
|
|
hsync : std_ulogic; -- horizontal sync
|
|
|
vsync : std_ulogic; -- vertical sync
|
|
|
comp_sync : std_ulogic; -- composite sync
|
|
|
blank : std_ulogic; -- blank signal
|
|
|
video_out_r : std_logic_vector(7 downto 0); -- red channel
|
|
|
video_out_g : std_logic_vector(7 downto 0); -- green channel
|
|
|
video_out_b : std_logic_vector(7 downto 0); -- blue channel
|
|
|
bitdepth : std_logic_vector(1 downto 0); -- Bith depth
|
|
|
end record;
|
|
|
|
|
|
component apbvga
|
|
|
generic(
|
|
|
memtech : integer := DEFMEMTECH;
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#);
|
|
|
port(
|
|
|
rst : in std_ulogic; -- Global asynchronous reset
|
|
|
clk : in std_ulogic; -- Global clock
|
|
|
vgaclk : in std_ulogic; -- VGA clock
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
vgao : out apbvga_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
component svgactrl
|
|
|
generic(
|
|
|
length : integer := 384; -- Fifo-length
|
|
|
part : integer := 128; -- Fifo-part lenght
|
|
|
memtech : integer := DEFMEMTECH;
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#;
|
|
|
hindex : integer := 0;
|
|
|
hirq : integer := 0;
|
|
|
clk0 : integer := 40000;
|
|
|
clk1 : integer := 20000;
|
|
|
clk2 : integer := 15385;
|
|
|
clk3 : integer := 0;
|
|
|
burstlen : integer range 2 to 8 := 8;
|
|
|
ahbaccsz : integer := 32;
|
|
|
asyncrst : integer range 0 to 1 := 0
|
|
|
);
|
|
|
port (
|
|
|
rst : in std_logic;
|
|
|
clk : in std_logic;
|
|
|
vgaclk : in std_logic;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
vgao : out apbvga_out_type;
|
|
|
ahbi : in ahb_mst_in_type;
|
|
|
ahbo : out ahb_mst_out_type;
|
|
|
clk_sel : out std_logic_vector(1 downto 0);
|
|
|
arst : in std_ulogic := '1'
|
|
|
);
|
|
|
|
|
|
end component;
|
|
|
|
|
|
constant vgao_none : apbvga_out_type :=
|
|
|
('0', '0', '0', '0', "00000000", "00000000", "00000000", "00");
|
|
|
constant ps2o_none : ps2_out_type := ('1', '1', '1', '1');
|
|
|
|
|
|
-- component ahbrom
|
|
|
-- generic (
|
|
|
-- hindex : integer := 0;
|
|
|
-- haddr : integer := 0;
|
|
|
-- hmask : integer := 16#fff#;
|
|
|
-- pipe : integer := 0;
|
|
|
-- tech : integer := 0;
|
|
|
-- kbytes : integer := 1);
|
|
|
-- port (
|
|
|
-- rst : in std_ulogic;
|
|
|
-- clk : in std_ulogic;
|
|
|
-- ahbsi : in ahb_slv_in_type;
|
|
|
-- ahbso : out ahb_slv_out_type
|
|
|
-- );
|
|
|
-- end component;
|
|
|
|
|
|
component ahbdma
|
|
|
generic (
|
|
|
hindex : integer := 0;
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#;
|
|
|
pirq : integer := 0;
|
|
|
dbuf : integer := 0);
|
|
|
port (
|
|
|
rst : in std_logic;
|
|
|
clk : in std_ulogic;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
ahbi : in ahb_mst_in_type;
|
|
|
ahbo : out ahb_mst_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- Interface type declarations for FIFO controller
|
|
|
-----------------------------------------------------------------------------
|
|
|
type FIFO_In_Type is record
|
|
|
Din: Std_Logic_Vector(31 downto 0); -- data input
|
|
|
Pin: Std_Logic_Vector( 3 downto 0); -- parity input
|
|
|
EFn: Std_ULogic; -- empty flag
|
|
|
FFn: Std_ULogic; -- full flag
|
|
|
HFn: Std_ULogic; -- half flag
|
|
|
end record;
|
|
|
|
|
|
type FIFO_Out_Type is record
|
|
|
Dout: Std_Logic_Vector(31 downto 0); -- data output
|
|
|
Den: Std_Logic_Vector(31 downto 0); -- data enable
|
|
|
Pout: Std_Logic_Vector( 3 downto 0); -- parity output
|
|
|
Pen: Std_Logic_Vector( 3 downto 0); -- parity enable
|
|
|
WEn: Std_ULogic; -- write enable
|
|
|
REn: Std_ULogic; -- read enable
|
|
|
end record;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- Component declaration for GR FIFO Interface
|
|
|
-----------------------------------------------------------------------------
|
|
|
component grfifo is
|
|
|
generic (
|
|
|
hindex: Integer := 0;
|
|
|
pindex: Integer := 0;
|
|
|
paddr: Integer := 0;
|
|
|
pmask: Integer := 16#FFF#;
|
|
|
pirq: Integer := 1; -- index of first irq
|
|
|
dwidth: Integer := 16; -- data width
|
|
|
ptrwidth: Integer range 16 to 16 := 16; -- 16 to 64k bytes
|
|
|
-- 128 to 512k bits
|
|
|
singleirq: Integer range 0 to 1 := 0; -- single irq output
|
|
|
oepol: Integer := 1); -- output enable polarity
|
|
|
port (
|
|
|
rstn: in Std_ULogic;
|
|
|
clk: in Std_ULogic;
|
|
|
apbi: in APB_Slv_In_Type;
|
|
|
apbo: out APB_Slv_Out_Type;
|
|
|
ahbi: in AHB_Mst_In_Type;
|
|
|
ahbo: out AHB_Mst_Out_Type;
|
|
|
fifoi: in FIFO_In_Type;
|
|
|
fifoo: out FIFO_Out_Type);
|
|
|
end component;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- Interface type declarations for CAN controllers
|
|
|
-----------------------------------------------------------------------------
|
|
|
type Analog_In_Type is record
|
|
|
Ain: Std_Logic_Vector(31 downto 0); -- address input
|
|
|
Din: Std_Logic_Vector(31 downto 0); -- data input
|
|
|
Rdy: Std_ULogic; -- adc ready input
|
|
|
Trig: Std_Logic_Vector( 2 downto 0); -- adc trigger inputs
|
|
|
end record;
|
|
|
|
|
|
type Analog_Out_Type is record
|
|
|
Aout: Std_Logic_Vector(31 downto 0); -- address output
|
|
|
Aen: Std_Logic_Vector(31 downto 0); -- address enable
|
|
|
Dout: Std_Logic_Vector(31 downto 0); -- dac data output
|
|
|
Den: Std_Logic_Vector(31 downto 0); -- dac data enable
|
|
|
Wr: Std_ULogic; -- dac write strobe
|
|
|
CS: Std_ULogic; -- adc chip select
|
|
|
RC: Std_ULogic; -- adc read/convert
|
|
|
end record;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- Component declaration for GR ADC/DAC Interface
|
|
|
-----------------------------------------------------------------------------
|
|
|
component gradcdac is
|
|
|
generic (
|
|
|
pindex: Integer := 0;
|
|
|
paddr: Integer := 0;
|
|
|
pmask: Integer := 16#FFF#;
|
|
|
pirq: Integer := 1; -- index of first irq
|
|
|
awidth: Integer := 8; -- address width
|
|
|
dwidth: Integer := 16; -- data width
|
|
|
oepol: Integer := 1); -- output enable polarity
|
|
|
port (
|
|
|
rstn: in Std_ULogic;
|
|
|
clk: in Std_ULogic;
|
|
|
apbi: in APB_Slv_In_Type;
|
|
|
apbo: out APB_Slv_Out_Type;
|
|
|
adi: in Analog_In_Type;
|
|
|
ado: out Analog_Out_Type);
|
|
|
end component;
|
|
|
|
|
|
component grclkgate
|
|
|
generic (
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#;
|
|
|
nbits : integer := 16
|
|
|
);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
clockdis : out std_logic_vector(nbits-1 downto 0);
|
|
|
reset : out std_logic_vector(nbits-1 downto 0)
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- I2C types and components
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
|
type i2c_in_type is record
|
|
|
scl : std_ulogic;
|
|
|
sda : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
type i2c_out_type is record
|
|
|
scl : std_ulogic;
|
|
|
scloen : std_ulogic;
|
|
|
sda : std_ulogic;
|
|
|
sdaoen : std_ulogic;
|
|
|
enable : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
-- AMBA wrapper for OC I2C-master
|
|
|
component i2cmst
|
|
|
generic (
|
|
|
pindex : integer;
|
|
|
paddr : integer;
|
|
|
pmask : integer;
|
|
|
pirq : integer;
|
|
|
oepol : integer range 0 to 1 := 0;
|
|
|
filter : integer range 2 to 512 := 2
|
|
|
);
|
|
|
port (
|
|
|
rstn : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
i2ci : in i2c_in_type;
|
|
|
i2co : out i2c_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
component i2cmst_gen
|
|
|
generic (
|
|
|
oepol : integer range 0 to 1 := 0;
|
|
|
filter : integer range 2 to 512 := 2);
|
|
|
port (
|
|
|
rstn : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
psel : in std_ulogic;
|
|
|
penable : in std_ulogic;
|
|
|
paddr : in std_logic_vector(31 downto 0);
|
|
|
pwrite : in std_ulogic;
|
|
|
pwdata : in std_logic_vector(31 downto 0);
|
|
|
prdata : out std_logic_vector(31 downto 0);
|
|
|
irq : out std_logic;
|
|
|
i2ci_scl : in std_ulogic;
|
|
|
i2ci_sda : in std_ulogic;
|
|
|
i2co_scl : out std_ulogic;
|
|
|
i2co_scloen : out std_ulogic;
|
|
|
i2co_sda : out std_ulogic;
|
|
|
i2co_sdaoen : out std_ulogic;
|
|
|
i2co_enable : out std_ulogic
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
component i2cslv
|
|
|
generic (
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#;
|
|
|
pirq : integer := 0;
|
|
|
hardaddr : integer range 0 to 1 := 0;
|
|
|
tenbit : integer range 0 to 1 := 0;
|
|
|
i2caddr : integer range 0 to 1023 := 0;
|
|
|
oepol : integer range 0 to 1 := 0;
|
|
|
filter : integer range 2 to 512 := 2
|
|
|
);
|
|
|
port (
|
|
|
rstn : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
i2ci : in i2c_in_type;
|
|
|
i2co : out i2c_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- SPI controller
|
|
|
-----------------------------------------------------------------------------
|
|
|
type spi_in_type is record
|
|
|
miso : std_ulogic;
|
|
|
mosi : std_ulogic;
|
|
|
sck : std_ulogic;
|
|
|
spisel : std_ulogic;
|
|
|
astart : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
type spi_out_type is record
|
|
|
miso : std_ulogic;
|
|
|
misooen : std_ulogic;
|
|
|
mosi : std_ulogic;
|
|
|
mosioen : std_ulogic;
|
|
|
sck : std_ulogic;
|
|
|
sckoen : std_ulogic;
|
|
|
ssn : std_logic_vector(7 downto 0); -- used by GE/OC SPI core
|
|
|
enable : std_ulogic;
|
|
|
astart : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
component spictrl
|
|
|
generic (
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#;
|
|
|
pirq : integer := 0;
|
|
|
fdepth : integer range 1 to 7 := 1;
|
|
|
slvselen : integer range 0 to 1 := 0;
|
|
|
slvselsz : integer range 1 to 32 := 1;
|
|
|
oepol : integer range 0 to 1 := 0;
|
|
|
odmode : integer range 0 to 1 := 0;
|
|
|
automode : integer range 0 to 1 := 0;
|
|
|
acntbits : integer range 1 to 32 := 32;
|
|
|
aslvsel : integer range 0 to 1 := 0;
|
|
|
twen : integer range 0 to 1 := 1;
|
|
|
maxwlen : integer range 0 to 15 := 0;
|
|
|
netlist : integer range 0 to NTECH := 0;
|
|
|
syncram : integer range 0 to 1 := 1;
|
|
|
memtech : integer range 0 to NTECH := 0;
|
|
|
ft : integer range 0 to 2 := 0;
|
|
|
scantest : integer range 0 to 1 := 0
|
|
|
);
|
|
|
port (
|
|
|
rstn : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
spii : in spi_in_type;
|
|
|
spio : out spi_out_type;
|
|
|
slvsel : out std_logic_vector((slvselsz-1) downto 0)
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- AMBA wrapper for System Monitor
|
|
|
-----------------------------------------------------------------------------
|
|
|
type grsysmon_in_type is record
|
|
|
convst : std_ulogic;
|
|
|
convstclk : std_ulogic;
|
|
|
vauxn : std_logic_vector(15 downto 0);
|
|
|
vauxp : std_logic_vector(15 downto 0);
|
|
|
vn : std_ulogic;
|
|
|
vp : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
type grsysmon_out_type is record
|
|
|
alm : std_logic_vector(2 downto 0);
|
|
|
ot : std_ulogic;
|
|
|
eoc : std_ulogic;
|
|
|
eos : std_ulogic;
|
|
|
channel : std_logic_vector(4 downto 0);
|
|
|
end record;
|
|
|
|
|
|
constant grsysmon_in_gnd : grsysmon_in_type :=
|
|
|
('0', '0', (others => '0'), (others => '0'), '0', '0');
|
|
|
|
|
|
component grsysmon
|
|
|
generic (
|
|
|
-- GRLIB generics
|
|
|
tech : integer := DEFFABTECH;
|
|
|
hindex : integer := 0; -- AHB slave index
|
|
|
hirq : integer := 0; -- Interrupt line
|
|
|
caddr : integer := 16#000#; -- Base address for configuration area
|
|
|
cmask : integer := 16#fff#; -- Area mask
|
|
|
saddr : integer := 16#001#; -- Base address for sysmon register area
|
|
|
smask : integer := 16#fff#; -- Area mask
|
|
|
split : integer := 0; -- Enable AMBA SPLIT support
|
|
|
extconvst : integer := 0; -- Use external CONVST signal
|
|
|
wrdalign : integer := 0; -- Word align System Monitor registers
|
|
|
-- Virtex 5 SYSMON generics
|
|
|
INIT_40 : bit_vector := X"0000";
|
|
|
INIT_41 : bit_vector := X"0000";
|
|
|
INIT_42 : bit_vector := X"0800";
|
|
|
INIT_43 : bit_vector := X"0000";
|
|
|
INIT_44 : bit_vector := X"0000";
|
|
|
INIT_45 : bit_vector := X"0000";
|
|
|
INIT_46 : bit_vector := X"0000";
|
|
|
INIT_47 : bit_vector := X"0000";
|
|
|
INIT_48 : bit_vector := X"0000";
|
|
|
INIT_49 : bit_vector := X"0000";
|
|
|
INIT_4A : bit_vector := X"0000";
|
|
|
INIT_4B : bit_vector := X"0000";
|
|
|
INIT_4C : bit_vector := X"0000";
|
|
|
INIT_4D : bit_vector := X"0000";
|
|
|
INIT_4E : bit_vector := X"0000";
|
|
|
INIT_4F : bit_vector := X"0000";
|
|
|
INIT_50 : bit_vector := X"0000";
|
|
|
INIT_51 : bit_vector := X"0000";
|
|
|
INIT_52 : bit_vector := X"0000";
|
|
|
INIT_53 : bit_vector := X"0000";
|
|
|
INIT_54 : bit_vector := X"0000";
|
|
|
INIT_55 : bit_vector := X"0000";
|
|
|
INIT_56 : bit_vector := X"0000";
|
|
|
INIT_57 : bit_vector := X"0000";
|
|
|
SIM_MONITOR_FILE : string := "sysmon.txt");
|
|
|
port (
|
|
|
rstn : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbsi : in ahb_slv_in_type;
|
|
|
ahbso : out ahb_slv_out_type;
|
|
|
sysmoni : in grsysmon_in_type;
|
|
|
sysmono : out grsysmon_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- AMBA System ACE Interface Controller
|
|
|
-----------------------------------------------------------------------------
|
|
|
type gracectrl_in_type is record
|
|
|
di : std_logic_vector(15 downto 0);
|
|
|
-- brdy : std_ulogic;
|
|
|
irq : std_ulogic;
|
|
|
end record;
|
|
|
|
|
|
type gracectrl_out_type is record
|
|
|
addr : std_logic_vector(6 downto 0);
|
|
|
do : std_logic_vector(15 downto 0);
|
|
|
cen : std_ulogic;
|
|
|
wen : std_ulogic;
|
|
|
oen : std_ulogic;
|
|
|
doen : std_ulogic; -- Data output enable to pad
|
|
|
end record;
|
|
|
|
|
|
constant gracectrl_none : gracectrl_out_type :=
|
|
|
((others => '1'), (others => '1'), '1', '1', '1', '1');
|
|
|
|
|
|
component gracectrl
|
|
|
generic (
|
|
|
hindex : integer := 0; -- AHB slave index
|
|
|
hirq : integer := 0; -- Interrupt line
|
|
|
haddr : integer := 16#000#; -- Base address
|
|
|
hmask : integer := 16#fff#; -- Area mask
|
|
|
split : integer range 0 to 1 := 0; -- Enable AMBA SPLIT support
|
|
|
swap : integer range 0 to 1 := 0;
|
|
|
oepol : integer range 0 to 1 := 0 -- Output enable polarity
|
|
|
);
|
|
|
port (
|
|
|
rstn : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
clkace : in std_ulogic;
|
|
|
ahbsi : in ahb_slv_in_type;
|
|
|
ahbso : out ahb_slv_out_type;
|
|
|
acei : in gracectrl_in_type;
|
|
|
aceo : out gracectrl_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- General purpose register
|
|
|
-----------------------------------------------------------------------------
|
|
|
component grgpreg is
|
|
|
generic (
|
|
|
pindex : integer := 0;
|
|
|
paddr : integer := 0;
|
|
|
pmask : integer := 16#fff#;
|
|
|
nbits : integer range 1 to 64 := 16;
|
|
|
rstval : integer := 0;
|
|
|
rstval2 : integer := 0;
|
|
|
extrst : integer := 0
|
|
|
);
|
|
|
port (
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
apbi : in apb_slv_in_type;
|
|
|
apbo : out apb_slv_out_type;
|
|
|
gprego : out std_logic_vector(nbits-1 downto 0);
|
|
|
resval : in std_logic_vector(nbits-1 downto 0) := (others => '0')
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- EDAC Memory scrubber
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
|
type memscrub_in_type is record
|
|
|
cerror : std_logic_vector(0 to NAHBSLV-1);
|
|
|
clrcount: std_logic;
|
|
|
start : std_logic;
|
|
|
end record;
|
|
|
|
|
|
component memscrub is
|
|
|
generic(
|
|
|
hmindex : integer := 0;
|
|
|
hsindex : integer := 0;
|
|
|
ioaddr : integer := 0;
|
|
|
iomask : integer := 16#FFF#;
|
|
|
hirq : integer := 0;
|
|
|
nftslv : integer range 1 to NAHBSLV - 1 := 3;
|
|
|
memwidth: integer := AHBDW;
|
|
|
-- Read block (cache line) burst size, must be even mult of 2
|
|
|
burstlen: integer := 2;
|
|
|
countlen: integer := 8
|
|
|
);
|
|
|
port(
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbmi : in ahb_mst_in_type;
|
|
|
ahbmo : out ahb_mst_out_type;
|
|
|
ahbsi : in ahb_slv_in_type;
|
|
|
ahbso : out ahb_slv_out_type;
|
|
|
scrubi: in memscrub_in_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
type ahb_mst_iface_in_type is record
|
|
|
req : std_ulogic;
|
|
|
write : std_ulogic;
|
|
|
addr : std_logic_vector(31 downto 0);
|
|
|
data : std_logic_vector(31 downto 0);
|
|
|
size : std_logic_vector(1 downto 0);
|
|
|
end record;
|
|
|
|
|
|
type ahb_mst_iface_out_type is record
|
|
|
grant : std_ulogic;
|
|
|
ready : std_ulogic;
|
|
|
error : std_ulogic;
|
|
|
retry : std_ulogic;
|
|
|
data : std_logic_vector(31 downto 0);
|
|
|
end record;
|
|
|
|
|
|
component ahb_mst_iface is
|
|
|
generic(
|
|
|
hindex : integer;
|
|
|
vendor : integer;
|
|
|
device : integer;
|
|
|
revision : integer);
|
|
|
port(
|
|
|
rst : in std_ulogic;
|
|
|
clk : in std_ulogic;
|
|
|
ahbmi : in ahb_mst_in_type;
|
|
|
ahbmo : out ahb_mst_out_type;
|
|
|
msti : in ahb_mst_iface_in_type;
|
|
|
msto : out ahb_mst_iface_out_type
|
|
|
);
|
|
|
end component;
|
|
|
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- Function declarations
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
|
-- function nandtree(v : std_logic_vector) return std_ulogic;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
package body misc is
|
|
|
|
|
|
function ahb2ahb_membar(memaddr : ahb_addr_type; prefetch, cache : std_ulogic;
|
|
|
addrmask : ahb_addr_type)
|
|
|
return integer is
|
|
|
variable tmp : std_logic_vector(29 downto 0);
|
|
|
variable bar : std_logic_vector(31 downto 0);
|
|
|
variable res : integer range 0 to 1073741823;
|
|
|
begin
|
|
|
bar := ahb_membar(memaddr, prefetch, cache, addrmask);
|
|
|
tmp := (others => '0');
|
|
|
tmp(29 downto 18) := bar(31 downto 20);
|
|
|
tmp(17 downto 0) := bar(17 downto 0);
|
|
|
res := conv_integer(tmp);
|
|
|
return(res);
|
|
|
end;
|
|
|
|
|
|
function ahb2ahb_iobar(memaddr : ahb_addr_type; addrmask : ahb_addr_type)
|
|
|
return integer is
|
|
|
variable tmp : std_logic_vector(29 downto 0);
|
|
|
variable bar : std_logic_vector(31 downto 0);
|
|
|
variable res : integer range 0 to 1073741823;
|
|
|
begin
|
|
|
bar := ahb_iobar(memaddr, addrmask);
|
|
|
tmp := (others => '0');
|
|
|
tmp(29 downto 18) := bar(31 downto 20);
|
|
|
tmp(17 downto 0) := bar(17 downto 0);
|
|
|
res := conv_integer(tmp);
|
|
|
return(res);
|
|
|
end;
|
|
|
|
|
|
-- function nandtree(v : std_logic_vector) return std_ulogic is
|
|
|
-- variable a : std_logic_vector(v'length-1 downto 0);
|
|
|
-- variable b : std_logic_vector(v'length downto 0);
|
|
|
-- begin
|
|
|
--
|
|
|
-- a := v; b(0) := '1';
|
|
|
--
|
|
|
-- for i in 0 to v'length-1 loop
|
|
|
-- b(i+1) := a(i) nand b(i);
|
|
|
-- end loop;
|
|
|
--
|
|
|
-- return b(v'length);
|
|
|
--
|
|
|
-- end;
|
|
|
|
|
|
|
|
|
end;
|
|
|
|