--
-- tms_top.vhd
--
-- Top Level User Application for TMS PUPE System
--
--
-- Version 1.0 30/1/06 A.McCormick (Alpha Data)
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;
use work.version.all;
library unisim;
use unisim.vcomponents.all;
entity user_top_level is
port (
-- Host Abstract Interface Connection
clk : in std_logic;
rst : in std_logic;
system_in : in std_logic_vector(system_width-1 downto 0);
system_out : out std_logic_vector(system_width-1 downto 0);
-- Timing Inputs
tbus_bplane :inout std_logic_vector(10 downto 1);
tbus_header :inout std_logic_vector(10 downto 1);
tbus_master :in std_logic_vector(10 downto 1);
ten_mhz_clk : in std_logic;
-- IO Output
phase_table_msb_out : out std_logic_vector(2 downto 0);
-- ADC Inputs
adc_in_0_0 : in std_logic_vector(13 downto 0);
adc_in_0_1 : in std_logic_vector(13 downto 0);
adc_in_0_2 : in std_logic_vector(13 downto 0);
adc_in_1_0 : in std_logic_vector(13 downto 0);
adc_in_1_1 : in std_logic_vector(13 downto 0);
adc_in_1_2 : in std_logic_vector(13 downto 0);
adc_in_2_0 : in std_logic_vector(13 downto 0);
adc_in_2_1 : in std_logic_vector(13 downto 0);
adc_in_2_2 : in std_logic_vector(13 downto 0);
adc_enb : out std_logic_vector(2 downto 0);
syn_rst : out std_logic;
user_leds : out std_logic_vector(1 downto 0);
debug : in std_Logic_vector(63 downto 0));
end user_top_level;
architecture rtl of user_top_level is
constant no_of_pupes : integer := 3;
component adc_ctrl
port (
clk : in std_logic;
rst : in std_logic;
system_in : in std_logic_vector(system_width-1 downto 0);
system_out : out std_logic_vector(system_width-1 downto 0);
adc_in_0_0 : in std_logic_vector(13 downto 0);
adc_in_0_1 : in std_logic_vector(13 downto 0);
adc_in_0_2 : in std_logic_vector(13 downto 0);
adc_in_1_0 : in std_logic_vector(13 downto 0);
adc_in_1_1 : in std_logic_vector(13 downto 0);
adc_in_1_2 : in std_logic_vector(13 downto 0);
adc_in_2_0 : in std_logic_vector(13 downto 0);
adc_in_2_1 : in std_logic_vector(13 downto 0);
adc_in_2_2 : in std_logic_vector(13 downto 0);
adc_out_0_0 : out std_logic_vector(13 downto 0);
adc_out_0_1 : out std_logic_vector(13 downto 0);
adc_out_0_2 : out std_logic_vector(13 downto 0);
adc_out_1_0 : out std_logic_vector(13 downto 0);
adc_out_1_1 : out std_logic_vector(13 downto 0);
adc_out_1_2 : out std_logic_vector(13 downto 0);
adc_out_2_0 : out std_logic_vector(13 downto 0);
adc_out_2_1 : out std_logic_vector(13 downto 0);
adc_out_2_2 : out std_logic_vector(13 downto 0);
adc_enb : out std_logic_vector(2 downto 0);
syn_rst : out std_logic;
fref_test : out std_logic;
user_leds : out std_logic_vector(1 downto 0));
end component;
component timing_io
port (
clk : in std_logic;
rst : in std_logic;
system_in : in std_logic_vector(system_width-1 downto 0);
system_out : out std_logic_vector(system_width-1 downto 0);
ten_mhz_clk : in std_logic;
tbus_bplane : inout std_logic_vector(10 downto 1);
tbus_header : inout std_logic_vector(10 downto 1);
tbus_master : in std_logic_vector(10 downto 1);
ten_mhz_clk_out : out std_logic;
cycle_start_out : out std_logic;
cycle_stop_out : out std_logic;
cal_start_out : out std_logic;
cal_stop_out : out std_logic;
injection_out : out std_logic;
hchange_out : out std_logic;
fref_out : out std_logic);
end component;
component pupe
generic (
index : integer := 0);
port (
-- Host Abstract Interface Connection
clk : in std_logic;
rst : in std_logic;
system_in : in std_logic_vector(system_width-1 downto 0);
system_out : out std_logic_vector(system_width-1 downto 0);
debug : in std_Logic_vector(63 downto 0);
-- Interrupts
irq : out std_logic_vector(7 downto 0);
-- IO Output
phase_table_msb_out : out std_logic;
-- Timing Inputs
cycle_start : in std_logic;
cycle_stop : in std_logic;
cal_start : in std_logic;
cal_stop : in std_logic;
injection : in std_logic;
hchange : in std_logic;
fref : in std_logic;
fref_test : in std_logic;
ten_mhz_clk : in std_logic;
-- Cross connections to other pupes plls
pll_mixed_sigma0_out : out std_logic_vector(13 downto 0);
pll_mixed_sigma1_out : out std_logic_vector(13 downto 0);
pll_mixed_sigma0a_in : in std_logic_vector(13 downto 0);
pll_mixed_sigma1a_in : in std_logic_vector(13 downto 0);
pll_mixed_sigma0b_in : in std_logic_vector(13 downto 0);
pll_mixed_sigma1b_in : in std_logic_vector(13 downto 0);
-- ADC Inputs
sigma : in std_logic_vector(13 downto 0);
deltax : in std_logic_vector(13 downto 0);
deltay : in std_logic_vector(13 downto 0));
end component;
-- Real Signals
constant ncomponents : integer := 7;
type sys_bus_type is array (0 to ncomponents) of std_logic_vector(system_width-1 downto 0);
signal s : sys_bus_type;
signal s_tmp : std_logic_vector(system_width-1 downto 0);
signal cycle_start_i : std_logic;
signal cycle_stop_i : std_logic;
signal cal_start_i : std_logic;
signal cal_stop_i : std_logic;
signal injection_i : std_logic;
signal hchange_i : std_logic;
signal fref_i : std_logic;
signal ten_mhz_clk_i : std_logic;
type adc_array is array (0 to 2) of std_logic_vector(13 downto 0);
signal adc_out_0,adc_out_1,adc_out_2 : adc_array;
type irq_array is array (0 to 2) of std_logic_vector(7 downto 0);
signal irqs : irq_array;
signal irq_signals : std_logic_vector(31 downto 0);
signal status : std_logic_vector(31 downto 0);
signal fref_test : std_logic;
signal pll_mixed_sigma0_out, pll_mixed_sigma1_out, pll_mixed_sigma0a_in, pll_mixed_sigma1a_in, pll_mixed_sigma0b_in, pll_mixed_sigma1b_in : adc_array;
begin -- rtl
s(0) <= system_in;
tio0 : timing_io
port map (
clk => clk,
rst => rst,
system_in => s(0),
system_out => s(1),
ten_mhz_clk => ten_mhz_clk,
tbus_bplane => tbus_bplane,
tbus_header => tbus_header,
tbus_master => tbus_master,
ten_mhz_clk_out => ten_mhz_clk_i,
cycle_start_out => cycle_start_i,
cycle_stop_out => cycle_stop_i,
cal_start_out => cal_start_i,
cal_stop_out => cal_stop_i,
injection_out => injection_i,
hchange_out => hchange_i,
fref_out => fref_i);
adc_ctrl0 : adc_ctrl
port map (
clk => clk,
rst => rst,
system_in => s(1),
system_out => s(2),
adc_in_0_0 => adc_in_0_0,
adc_in_0_1 => adc_in_0_1,
adc_in_0_2 => adc_in_0_2,
adc_in_1_0 => adc_in_1_0,
adc_in_1_1 => adc_in_1_1,
adc_in_1_2 => adc_in_1_2,
adc_in_2_0 => adc_in_2_0,
adc_in_2_1 => adc_in_2_1,
adc_in_2_2 => adc_in_2_2,
adc_out_0_0 => adc_out_0(0),
adc_out_0_1 => adc_out_1(0),
adc_out_0_2 => adc_out_2(0),
adc_out_1_0 => adc_out_0(1),
adc_out_1_1 => adc_out_1(1),
adc_out_1_2 => adc_out_2(1),
adc_out_2_0 => adc_out_0(2),
adc_out_2_1 => adc_out_1(2),
adc_out_2_2 => adc_out_2(2),
adc_enb => adc_enb,
syn_rst => syn_rst,
fref_test => fref_test,
user_leds => user_leds);
gen_pupes: for i in 0 to no_of_pupes-1 generate
pupe_i: pupe
generic map (
index => i)
port map (
clk => clk,
rst => rst,
system_in => s(i+2),
system_out => s(i+3),
debug => debug,
irq => irqs(i),
phase_table_msb_out => phase_table_msb_out(i),
cycle_start => cycle_start_i,
cycle_stop => cycle_stop_i,
cal_start => cal_start_i,
cal_stop => cal_stop_i,
hchange => hchange_i,
injection => injection_i,
fref => fref_i,
fref_test => fref_test,
ten_mhz_clk => ten_mhz_clk_i,
pll_mixed_sigma0_out => pll_mixed_sigma0_out(i),
pll_mixed_sigma1_out => pll_mixed_sigma1_out(i),
pll_mixed_sigma0a_in => pll_mixed_sigma0a_in(i),
pll_mixed_sigma1a_in => pll_mixed_sigma1a_in(i),
pll_mixed_sigma0b_in => pll_mixed_sigma0b_in(i),
pll_mixed_sigma1b_in => pll_mixed_sigma1b_in(i),
sigma => adc_out_0(i),
deltax => adc_out_1(i),
deltay => adc_out_2(i));
end generate gen_pupes;
-- Cross-map PLL Mixed Sigmas
pll_mixed_sigma0a_in(0) <= pll_mixed_sigma0_out(1);
pll_mixed_sigma0b_in(0) <= pll_mixed_sigma0_out(2);
pll_mixed_sigma0a_in(1) <= pll_mixed_sigma0_out(0);
pll_mixed_sigma0b_in(1) <= pll_mixed_sigma0_out(2);
pll_mixed_sigma0a_in(2) <= pll_mixed_sigma0_out(0);
pll_mixed_sigma0b_in(2) <= pll_mixed_sigma0_out(1);
pll_mixed_sigma1a_in(0) <= pll_mixed_sigma1_out(1);
pll_mixed_sigma1b_in(0) <= pll_mixed_sigma1_out(2);
pll_mixed_sigma1a_in(1) <= pll_mixed_sigma1_out(0);
pll_mixed_sigma1b_in(1) <= pll_mixed_sigma1_out(2);
pll_mixed_sigma1a_in(2) <= pll_mixed_sigma1_out(0);
pll_mixed_sigma1b_in(2) <= pll_mixed_sigma1_out(1);
s_tmp <= s(no_of_pupes+2);
-- Firmware ID
sreg0 : status_register
generic map (
width => 32, addr => 0)
port map (
clk => clk, rst => rst, system_in => s_tmp, system_out => s(6),
status_data => status);
status <= X"43" & CONV_STD_LOGIC_VECTOR(version_major,8) & CONV_STD_LOGIC_VECTOR(version_minor,8) & CONV_STD_LOGIC_VECTOR(version_sub,8);
-- IRQ Register
ireg0: interrupt_register
generic map (
width => 32)
port map (
clk => clk,
rst => rst,
system_in => s(6),
system_out => s(7),
interrupt_enable => open,
interrupt_trigger => irq_signals );
irq_signals <= EXT( irqs(2) & irqs(1) & irqs(0) , 32);
system_out <= s(7);
end rtl;