]> jspc29.x-matter.uni-frankfurt.de Git - trb3.git/commitdiff
nx timestamp window filter added
authorhadaq <hadaq>
Wed, 20 Mar 2013 19:43:35 +0000 (19:43 +0000)
committerhadaq <hadaq>
Wed, 20 Mar 2013 19:43:35 +0000 (19:43 +0000)
nxyter/source/nx_timestamp_process.vhd [new file with mode: 0644]

diff --git a/nxyter/source/nx_timestamp_process.vhd b/nxyter/source/nx_timestamp_process.vhd
new file mode 100644 (file)
index 0000000..b87c531
--- /dev/null
@@ -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;