--
-- Common Interface Components
--
-- (C) 2006 Alpha Data
--
-- Entities for Common Interface components
--
-- control_register
-- status_register
-- interrupt_register
-- internal_memory
-- external_memory
-- locallink
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
library work;
use work.common_interface.all;
entity control_register is
generic (
width : integer := 32;
addr : integer := 0;
sys_width : integer := system_width);
port (
clk : in std_logic;
rst : in std_logic;
system_in : in std_logic_vector(sys_width-1 downto 0);
system_out : out std_logic_vector(sys_width-1 downto 0);
control_data : out std_logic_vector(width-1 downto 0);
control_wstb : out std_logic);
end control_register;
architecture rtl of control_register is
signal lclk : std_logic;
signal ctrl_bus : std_logic_vector(ctrl_bus_width-1 downto 0);
signal status_bus : std_logic_vector(status_bus_width-1 downto 0);
signal irq_bus : std_logic_vector(interrupt_bus_width-1 downto 0);
signal bram_bus : std_logic_vector(bram_bus_width-1 downto 0);
signal locallinks : std_logic_vector(4*locallink_type_width-1 downto 0);
signal extrams : std_logic_vector(6*extmem_type_width-1 downto 0);
signal ctrl_bus_sig : ctrl_bus_type;
signal wstb_reg,wstb_reg1,wstb_reg2 : std_logic;
signal control_reg : std_logic_vector(width-1 downto 0);
begin -- rtl
split0 : split_system_signal(
system => system_in,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus,
irq_bus => irq_bus,
bram_bus => bram_bus,
locallinks => locallinks,
extrams => extrams);
merge0 : build_system_signal (
system => system_out,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus,
irq_bus => irq_bus,
bram_bus => bram_bus,
locallinks => locallinks,
extrams => extrams);
ctrl_bus_sig <= slv_to_ctrl_bus (ctrl_bus);
ctrl_reg : process (clk, rst)
begin -- process ctrl_reg
if rst = '1' then -- asynchronous reset (active low)
control_data <= (others => '0');
control_wstb <= '0';
wstb_reg2 <= '0';
wstb_reg1 <= '0';
elsif clk'event and clk = '1' then -- rising clock edge
control_data <= control_reg;
wstb_reg1 <= wstb_reg;
wstb_reg2 <= wstb_reg1;
control_wstb <= wstb_reg1 and not wstb_reg2;
end if;
end process ctrl_reg;
decode_addr: process (lclk)
begin -- process decode_addr
if lclk'event and lclk = '1' then -- rising clock edge
if ctrl_bus_sig.addr = CONV_STD_LOGIC_VECTOR(addr, reg_addr_width) and ctrl_bus_sig.wstb = '1' then
wstb_reg <= '1';
control_reg <= ctrl_bus_sig.data(width-1 downto 0);
else
wstb_reg <= '0';
end if;
end if;
end process decode_addr;
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
library work;
use work.common_interface.all;
entity status_register is
generic (
width : integer := 32;
addr : integer := 0;
sys_width : integer := system_width);
port (
clk : in std_logic;
rst : in std_logic;
system_in : in std_logic_vector(sys_width-1 downto 0);
system_out : out std_logic_vector(sys_width-1 downto 0);
status_data : in std_logic_vector(width-1 downto 0));
end status_register;
architecture rtl of status_register is
signal lclk : std_logic;
signal ctrl_bus : std_logic_vector(ctrl_bus_width-1 downto 0);
signal status_bus : std_logic_vector(status_bus_width-1 downto 0);
signal irq_bus : std_logic_vector(interrupt_bus_width-1 downto 0);
signal bram_bus : std_logic_vector(bram_bus_width-1 downto 0);
signal locallinks : std_logic_vector(4*locallink_type_width-1 downto 0);
signal extrams : std_logic_vector(6*extmem_type_width-1 downto 0);
signal status_bus_in : std_logic_vector(status_bus_width-1 downto 0);
signal status_bus_sig_in, status_bus_sig_out : status_bus_type;
signal status_signal : std_logic_vector(width-1 downto 0);
begin -- rtl
split0 : split_system_signal(
system => system_in,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus_in,
irq_bus => irq_bus,
bram_bus => bram_bus,
locallinks => locallinks,
extrams => extrams);
merge0 : build_system_signal (
system => system_out,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus,
irq_bus => irq_bus,
bram_bus => bram_bus,
locallinks => locallinks,
extrams => extrams);
status_bus_sig_in <= slv_to_status_bus (status_bus_in);
status_bus <= status_bus_to_slv(status_bus_sig_out);
status_bus_sig_out.addr <= status_bus_sig_in.addr;
status_bus_sig_out.data <= EXT(status_signal, reg_width) when status_bus_sig_in.addr = CONV_STD_LOGIC_VECTOR(addr,reg_addr_width) else status_bus_sig_in.data;
status_reg : process (lclk, rst)
begin -- process ctrl_reg
if rst = '1' then -- asynchronous reset (active low)
status_signal <= (others => '0');
elsif lclk'event and lclk = '1' then -- rising clock edge
status_signal <= status_data;
end if;
end process status_reg;
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
library work;
use work.common_interface.all;
entity readable_control_register is
generic (
width : integer := 32;
addr : integer := 0;
sys_width : integer := system_width);
port (
clk : in std_logic;
rst : in std_logic;
system_in : in std_logic_vector(sys_width-1 downto 0);
system_out : out std_logic_vector(sys_width-1 downto 0);
control_data : out std_logic_vector(width-1 downto 0);
control_wstb : out std_logic);
end readable_control_register;
architecture rtl of readable_control_register is
signal system_int : std_logic_vector(sys_width-1 downto 0);
signal data : std_logic_vector(width-1 downto 0);
signal status_data : std_logic_vector(width-1 downto 0);
begin -- rtl
creg0 : control_register
generic map (
width => width, addr => addr)
port map (
clk => clk, rst => rst, system_in => system_in, system_out => system_int,
control_data => data, control_wstb => control_wstb);
sreg0 : status_register
generic map (
width => width, addr => addr)
port map (
clk => clk, rst => rst, system_in => system_int, system_out => system_out,
status_data => status_data);
process (clk)
begin -- process
if clk'event and clk = '1' then -- rising clock edge
status_data <= data;
end if;
end process;
control_data <= data;
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
library work;
use work.common_interface.all;
entity interrupt_register is
generic (
width : integer := 32;
sys_width : integer := system_width);
port (
clk : in std_logic;
rst : in std_logic;
system_in : in std_logic_vector(sys_width-1 downto 0);
system_out : out std_logic_vector(sys_width-1 downto 0);
interrupt_enable : out std_logic_vector(width-1 downto 0);
interrupt_trigger : in std_logic_vector(width-1 downto 0));
end interrupt_register;
architecture rtl of interrupt_register is
signal lclk : std_logic;
signal ctrl_bus : std_logic_vector(ctrl_bus_width-1 downto 0);
signal status_bus : std_logic_vector(status_bus_width-1 downto 0);
signal irq_bus_in : std_logic_vector(interrupt_bus_width-1 downto 0);
signal bram_bus : std_logic_vector(bram_bus_width-1 downto 0);
signal locallinks : std_logic_vector(4*locallink_type_width-1 downto 0);
signal extrams : std_logic_vector(6*extmem_type_width-1 downto 0);
signal irq_bus_out : std_logic_vector(interrupt_bus_width-1 downto 0);
signal irq_in, irq_out : interrupt_bus_type;
signal interrupt_reg : std_logic_vector(width-1 downto 0);
begin -- rtl
split0 : split_system_signal(
system => system_in,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus,
irq_bus => irq_bus_in,
bram_bus => bram_bus,
locallinks => locallinks,
extrams => extrams);
merge0 : build_system_signal (
system => system_out,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus,
irq_bus => irq_bus_out,
bram_bus => bram_bus,
locallinks => locallinks,
extrams => extrams);
irq_in <= slv_to_irq_bus (irq_bus_in);
irq_bus_out <= irq_bus_to_slv(irq_out);
irq_out.ier <= (others => '0');
status_reg : process (lclk, rst)
begin -- process ctrl_reg
if rst = '1' then -- asynchronous reset (active low)
interrupt_reg <= (others => '0');
interrupt_enable <= (others => '0');
irq_out.isr <= (others => '0');
elsif lclk'event and lclk = '1' then -- rising clock edge
for i in 0 to width-1 loop
if irq_in.ier(i) = '1' then
if irq_in.isr(i) = '1' then -- write '1' to clear interrupt
irq_out.isr(i) <= '0';
else
if interrupt_reg(i) = '1' then
irq_out.isr(i) <= '1';
end if;
end if;
end if;
end loop; -- i
interrupt_reg <= interrupt_trigger;
interrupt_enable <= irq_in.ier(width-1 downto 0);
end if;
end process status_reg;
end rtl;
--
-- 64 bit wide block RAM, selectable depth
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
-- synthesis translate_off
library UNISIM;
use UNISIM.all;
-- synthesis translate_on
entity ramb16_64_64 is
generic (
depth : natural := 14);
port (
wea : in std_logic_vector(7 downto 0);
ena : in std_logic;
ssra : in std_logic;
clka : in std_logic;
addra : in std_logic_vector(depth-1 downto 0);
dia : in std_logic_vector(63 downto 0);
doa : out std_logic_vector(63 downto 0);
web : in std_logic_vector(7 downto 0);
enb : in std_logic;
ssrb : in std_logic;
clkb : in std_logic;
addrb : in std_logic_vector(depth-1 downto 0);
dib : in std_logic_vector(63 downto 0);
dob : out std_logic_vector(63 downto 0));
end ramb16_64_64;
architecture rtl of ramb16_64_64 is
component RAMB16_S9_S9
generic (
WRITE_MODE_A : string;
WRITE_MODE_B : string);
port (
wea : in std_logic;
ena : in std_logic;
ssra : in std_logic;
clka : in std_logic;
addra : in std_logic_vector(10 downto 0);
dia : in std_logic_vector(7 downto 0);
doa : out std_logic_vector(7 downto 0);
dipa : in std_logic_vector(0 downto 0);
dopa : out std_logic_vector(0 downto 0);
web : in std_logic;
enb : in std_logic;
ssrb : in std_logic;
clkb : in std_logic;
addrb : in std_logic_vector(10 downto 0);
dib : in std_logic_vector(7 downto 0);
dob : out std_logic_vector(7 downto 0);
dipb : in std_logic_vector(0 downto 0);
dopb : out std_logic_vector(0 downto 0)
);
end component;
component RAMB16_S4_S4
generic (
WRITE_MODE_A : string;
WRITE_MODE_B : string);
port (
wea : in std_logic;
ena : in std_logic;
ssra : in std_logic;
clka : in std_logic;
addra : in std_logic_vector(11 downto 0);
dia : in std_logic_vector(3 downto 0);
doa : out std_logic_vector(3 downto 0);
web : in std_logic;
enb : in std_logic;
ssrb : in std_logic;
clkb : in std_logic;
addrb : in std_logic_vector(11 downto 0);
dib : in std_logic_vector(3 downto 0);
dob : out std_logic_vector(3 downto 0));
end component;
component RAMB16_S2_S2
generic (
WRITE_MODE_A : string;
WRITE_MODE_B : string);
port (
wea : in std_logic;
ena : in std_logic;
ssra : in std_logic;
clka : in std_logic;
addra : in std_logic_vector(12 downto 0);
dia : in std_logic_vector(1 downto 0);
doa : out std_logic_vector(1 downto 0);
web : in std_logic;
enb : in std_logic;
ssrb : in std_logic;
clkb : in std_logic;
addrb : in std_logic_vector(12 downto 0);
dib : in std_logic_vector(1 downto 0);
dob : out std_logic_vector(1 downto 0));
end component;
component RAMB16_S1_S1
generic (
WRITE_MODE_A : string;
WRITE_MODE_B : string);
port (
wea : in std_logic;
ena : in std_logic;
ssra : in std_logic;
clka : in std_logic;
addra : in std_logic_vector(13 downto 0);
dia : in std_logic_vector(0 downto 0);
doa : out std_logic_vector(0 downto 0);
web : in std_logic;
enb : in std_logic;
ssrb : in std_logic;
clkb : in std_logic;
addrb : in std_logic_vector(13 downto 0);
dib : in std_logic_vector(0 downto 0);
dob : out std_logic_vector(0 downto 0));
end component;
signal addra_int : std_logic_vector(19 downto 0);
signal addrb_int : std_logic_vector(19 downto 0);
begin -- rtl
addra_int <= EXT(addra, 20);
addrb_int <= EXT(addrb, 20);
gen_depth_lt_12 : if depth < 12 generate
gen_ramb99 : for i in 0 to 7 generate
bram_i : RAMB16_S9_S9
generic map (
WRITE_MODE_A => "READ_FIRST",
WRITE_MODE_B => "READ_FIRST")
port map (
wea => wea(i),
ena => ena,
ssra => ssra,
clka => clka,
addra => addra_int(10 downto 0),
dia => dia(8*i+7 downto 8*i),
dipa => "0",
doa => doa(8*i+7 downto 8*i),
web => web(i),
enb => enb,
ssrb => ssrb,
clkb => clkb,
addrb => addrb_int(10 downto 0),
dib => dib(8*i+7 downto 8*i),
dipb => "0",
dob => dob(8*i+7 downto 8*i));
end generate gen_ramb99;
end generate gen_depth_lt_12;
gen_depth_eq_12 : if depth = 12 generate
gen_ramb44x2 : for i in 0 to 7 generate
gen_ramb44 : for j in 0 to 1 generate
bram_i : RAMB16_S4_S4
generic map (
WRITE_MODE_A => "READ_FIRST",
WRITE_MODE_B => "READ_FIRST")
port map (
wea => wea(i),
ena => ena,
ssra => ssra,
clka => clka,
addra => addra_int(11 downto 0),
dia => dia(8*i+4*j+3 downto 8*i+4*j),
doa => doa(8*i+4*j+3 downto 8*i+4*j),
web => web(i),
enb => enb,
ssrb => ssrb,
clkb => clkb,
addrb => addrb_int(11 downto 0),
dib => dib(8*i+4*j+3 downto 8*i+4*j),
dob => dob(8*i+4*j+3 downto 8*i+4*j));
end generate gen_ramb44;
end generate gen_ramb44x2;
end generate gen_depth_eq_12;
gen_depth_eq_13 : if depth = 13 generate
gen_ramb22x4 : for i in 0 to 7 generate
gen_ramb22 : for j in 0 to 3 generate
bram_i : RAMB16_S2_S2
generic map (
WRITE_MODE_A => "READ_FIRST",
WRITE_MODE_B => "READ_FIRST")
port map (
wea => wea(i),
ena => ena,
ssra => ssra,
clka => clka,
addra => addra_int(12 downto 0),
dia => dia(8*i+2*j+1 downto 8*i+2*j),
doa => doa(8*i+2*j+1 downto 8*i+2*j),
web => web(i),
enb => enb,
ssrb => ssrb,
clkb => clkb,
addrb => addrb_int(12 downto 0),
dib => dib(8*i+2*j+1 downto 8*i+2*j),
dob => dob(8*i+2*j+1 downto 8*i+2*j));
end generate gen_ramb22;
end generate gen_ramb22x4;
end generate gen_depth_eq_13;
gen_depth_eq_14 : if depth = 14 generate
gen_ramb11x8 : for i in 0 to 7 generate
gen_ramb11 : for j in 0 to 7 generate
bram_i : RAMB16_S1_S1
generic map (
WRITE_MODE_A => "READ_FIRST",
WRITE_MODE_B => "READ_FIRST")
port map (
wea => wea(i),
ena => ena,
ssra => ssra,
clka => clka,
addra => addra_int(13 downto 0),
dia => dia(8*i+j downto 8*i+j),
doa => doa(8*i+j downto 8*i+j),
web => web(i),
enb => enb,
ssrb => ssrb,
clkb => clkb,
addrb => addrb_int(13 downto 0),
dib => dib(8*i+j downto 8*i+j),
dob => dob(8*i+j downto 8*i+j));
end generate gen_ramb11;
end generate gen_ramb11x8;
end generate gen_depth_eq_14;
end rtl;
--
-- Dual Port Block RAM Interface
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
library work;
use work.common_interface.all;
entity internal_memory is
generic (
width : integer := 8;
depth : integer := 14;
bank_id : integer := 0;
sys_width : integer := system_width);
port (
clk : in std_logic;
rst : in std_logic;
system_in : in std_logic_vector(sys_width-1 downto 0);
system_out : out std_logic_vector(sys_width-1 downto 0);
w : in std_logic;
a : in std_logic_vector(depth-1 downto 0);
d : in std_logic_vector(width-1 downto 0);
q : out std_logic_vector(width-1 downto 0));
end internal_memory;
architecture rtl of internal_memory is
constant bram64_depth : natural := depth-6+log2(width);
constant addr_decode_width : natural := 6-log2(width);
component ramb16_64_64
generic (
depth : natural := 14);
port (
wea : in std_logic_vector(7 downto 0);
ena : in std_logic;
ssra : in std_logic;
clka : in std_logic;
addra : in std_logic_vector(depth-1 downto 0);
dia : in std_logic_vector(63 downto 0);
doa : out std_logic_vector(63 downto 0);
web : in std_logic_vector(7 downto 0);
enb : in std_logic;
ssrb : in std_logic;
clkb : in std_logic;
addrb : in std_logic_vector(depth-1 downto 0);
dib : in std_logic_vector(63 downto 0);
dob : out std_logic_vector(63 downto 0));
end component;
signal addra_int : std_logic_vector(bram64_depth-1 downto 0);
signal d_int, q_int : std_logic_vector(63 downto 0);
signal addra_decode : std_logic_vector(addr_decode_width downto 0);
signal wea : std_logic_vector(7 downto 0);
signal lclk : std_logic;
signal ctrl_bus : std_logic_vector(ctrl_bus_width-1 downto 0);
signal status_bus : std_logic_vector(status_bus_width-1 downto 0);
signal irq_bus : std_logic_vector(interrupt_bus_width-1 downto 0);
signal bram_bus_in : std_logic_vector(bram_bus_width-1 downto 0);
signal bram_bus_out : std_logic_vector(bram_bus_width-1 downto 0);
signal locallinks : std_logic_vector(4*locallink_type_width-1 downto 0);
signal extrams : std_logic_vector(6*extmem_type_width-1 downto 0);
signal bbus_in, bbus_out : bram_bus_type;
signal bwe : std_logic_vector(7 downto 0);
signal bq, q_reg : std_logic_vector(bram_width-1 downto 0);
begin -- rtl
assert width = 8 or width = 16 or width = 32 or width = 64 report "Illegal Memory Width (must be 8,16,32 or 64)" severity warning;
split0 : split_system_signal(
system => system_in,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus,
irq_bus => irq_bus,
bram_bus => bram_bus_in,
locallinks => locallinks,
extrams => extrams);
merge0 : build_system_signal (
system => system_out,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus,
irq_bus => irq_bus,
bram_bus => bram_bus_out,
locallinks => locallinks,
extrams => extrams);
bbus_in <= slv_to_bram_bus (bram_bus_in);
bram_bus_out <= bram_bus_to_slv(bbus_out);
gen_d_int : for i in 0 to 64/width-1 generate
d_int((i+1)*width-1 downto i*width) <= d;
end generate gen_d_int;
gen_dout_width64 : if width = 64 generate
q <= q_int;
wea <= (others => w);
end generate gen_dout_width64;
addra_int <= a(bram64_depth-1+addr_decode_width downto addr_decode_width);
gen_dout_widthn64 : if width /= 64 generate
process (clk)
begin -- process
if clk'event and clk = '1' then -- rising clock edge
addra_decode(addr_decode_width-1 downto 0) <= a(addr_decode_width-1 downto 0);
end if;
end process;
gen_wea : for i in 0 to width/8-1 generate
gen_wea1 : for j in 0 to 64/width-1 generate
wea(j*width/8+i) <= w when CONV_INTEGER(a(addr_decode_width-1 downto 0)) = j else '0';
end generate gen_wea1;
end generate gen_wea;
end generate gen_dout_widthn64;
gen_width_eq_32 : if width = 32 generate
q <= q_int(31 downto 0) when addra_decode(0) = '0' else q_int(63 downto 32);
end generate gen_width_eq_32;
gen_width_eq_16 : if width = 16 generate
mux_q : process (q_int, addra_decode)
begin -- process mux_q
case addra_decode(1 downto 0) is
when "00" => q <= q_int(15 downto 0);
when "01" => q <= q_int(31 downto 16);
when "10" => q <= q_int(47 downto 32);
when "11" => q <= q_int(63 downto 48);
when others => q <= (others => '0');
end case;
end process mux_q;
end generate gen_width_eq_16;
gen_width_eq_8 : if width = 8 generate
mux_q : process (q_int, addra_decode)
begin -- process mux_q
case addra_decode(2 downto 0) is
when "000" => q <= q_int(7 downto 0);
when "001" => q <= q_int(15 downto 8);
when "010" => q <= q_int(23 downto 16);
when "011" => q <= q_int(31 downto 24);
when "100" => q <= q_int(39 downto 32);
when "101" => q <= q_int(47 downto 40);
when "110" => q <= q_int(55 downto 48);
when "111" => q <= q_int(63 downto 56);
when others => q <= (others => '0');
end case;
end process mux_q;
end generate gen_width_eq_8;
bram_i : ramb16_64_64
generic map (
depth => bram64_depth)
port map (
wea => wea,
ena => '1',
ssra => rst,
clka => clk,
addra => addra_int,
dia => d_int,
doa => q_int,
web => bwe,
enb => '1',
ssrb => rst,
clkb => lclk,
addrb => bbus_in.addr(bram64_depth-1 downto 0),
dib => bbus_in.data,
dob => bq);
bwe <= "11111111" when CONV_STD_LOGIC_VECTOR(bank_id, bram_id_width) = bbus_in.id and bbus_in.wstb = '1' else (others => '0');
bbus_out.q <= bq when CONV_STD_LOGIC_VECTOR(bank_id, bram_id_width) = bbus_in.id else q_reg;
reg_bram_bus0 : process (lclk, rst)
begin -- process reg_bram_bus0
if rst = '1' then -- asynchronous reset (active low)
bbus_out.data <= (others => '0');
bbus_out.addr <= (others => '0');
bbus_out.id <= (others => '0');
bbus_out.wstb <= '0';
bbus_out.rstb <= '0';
bbus_out.qv <= '0';
q_reg <= (others => '0');
elsif lclk'event and lclk = '1' then -- rising clock edge
bbus_out.data <= bbus_in.data;
bbus_out.addr <= bbus_in.addr;
bbus_out.id <= bbus_in.id;
bbus_out.wstb <= bbus_in.wstb;
bbus_out.rstb <= bbus_in.rstb;
q_reg <= bbus_in.q;
if CONV_STD_LOGIC_VECTOR(bank_id, bram_id_width) = bbus_in.id then
bbus_out.qv <= bbus_in.rstb;
else
bbus_out.qv <= bbus_in.qv;
end if;
end if;
end process reg_bram_bus0;
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
library work;
use work.common_interface.all;
entity external_memory is
generic (
width : integer := 64;
depth : integer := 26;
bank_id : integer := 0;
sys_width : integer := system_width);
port (
clk : in std_logic;
rst : in std_logic;
system_in : in std_logic_vector(sys_width-1 downto 0);
system_out : out std_logic_vector(sys_width-1 downto 0);
w : in std_logic;
r : in std_logic;
a : in std_logic_vector(depth-1 downto 0);
d : in std_logic_vector(width-1 downto 0);
q : out std_logic_vector(width-1 downto 0);
qv : out std_logic;
full : out std_logic;
req : in std_logic;
gnt : out std_logic);
end external_memory;
architecture rtl of external_memory is
signal lclk : std_logic;
signal ctrl_bus : std_logic_vector(ctrl_bus_width-1 downto 0);
signal status_bus : std_logic_vector(status_bus_width-1 downto 0);
signal irq_bus : std_logic_vector(interrupt_bus_width-1 downto 0);
signal bram_bus : std_logic_vector(bram_bus_width-1 downto 0);
signal locallinks : std_logic_vector(4*locallink_type_width-1 downto 0);
signal extrams_in : std_logic_vector(6*extmem_type_width-1 downto 0);
signal extrams_out : std_logic_vector(6*extmem_type_width-1 downto 0);
signal extram_in, extram_out : extmem_type;
begin -- rtl
split0 : split_system_signal(
system => system_in,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus,
irq_bus => irq_bus,
bram_bus => bram_bus,
locallinks => locallinks,
extrams => extrams_in);
merge0 : build_system_signal (
system => system_out,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus,
irq_bus => irq_bus,
bram_bus => bram_bus,
locallinks => locallinks,
extrams => extrams_out);
gen_mem_routethrough : for i in 0 to 5 generate
gen_through : if i /= bank_id generate
extrams_out(extmem_type_width*(i+1)-1 downto extmem_type_width*i) <= extrams_in(extmem_type_width*(i+1)-1 downto extmem_type_width*i);
end generate gen_through;
gen_ram_if : if i = bank_id generate
extram_in <= slv_to_extmem_type(extrams_in(extmem_type_width*(i+1)-1 downto extmem_type_width*i));
extrams_out(extmem_type_width*(i+1)-1 downto extmem_type_width*i) <= extmem_type_to_slv(extram_out);
end generate gen_ram_if;
end generate gen_mem_routethrough;
q <= extram_in.q(width-1 downto 0);
qv <= extram_in.qv;
full <= extram_in.full;
gnt <= extram_in.gnt;
extram_out.w <= w;
extram_out.r <= r;
extram_out.a <= EXT(a, extmem_addr_width);
extram_out.d <= EXT(d, extmem_width);
extram_out.req <= req;
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
library work;
use work.common_interface.all;
entity locallink is
generic (
link_id : integer := 0;
sys_width : integer := system_width);
port (
clk : in std_logic;
rst : in std_logic;
system_in : in std_logic_vector(sys_width-1 downto 0);
system_out : out std_logic_vector(sys_width-1 downto 0);
tx_src_rdy : in std_logic;
tx_dst_rdy : out std_logic;
tx_data : in std_logic_vector(link_width-1 downto 0);
tx_sof : in std_logic;
tx_eof : in std_logic;
rx_data : out std_logic_vector(link_width-1 downto 0);
rx_src_rdy : out std_logic;
rx_sof : out std_logic;
rx_eof : out std_logic);
end locallink;
architecture rtl of locallink is
signal lclk : std_logic;
signal ctrl_bus : std_logic_vector(ctrl_bus_width-1 downto 0);
signal status_bus : std_logic_vector(status_bus_width-1 downto 0);
signal irq_bus : std_logic_vector(interrupt_bus_width-1 downto 0);
signal bram_bus : std_logic_vector(bram_bus_width-1 downto 0);
signal locallinks_in : std_logic_vector(4*locallink_type_width-1 downto 0);
signal locallinks_out : std_logic_vector(4*locallink_type_width-1 downto 0);
signal extrams : std_logic_vector(6*extmem_type_width-1 downto 0);
signal link_in, link_out : locallink_type;
begin -- rtl
split0 : split_system_signal(
system => system_in,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus,
irq_bus => irq_bus,
bram_bus => bram_bus,
locallinks => locallinks_in,
extrams => extrams);
merge0 : build_system_signal (
system => system_out,
lclk => lclk,
ctrl_bus => ctrl_bus,
status_bus => status_bus,
irq_bus => irq_bus,
bram_bus => bram_bus,
locallinks => locallinks_out,
extrams => extrams);
gen_routethrough : for i in 0 to 3 generate
gen_through : if i /= link_id generate
locallinks_out(locallink_type_width*(i+1)-1 downto locallink_type_width*i) <= locallinks_in(locallink_type_width*(i+1)-1 downto locallink_type_width*i);
end generate gen_through;
gen_ram_if : if i = link_id generate
link_in <= slv_to_locallink_type(locallinks_in(locallink_type_width*(i+1)-1 downto locallink_type_width*i));
locallinks_out(locallink_type_width*(i+1)-1 downto locallink_type_width*i) <= locallink_type_to_slv(link_out);
end generate gen_ram_if;
end generate gen_routethrough;
tx_dst_rdy <= link_in.tx_dst_rdy;
rx_data <= link_in.rx_data;
rx_src_rdy <= link_in.rx_src_rdy;
rx_sof <= link_in.rx_sof;
rx_eof <= link_in.rx_eof;
link_out.tx_src_rdy <= tx_src_rdy;
link_out.tx_data <= tx_data;
link_out.tx_sof <= tx_sof;
link_out.tx_eof <= tx_eof;
end rtl;