--
-- pupe.vhd
--
-- Pick Up Processing Engine
-- Module for single set of 3 channels
-- Connects up the 4 main sub-modules in the system:
-- Timing : Edge detection and test register control of Timing Signals
-- PLL/SPU : Main Phase Lock Loop and Signal Processing
-- Data Logger : Data Capture State Machines
-- Host Interface : Host Accessible Registers and Memories
--
-- Version 1.0 5/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;
entity pupe is
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 pupe;
architecture rtl of pupe is
component timing
port (
clk : in std_logic;
rst : in std_logic;
cycle_start_in : in std_logic;
cycle_stop_in : in std_logic;
cal_start_in : in std_logic;
cal_stop_in : in std_logic;
injection_in : in std_logic;
hchange_in : in std_logic;
fref_in : in std_logic;
fref_test : in std_logic;
ten_mhz_clk : in std_logic;
test_timing_in : in std_logic_vector(31 downto 0);
test_timing_wstb : in std_logic;
cycle_start_out : out std_logic;
cycle_start_out_ten_mhz : 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 pllspu
port (
clk : in std_logic;
rst : in std_logic;
ten_mhz_clk : in std_logic;
-- Timing Inputs (already edge detected)
cycle_start : in std_logic;
cycle_start_ten_mhz : 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;
frev_in : in std_logic;
-- PLL Registers
init : in std_logic;
loop_ctrl : in std_logic;
dds_freq_limit_en : in std_logic;
blr_disable : in std_Logic;
pll_frequency : in std_logic_vector(31 downto 0);
pll_freqdelay : in std_logic_vector(31 downto 0);
pll_phasedelay : in std_logic_vector(31 downto 0);
pll_gain : in std_logic_vector(31 downto 0);
dds_freq_min : in std_logic_vector(31 downto 0);
dds_freq_max : in std_logic_vector(31 downto 0);
use_neighbour_pll : in std_logic_vector(3 downto 0);
-- 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);
-- Switch Table Read Only Interface
switch_table_addr : out std_logic_vector(3 downto 0);
switch_table_data : in std_logic_vector(31 downto 0);
-- Phase Table Read Only Interface
phase_table_addr : out std_logic_vector(12 downto 0);
phase_table_data : in std_logic_vector(7 downto 0);
-- Outputs to Data Logging Module
result_valid : out std_logic;
result_0 : out std_logic_vector (23 downto 0);
result_1 : out std_logic_vector (23 downto 0);
result_2 : out std_logic_vector (23 downto 0);
acq : out std_logic;
cycle : out std_logic_vector(31 downto 0);
ctime : out std_logic_vector(31 downto 0);
ms_pulse_out : out std_logic;
phase_table_sync : out std_Logic;
hchange_sync : out std_logic;
injection_sync : out std_logic;
cal_start_sync : out std_logic;
-- IO Output
phase_table_msb_out : out std_logic;
-- State Machine PCI Control
cycle_init_val : in std_logic_vector(31 downto 0);
cycle_val_set : in std_logic;
switch_state_reg : out std_logic_vector(3 downto 0);
-- Diagnostics Output
diagnostics : out std_logic_vector(255 downto 0));
end component;
component data_logger
port (
clk : in std_logic;
rst : in std_logic;
ten_mhz_clk : in std_logic;
-- Inputs from PLL
ms_pulse : in std_logic;
acq : in std_logic;
cycle : in std_logic_vector(31 downto 0);
ctime : in std_logic_vector(31 downto 0);
sigma_avg : in std_logic_vector(15 downto 0);
deltax_avg : in std_logic_vector(15 downto 0);
deltay_avg : in std_logic_vector(15 downto 0);
avg_valid : in std_logic;
init : in std_logic;
bunchmean_acc : in std_logic_vector(1 downto 0);
phase_table_sync : in std_Logic;
hchange_sync : in std_logic;
injection_sync : in std_logic;
cal_start_sync : in std_logic;
-- Timing Inputs (already edge detected)
cycle_start_edge : in std_logic;
cycle_stop_edge : in std_logic;
cal_start_edge : in std_logic;
cal_stop_edge : in std_logic;
injection_edge : in std_logic;
hchange_edge : in std_logic;
-- Timing Inputs
cycle_start : in std_logic;
cycle_start_ten_mhz : 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;
-- Diagnostics from PLL
diagnostics : in std_logic_vector(255 downto 0);
-- Host Control Registers
diag_control : in std_logic_vector(31 downto 0);
diag_control_set : in std_logic;
diag_delay : in std_logic_vector(31 downto 0);
diag_delay_set : in std_logic;
diag_trigger : in std_logic_vector(31 downto 0);
diag_status : out std_logic_vector(31 downto 0);
diag_irq : out std_Logic;
-- Write Signals to Memory
sdram_addr : out std_logic_vector(24 downto 0);
sdram_data : out std_logic_vector(63 downto 0);
sdram_write : out std_logic;
timing_addr : out std_logic_vector(11 downto 0);
timing_data : out std_logic_vector(63 downto 0);
timing_write : out std_logic;
info_addr : out std_logic_vector(5 downto 0);
info_data : out std_logic_vector(63 downto 0);
info_write : out std_logic;
diagnostics_data : out std_logic_vector(63 downto 0);
diagnostics_addr : out std_logic_vector(11 downto 0);
diagnostics_write : out std_logic;
bunchmean0_data : out std_logic_vector(63 downto 0);
bunchmean0_addr : out std_logic_vector(11 downto 0);
bunchmean0_write : out std_logic;
bunchmean1_data : out std_logic_vector(63 downto 0);
bunchmean1_addr : out std_logic_vector(11 downto 0);
bunchmean1_write : out std_logic);
end component;
component host_interface
generic (
index : integer := 0);
port (
-- Host Abstract Interface
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);
-- Connection to Timing, PLL and Data Logger
control : out std_Logic_vector(31 downto 0);
status : in std_Logic_vector(31 downto 0);
test_timing : out std_logic_vector(31 downto 0);
test_timing_wstb : out std_logic;
cycle : in std_logic_vector(31 downto 0);
cycle_init_val : out std_logic_vector(31 downto 0);
cycle_val_set : out std_logic;
ctime : in std_logic_vector(31 downto 0);
time_tbladdr : in std_logic_vector(31 downto 0);
pll_frequency : out std_logic_vector(31 downto 0);
pll_freqdelay : out std_logic_vector(31 downto 0);
pll_phasedelay : out std_logic_vector(31 downto 0);
pll_gain : out std_logic_vector(31 downto 0);
dds_freq_min : out std_logic_vector(31 downto 0);
dds_freq_max : out std_logic_vector(31 downto 0);
diag_control : out std_logic_vector(31 downto 0);
diag_control_set : out std_logic;
diag_delay : out std_logic_vector(31 downto 0);
diag_delay_set : out std_logic;
diag_trigger : out std_logic_vector(31 downto 0);
diag_status : in std_logic_vector(31 downto 0);
sdram_addr : in std_logic_vector(24 downto 0);
sdram_data : in std_logic_vector(63 downto 0);
sdram_write : in std_logic;
fifo_irq : out std_Logic;
timing_addr : in std_logic_vector(11 downto 0);
timing_data : in std_logic_vector(63 downto 0);
timing_write : in std_logic;
info_addr : in std_logic_vector(5 downto 0);
info_data : in std_logic_vector(63 downto 0);
info_write : in std_logic;
phase_table_addr : in std_logic_vector(12 downto 0);
phase_table_data : out std_logic_vector(7 downto 0);
switch_table_addr : in std_logic_vector(3 downto 0);
switch_table_data : out std_logic_vector(31 downto 0);
diagnostics_data : in std_logic_vector(63 downto 0);
diagnostics_addr : in std_logic_vector(11 downto 0);
diagnostics_write : in std_logic;
bunchmean0_data : in std_logic_vector(63 downto 0);
bunchmean0_addr : in std_logic_vector(11 downto 0);
bunchmean0_write : in std_logic;
bunchmean1_data : in std_logic_vector(63 downto 0);
bunchmean1_addr : in std_logic_vector(11 downto 0);
bunchmean1_write : in std_logic
);
end component;
signal test_timing : std_logic_vector(31 downto 0);
signal control : std_logic_vector(31 downto 0);
signal status : std_logic_vector(31 downto 0);
signal time_tbladdr : std_logic_vector(31 downto 0);
signal test_timing_wstb : std_logic;
signal cycle_start_edge, cycle_stop_edge, cal_start_edge, cal_stop_edge, injection_edge, hchange_edge, fref_edge : std_logic;
signal cycle_start_edge_ten_mhz : std_logic;
signal init : std_logic;
signal loop_ctrl : std_logic;
signal dds_freq_limit_en : std_logic;
signal blr_disable : std_logic;
signal pll_frequency, pll_freqdelay, pll_phasedelay, pll_gain, dds_freq_min, dds_freq_max : std_logic_vector(31 downto 0);
signal switch_table_addr : std_logic_vector(3 downto 0);
signal switch_table_data : std_logic_vector(31 downto 0);
signal phase_table_addr : std_logic_vector(12 downto 0);
signal phase_table_data : std_logic_vector(7 downto 0);
signal result_valid : std_logic;
signal result_0, result_1, result_2 : std_logic_vector (23 downto 0);
signal acq : std_logic;
signal fref_in : std_logic;
signal cycle : std_logic_vector(31 downto 0);
signal ctime : std_logic_vector(31 downto 0);
signal ms_pulse_out : std_logic;
signal hchange_sync : std_logic;
signal injection_sync : std_logic;
signal cal_start_sync : std_logic;
signal cycle_init_val : std_logic_vector(31 downto 0);
signal cycle_val_set : std_logic;
signal switch_state_reg : std_logic_vector(3 downto 0);
signal diagnostics,diagnostics1 : std_logic_vector(255 downto 0);
signal diag_control : std_logic_vector(31 downto 0);
signal diag_control_set : std_logic;
signal diag_delay : std_logic_vector(31 downto 0);
signal diag_delay_set : std_logic;
signal diag_trigger : std_logic_vector(31 downto 0);
signal diag_status : std_logic_vector(31 downto 0);
signal sdram_addr : std_logic_vector(24 downto 0);
signal sdram_data : std_logic_vector(63 downto 0);
signal sdram_write : std_logic;
signal timing_addr : std_logic_vector(11 downto 0);
signal timing_data : std_logic_vector(63 downto 0);
signal timing_write : std_logic;
signal info_addr : std_logic_vector(5 downto 0);
signal info_data : std_logic_vector(63 downto 0);
signal info_write : std_logic;
signal diagnostics_data : std_logic_vector(63 downto 0);
signal diagnostics_addr : std_logic_vector(11 downto 0);
signal diagnostics_write : std_logic;
signal bunchmean0_data : std_logic_vector(63 downto 0);
signal bunchmean0_addr : std_logic_vector(11 downto 0);
signal bunchmean0_write : std_logic;
signal bunchmean1_data : std_logic_vector(63 downto 0);
signal bunchmean1_addr : std_logic_vector(11 downto 0);
signal bunchmean1_write : std_logic;
signal bunchmean_acc : std_logic_vector(1 downto 0);
signal bunchmean_acc_reg : std_logic_vector(1 downto 0);
signal fref_reg : std_logic;
signal diag_irq : std_logic;
signal fifo_irq : std_logic;
signal phase_table_sync : std_Logic;
signal irq0,irq1,irq2,irq3,irq4,irq5 : std_logic_vector(7 downto 0);
begin -- rtl
t0 : timing
port map(
clk => clk,
rst => rst,
cycle_start_in => cycle_start,
cycle_stop_in => cycle_stop,
cal_start_in => cal_start,
cal_stop_in => cal_stop,
injection_in => injection,
hchange_in => hchange,
fref_in => fref,
fref_test => fref_test,
ten_mhz_clk => ten_mhz_clk,
test_timing_in => test_timing,
test_timing_wstb => test_timing_wstb,
cycle_start_out => cycle_start_edge,
cycle_start_out_ten_mhz => cycle_start_edge_ten_mhz,
cycle_stop_out => cycle_stop_edge,
cal_start_out => cal_start_edge,
cal_stop_out => cal_stop_edge,
injection_out => injection_edge,
hchange_out => hchange_edge,
fref_out => fref_reg);
ps0 : pllspu
port map(
clk => clk,
rst => rst,
ten_mhz_clk => ten_mhz_clk,
-- Timing Inputs (already edge detected)
cycle_start => cycle_start_edge,
cycle_start_ten_mhz => cycle_start_edge_ten_mhz,
cycle_stop => cycle_stop_edge,
cal_start => cal_start_edge,
cal_stop => cal_stop_edge,
injection => injection_edge,
hchange => hchange_edge,
fref => fref,
frev_in => fref_reg,
-- PLL Registers
init => init,
loop_ctrl => loop_ctrl,
dds_freq_limit_en => dds_freq_limit_en,
blr_disable => blr_disable,
pll_frequency => pll_frequency,
pll_freqdelay => pll_freqdelay,
pll_phasedelay => pll_phasedelay,
pll_gain => pll_gain,
dds_freq_min => dds_freq_min,
dds_freq_max => dds_freq_max,
use_neighbour_pll => control(11 downto 8),
-- Cross connections to other pupes plls
pll_mixed_sigma0_out => pll_mixed_sigma0_out,
pll_mixed_sigma1_out => pll_mixed_sigma1_out,
pll_mixed_sigma0a_in => pll_mixed_sigma0a_in,
pll_mixed_sigma1a_in => pll_mixed_sigma1a_in,
pll_mixed_sigma0b_in => pll_mixed_sigma0b_in,
pll_mixed_sigma1b_in => pll_mixed_sigma1b_in,
-- ADC Inputs
sigma => sigma,
deltax => deltax,
deltay => deltay,
-- Switch Table Read Only Interface
switch_table_addr => switch_table_addr,
switch_table_data => switch_table_data,
-- Phase Table Read Only Interface
phase_table_addr => phase_table_addr,
phase_table_data => phase_table_data,
-- Outputs to Data Logging Module
result_valid => result_valid,
result_0 => result_0,
result_1 => result_1,
result_2 => result_2,
acq => acq,
cycle => cycle,
ctime => ctime,
ms_pulse_out => ms_pulse_out,
phase_table_sync => phase_table_sync,
hchange_sync => hchange_sync,
injection_sync => injection_sync,
cal_start_sync => cal_start_sync,
phase_table_msb_out => phase_table_msb_out,
-- State Machine PCI Control
cycle_init_val => cycle_init_val,
cycle_val_set => cycle_val_set,
switch_state_reg => switch_state_reg,
-- Diagnostics Output
diagnostics => diagnostics);
diagnostics1 <= diagnostics;
--diagnostics1 <= diagnostics(255 downto 64) & debug; -- Feed local bus debug
-- data into daignostics capture logic
dl0 : data_logger
port map (
clk => clk,
rst => rst,
ten_mhz_clk => ten_mhz_clk,
-- Inputs from PLL
ms_pulse => ms_pulse_out,
acq => acq,
cycle => cycle,
ctime => ctime,
sigma_avg => result_0(18 downto 3),
deltax_avg => result_1(18 downto 3),
deltay_avg => result_2(18 downto 3),
avg_valid => result_valid,
init => init,
bunchmean_acc => bunchmean_acc,
phase_table_sync => phase_table_sync,
hchange_sync => hchange_sync,
injection_sync => injection_sync,
cal_start_sync => cal_start_sync,
-- Timing Inputs (already edge detected)
cycle_start_edge => cycle_start_edge,
cycle_stop_edge => cycle_stop_edge,
cal_start_edge => cal_start_edge,
cal_stop_edge => cal_stop_edge,
injection_edge => injection_edge,
hchange_edge => hchange_edge,
cycle_start => cycle_start,
cycle_start_ten_mhz => cycle_start_edge_ten_mhz,
cycle_stop => cycle_stop,
cal_start => cal_start,
cal_stop => cal_stop,
injection => injection,
hchange => hchange,
fref => fref,
-- Diagnostics from PLL
diagnostics => diagnostics1,
-- Host Control Registers
diag_control => diag_control,
diag_control_set => diag_control_set,
diag_delay => diag_delay,
diag_delay_set => diag_delay_set,
diag_trigger => diag_trigger,
diag_status => diag_status,
diag_irq => diag_irq,
-- Write Signals to Memory
sdram_addr => sdram_addr,
sdram_data => sdram_data,
sdram_write => sdram_write,
timing_addr => timing_addr,
timing_data => timing_data,
timing_write => timing_write,
info_addr => info_addr,
info_data => info_data,
info_write => info_write,
diagnostics_data => diagnostics_data,
diagnostics_addr => diagnostics_addr,
diagnostics_write => diagnostics_write,
bunchmean0_data => bunchmean0_data,
bunchmean0_addr => bunchmean0_addr,
bunchmean0_write => bunchmean0_write,
bunchmean1_data => bunchmean1_data,
bunchmean1_addr => bunchmean1_addr,
bunchmean1_write => bunchmean1_write);
hi0: host_interface
generic map(
index => index)
port map(
-- Host Abstract Interface
clk => clk,
rst => rst,
system_in => system_in,
system_out => system_out,
-- Connection to Timing, PLL and Data Logger
control => control,
status => status,
test_timing => test_timing,
test_timing_wstb => test_timing_wstb,
cycle => cycle,
cycle_init_val => cycle_init_val,
cycle_val_set => cycle_val_set,
ctime => ctime,
time_tbladdr => time_tbladdr,
pll_frequency => pll_frequency,
pll_freqdelay => pll_freqdelay,
pll_phasedelay => pll_phasedelay,
pll_gain => pll_gain,
dds_freq_min => dds_freq_min,
dds_freq_max => dds_freq_max,
diag_control => diag_control,
diag_control_set => diag_control_set,
diag_delay => diag_delay,
diag_delay_set => diag_delay_set,
diag_trigger => diag_trigger,
diag_status => diag_status,
sdram_addr => sdram_addr,
sdram_data => sdram_data,
sdram_write => sdram_write,
fifo_irq => fifo_irq,
timing_addr => timing_addr,
timing_data => timing_data,
timing_write => timing_write,
info_addr => info_addr,
info_data => info_data,
info_write => info_write,
phase_table_addr => phase_table_addr,
phase_table_data => phase_table_data,
switch_table_addr => switch_table_addr,
switch_table_data => switch_table_data,
diagnostics_data => diagnostics_data,
diagnostics_addr => diagnostics_addr,
diagnostics_write => diagnostics_write,
bunchmean0_data => bunchmean0_data,
bunchmean0_addr => bunchmean0_addr,
bunchmean0_write => bunchmean0_write,
bunchmean1_data => bunchmean1_data,
bunchmean1_addr => bunchmean1_addr,
bunchmean1_write => bunchmean1_write);
-- Connect Up miscellaneous registers
init <= control(0);
loop_ctrl <= control(1);
dds_freq_limit_en <= control(2);
blr_disable <= control(3);
status(7 downto 4) <= switch_state_reg;
status(3 downto 0) <= control(3 downto 0);
bunchmean_acc <= phase_table_data(7 downto 6) and not bunchmean_acc_reg;
status(11 downto 8) <= control(11 downto 8);
process (clk,rst)
begin -- process
if rst = '1' then -- asynchronous reset
time_tbladdr <= (others => '0');
bunchmean_acc_reg <= "00";
elsif clk'event and clk = '1' then -- rising clock edge
if timing_write = '1' then
time_tbladdr <= EXT(timing_addr,32);
end if;
bunchmean_acc_reg <= phase_table_data(7 downto 6);
end if;
end process;
irq0(0) <= cycle_start_edge;
irq0(1) <= cycle_stop_edge;
irq0(2) <= '1' when switch_table_addr = "1110" else '0'; -- Error State
irq0(3) <= diag_irq;
irq0(4) <= fifo_irq;
process (clk)
begin -- process
if clk'event and clk = '1' then -- rising clock edge
irq0(7 downto 5) <= switch_table_data(7 downto 5); -- User defined interrupts
irq1 <= irq0;
irq2 <= irq1;
irq3 <= irq2;
irq4 <= irq3;
irq5 <= irq4;
-- Hold IRQ pulse for 6 clock cycles.
irq <= irq0 or irq1 or irq2 or irq3 or irq4 or irq5;
end if;
end process;
end rtl;