-- -- pllspu.vhd -- -- PLL and Signal Processing Unit for CERN TMS PUPE FPGA design -- -- Based on pll3.vhd provided by G. Kasprowicz (CERN) -- -- Version 1.0 4/1/06 A.McCormick (Alpha Data) -- -- Version 1.1 13/3/06 A.McCormick (Alpha Data) -- Added 2nd loop filter library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_signed.all; use ieee.std_logic_arith.all; use ieee.std_logic_misc.all; entity pllspu is 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; -- (non edge detected) -- 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; -- Output to IO 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 pllspu; architecture rtl of pllspu is --BLR signal e0, e1, e2 : std_logic_vector(23 downto 0); signal b0, b1, b2 : std_logic_vector(23 downto 0); signal x0, x1, x2, y0, y1, y2 : std_logic_vector(23 downto 0); signal BLR_data_in_0, BLR_data_in_1, BLR_data_in_2 : std_logic_vector (23 downto 0); signal BLR_data_out_0 : std_logic_vector (23 downto 0); signal BLR_data_out_1 : std_logic_vector (23 downto 0); signal BLR_data_out_2 : std_logic_vector (23 downto 0); --DDS signal ph_table_addr : std_logic_vector (12 downto 0); signal dds_ph, dds_freq, dds_freq_limit : std_logic_vector (31 downto 0); signal f_error_dds : std_logic_vector(31 downto 0); signal load_dds_freq, dds_freq_OVR, dds_freq_UR, clk62 : std_logic := '0'; --multiplier signal mul_data_in1,mul_data_in2,mult_out1,mult_out2, mult_neg_data_in1,mult_neg_data_in2 : std_logic_vector (13 downto 0); --filter signal n1, n2, n3, n4, n5, n6, s3, s4, s5, s6, filter_data_out : std_logic_vector(31 downto 0); signal filter1_in : std_logic_vector (15 downto 0); signal nb1, nb2, nb3, nb4, nb5, nb6, sb3, sb4, sb5, sb6 : std_logic_vector(31 downto 0); signal filter2_in : std_logic_vector (15 downto 0); -- integrators type STATE_TYPE is (idle, integrate, ready, reset_acc); signal state : STATE_TYPE; signal accumulate_0, accumulate_1, accumulate_2, result0_tmp, result1_tmp, result2_tmp : std_logic_vector (23 downto 0) := (others => '0'); signal acc_reset, result_Write_en : std_logic; type shifted_ferror_type is array (natural range <>) of std_logic_vector(31 downto 0); signal switch_state : std_logic_vector(3 downto 0); signal switch_reading : std_logic; signal rf_select1 : std_logic; signal rf_select2 : std_logic; signal cycle_count : std_logic_vector(15 downto 0); signal ctime_count : std_logic_vector(15 downto 0); signal ctimer : std_logic_vector(16 downto 0); signal ms_pulse : std_logic; signal ms_pulse_reg : std_logic_vector(7 downto 0); signal hchange_switch : std_logic; signal hchange_temp : std_Logic; signal phase_table_msb_falling : std_Logic; signal phase_table_msb,phase_table_msb_reg : std_logic; signal phase_table_addr_i : std_logic_vector(12 downto 0); signal LO_pulse1,LO_pulse2,blr_pulse,gate_pulse : std_logic; signal f_error,f_err : std_logic_vector(31 downto 0); signal Frev_num : std_logic_vector(13 downto 0); signal pll_init : std_logic; signal pll_init_count : std_logic_vector(15 downto 0); signal sel_filter : std_Logic; signal pll_msb : std_logic; signal use_pll_for_lo1 : std_logic; signal use_pll_for_lo2 : std_logic; signal event_delayed_i : std_logic; signal injection_switch : std_logic; signal cal_start_switch : std_logic; signal event : std_logic; signal event_delay_count : std_logic_vector(3 downto 0); signal event_delayed_switch : std_logic; signal other_plls1a,other_plls2a : std_logic_vector(13 downto 0); signal other_plls1b,other_plls2b : std_logic_vector(13 downto 0); signal injection_reg : std_logic; signal hchange_reg : std_logic; signal cal_start_reg : std_logic; begin -- rtl cycle <= EXT(cycle_count, 32); switch_state_reg <= switch_state; ctimer0: process (ten_mhz_clk, rst) begin -- process ctimer0 if rst = '1' then -- asynchronous reset ctime_count <= (others => '0'); ctimer <= CONV_STD_LOGIC_VECTOR(9999, 17); ms_pulse <= '0'; elsif ten_mhz_clk'event and ten_mhz_clk = '1' then -- rising clock edge ms_pulse <= not OR_reduce(ctimer); if cycle_start_ten_mhz = '1' then ctimer <= CONV_STD_LOGIC_VECTOR(9999, 17); ctime_count <= (others => '0'); else if OR_reduce(ctimer) = '0' then ctimer <= CONV_STD_LOGIC_VECTOR(9999, 17); ctime_count <= ctime_count+1; else ctimer <= ctimer-1; end if; end if; end if; end process ctimer0; switch_fsm0 : process (clk, rst) begin -- process switch_fsm0 if rst = '1' then -- asynchronous reset switch_state <= (others => '1'); switch_reading <= '0'; cycle_count <= (others => '0'); ms_pulse_reg <= (others => '0'); ms_pulse_out <= '0'; ctime <= (others => '0'); hchange_temp <= '0'; hchange_switch <= '0'; injection_reg <= '0'; hchange_reg <= '0'; elsif clk'event and clk = '1' then -- rising clock edge ms_pulse_reg <= ms_pulse_reg (6 downto 0) & ms_pulse; -- Update CTIME 56ns after rising edge of MS Pulse -- to give plenty of time for ctime_count to settle if ms_pulse_reg(7) = '0' and ms_pulse_reg(6) = '1' then ms_pulse_out <= '1'; ctime <= EXT(ctime_count, 32); else ms_pulse_out <= '0'; end if; if cycle_val_set = '1' then cycle_count <= cycle_init_val(15 downto 0); elsif cycle_stop = '1' then cycle_count <= cycle_count+1; end if; if init = '1' then switch_state <= (others => '1'); switch_reading <= '0'; else -- 1 cycle delay between switching states and next state switch table -- data being available if switch_reading = '1' then switch_reading <= '0'; else if switch_state = "1111" or switch_state = "1110" then if cycle_start = '1' then switch_state <= "0000"; switch_reading <= '1'; end if; else if cycle_stop = '1' then switch_state <= switch_table_data(11 downto 8); switch_reading <= '1'; end if; if cal_stop = '1' then switch_state <= switch_table_data(15 downto 12); switch_reading <= '1'; end if; if cal_start_switch = '1' and phase_table_msb_falling = '1' then switch_state <= switch_table_data(19 downto 16); switch_reading <= '1'; end if; if injection_switch = '1' and phase_table_msb_falling = '1' then switch_state <= switch_table_data(23 downto 20); switch_reading <= '1'; end if; if hchange_switch = '1' and phase_table_msb_falling = '1' then switch_state <= switch_table_data(27 downto 24); switch_reading <= '1'; end if; if event_delayed_switch = '1' and phase_table_msb_falling = '1' then switch_state <= switch_table_data(31 downto 28); switch_reading <= '1'; end if; end if; end if; end if; -- Delay HCHANGE Effect till cycle table msb falling edge -- Reset on Cycle Start if cycle_start = '1' then hchange_temp <= '0'; hchange_switch <= '0'; injection_switch <= '0'; cal_start_switch <= '0'; else if hchange = '1' and hchange_reg = '0' then -- hchange_temp <= '1'; -- elsif ms_pulse_reg(7) = '0' and ms_pulse_reg(6) = '1' and hchange_temp = '1' then -- hchange_temp <= '0'; hchange_switch <= '1'; elsif hchange_switch = '1' and phase_table_msb_falling = '1' then hchange_switch <= '0'; end if; if injection = '1' and injection_reg = '0' then injection_switch <= '1'; elsif injection_switch = '1' and phase_table_msb_falling = '1' then injection_switch <= '0'; end if; if cal_start = '1' and cal_start_reg = '0' then cal_start_switch <= '1'; elsif cal_start_switch = '1' and phase_table_msb_falling = '1' then cal_start_switch <= '0'; end if; end if; injection_reg <= injection; hchange_reg <= hchange; cal_start_reg <= cal_start; use_pll_for_lo2 <= switch_table_data(5); use_pll_for_lo1 <= switch_table_data(4); sel_filter <= switch_table_data(3); rf_select2 <= switch_table_data(2); rf_select1 <= switch_table_data(1); acq <= switch_table_data(0); end if; end process switch_fsm0; hchange_sync <= hchange_switch and phase_table_msb_falling; injection_sync <= injection_switch and phase_table_msb_falling; cal_start_sync <= cal_start_switch and phase_table_msb_falling; delay_event: process (clk, rst) begin -- process delay_event if rst = '1' then -- asynchronous reset event_delayed_i <= '0'; event <= '0'; event_delay_count <= (others => '0'); event_delayed_switch <= '0'; elsif clk'event and clk = '1' then -- rising clock edge event <= cycle_start or cycle_stop or cal_stop or cal_start or ((hchange_switch or injection_switch) and phase_table_msb_falling); if OR_reduce(event_delay_count) = '0' then if event = '1' then event_delay_count <= CONV_STD_LOGIC_VECTOR(1,12); end if; else if phase_table_msb_falling = '1' then event_delay_count <= event_delay_count+1; end if; end if; event_delayed_i <= AND_reduce(event_delay_count); if event_delayed_i = '1' then event_delayed_switch <= '1'; elsif event_delayed_switch = '1' and phase_table_msb_falling = '1' then event_delayed_switch <= '0'; end if; end if; end process delay_event; switch_table_addr <= switch_state; phase_table_addr_i(12 downto 9) <= switch_state; phase_table_addr_i(8 downto 0) <= dds_ph(31 downto 23) + pll_phasedelay(8 downto 0); phase_table_addr <= phase_table_addr_i; pll_msb <= dds_ph(31); phase_table_msb <= phase_table_addr_i(8); process (clk) begin -- process if clk'event and clk = '1' then -- rising clock edge phase_table_msb_reg <= phase_table_msb; -- falling edge of phase table phase_table_msb_falling <= (not phase_table_msb) and phase_table_msb_reg; --phase_table_sync <= not phase_table_msb and phase_table_msb_reg; phase_table_sync <= (not phase_table_msb) and phase_table_msb_reg; phase_table_msb_out <= phase_table_msb_reg; end if; end process; --LO_out <= phase_table_data(0); LO_pulse1 <= phase_table_data(0) when use_pll_for_lo1 = '0' else not pll_msb; BLR_pulse <= phase_table_data(1); GATE_pulse <= phase_table_data(2); LO_pulse2 <= phase_table_data(3) when use_pll_for_lo2 = '0' else not pll_msb; -- Loop Gain Control -- purpose: Shifts f_error by number of bits specified by in "loop gain" loop_gain0 : process (pll_gain, f_error) variable shifted_ferror : shifted_ferror_type(0 to 15); variable loop_gain_int : integer; begin -- process loop_gain0 loop_gain_int := CONV_INTEGER(('0' & pll_gain(19 downto 16))); shifted_ferror(0) := f_error; for i in 1 to 15 loop shifted_ferror(i) := SXT(f_error(31 downto i), 32); end loop; -- i F_ERR <= shifted_ferror(loop_gain_int); end process loop_gain0; --************************************************************************************************************** --**************************** Input signal selection ****************************************************** --************************************************************************************************************** --selection of algorithm input signal process(clk) begin if rising_edge(clk) then if rf_select1 = '1' then mul_data_in1 <= sigma; mult_neg_data_in1 <= (not sigma) +1; else if Frev_in = '1' then mul_data_in1 <= pll_gain(13 downto 0); mult_neg_data_in1 <= (not pll_gain(13 downto 0)) +1; else mult_neg_data_in1 <= pll_gain(13 downto 0); mul_data_in1 <= (not pll_gain(13 downto 0)) +1; end if; end if; if rf_select2 = '1' then mul_data_in2 <= sigma; mult_neg_data_in2 <= (not sigma) +1; else if Frev_in = '1' then mul_data_in2 <= pll_gain(13 downto 0); mult_neg_data_in2 <= (not pll_gain(13 downto 0)) +1; else mult_neg_data_in2 <= pll_gain(13 downto 0); mul_data_in2 <= (not pll_gain(13 downto 0)) +1; end if; end if; end if; end process; --generation of bipolar revolution frequency word -- mult_neg_data_in1 <= (not mul_data_in1) + 1; -- mult_neg_data_in2 <= (not mul_data_in2) + 1; -- Frev_num <= pll_gain(13 downto 0) when Frev_in = '1' else (not pll_gain(13 downto 0)) +1; --************************************************************************************************************** --**************************** DDS ****************************************************** --************************************************************************************************************** f_error_dds <= F_ERR; -- Generate 62.5 MHz Clock -- process(clk) -- begin -- if rising_edge(clk) then -- clk62 <= not clk62; -- end if; -- end process; clk62 <= '1'; process(clk,rst) begin if rst = '1' then dds_ph <= (others => '0'); dds_freq <= (others => '0'); dds_freq_OVR <= '0'; dds_freq_UR <= '0'; pll_init_count <= (others => '0'); pll_init <= '0'; elsif rising_edge(clk) then if cycle_start = '1' then pll_init_count <= pll_freqdelay(15 downto 0); --pll_init <= not OR_reduce(pll_freqdelay(15 downto 0)); pll_init <= '1'; else if OR_reduce(pll_init_count) = '1' and ms_pulse_reg(7) = '0' and ms_pulse_reg(6) = '1' then pll_init_count <= pll_init_count-1; if pll_init_count = CONV_STD_LOGIC_VECTOR(1,16) then pll_init <= '1'; else pll_init <= '0'; end if; else pll_init <= '0'; end if; end if; if pll_init = '1' then dds_ph <= (others => '0'); dds_freq <= pll_frequency; dds_freq_OVR <= '0'; dds_freq_UR <= '0'; elsif clk62 = '1' then dds_ph <= dds_ph + dds_freq; if dds_freq > dds_freq_max then dds_freq_OVR <= '1'; dds_freq_UR <= '0'; elsif dds_freq < dds_freq_min then dds_freq_OVR <= '0'; dds_freq_UR <= '1'; end if; if load_dds_freq = '1' then dds_freq <= dds_freq_limit; elsif loop_ctrl = '0' then dds_freq <= dds_freq + f_error_dds; dds_freq_OVR <= '0'; dds_freq_UR <= '0'; end if; end if; end if; end process; dds_freq_limit <= dds_freq_max when dds_freq_OVR = '1' else dds_freq_min; load_dds_freq <= dds_freq_limit_en and (dds_freq_OVR or dds_freq_UR); --************************************************************************************************************** --**************************** multiplier ****************************************************** --************************************************************************************************************** --multiplier function call mult_out1 <= mul_data_in1 when LO_pulse1 = '0' else mult_neg_data_in1; mult_out2 <= mul_data_in2 when LO_pulse2 = '0' else mult_neg_data_in2; pll_mixed_sigma0_out <= mult_out1; pll_mixed_sigma1_out <= mult_out2; process(clk) begin if rising_edge(clk) then filter1_in <= SXT(mult_out1, 16); filter2_in <= SXT(mult_out2, 16); if use_neighbour_pll(0) = '0' then other_plls1a <= (others => '0'); else other_plls1a <= pll_mixed_sigma0a_in; end if; if use_neighbour_pll(1) = '0' then other_plls1b <= (others => '0'); else other_plls1b <= pll_mixed_sigma0b_in; end if; if use_neighbour_pll(2) = '0' then other_plls2a <= (others => '0'); else other_plls2a <= pll_mixed_sigma1a_in; end if; if use_neighbour_pll(3) = '0' then other_plls2b <= (others => '0'); else other_plls2b <= pll_mixed_sigma1b_in; end if; end if; end process; --************************************************************************************************************** --**************************** filter ****************************************************** --************************************************************************************************************** -- Filter input options, only use one combine_3_pupes: if false generate n1 <= SXT(filter1_in+ SXT(other_plls1a,16) + SXT(other_plls1b,16),32); nb1 <= SXT(filter2_in+ SXT(other_plls2a,16) + SXT(other_plls2b,16),32); end generate combine_3_pupes; independent_pupes: if false generate n1 <= SXT(filter1_in,32); nb1 <= SXT(filter2_in,32); end generate independent_pupes; combine_3_pupes_registered: if true generate process (clk) begin -- process if rising_edge(clk) then n1 <= SXT(filter1_in+ SXT(other_plls1a,16) + SXT(other_plls1b,16),32); nb1 <= SXT(filter2_in+ SXT(other_plls2a,16) + SXT(other_plls2b,16),32); end if; end process; end generate combine_3_pupes_registered; process(clk, init, rst) begin if rst = '1' then n2 <= x"00000000"; n3 <= x"00000000"; n4 <= x"00000000"; n5 <= x"00000000"; n6 <= x"00000000"; s4 <= x"00000000"; s6 <= x"00000000"; elsif rising_edge(clk) then if init = '1' then n2 <= x"00000000"; n3 <= x"00000000"; n4 <= x"00000000"; n5 <= x"00000000"; n6 <= x"00000000"; s4 <= x"00000000"; s6 <= x"00000000"; elsif clk62 = '1' then n2 <= n1 + n2 - SXT(n2(31 downto 8), 32); n3 <= n2 + n3 - SXT(n3(31 downto 8), 32); s4 <= n3 - SXT(n3(31 downto 10), 24); n4 <= n3 - s4; n5 <= n4 + n5 - SXT(n5(31 downto 8), 32); s6 <= n5 - SXT(n5(31 downto 10), 32); n6 <= n5 - s6; end if; end if; end process; process(clk, init, rst) begin if rst = '1' then nb2 <= x"00000000"; nb3 <= x"00000000"; nb4 <= x"00000000"; nb5 <= x"00000000"; nb6 <= x"00000000"; sb4 <= x"00000000"; sb6 <= x"00000000"; elsif rising_edge(clk) then if init = '1' then nb2 <= x"00000000"; nb3 <= x"00000000"; nb4 <= x"00000000"; nb5 <= x"00000000"; nb6 <= x"00000000"; sb4 <= x"00000000"; sb6 <= x"00000000"; elsif clk62 = '1' then nb2 <= nb1 + nb2 - SXT(nb2(31 downto 8), 32); nb3 <= nb2 + nb3 - SXT(nb3(31 downto 8), 32); sb4 <= nb3 - SXT(nb3(31 downto 10), 32); nb4 <= nb3 - sb4; nb5 <= nb4 + nb5 - SXT(nb5(31 downto 8), 32); sb6 <= nb5 - SXT(nb5(31 downto 10), 32); nb6 <= nb5 - sb6; end if; end if; end process; filter_data_out <= n6(31 downto 0) when sel_filter = '0' else nb6(31 downto 0); f_error <= filter_data_out; --************************************************************************************************************** --**************************** INTEGRATORS ****************************************************** --************************************************************************************************************** process(clk,rst) begin if rst = '1' then accumulate_0 <= x"000000"; accumulate_1 <= x"000000"; accumulate_2 <= x"000000"; elsif rising_edge(clk) then if acc_reset = '1' then accumulate_0 <= x"000000"; accumulate_1 <= x"000000"; accumulate_2 <= x"000000"; elsif GATE_PULSE = '1' then accumulate_0 <= accumulate_0 + BLR_data_out_0; accumulate_1 <= accumulate_1 + BLR_data_out_1; accumulate_2 <= accumulate_2 + BLR_data_out_2; end if; end if; end process; process (clk, init,rst) begin if init = '1' or rst = '1' then state <= idle; elsif rising_edge(clk) then case state is when idle => if GATE_PULSE = '1' then state <= integrate; else state <= idle; end if; when integrate => if GATE_PULSE = '1' then state <= integrate; else state <= ready; end if; when ready => state <= reset_acc; when reset_acc => state <= idle; end case; end if; end process; acc_reset <= '1' when state = reset_acc else '0'; result_valid <= '1' when state = reset_acc else '0'; process(clk) begin if rising_edge(clk) then if state = ready then result0_tmp <= accumulate_0; result1_tmp <= accumulate_1; result2_tmp <= accumulate_2; end if; end if; end process; result_0 <= result0_tmp; result_1 <= result1_tmp; result_2 <= result2_tmp; --************************************************************************************************************** --**************************** BASELINE RESTORATION ********************************************** --************************************************************************************************************** BLR_data_in_0 <= SXT(sigma, 24); BLR_data_in_1 <= SXT(deltax, 24); BLR_data_in_2 <= SXT(deltay, 24); --accumulate e process(clk, init) begin if init = '1' then e0 <= (others => '0'); e1 <= (others => '0'); e2 <= (others => '0'); b0 <= (others => '0'); b1 <= (others => '0'); b2 <= (others => '0'); y0 <= (others => '0'); y1 <= (others => '0'); y2 <= (others => '0'); x0 <= (others => '0'); x1 <= (others => '0'); x2 <= (others => '0'); elsif rising_edge(clk) then x0 <= BLR_data_in_0 - b0; x1 <= BLR_data_in_1 - b1; x2 <= BLR_data_in_2 - b2; e0 <= e0+x0; e1 <= e1+x1; e2 <= e2+x2; y0 <= x0 + SXT(e0(23 downto 7), 24); y1 <= x1 + SXT(e1(23 downto 7), 24); y2 <= x2 + SXT(e2(23 downto 7), 24); if BLR_pulse = '1' then b0 <= b0 + SXT(y0(23 downto 2), 24); b1 <= b1 + SXT(y1(23 downto 2), 24); b2 <= b2 + SXT(y2(23 downto 2), 24); end if; end if; end process; -- BLR_data_out_0 <= b0; -- BLR_data_out_1 <= b1; -- BLR_data_out_2 <= b2; BLR_data_out_0 <= y0 when blr_disable = '0' else BLR_data_in_0; BLR_data_out_1 <= y1 when blr_disable = '0' else BLR_data_in_1; BLR_data_out_2 <= y2 when blr_disable = '0' else BLR_data_in_2; -- Diagnostics -- Record 256 bits of signals process (clk) begin -- process if clk'event and clk = '1' then -- rising clock edge diagnostics(63 downto 56) <= frev_in & pll_msb & phase_table_msb & LO_pulse1 & event_delayed_switch & injection_switch & hchange_switch & LO_pulse2; diagnostics(55 downto 48) <= (hchange_switch and phase_table_msb_falling) & sel_filter & rf_select2 & rf_select1 & phase_table_data(7 downto 6) & GATE_pulse & BLR_pulse; diagnostics(47 downto 32) <= switch_state & sigma(13 downto 2); diagnostics(31 downto 26) <= hchange & injection & cal_stop & cal_start & cycle_stop & cycle_start; diagnostics(25 downto 0) <= dds_freq(31 downto 6); diagnostics(127 downto 120) <= frev_in & pll_msb & phase_table_msb & LO_pulse1 & sigma(13 downto 11) & LO_pulse2; diagnostics(115 downto 102) <= mult_out1; diagnostics(101 downto 88) <= mult_out2; diagnostics(87 downto 64) <= f_error(23 downto 0); diagnostics(191 downto 184) <= frev_in & pll_msb & phase_table_msb & LO_pulse1 & sigma(13 downto 11) & LO_pulse2; diagnostics(183) <= GATE_pulse; diagnostics(182 downto 160) <= b0(22 downto 0); diagnostics(159 downto 128) <= SXT(result0_tmp,32); diagnostics(255 downto 248) <= frev_in & pll_msb & phase_table_msb & LO_pulse1 & BLR_data_out_0(23) & BLR_data_out_0(12 downto 11)& LO_pulse2; diagnostics(247) <= BLR_pulse; diagnostics(246) <= GATE_pulse; diagnostics(245 downto 232) <= sigma; diagnostics(231 downto 218) <= deltax; diagnostics(217 downto 204) <= deltay; diagnostics(198 downto 193) <= hchange & injection & cal_stop & cal_start & cycle_stop & cycle_start; -- diagnostics(239 downto 224) <= y0(15 downto 0); -- diagnostics(223 downto 208) <= e0(15 downto 0); -- diagnostics(207 downto 192) <= x0(15 downto 0); end if; end process; end rtl;