From: hadaq Date: Wed, 20 Mar 2013 19:43:35 +0000 (+0000) Subject: nx timestamp window filter added X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=1ac31716902cd1038334540fb673653ffb2f8840;p=trb3.git nx timestamp window filter added --- diff --git a/nxyter/source/nx_timestamp_process.vhd b/nxyter/source/nx_timestamp_process.vhd new file mode 100644 index 0000000..b87c531 --- /dev/null +++ b/nxyter/source/nx_timestamp_process.vhd @@ -0,0 +1,816 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library work; +use work.trb_net_std.all; +use work.nxyter_components.all; + +entity nx_timestamp_process is + port ( + CLK_IN : in std_logic; + RESET_IN : in std_logic; + + -- Inputs + TIMESTAMP_CLK_IN : in std_logic; + NX_TOKEN_RETURN_IN : in std_logic; + NX_NOMORE_DATA_IN : in std_logic; + TIMESTAMP_IN : in unsigned(13 downto 0); + CHANNEL_IN : in unsigned(6 downto 0); + TIMESTAMP_STATUS_IN : in std_logic_vector(1 downto 0); + TIMESTAMP_REF_IN : in unsigned(11 downto 0); + TRIGGER_IN : in std_logic; + + -- Outputs + PROCESS_BUSY_OUT : out std_logic; + DATA_OUT : out std_logic_vector(31 downto 0); + DATA_CLK_OUT : out std_logic; + DATA_FIFO_RESET_OUT : out std_logic; + + -- Slave bus + SLV_READ_IN : in std_logic; + SLV_WRITE_IN : in std_logic; + SLV_DATA_OUT : out std_logic_vector(31 downto 0); + SLV_DATA_IN : in std_logic_vector(31 downto 0); + SLV_ADDR_IN : in std_logic_vector(15 downto 0); + SLV_ACK_OUT : out std_logic; + SLV_NO_MORE_DATA_OUT : out std_logic; + SLV_UNKNOWN_ADDR_OUT : out std_logic; + + DEBUG_OUT : out std_logic_vector(15 downto 0) + ); + +end entity; + +architecture Behavioral of nx_timestamp_process is + + -- Sync Ref + signal timestamp_ref_x : unsigned(11 downto 0); + signal timestamp_ref : unsigned(11 downto 0); + + -- Process Channel_Status + signal channel_index : unsigned(6 downto 0); + signal channel_wait : unsigned(127 downto 0); + signal channel_done : unsigned(127 downto 0); + signal channel_all_done : std_logic; + + type CS_CMDS is (CS_RESET, + CS_TOKEN_UPDATE, + CS_SET_WAIT, + CS_SET_DONE, + CS_NONE + ); + signal channel_status_cmd : CS_CMDS; + + -- Process Timestamp + signal data_o : std_logic_vector(31 downto 0); + signal data_clk_o : std_logic; + signal out_of_window_l : std_logic; + signal out_of_window_h : std_logic; + signal ch_status_cmd_pr : CS_CMDS; + + -- Process Trigger Handler + signal store_to_fifo : std_logic; + signal store_to_fifo_x : std_logic; + signal data_fifo_reset_o : std_logic; + signal data_fifo_reset_o_x : std_logic; + signal process_busy_o : std_logic; + signal process_busy_o_x : std_logic; + signal wait_timer_init : unsigned(11 downto 0); + signal wait_timer_init_x : unsigned(11 downto 0); + signal token_return_ctr : unsigned(3 downto 0); + signal token_return_ctr_x : unsigned(3 downto 0); + signal ch_status_cmd_tr : CS_CMDS; + signal ch_status_cmd_tr_x : CS_CMDS; + + type STATES is (S_IDLE, + S_TRIGGER, + S_WAIT_DATA, + S_PROCESS_START, + S_WAIT_PROCESS_END, + S_WRITE_TRAILER + ); + signal STATE, NEXT_STATE : STATES; + + signal t_data_o : std_logic_vector(31 downto 0); + signal t_data_o_x : std_logic_vector(31 downto 0); + signal t_data_clk_o : std_logic; + signal t_data_clk_o_x : std_logic; + + signal busy_time_ctr : unsigned(11 downto 0); + signal busy_time_ctr_x : unsigned(11 downto 0); + + -- Timer + signal wait_timer_done : std_logic; + + -- Slave Bus + signal slv_data_out_o : std_logic_vector(31 downto 0); + signal slv_no_more_data_o : std_logic; + signal slv_unknown_addr_o : std_logic; + signal slv_ack_o : std_logic; + + signal readout_mode : std_logic_vector(3 downto 0); + signal trigger_window_width : unsigned(11 downto 0); + signal trigger_window_delay : unsigned(11 downto 0); + signal readout_time_max : unsigned(11 downto 0); + +begin + + -- Debug Line + DEBUG_OUT(0) <= store_to_fifo; + DEBUG_OUT(1) <= data_fifo_reset_o; + DEBUG_OUT(2) <= process_busy_o; + DEBUG_OUT(3) <= channel_all_done; + DEBUG_OUT(4) <= data_clk_o; + DEBUG_OUT(5) <= t_data_clk_o; + DEBUG_OUT(6) <= out_of_window_l; + DEBUG_OUT(7) <= out_of_window_h; + DEBUG_OUT(14 downto 8) <= (others => '0'); + + -- Timer + nx_timer_1: nx_timer + generic map( + CTR_WIDTH => 12 + ) + port map ( + CLK_IN => CLK_IN, + RESET_IN => RESET_IN, + TIMER_START_IN => wait_timer_init, + TIMER_DONE_OUT => wait_timer_done + ); + + -- Sync Timestamp Ref + PROC_SYNC_TIMESTAMP_REF: process (CLK_IN) + begin + if( rising_edge(CLK_IN) ) then + if (RESET_IN = '1') then + timestamp_ref_x <= (others => '0'); + timestamp_ref <= (others => '0'); + else + timestamp_ref_x <= TIMESTAMP_REF_IN; + timestamp_ref <= timestamp_ref_x; + end if; + end if; + end process PROC_SYNC_TIMESTAMP_REF; + + ----------------------------------------------------------------------------- + -- Filter only valid events + ----------------------------------------------------------------------------- + + PROC_PROCESS_TIMESTAMP: process (CLK_IN) + variable ts_ref : unsigned(11 downto 0); + variable window_lower_thr : unsigned(11 downto 0); + variable window_upper_thr : unsigned(11 downto 0); + variable deltaT : unsigned(11 downto 0); + + begin + if( rising_edge(CLK_IN) ) then + if (RESET_IN = '1') then + data_o <= (others => '0'); + data_clk_o <= '0'; + out_of_window_l <= '0'; + out_of_window_h <= '0'; + else + data_o <= (others => '0'); + data_clk_o <= '0'; + out_of_window_l <= '0'; + out_of_window_h <= '0'; + ch_status_cmd_pr <= CS_NONE; + + if (store_to_fifo = '1' and TIMESTAMP_CLK_IN = '1') then + ts_ref := timestamp_ref - x"010"; + window_lower_thr := trigger_window_delay; + window_upper_thr := window_lower_thr + trigger_window_width; + deltaT := TIMESTAMP_IN(13 downto 2) - ts_ref; + + case readout_mode is + + when x"0" => -- RefValue + valid and window filter + if (TIMESTAMP_STATUS_IN(0) = '0') then + if (deltaT < window_lower_thr) then + out_of_window_l <= '1'; + data_clk_o <= '0'; + -- IN LUT-Data bit setzten. + channel_index <= CHANNEL_IN; + ch_status_cmd_pr <= CS_SET_WAIT; + elsif (deltaT > window_upper_thr) then + out_of_window_h <= '1'; + data_clk_o <= '0'; + -- In LUT-Done Bit setzten + channel_index <= CHANNEL_IN; + ch_status_cmd_pr <= CS_SET_DONE; + else + --data_o( 1 downto 0) <= TIMESTAMP_IN(1 downto 0); + data_o(11 downto 0) <= deltaT; + data_o(15 downto 12) <= (others => '0'); + data_o(22 downto 16) <= CHANNEL_IN; + data_o(27 downto 23) <= (others => '0'); + data_o(29 downto 28) <= TIMESTAMP_STATUS_IN; + data_o(31 downto 30) <= (others => '0'); + data_clk_o <= '1'; + -- IN LUT-Data bit setzten. + channel_index <= CHANNEL_IN; + ch_status_cmd_pr <= CS_SET_WAIT; + end if; + end if; + + when x"1" => -- RefValue + valid filter + if (TIMESTAMP_STATUS_IN(0) = '0') then + --data_o( 1 downto 0) <= TIMESTAMP_IN(1 downto 0); + data_o(11 downto 0) <= deltaT; + data_o(15 downto 12) <= (others => '0'); + data_o(22 downto 16) <= CHANNEL_IN; + data_o(27 downto 23) <= (others => '0'); + data_o(29 downto 28) <= TIMESTAMP_STATUS_IN; + data_o(31 downto 30) <= (others => '0'); + data_clk_o <= '1'; + end if; + + when x"3" => -- RefValue + valid filter + if (TIMESTAMP_STATUS_IN(0) = '0') then + data_o(11 downto 0) <= TIMESTAMP_IN(13 downto 2); + data_o(13 downto 12) <= (others => '0'); + data_o(15 downto 14) <= (others => '0'); + data_o(27 downto 16) <= ts_ref; + data_o(31 downto 28) <= (others => '0'); + data_clk_o <= '1'; + end if; + + when x"4" => -- RawValue + data_o(13 downto 0) <= TIMESTAMP_IN; + data_o(15 downto 14) <= (others => '0'); + data_o(22 downto 16) <= CHANNEL_IN; + data_o(27 downto 23) <= (others => '0'); + data_o(29 downto 28) <= TIMESTAMP_STATUS_IN; + data_o(31 downto 30) <= (others => '0'); + data_clk_o <= '1'; + + when x"5" => -- RawValue + valid filter + if (TIMESTAMP_STATUS_IN(0) = '0') then + data_o(13 downto 0) <= TIMESTAMP_IN; + data_o(15 downto 14) <= (others => '0'); + data_o(22 downto 16) <= CHANNEL_IN; + data_o(27 downto 23) <= (others => '0'); + data_o(29 downto 28) <= TIMESTAMP_STATUS_IN; + data_o(31 downto 30) <= (others => '0'); + data_clk_o <= '1'; + end if; + + when others => null; + + end case; + + end if; + end if; + end if; + end process PROC_PROCESS_TIMESTAMP; + + ----------------------------------------------------------------------------- + -- Trigger Handler + ----------------------------------------------------------------------------- + + PROC_TRIGGER_HANDLER_TRANSFER: process(CLK_IN) + begin + + if( rising_edge(CLK_IN) ) then + if (RESET_IN = '1') then + store_to_fifo <= '0'; + data_fifo_reset_o <= '0'; + process_busy_o <= '0'; + wait_timer_init <= (others => '0'); + t_data_o <= (others => '0'); + t_data_clk_o <= '0'; + busy_time_ctr <= (others => '0'); + token_return_ctr <= (others => '0'); + ch_status_cmd_tr <= CS_RESET; + STATE <= S_IDLE; + else + store_to_fifo <= store_to_fifo_x; + data_fifo_reset_o <= data_fifo_reset_o_x; + process_busy_o <= process_busy_o_x; + wait_timer_init <= wait_timer_init_x; + t_data_o <= t_data_o_x; + t_data_clk_o <= t_data_clk_o_x; + busy_time_ctr <= busy_time_ctr_x; + token_return_ctr <= token_return_ctr_x; + ch_status_cmd_tr <= ch_status_cmd_tr_x; + STATE <= NEXT_STATE; + end if; + end if; + end process PROC_TRIGGER_HANDLER_TRANSFER; + + + PROC_TRIGGER_HANDLER: process(TRIGGER_IN) + begin + store_to_fifo_x <= '0'; + data_fifo_reset_o_x <= '0'; + wait_timer_init_x <= (others => '0'); + process_busy_o_x <= '1'; + t_data_o_x <= (others => '0'); + t_data_clk_o_x <= '0'; + token_return_ctr_x <= token_return_ctr; + ch_status_cmd_tr_x <= CS_NONE; + case STATE is + + when S_IDLE => + if (TRIGGER_IN = '1') then + busy_time_ctr_x <= (others => '0'); + NEXT_STATE <= S_TRIGGER; + else + process_busy_o_x <= '0'; + NEXT_STATE <= S_IDLE; + end if; + + when S_TRIGGER => + ch_status_cmd_tr_x <= CS_RESET; + data_fifo_reset_o_x <= '1'; + wait_timer_init_x <= x"020"; -- wait 320ns for first event + NEXT_STATE <= S_WAIT_DATA; + + when S_WAIT_DATA => + if (wait_timer_done = '0') then + NEXT_STATE <= S_WAIT_DATA; + else + NEXT_STATE <= S_PROCESS_START; + end if; + + when S_PROCESS_START => + token_return_ctr_x <= (others => '0'); + wait_timer_init_x <= readout_time_max; + store_to_fifo_x <= '1'; + NEXT_STATE <= S_WAIT_PROCESS_END; + + when S_WAIT_PROCESS_END => + if (wait_timer_done = '1' or + channel_all_done = '1' or + NX_NOMORE_DATA_IN = '1') then + NEXT_STATE <= S_WRITE_TRAILER; + else + store_to_fifo_x <= '1'; + NEXT_STATE <= S_WAIT_PROCESS_END; + + -- Check Token_Return + if (readout_mode = x"0" and NX_TOKEN_RETURN_IN = '1') then + if (token_return_ctr > 0) then + ch_status_cmd_tr_x <= CS_TOKEN_UPDATE; + end if; + token_return_ctr_x <= token_return_ctr + 1; + end if; + end if; + + when S_WRITE_TRAILER => + t_data_o_x <= x"deadaffe"; + t_data_clk_o_x <= '1'; + ch_status_cmd_tr_x <= CS_RESET; + NEXT_STATE <= S_IDLE; + + end case; + + if (STATE /= S_IDLE) then + busy_time_ctr_x <= busy_time_ctr + 1; + end if; + + end process PROC_TRIGGER_HANDLER; + + ----------------------------------------------------------------------------- + -- TRBNet Slave Bus + ----------------------------------------------------------------------------- + + -- Give status info to the TRB Slow Control Channel + PROC_FIFO_REGISTERS: process(CLK_IN) + begin + if( rising_edge(CLK_IN) ) then + if( RESET_IN = '1' ) then + slv_data_out_o <= (others => '0'); + slv_ack_o <= '0'; + slv_unknown_addr_o <= '0'; + slv_no_more_data_o <= '0'; + readout_mode <= "0000"; + trigger_window_delay <= (others => '0'); + trigger_window_width <= x"020"; + readout_time_max <= x"640"; + else + slv_data_out_o <= (others => '0'); + slv_unknown_addr_o <= '0'; + slv_no_more_data_o <= '0'; + + if (SLV_READ_IN = '1') then + case SLV_ADDR_IN is + when x"0000" => + slv_data_out_o(3 downto 0) <= readout_mode; + slv_data_out_o(31 downto 4) <= (others => '0'); + slv_ack_o <= '1'; + + when x"0001" => + slv_data_out_o(11 downto 0) <= + std_logic_vector(trigger_window_delay); + slv_data_out_o(31 downto 12) <= (others => '0'); + slv_ack_o <= '1'; + + when x"0002" => + slv_data_out_o(11 downto 0) <= + std_logic_vector(trigger_window_width); + slv_data_out_o(31 downto 12) <= (others => '0'); + slv_ack_o <= '1'; + + when x"0003" => + slv_data_out_o(11 downto 0) <= + std_logic_vector(readout_time_max); + slv_data_out_o(31 downto 12) <= (others => '0'); + slv_ack_o <= '1'; + + when x"0004" => + slv_data_out_o(11 downto 0) <= + std_logic_vector(busy_time_ctr); + slv_data_out_o(31 downto 12) <= (others => '0'); + slv_ack_o <= '1'; + + when x"0005" => + slv_data_out_o <= + std_logic_vector(channel_done(31 downto 0)); + slv_ack_o <= '1'; + when x"0006" => + slv_data_out_o <= + std_logic_vector(channel_done(63 downto 32)); + slv_ack_o <= '1'; + when x"0007" => + slv_data_out_o <= + std_logic_vector(channel_done(95 downto 64)); + slv_ack_o <= '1'; + when x"0008" => + slv_data_out_o <= + std_logic_vector(channel_done(127 downto 96)); + slv_ack_o <= '1'; + + when others => + slv_unknown_addr_o <= '1'; + slv_ack_o <= '0'; + + end case; + + elsif (SLV_WRITE_IN = '1') then + case SLV_ADDR_IN is + when x"0000" => + readout_mode <= SLV_DATA_IN(3 downto 0); + slv_ack_o <= '1'; + + when x"0001" => + trigger_window_delay <= SLV_DATA_IN(11 downto 0); + slv_ack_o <= '1'; + + when x"0002" => + trigger_window_width <= + unsigned(SLV_DATA_IN(11 downto 0)); + slv_ack_o <= '1'; + + when x"0003" => + readout_time_max <= + unsigned(SLV_DATA_IN(11 downto 0)); + slv_ack_o <= '1'; + + when others => + slv_unknown_addr_o <= '1'; + slv_ack_o <= '0'; + end case; + else + slv_ack_o <= '0'; + end if; + end if; + end if; + end process PROC_FIFO_REGISTERS; + + ----------------------------------------------------------------------------- + -- Output Signals + ----------------------------------------------------------------------------- + + PROCESS_BUSY_OUT <= process_busy_o; + DATA_OUT <= data_o or t_data_o; + DATA_CLK_OUT <= data_clk_o or t_data_clk_o; + DATA_FIFO_RESET_OUT <= data_fifo_reset_o; + + -- Slave + SLV_DATA_OUT <= slv_data_out_o; + SLV_NO_MORE_DATA_OUT <= slv_no_more_data_o; + SLV_UNKNOWN_ADDR_OUT <= slv_unknown_addr_o; + SLV_ACK_OUT <= slv_ack_o; + + +------------------------------------------------------------------------------- +-- Channel Sttaus Handler +------------------------------------------------------------------------------- + PROC_CHANNEL_STATUS_CMD: process(ch_status_cmd_tr, + ch_status_cmd_pr) + begin + if (ch_status_cmd_tr /= CS_NONE) then + channel_status_cmd <= ch_status_cmd_tr; + elsif (ch_status_cmd_pr /= CS_NONE) then + channel_status_cmd <= ch_status_cmd_pr; + else + channel_status_cmd <= CS_NONE; + end if; + end process PROC_CHANNEL_STATUS_CMD; + + PROC_CHANNEL_STATUS: process(CLK_IN) + constant all_one : unsigned(127 downto 0) := (others => '1'); + + begin + if( rising_edge(CLK_IN) ) then + if( RESET_IN = '1') then + channel_wait <= (others => '0'); + channel_done <= (others => '0'); + channel_all_done <= '0'; + + else + -- Check done status + if (channel_done = all_one) then + channel_all_done <= '1'; + end if; + + -- Process Command + case channel_status_cmd is + + when CS_RESET => + channel_wait <= (others => '0'); + channel_done <= (others => '0'); + channel_all_done <= '0'; + + when CS_TOKEN_UPDATE => + channel_done <= channel_done or (not channel_wait); + channel_wait <= (others => '0'); + + when CS_SET_WAIT => + case channel_index is + + when "0000000" => channel_wait(0) <= '1'; + when "0000001" => channel_wait(1) <= '1'; + when "0000010" => channel_wait(2) <= '1'; + when "0000011" => channel_wait(3) <= '1'; + when "0000100" => channel_wait(4) <= '1'; + when "0000101" => channel_wait(5) <= '1'; + when "0000110" => channel_wait(6) <= '1'; + when "0000111" => channel_wait(7) <= '1'; + when "0001000" => channel_wait(8) <= '1'; + when "0001001" => channel_wait(9) <= '1'; + when "0001010" => channel_wait(10) <= '1'; + when "0001011" => channel_wait(11) <= '1'; + when "0001100" => channel_wait(12) <= '1'; + when "0001101" => channel_wait(13) <= '1'; + when "0001110" => channel_wait(14) <= '1'; + when "0001111" => channel_wait(15) <= '1'; + when "0010000" => channel_wait(16) <= '1'; + when "0010001" => channel_wait(17) <= '1'; + when "0010010" => channel_wait(18) <= '1'; + when "0010011" => channel_wait(19) <= '1'; + when "0010100" => channel_wait(20) <= '1'; + when "0010101" => channel_wait(21) <= '1'; + when "0010110" => channel_wait(22) <= '1'; + when "0010111" => channel_wait(23) <= '1'; + when "0011000" => channel_wait(24) <= '1'; + when "0011001" => channel_wait(25) <= '1'; + when "0011010" => channel_wait(26) <= '1'; + when "0011011" => channel_wait(27) <= '1'; + when "0011100" => channel_wait(28) <= '1'; + when "0011101" => channel_wait(29) <= '1'; + when "0011110" => channel_wait(30) <= '1'; + when "0011111" => channel_wait(31) <= '1'; + when "0100000" => channel_wait(32) <= '1'; + when "0100001" => channel_wait(33) <= '1'; + when "0100010" => channel_wait(34) <= '1'; + when "0100011" => channel_wait(35) <= '1'; + when "0100100" => channel_wait(36) <= '1'; + when "0100101" => channel_wait(37) <= '1'; + when "0100110" => channel_wait(38) <= '1'; + when "0100111" => channel_wait(39) <= '1'; + when "0101000" => channel_wait(40) <= '1'; + when "0101001" => channel_wait(41) <= '1'; + when "0101010" => channel_wait(42) <= '1'; + when "0101011" => channel_wait(43) <= '1'; + when "0101100" => channel_wait(44) <= '1'; + when "0101101" => channel_wait(45) <= '1'; + when "0101110" => channel_wait(46) <= '1'; + when "0101111" => channel_wait(47) <= '1'; + when "0110000" => channel_wait(48) <= '1'; + when "0110001" => channel_wait(49) <= '1'; + when "0110010" => channel_wait(50) <= '1'; + when "0110011" => channel_wait(51) <= '1'; + when "0110100" => channel_wait(52) <= '1'; + when "0110101" => channel_wait(53) <= '1'; + when "0110110" => channel_wait(54) <= '1'; + when "0110111" => channel_wait(55) <= '1'; + when "0111000" => channel_wait(56) <= '1'; + when "0111001" => channel_wait(57) <= '1'; + when "0111010" => channel_wait(58) <= '1'; + when "0111011" => channel_wait(59) <= '1'; + when "0111100" => channel_wait(60) <= '1'; + when "0111101" => channel_wait(61) <= '1'; + when "0111110" => channel_wait(62) <= '1'; + when "0111111" => channel_wait(63) <= '1'; + when "1000000" => channel_wait(64) <= '1'; + when "1000001" => channel_wait(65) <= '1'; + when "1000010" => channel_wait(66) <= '1'; + when "1000011" => channel_wait(67) <= '1'; + when "1000100" => channel_wait(68) <= '1'; + when "1000101" => channel_wait(69) <= '1'; + when "1000110" => channel_wait(70) <= '1'; + when "1000111" => channel_wait(71) <= '1'; + when "1001000" => channel_wait(72) <= '1'; + when "1001001" => channel_wait(73) <= '1'; + when "1001010" => channel_wait(74) <= '1'; + when "1001011" => channel_wait(75) <= '1'; + when "1001100" => channel_wait(76) <= '1'; + when "1001101" => channel_wait(77) <= '1'; + when "1001110" => channel_wait(78) <= '1'; + when "1001111" => channel_wait(79) <= '1'; + when "1010000" => channel_wait(80) <= '1'; + when "1010001" => channel_wait(81) <= '1'; + when "1010010" => channel_wait(82) <= '1'; + when "1010011" => channel_wait(83) <= '1'; + when "1010100" => channel_wait(84) <= '1'; + when "1010101" => channel_wait(85) <= '1'; + when "1010110" => channel_wait(86) <= '1'; + when "1010111" => channel_wait(87) <= '1'; + when "1011000" => channel_wait(88) <= '1'; + when "1011001" => channel_wait(89) <= '1'; + when "1011010" => channel_wait(90) <= '1'; + when "1011011" => channel_wait(91) <= '1'; + when "1011100" => channel_wait(92) <= '1'; + when "1011101" => channel_wait(93) <= '1'; + when "1011110" => channel_wait(94) <= '1'; + when "1011111" => channel_wait(95) <= '1'; + when "1100000" => channel_wait(96) <= '1'; + when "1100001" => channel_wait(97) <= '1'; + when "1100010" => channel_wait(98) <= '1'; + when "1100011" => channel_wait(99) <= '1'; + when "1100100" => channel_wait(100) <= '1'; + when "1100101" => channel_wait(101) <= '1'; + when "1100110" => channel_wait(102) <= '1'; + when "1100111" => channel_wait(103) <= '1'; + when "1101000" => channel_wait(104) <= '1'; + when "1101001" => channel_wait(105) <= '1'; + when "1101010" => channel_wait(106) <= '1'; + when "1101011" => channel_wait(107) <= '1'; + when "1101100" => channel_wait(108) <= '1'; + when "1101101" => channel_wait(109) <= '1'; + when "1101110" => channel_wait(110) <= '1'; + when "1101111" => channel_wait(111) <= '1'; + when "1110000" => channel_wait(112) <= '1'; + when "1110001" => channel_wait(113) <= '1'; + when "1110010" => channel_wait(114) <= '1'; + when "1110011" => channel_wait(115) <= '1'; + when "1110100" => channel_wait(116) <= '1'; + when "1110101" => channel_wait(117) <= '1'; + when "1110110" => channel_wait(118) <= '1'; + when "1110111" => channel_wait(119) <= '1'; + when "1111000" => channel_wait(120) <= '1'; + when "1111001" => channel_wait(121) <= '1'; + when "1111010" => channel_wait(122) <= '1'; + when "1111011" => channel_wait(123) <= '1'; + when "1111100" => channel_wait(124) <= '1'; + when "1111101" => channel_wait(125) <= '1'; + when "1111110" => channel_wait(126) <= '1'; + when "1111111" => channel_wait(127) <= '1'; + + end case; + + when CS_SET_DONE => + case channel_index is + + when "0000000" => channel_done(0) <= '1'; + when "0000001" => channel_done(1) <= '1'; + when "0000010" => channel_done(2) <= '1'; + when "0000011" => channel_done(3) <= '1'; + when "0000100" => channel_done(4) <= '1'; + when "0000101" => channel_done(5) <= '1'; + when "0000110" => channel_done(6) <= '1'; + when "0000111" => channel_done(7) <= '1'; + when "0001000" => channel_done(8) <= '1'; + when "0001001" => channel_done(9) <= '1'; + when "0001010" => channel_done(10) <= '1'; + when "0001011" => channel_done(11) <= '1'; + when "0001100" => channel_done(12) <= '1'; + when "0001101" => channel_done(13) <= '1'; + when "0001110" => channel_done(14) <= '1'; + when "0001111" => channel_done(15) <= '1'; + when "0010000" => channel_done(16) <= '1'; + when "0010001" => channel_done(17) <= '1'; + when "0010010" => channel_done(18) <= '1'; + when "0010011" => channel_done(19) <= '1'; + when "0010100" => channel_done(20) <= '1'; + when "0010101" => channel_done(21) <= '1'; + when "0010110" => channel_done(22) <= '1'; + when "0010111" => channel_done(23) <= '1'; + when "0011000" => channel_done(24) <= '1'; + when "0011001" => channel_done(25) <= '1'; + when "0011010" => channel_done(26) <= '1'; + when "0011011" => channel_done(27) <= '1'; + when "0011100" => channel_done(28) <= '1'; + when "0011101" => channel_done(29) <= '1'; + when "0011110" => channel_done(30) <= '1'; + when "0011111" => channel_done(31) <= '1'; + when "0100000" => channel_done(32) <= '1'; + when "0100001" => channel_done(33) <= '1'; + when "0100010" => channel_done(34) <= '1'; + when "0100011" => channel_done(35) <= '1'; + when "0100100" => channel_done(36) <= '1'; + when "0100101" => channel_done(37) <= '1'; + when "0100110" => channel_done(38) <= '1'; + when "0100111" => channel_done(39) <= '1'; + when "0101000" => channel_done(40) <= '1'; + when "0101001" => channel_done(41) <= '1'; + when "0101010" => channel_done(42) <= '1'; + when "0101011" => channel_done(43) <= '1'; + when "0101100" => channel_done(44) <= '1'; + when "0101101" => channel_done(45) <= '1'; + when "0101110" => channel_done(46) <= '1'; + when "0101111" => channel_done(47) <= '1'; + when "0110000" => channel_done(48) <= '1'; + when "0110001" => channel_done(49) <= '1'; + when "0110010" => channel_done(50) <= '1'; + when "0110011" => channel_done(51) <= '1'; + when "0110100" => channel_done(52) <= '1'; + when "0110101" => channel_done(53) <= '1'; + when "0110110" => channel_done(54) <= '1'; + when "0110111" => channel_done(55) <= '1'; + when "0111000" => channel_done(56) <= '1'; + when "0111001" => channel_done(57) <= '1'; + when "0111010" => channel_done(58) <= '1'; + when "0111011" => channel_done(59) <= '1'; + when "0111100" => channel_done(60) <= '1'; + when "0111101" => channel_done(61) <= '1'; + when "0111110" => channel_done(62) <= '1'; + when "0111111" => channel_done(63) <= '1'; + when "1000000" => channel_done(64) <= '1'; + when "1000001" => channel_done(65) <= '1'; + when "1000010" => channel_done(66) <= '1'; + when "1000011" => channel_done(67) <= '1'; + when "1000100" => channel_done(68) <= '1'; + when "1000101" => channel_done(69) <= '1'; + when "1000110" => channel_done(70) <= '1'; + when "1000111" => channel_done(71) <= '1'; + when "1001000" => channel_done(72) <= '1'; + when "1001001" => channel_done(73) <= '1'; + when "1001010" => channel_done(74) <= '1'; + when "1001011" => channel_done(75) <= '1'; + when "1001100" => channel_done(76) <= '1'; + when "1001101" => channel_done(77) <= '1'; + when "1001110" => channel_done(78) <= '1'; + when "1001111" => channel_done(79) <= '1'; + when "1010000" => channel_done(80) <= '1'; + when "1010001" => channel_done(81) <= '1'; + when "1010010" => channel_done(82) <= '1'; + when "1010011" => channel_done(83) <= '1'; + when "1010100" => channel_done(84) <= '1'; + when "1010101" => channel_done(85) <= '1'; + when "1010110" => channel_done(86) <= '1'; + when "1010111" => channel_done(87) <= '1'; + when "1011000" => channel_done(88) <= '1'; + when "1011001" => channel_done(89) <= '1'; + when "1011010" => channel_done(90) <= '1'; + when "1011011" => channel_done(91) <= '1'; + when "1011100" => channel_done(92) <= '1'; + when "1011101" => channel_done(93) <= '1'; + when "1011110" => channel_done(94) <= '1'; + when "1011111" => channel_done(95) <= '1'; + when "1100000" => channel_done(96) <= '1'; + when "1100001" => channel_done(97) <= '1'; + when "1100010" => channel_done(98) <= '1'; + when "1100011" => channel_done(99) <= '1'; + when "1100100" => channel_done(100) <= '1'; + when "1100101" => channel_done(101) <= '1'; + when "1100110" => channel_done(102) <= '1'; + when "1100111" => channel_done(103) <= '1'; + when "1101000" => channel_done(104) <= '1'; + when "1101001" => channel_done(105) <= '1'; + when "1101010" => channel_done(106) <= '1'; + when "1101011" => channel_done(107) <= '1'; + when "1101100" => channel_done(108) <= '1'; + when "1101101" => channel_done(109) <= '1'; + when "1101110" => channel_done(110) <= '1'; + when "1101111" => channel_done(111) <= '1'; + when "1110000" => channel_done(112) <= '1'; + when "1110001" => channel_done(113) <= '1'; + when "1110010" => channel_done(114) <= '1'; + when "1110011" => channel_done(115) <= '1'; + when "1110100" => channel_done(116) <= '1'; + when "1110101" => channel_done(117) <= '1'; + when "1110110" => channel_done(118) <= '1'; + when "1110111" => channel_done(119) <= '1'; + when "1111000" => channel_done(120) <= '1'; + when "1111001" => channel_done(121) <= '1'; + when "1111010" => channel_done(122) <= '1'; + when "1111011" => channel_done(123) <= '1'; + when "1111100" => channel_done(124) <= '1'; + when "1111101" => channel_done(125) <= '1'; + when "1111110" => channel_done(126) <= '1'; + when "1111111" => channel_done(127) <= '1'; + end case; + + when others => null; + + end case; + end if; + end if; + end process PROC_CHANNEL_STATUS; + + +end Behavioral;