ERROR_ADC0_OUT : out std_logic;
ERROR_ADC1_OUT : out std_logic;
+ ERROR_UNDEF_ADC0_OUT : out std_logic;
+ ERROR_UNDEF_ADC1_OUT : out std_logic;
DEBUG_IN : in std_logic_vector(3 downto 0);
DEBUG_OUT : out std_logic_vector(15 downto 0)
);
type adc_data_t is array(0 to 3) of std_logic_vector(11 downto 0);
type BYTE_STATUS is (B_UNDEF,
+ B_BITSHIFTED,
B_ALIGNED,
B_SHIFTED
);
signal adc0_frame_clk_ok_hist : std_logic_vector(15 downto 0);
signal adc0_frame_locked : std_logic;
signal adc0_error : std_logic;
+ signal adc0_error_undef : std_logic;
-- ADC0
signal adc1_data_shift : adc_data_s;
signal adc1_frame_clk_ok_hist : std_logic_vector(15 downto 0);
signal adc1_frame_locked : std_logic;
signal adc1_error : std_logic;
-
+ signal adc1_error_undef : std_logic;
+
-- Clock Transfer
signal adc0_fifo_empty : std_logic;
signal adc0_fifo_full : std_logic;
-- Error
signal error_adc0_o : std_logic;
signal error_adc1_o : std_logic;
+ signal error_undef_adc0_o : std_logic;
+ signal error_undef_adc1_o : std_logic;
-- Output
signal adc0_data_clk_o : std_logic;
-----------------------------------------------------------------------------
DFALSE: if (DEBUG_ENABLE = false) generate
-
- DEBUG_OUT(0) <= CLK_IN;
- DEBUG_OUT(1) <= DDR_DATA_CLK;
- DEBUG_OUT(2) <= adc0_write_enable;
- DEBUG_OUT(3) <= adc0_fifo_full;
- DEBUG_OUT(4) <= adc0_fifo_empty;
- DEBUG_OUT(5) <= adc0_data_clk_m;
- DEBUG_OUT(6) <= adc0_read_enable;
- DEBUG_OUT(7) <= adc0_read_enable_t;
- DEBUG_OUT(8) <= adc0_read_enable_tt;
- DEBUG_OUT(9) <= adc0_data_clk_o;
- DEBUG_OUT(10) <= adc0_error;
- DEBUG_OUT(11) <= adc0_frame_locked;
- DEBUG_OUT(12) <= adc0_frame_clk_ok;
- DEBUG_OUT(13) <= wait_timer_done;
- DEBUG_OUT(14) <= RESET_CLKDIV;
- DEBUG_OUT(15) <= RESET_ADC0;
+ DEBUG_OUT <= (others => '0');
+ --DEBUG_OUT(0) <= CLK_IN;
+ --DEBUG_OUT(1) <= DDR_DATA_CLK;
+ --DEBUG_OUT(2) <= adc0_write_enable;
+ --DEBUG_OUT(3) <= adc0_fifo_full;
+ --DEBUG_OUT(4) <= adc0_fifo_empty;
+ --DEBUG_OUT(5) <= adc0_data_clk_m;
+ --DEBUG_OUT(6) <= adc0_read_enable;
+ --DEBUG_OUT(7) <= adc0_read_enable_t;
+ --DEBUG_OUT(8) <= adc0_read_enable_tt;
+ --DEBUG_OUT(9) <= adc0_data_clk_o;
+ --DEBUG_OUT(10) <= adc0_error;
+ --DEBUG_OUT(11) <= adc0_frame_locked;
+ --DEBUG_OUT(12) <= adc0_frame_clk_ok;
+ --DEBUG_OUT(13) <= wait_timer_done;
+ --DEBUG_OUT(14) <= RESET_CLKDIV;
+ --DEBUG_OUT(15) <= RESET_ADC0;
end generate DFALSE;
DTRUE: if (DEBUG_ENABLE = true) generate
adc0_frame_clk_ok_hist <= (others => '0');
adc0_frame_locked <= '0';
adc0_error <= '0';
+ adc0_error_undef <= '0';
else
-- Store new incoming Data in Shift Registers
for I in 0 to 4 loop
adc0_data_clk_m <= '0';
adc0_frame_clk_ok <= '1';
adc0_byte_status <= B_ALIGNED;
-
+
when "000000111111" | "001111110000" =>
-- Input Data is correct
adc0_data_clk_m <= '0';
adc0_frame_clk_ok <= '1';
adc0_byte_status <= B_SHIFTED;
-
+
+ when "000001111110" |
+ "000111111000" |
+ "011111100000" |
+ "111110000001" |
+ "111000000111" |
+ "100000011111" =>
+ adc0_data_clk_m <= '0';
+ adc0_frame_clk_ok <= '0';
+ adc0_byte_status <= B_BITSHIFTED;
+
when others =>
-- Input Data is invalid, Fatal Error of DDR Data, needs reset.
adc0_data_clk_m <= '0';
-- Error Status
adc0_byte_status_last <= adc0_byte_status;
- if ( adc0_byte_status /= adc0_byte_status_last or
- adc0_byte_status = B_UNDEF) then
+ --if (adc0_byte_status /= adc0_byte_status_last and
+ -- adc0_byte_status /= B_UNDEF and
+ -- adc0_byte_status_last /= B_UNDEF) then
+ if (adc0_byte_status = B_BITSHIFTED) then
adc0_error <= '1';
else
adc0_error <= '0';
end if;
+
+ if (adc0_byte_status = B_UNDEF) then
+ adc0_error_undef <= '1';
+ else
+ adc0_error_undef <= '0';
+ end if;
+
end if;
end if;
-- Error Status
adc1_byte_status_last <= adc1_byte_status;
- if (adc1_byte_status /= adc1_byte_status_last or
- adc1_byte_status = B_UNDEF) then
+ if (adc1_byte_status /= adc1_byte_status_last) then
adc1_error <= '1';
else
adc1_error <= '0';
end if;
+ if (adc1_byte_status = B_UNDEF) then
+ adc1_error_undef <= '1';
+ else
+ adc1_error_undef <= '0';
+ end if;
+
end if;
end if;
end process PROC_MERGE_DATA_ADC1;
RESET_B_IN => '0',
PULSE_B_OUT => error_adc1_o
);
+
+ pulse_dtrans_ADC0_ERROR_UNDEF: pulse_dtrans
+ generic map (
+ CLK_RATIO => 2
+ )
+ port map (
+ CLK_A_IN => DDR_DATA_CLK,
+ RESET_A_IN => '0',
+ PULSE_A_IN => adc0_error_undef,
+ CLK_B_IN => CLK_IN,
+ RESET_B_IN => '0',
+ PULSE_B_OUT => error_undef_adc0_o
+ );
+
+ pulse_dtrans_ADC1_ERROR_UNDEF: pulse_dtrans
+ generic map (
+ CLK_RATIO => 2
+ )
+ port map (
+ CLK_A_IN => DDR_DATA_CLK,
+ RESET_A_IN => '0',
+ PULSE_A_IN => adc1_error_undef,
+ CLK_B_IN => CLK_IN,
+ RESET_B_IN => '0',
+ PULSE_B_OUT => error_undef_adc1_o
+ );
-- Output
ADC0_SCLK_OUT <= ADC0_SCLK_IN;
ERROR_ADC0_OUT <= error_adc0_o;
ERROR_ADC1_OUT <= error_adc1_o;
+
+ ERROR_UNDEF_ADC0_OUT <= error_undef_adc0_o;
+ ERROR_UNDEF_ADC1_OUT <= error_undef_adc1_o;
end Behavioral;
NX_CLOCK_ON_IN : in std_logic;
-- nXyter Ports
- NX_TIMESTAMP_CLK_IN : in std_logic;
+ NX_DATA_CLK_IN : in std_logic;
NX_TIMESTAMP_IN : in std_logic_vector (7 downto 0);
NX_TIMESTAMP_RESET_OUT : out std_logic;
-- Error
signal adc_error_i : std_logic;
+ signal adc_error_undef_i : std_logic;
signal error_o : std_logic;
signal error_status_bits : std_logic_vector(15 downto 0);
signal adc_notlock_counter : unsigned(27 downto 0);
signal adc_error_counter : unsigned(27 downto 0);
+ signal adc_error_undef_counter : unsigned(27 downto 0);
-- Rate Errors
signal nx_frame_rate_offline_last : std_logic;
signal nx_online_ii : std_logic;
signal nx_online_i : std_logic;
signal adc_error : std_logic;
+ signal adc_error_undef : std_logic;
signal startup_reset : std_logic;
signal rs_wait_timer_start : std_logic;
signal rs_wait_timer_done : std_logic;
-- Reset Domain Transfers
signal reset_nx_timestamp_clk_in_ff : std_logic;
signal reset_nx_timestamp_clk_in_f : std_logic;
- signal RESET_NX_TIMESTAMP_CLK_IN : std_logic;
+ signal RESET_NX_DATA_CLK_IN : std_logic;
signal debug_state : std_logic_vector(3 downto 0);
signal debug_frame_on : std_logic;
attribute syn_keep of adc_debug_type_f : signal is true;
attribute syn_keep of adc_debug_type : signal is true;
+ attribute syn_keep of nx_frame_word_delay_f : signal is true;
+ attribute syn_keep of nx_frame_word_delay : signal is true;
+
+ attribute syn_keep of nx_frame_word_f : signal is true;
+
attribute syn_keep of nx_frame_word_delay_rr : signal is true;
attribute syn_keep of nx_frame_word_delay_r : signal is true;
-
+
attribute syn_preserve : boolean;
attribute syn_preserve of reset_nx_timestamp_clk_in_ff : signal is true;
attribute syn_preserve of reset_nx_timestamp_clk_in_f : signal is true;
attribute syn_preserve of adc_debug_type_f : signal is true;
attribute syn_preserve of adc_debug_type : signal is true;
+ attribute syn_preserve of nx_frame_word_delay_f : signal is true;
+ attribute syn_preserve of nx_frame_word_delay : signal is true;
+
+ attribute syn_preserve of nx_frame_word_f : signal is true;
+
attribute syn_preserve of nx_frame_word_delay_rr : signal is true;
attribute syn_preserve of nx_frame_word_delay_r : signal is true;
-
+
begin
DFALSE: if (DEBUG_ENABLE = false) generate
when "101" =>
-- AD9228 Handler Debug output
- DEBUG_OUT(0) <= NX_TIMESTAMP_CLK_IN;
+ DEBUG_OUT(0) <= NX_DATA_CLK_IN;
DEBUG_OUT(1) <= '0';
DEBUG_OUT(2) <= nx_frame_clk;
DEBUG_OUT(3) <= '0';
DEBUG_OUT(15 downto 12) <= adc_data_clk_last;
when "110" =>
- DEBUG_OUT(0) <= NX_TIMESTAMP_CLK_IN;
+ DEBUG_OUT(0) <= NX_DATA_CLK_IN;
DEBUG_OUT(1) <= '0';
DEBUG_OUT(2) <= '0';
DEBUG_OUT(3) <= '0';
-- Reset Domain Transfer
-----------------------------------------------------------------------------
reset_nx_timestamp_clk_in_ff <= RESET_IN
- when rising_edge(NX_TIMESTAMP_CLK_IN);
+ when rising_edge(NX_DATA_CLK_IN);
reset_nx_timestamp_clk_in_f <= reset_nx_timestamp_clk_in_ff
- when rising_edge(NX_TIMESTAMP_CLK_IN);
- RESET_NX_TIMESTAMP_CLK_IN <= reset_nx_timestamp_clk_in_f
- when rising_edge(NX_TIMESTAMP_CLK_IN);
+ when rising_edge(NX_DATA_CLK_IN);
+ RESET_NX_DATA_CLK_IN <= reset_nx_timestamp_clk_in_f
+ when rising_edge(NX_DATA_CLK_IN);
-----------------------------------------------------------------------------
-- PLL Handler
CLK_RATIO => 2
)
port map (
- CLK_A_IN => NX_TIMESTAMP_CLK_IN,
- RESET_A_IN => RESET_NX_TIMESTAMP_CLK_IN,
+ CLK_A_IN => NX_DATA_CLK_IN,
+ RESET_A_IN => RESET_NX_DATA_CLK_IN,
PULSE_A_IN => adc_data_clk,
CLK_B_IN => CLK_IN,
RESET_B_IN => RESET_IN,
CLK_RATIO => 2
)
port map (
- CLK_A_IN => NX_TIMESTAMP_CLK_IN,
- RESET_A_IN => RESET_NX_TIMESTAMP_CLK_IN,
+ CLK_A_IN => NX_DATA_CLK_IN,
+ RESET_A_IN => RESET_NX_DATA_CLK_IN,
PULSE_A_IN => nx_frame_clk,
CLK_B_IN => CLK_IN,
RESET_B_IN => RESET_IN,
CLK_RATIO => 2
)
port map (
- CLK_A_IN => NX_TIMESTAMP_CLK_IN,
- RESET_A_IN => RESET_NX_TIMESTAMP_CLK_IN,
+ CLK_A_IN => NX_DATA_CLK_IN,
+ RESET_A_IN => RESET_NX_DATA_CLK_IN,
PULSE_A_IN => parity_error,
CLK_B_IN => CLK_IN,
RESET_B_IN => RESET_IN,
CLK_RATIO => 4
)
port map (
- CLK_A_IN => NX_TIMESTAMP_CLK_IN,
- RESET_A_IN => RESET_NX_TIMESTAMP_CLK_IN,
+ CLK_A_IN => NX_DATA_CLK_IN,
+ RESET_A_IN => RESET_NX_DATA_CLK_IN,
PULSE_A_IN => adc_reset_sync_s,
CLK_B_IN => CLK_IN,
RESET_B_IN => RESET_IN,
);
-- ADC Sampling Clock Generator using a Johnson Counter
- PROC_ADC_SAMPLING_CLK_GENERATOR: process(NX_TIMESTAMP_CLK_IN)
+ PROC_ADC_SAMPLING_CLK_GENERATOR: process(NX_DATA_CLK_IN)
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
+ if (rising_edge(NX_DATA_CLK_IN)) then
if (adc_sclk_skip = '0') then
johnson_ff_0 <= not johnson_ff_1;
johnson_ff_1 <= johnson_ff_0;
-- Adjust johnson_counter_sync to show optimal value at 0
- PROC_ADC_SAMPLING_CLK_SYNC: process(NX_TIMESTAMP_CLK_IN)
+ PROC_ADC_SAMPLING_CLK_SYNC: process(NX_DATA_CLK_IN)
variable adc_sclk_state : std_logic_vector(1 downto 0);
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
+ if (rising_edge(NX_DATA_CLK_IN)) then
johnson_counter_sync <= std_logic_vector(johnson_counter_sync_r);
adc_sclk_state := johnson_ff_1 & johnson_ff_0;
adc_sclk_skip <= '0';
end if;
end process PROC_ADC_SAMPLING_CLK_SYNC;
- PROC_ADC_RESET: process(NX_TIMESTAMP_CLK_IN)
+ PROC_ADC_RESET: process(NX_DATA_CLK_IN)
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
- if (RESET_NX_TIMESTAMP_CLK_IN = '1') then
+ if (rising_edge(NX_DATA_CLK_IN)) then
+ if (RESET_NX_DATA_CLK_IN = '1') then
adc_sclk_ok_last <= '0';
adc_reset_sync_s <= '0';
else
-----------------------------------------------------------------------------
-- First use two FFs for NX_TIMESTAMP_IN
- nx_frame_word_ff <= NX_TIMESTAMP_IN when rising_edge(NX_TIMESTAMP_CLK_IN);
- nx_frame_word_f <= nx_frame_word_ff when rising_edge(NX_TIMESTAMP_CLK_IN);
+ nx_frame_word_ff <= NX_TIMESTAMP_IN when rising_edge(NX_DATA_CLK_IN);
+ nx_frame_word_f <= nx_frame_word_ff when rising_edge(NX_DATA_CLK_IN);
-- Second delay NX_TIMESTAMP_IN relatively to ADC Clock
dynamic_shift_register8x64_1: dynamic_shift_register8x64
port map (
Din => nx_frame_word_f,
Addr => nx_shift_register_delay,
- Clock => NX_TIMESTAMP_CLK_IN,
+ Clock => NX_DATA_CLK_IN,
ClockEn => '1',
- Reset => RESET_NX_TIMESTAMP_CLK_IN,
+ Reset => RESET_NX_DATA_CLK_IN,
Q => nx_frame_word_s
);
-- Timestamp Input Delay relative to ADC
- PROC_NX_SHIFT_REGISTER_DELAY: process(NX_TIMESTAMP_CLK_IN)
+ PROC_NX_SHIFT_REGISTER_DELAY: process(NX_DATA_CLK_IN)
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
+ if (rising_edge(NX_DATA_CLK_IN)) then
nx_timestamp_delay_f <= nx_timestamp_delay_s;
- if( RESET_NX_TIMESTAMP_CLK_IN = '1' ) then
+ if( RESET_NX_DATA_CLK_IN = '1' ) then
nx_timestamp_delay <= "010";
nx_shift_register_delay <= "011011"; -- 27
else
end process PROC_NX_SHIFT_REGISTER_DELAY;
-- Merge TS Data 8bit to 32Bit Timestamp Frame
- PROC_8_TO_32_BIT: process(NX_TIMESTAMP_CLK_IN)
+ PROC_8_TO_32_BIT: process(NX_DATA_CLK_IN)
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
+ if (rising_edge(NX_DATA_CLK_IN)) then
case frame_byte_pos is
when "11" => nx_frame_word_t(31 downto 24) <= nx_frame_word_s;
nx_frame_clk_t <= '0';
end process PROC_8_TO_32_BIT;
-- TS Frame Sync process
- PROC_SYNC_TO_NX_FRAME: process(NX_TIMESTAMP_CLK_IN)
+ PROC_SYNC_TO_NX_FRAME: process(NX_DATA_CLK_IN)
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
- if( RESET_NX_TIMESTAMP_CLK_IN = '1' ) then
+ if (rising_edge(NX_DATA_CLK_IN)) then
+ if( RESET_NX_DATA_CLK_IN = '1' ) then
frame_byte_pos <= "11";
rs_sync_set <= '0';
rs_sync_reset <= '0';
end process PROC_SYNC_TO_NX_FRAME;
-- RS FlipFlop to hold Sync Status
- PROC_RS_FRAME_SYNCED: process(NX_TIMESTAMP_CLK_IN)
+ PROC_RS_FRAME_SYNCED: process(NX_DATA_CLK_IN)
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
- if (RESET_NX_TIMESTAMP_CLK_IN = '1') then
+ if (rising_edge(NX_DATA_CLK_IN)) then
+ if (RESET_NX_DATA_CLK_IN = '1') then
nx_frame_synced <= '0';
else
if (rs_sync_reset = '1') then
end process PROC_RS_FRAME_SYNCED;
-- Check Parity Bit
- PROC_PARITY_CHECKER: process(NX_TIMESTAMP_CLK_IN)
+ PROC_PARITY_CHECKER: process(NX_DATA_CLK_IN)
variable parity_bits : std_logic_vector(22 downto 0);
variable parity : std_logic;
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
- if (RESET_NX_TIMESTAMP_CLK_IN = '1') then
+ if (rising_edge(NX_DATA_CLK_IN)) then
+ if (RESET_NX_DATA_CLK_IN = '1') then
parity_error <= '0';
else
if (nx_frame_clk = '1') then
-----------------------------------------------------------------------------
-- Delay NX Timestamp relative to ADC Frames
-----------------------------------------------------------------------------
- PROC_NX_TIMESTAMP_FRAME_DELAY: process(NX_TIMESTAMP_CLK_IN)
+ PROC_NX_TIMESTAMP_FRAME_DELAY: process(NX_DATA_CLK_IN)
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
+ if (rising_edge(NX_DATA_CLK_IN)) then
nx_frame_word_delayed_t(0) <= nx_frame_word;
nx_frame_clk_delayed_t(0) <= nx_frame_clk;
end if;
end process PROC_NX_TIMESTAMP_FRAME_DELAY;
- PROC_NX_FRAME_WORD_DELAY_AUTO_SETUP: process(NX_TIMESTAMP_CLK_IN)
+ PROC_NX_FRAME_WORD_DELAY_AUTO_SETUP: process(NX_DATA_CLK_IN)
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
+ if (rising_edge(NX_DATA_CLK_IN)) then
nx_frame_word_delay <= nx_frame_word_delay_f;
adc_data_clk_last(0) <= adc_data_s_clk;
- if (RESET_NX_TIMESTAMP_CLK_IN = '1') then
+ if (RESET_NX_DATA_CLK_IN = '1') then
nx_frame_word_delay_f <= "10";
adc_data_clk_last(3 downto 1) <= (others => '0');
frame_word_delay_change <= '0';
-----------------------------------------------------------------------------
adc_reset_handler_cnx_ff <= adc_reset_handler
- when rising_edge(NX_TIMESTAMP_CLK_IN);
+ when rising_edge(NX_DATA_CLK_IN);
adc_reset_handler_cnx_f <= adc_reset_handler_cnx_ff
- when rising_edge(NX_TIMESTAMP_CLK_IN);
+ when rising_edge(NX_DATA_CLK_IN);
adc_reset_handler_cnx <= adc_reset_handler_cnx_f
- when rising_edge(NX_TIMESTAMP_CLK_IN);
+ when rising_edge(NX_DATA_CLK_IN);
- ADC_RESET_AD9228 <= RESET_NX_TIMESTAMP_CLK_IN or
+ ADC_RESET_AD9228 <= RESET_NX_DATA_CLK_IN or
adc_reset_handler_cnx;
adc_debug_type_f <= adc_debug_type_r
- when rising_edge(NX_TIMESTAMP_CLK_IN);
+ when rising_edge(NX_DATA_CLK_IN);
adc_debug_type <= adc_debug_type_f
- when rising_edge(NX_TIMESTAMP_CLK_IN);
+ when rising_edge(NX_DATA_CLK_IN);
adc_ad9228_1: adc_ad9228
generic map (
DEBUG_ENABLE => false
)
port map (
- CLK_IN => NX_TIMESTAMP_CLK_IN,
+ CLK_IN => NX_DATA_CLK_IN,
RESET_IN => ADC_RESET_AD9228,
CLK_ADCDAT_IN => ADC_CLK_DAT_IN,
ERROR_ADC0_OUT => adc_error_i,
ERROR_ADC1_OUT => open,
+
+ ERROR_UNDEF_ADC0_OUT => adc_error_undef_i,
+ ERROR_UNDEF_ADC1_OUT => open,
+
DEBUG_IN => adc_debug_type,
DEBUG_OUT => ADC_DEBUG
);
- PROC_ADC_DATA_BIT_SHIFT: process(NX_TIMESTAMP_CLK_IN)
+ PROC_ADC_DATA_BIT_SHIFT: process(NX_DATA_CLK_IN)
variable adcval : unsigned(11 downto 0) := (others => '0');
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
+ if (rising_edge(NX_DATA_CLK_IN)) then
if (adc_bit_shift(3) = '1') then
adcval := unsigned(adc_data) rol
to_integer(adc_bit_shift(2 downto 0));
-- Merge Data Streams Timestamps and ADC Value
-----------------------------------------------------------------------------
merge_handler_reset_i <= output_handler_reset
- when rising_edge(NX_TIMESTAMP_CLK_IN);
+ when rising_edge(NX_DATA_CLK_IN);
merge_handler_reset <= merge_handler_reset_i
- when rising_edge(NX_TIMESTAMP_CLK_IN);
- disable_adc_f <= disable_adc_r when rising_edge(NX_TIMESTAMP_CLK_IN);
- disable_adc <= disable_adc_f when rising_edge(NX_TIMESTAMP_CLK_IN);
+ when rising_edge(NX_DATA_CLK_IN);
+ disable_adc_f <= disable_adc_r when rising_edge(NX_DATA_CLK_IN);
+ disable_adc <= disable_adc_f when rising_edge(NX_DATA_CLK_IN);
- PROC_DATA_MERGE_HANDLER: process(NX_TIMESTAMP_CLK_IN)
+ PROC_DATA_MERGE_HANDLER: process(NX_DATA_CLK_IN)
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
- if (RESET_NX_TIMESTAMP_CLK_IN = '1' or merge_handler_reset = '1') then
+ if (rising_edge(NX_DATA_CLK_IN)) then
+ if (RESET_NX_DATA_CLK_IN = '1' or merge_handler_reset = '1') then
merge_timeout_ctr <= (others => '0');
merge_timeout_error <= '0';
merge_error_ctr <= (others => '0');
fifo_data_stream_44to44_dc_1: fifo_data_stream_44to44_dc
port map (
Data => data_frame,
- WrClock => NX_TIMESTAMP_CLK_IN,
+ WrClock => NX_DATA_CLK_IN,
RdClock => CLK_IN,
WrEn => fifo_write_enable,
RdEn => fifo_read_enable,
CLK_RATIO => 3
)
port map (
- CLK_A_IN => NX_TIMESTAMP_CLK_IN,
- RESET_A_IN => RESET_NX_TIMESTAMP_CLK_IN,
+ CLK_A_IN => NX_DATA_CLK_IN,
+ RESET_A_IN => RESET_NX_DATA_CLK_IN,
PULSE_A_IN => rs_sync_reset,
CLK_B_IN => CLK_IN,
RESET_B_IN => RESET_IN,
CLK_RATIO => 2
)
port map (
- CLK_A_IN => NX_TIMESTAMP_CLK_IN,
- RESET_A_IN => RESET_NX_TIMESTAMP_CLK_IN,
+ CLK_A_IN => NX_DATA_CLK_IN,
+ RESET_A_IN => RESET_NX_DATA_CLK_IN,
PULSE_A_IN => adc_dt_error_p,
CLK_B_IN => CLK_IN,
RESET_B_IN => RESET_IN,
CLK_RATIO => 2
)
port map (
- CLK_A_IN => NX_TIMESTAMP_CLK_IN,
- RESET_A_IN => RESET_NX_TIMESTAMP_CLK_IN,
+ CLK_A_IN => NX_DATA_CLK_IN,
+ RESET_A_IN => RESET_NX_DATA_CLK_IN,
PULSE_A_IN => timestamp_dt_error_p,
CLK_B_IN => CLK_IN,
RESET_B_IN => RESET_IN,
end if;
end process PROC_EVENT_ERRORS_PER_SECOND;
- PROC_DATA_STREAM_DELTA_T: process(NX_TIMESTAMP_CLK_IN)
+ PROC_DATA_STREAM_DELTA_T: process(NX_DATA_CLK_IN)
begin
- if (rising_edge(NX_TIMESTAMP_CLK_IN)) then
- if (RESET_NX_TIMESTAMP_CLK_IN = '1') then
+ if (rising_edge(NX_DATA_CLK_IN)) then
+ if (RESET_NX_DATA_CLK_IN = '1') then
new_adc_dt_ctr <= (others => '0');
new_timestamp_dt_ctr <= (others => '0');
new_adc_dt_error_ctr <= (others => '0');
CLK_RATIO => 2
)
port map (
- CLK_A_IN => NX_TIMESTAMP_CLK_IN,
- RESET_A_IN => RESET_NX_TIMESTAMP_CLK_IN,
+ CLK_A_IN => NX_DATA_CLK_IN,
+ RESET_A_IN => RESET_NX_DATA_CLK_IN,
PULSE_A_IN => adc_error_i,
CLK_B_IN => CLK_IN,
RESET_B_IN => RESET_IN,
PULSE_B_OUT => adc_error
);
+ pulse_dtrans_ADC_ERROR_UNDEF: pulse_dtrans
+ generic map (
+ CLK_RATIO => 2
+ )
+ port map (
+ CLK_A_IN => NX_DATA_CLK_IN,
+ RESET_A_IN => RESET_NX_DATA_CLK_IN,
+ PULSE_A_IN => adc_error_undef_i,
+ CLK_B_IN => CLK_IN,
+ RESET_B_IN => RESET_IN,
+ PULSE_B_OUT => adc_error_undef
+ );
+
PROC_ERROR_STATUS: process(CLK_IN)
variable error_mask : std_logic_vector(15 downto 0);
begin
if (rising_edge(CLK_IN)) then
- adc_sclk_ok_f <= adc_sclk_ok;
+ adc_sclk_ok_f <= adc_sclk_ok;
if (RESET_IN = '1') then
- adc_sclk_ok_c100 <= '0';
- error_status_bits <= (others => '0');
- error_o <= '0';
- adc_notlock_counter <= (others => '0');
- adc_error_counter <= (others => '0');
+ adc_sclk_ok_c100 <= '0';
+ error_status_bits <= (others => '0');
+ error_o <= '0';
+ adc_notlock_counter <= (others => '0');
+ adc_error_counter <= (others => '0');
+ adc_error_undef_counter <= (others => '0');
else
adc_sclk_ok_c100 <= adc_sclk_ok_f;
adc_error_counter <= adc_error_counter + 1;
end if;
+ if (adc_error_undef = '1') then
+ adc_error_undef_counter <= adc_error_undef_counter + 1;
+ end if;
+
end if;
end if;
end process PROC_ERROR_STATUS;
fifo_full_rr <= fifo_full;
fifo_empty_rr <= fifo_empty;
nx_frame_synced_rr <= nx_frame_synced;
+ nx_frame_word_delay_rr <= nx_frame_word_delay_f;
+
if (RESET_IN = '1') then
fifo_full_r <= '0';
fifo_empty_r <= '0';
new_timestamp_dt_error_ctr_r <= (others => '0');
adc_notlock_ctr_r <= (others => '0');
merge_error_ctr_r <= (others => '0');
+ nx_frame_word_delay_r <= (others => '0');
else
fifo_full_r <= fifo_full_rr;
fifo_empty_r <= fifo_empty_rr;
new_timestamp_dt_error_ctr_r <= new_timestamp_dt_error_ctr;
adc_notlock_ctr_r <= adc_notlock_ctr;
merge_error_ctr_r <= merge_error_ctr;
+ nx_frame_word_delay_r <= nx_frame_word_delay_rr;
end if;
end if;
end process PROC_SLAVE_BUS_BUFFER;
when x"0010" =>
slv_data_out_o(2 downto 0) <=
std_logic_vector(nx_timestamp_delay_s);
+ slv_data_out_o(3) <= '0';
slv_data_out_o(5 downto 4) <=
std_logic_vector(nx_frame_word_delay_r);
slv_data_out_o(14 downto 6) <= (others => '0');
slv_data_out_o(31 downto 28) <= (others => '0');
slv_ack_o <= '1';
+ when x"0018" =>
+ slv_data_out_o(27 downto 0) <=
+ std_logic_vector(adc_error_undef_counter);
+ slv_data_out_o(31 downto 28) <= (others => '0');
+ slv_ack_o <= '1';
+
when x"001e" =>
slv_data_out_o(2 downto 0) <= debug_mode;
slv_data_out_o(31 downto 3) <= (others => '0');