]> jspc29.x-matter.uni-frankfurt.de Git - trbnet.git/commitdiff
*** empty log message ***
authorhadeshyp <hadeshyp>
Fri, 19 Mar 2010 13:14:34 +0000 (13:14 +0000)
committerhadeshyp <hadeshyp>
Fri, 19 Mar 2010 13:14:34 +0000 (13:14 +0000)
special/handler_data.vhd
special/handler_ipu.vhd
special/handler_lvl1.vhd
special/handler_trigger_and_data.vhd
special/slv_register.vhd
special/spi_master.vhd

index 0dc0cc4a9e98bced85ac05ba98b787990a758754..177e3957f81db7ff975d5ce3969b4bf29bce112c 100644 (file)
@@ -18,25 +18,28 @@ entity handler_data is
     CLOCK                        : in  std_logic;
     RESET                        : in  std_logic;
 
-    --From LVL1 Handler
-    LVL1_TRG_RECEIVED_OUT        : in  std_logic;                     --TRG Info valid & FEE busy
-    LVL1_TRG_TYPE_OUT            : in  std_logic_vector(3  downto 0); --trigger type
-    LVL1_TRG_INFO_OUT            : in  std_logic_vector(23 downto 0); --further trigger details
-    LVL1_TRG_NUMBER_OUT          : in  std_logic_vector(15 downto 0); --trigger number
-    LVL1_BUFFER_WARN_OUT         : out std_logic;                     --some fifos might be full soon
-    LVL1_BUFFER_FULL_OUT         : out std_logic;                     --some fifos are full
+    --LVL1 Handler
+    LVL1_TRG_RECEIVED_IN         : in  std_logic;                     --TRG Info valid & FEE busy
+    LVL1_TRG_TYPE_IN             : in  std_logic_vector(3  downto 0); --trigger type
+    LVL1_TRG_INFO_IN             : in  std_logic_vector(23 downto 0); --further trigger details
+    LVL1_TRG_CODE_IN             : in  std_logic_vector(7 downto 0);
+    LVL1_TRG_NUMBER_IN           : in  std_logic_vector(15 downto 0); --trigger number
     LVL1_STATUSBITS_OUT          : out std_logic_vector(31 downto 0);
+    LVL1_TRG_RELEASE_OUT         : out std_logic;
 
-    --From FEE
+    --FEE
     FEE_DATA_IN                  : in  std_logic_vector(DATA_INTERFACE_NUMBER*32-1 downto 0);
     FEE_DATA_WRITE_IN            : in  std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
-    FEE_DATA_ALMOST_FULL_OUT     : out std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
+    FEE_DATA_FINISHED_IN         : in  std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
     FEE_DATA_STATUSBITS_IN       : in  std_logic_vector(DATA_INTERFACE_NUMBER*32-1 downto 0);
+       FEE_DATA_ALMOST_FULL_OUT     : out std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
 
-    --To IPU Handler
-    IPU_DATA_OUT                 : out std_logic_vector(DATA_INTERFACE_NUMBER*32-1 downto 0);
+    --IPU Handler
+    IPU_DATA_OUT                 : out std_logic_vector(DATA_INTERFACE_NUMBER*36-1 downto 0);
     IPU_DATA_READ_IN             : in  std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
     IPU_DATA_EMPTY_OUT           : out std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
+         IPU_DATA_LENGTH_OUT          : out std_logic_vector(DATA_INTERFACE_NUMBER*16-1 downto 0);
+       
     IPU_HDR_DATA_OUT             : out std_logic_vector(31 downto 0);
     IPU_HDR_DATA_READ_IN         : in  std_logic;
     IPU_HDR_DATA_EMPTY_OUT       : out std_logic;
index 6ab7ebcabd27136f2285e3ea167585176e59e702..c13a5096798b4312cf5096d9f25a31195171b202 100644 (file)
@@ -15,14 +15,13 @@ entity handler_ipu is
     RESET                        : in  std_logic;
 
     --From Data Handler
-    DAT_DATA                     : in  std_logic_vector(DATA_INTERFACE_NUMBER*32-1 downto 0);
+    DAT_DATA                     : in  std_logic_vector(DATA_INTERFACE_NUMBER*36-1 downto 0);
     DAT_DATA_READ                : out std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
     DAT_DATA_EMPTY               : in  std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
     DAT_HDR_DATA                 : in  std_logic_vector(31 downto 0);
     DAT_HDR_DATA_READ            : out std_logic;
     DAT_HDR_DATA_EMPTY           : in  std_logic;
 
-
     --To IPU Channel
     IPU_NUMBER_IN                : in  std_logic_vector (15 downto 0);
     IPU_INFORMATION_IN           : in  std_logic_vector (7  downto 0);
index 56e1291567c30fd2851eb2d75b13336d8dcb892f..7db3b5abdf4e29eccaced9e8b6bd7b061c396678 100644 (file)
@@ -7,37 +7,38 @@ use work.trb_net_std.all;
 use work.trb_net_components.all;
 
 
-entity lvl1_handler is
+entity handler_lvl1 is
+    generic(
+      DATA_INTERFACE_NUMBER        : integer range 1 to 16         := 1  
+      );
     port (
-      RESET     : in  std_logic;
-      CLOCK     : in  std_logic;
+      RESET                      : in  std_logic;
+      CLOCK                      : in  std_logic;
       --Timing Trigger
-      LVL1_TIMING_TRG_IN        : in  std_logic;
+      LVL1_TIMING_TRG_IN         : in  std_logic;
       --LVL1_handler connection
-      LVL1_TRG_TYPE_IN          : in  std_logic_vector(3 downto 0);
-      LVL1_TRG_RECEIVED_IN      : in  std_logic;
-      LVL1_TRG_NUMBER_IN        : in  std_logic_vector(15 downto 0);
-      LVL1_TRG_CODE_IN          : in  std_logic_vector(7 downto 0);
-      LVL1_TRG_INFORMATION_IN   : in  std_logic_vector(23 downto 0);
-      LVL1_ERROR_PATTERN_OUT    : out std_logic_vector(31 downto 0);
-      LVL1_TRG_RELEASE_OUT      : out std_logic := '0';
-      LVL1_INT_TRG_NUMBER_IN    : in  std_logic_vector(15 downto 0);
+      LVL1_TRG_TYPE_IN           : in  std_logic_vector(3 downto 0);
+      LVL1_TRG_RECEIVED_IN       : in  std_logic;
+      LVL1_TRG_NUMBER_IN         : in  std_logic_vector(15 downto 0);
+      LVL1_TRG_CODE_IN           : in  std_logic_vector(7 downto 0);
+      LVL1_TRG_INFORMATION_IN    : in  std_logic_vector(23 downto 0);
+      LVL1_ERROR_PATTERN_OUT     : out std_logic_vector(31 downto 0);
+      LVL1_TRG_RELEASE_OUT       : out std_logic := '0';
+      LVL1_INT_TRG_NUMBER_IN     : in  std_logic_vector(15 downto 0);
 
       --FEE logic / Data Handler
-      FEE_TIMING_TRIGGER_OUT       : out std_logic;                     --timing trigger (registered)
-      FEE_TRG_RECEIVED_OUT         : out std_logic;                     --TRG Info valid & FEE busy
-      FEE_TRG_TYPE_OUT             : out std_logic_vector(3  downto 0); --trigger type
-      FEE_TRG_INFO_OUT             : out std_logic_vector(23 downto 0); --further trigger details
-      FEE_TRG_CODE_OUT             : out std_logic_vector(7 downto 0);  --further trigger details
-      FEE_TRG_NUMBER_OUT           : out std_logic_vector(15 downto 0); --trigger number
-      FEE_BUSY_IN                  : in  std_logic;                     --FEE busy
-      FEE_BUFFER_WARN_IN           : in  std_logic;                     --some fifos (if any) might be full soon
-      FEE_TRG_STATUSBITS_IN        : in  std_logic_vector(31 downto 0);
-
-      DAT_DATA_ALMOST_FULL_OUT     : out std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
-      DAT_DATA_STATUSBITS_IN       : in  std_logic_vector(DATA_INTERFACE_NUMBER*32-1 downto 0);
+      FEE_TIMING_TRIGGER_OUT     : out std_logic;                     --timing trigger (registered)
+      FEE_TRG_RECEIVED_OUT       : out std_logic;                     --TRG Info valid & FEE busy
+      FEE_TRG_TYPE_OUT           : out std_logic_vector(3  downto 0); --trigger type
+      FEE_TRG_INFO_OUT           : out std_logic_vector(23 downto 0); --further trigger details
+      FEE_TRG_CODE_OUT           : out std_logic_vector(7 downto 0);  --further trigger details
+      FEE_TRG_NUMBER_OUT         : out std_logic_vector(15 downto 0); --trigger number
+      FEE_BUSY_IN                : in  std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
+      FEE_TRG_STATUSBITS_IN      : in  std_logic_vector(DATA_INTERFACE_NUMBER*32-1 downto 0);
 
+      DAT_TRG_STATUSBITS_IN      : in  std_logic_vector(31 downto 0);
+      DAT_TRG_RELEASE_IN         : in  std_logic; 
       --Debug
-      DEBUG_OUT                 : out std_logic_vector (15 downto 0)
+      DEBUG_OUT                  : out std_logic_vector (15 downto 0)
       );
 end entity;
\ No newline at end of file
index 4f42f86c6c8fdbcb19e8a1ffff7f6168367567ed..544a5adb12333947f83a0a54c8d43dffff167fe6 100644 (file)
@@ -52,16 +52,14 @@ entity handler_trigger_and_data is
     FEE_TRG_INFO_OUT             : out std_logic_vector(23 downto 0); --further trigger details
     FEE_TRG_CODE_OUT             : out std_logic_vector(7 downto 0);  --further trigger details
     FEE_TRG_NUMBER_OUT           : out std_logic_vector(15 downto 0); --trigger number
-    FEE_BUSY_IN                  : in  std_logic;                     --FEE busy
-    FEE_BUFFER_WARN_IN           : in  std_logic;                     --some fifos (if any) might be full soon
-    FEE_TRG_STATUSBITS_IN        : in  std_logic_vector(31 downto 0);
+    FEE_TRG_RELEASE_IN           : in  std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
+    FEE_TRG_STATUSBITS_IN        : in  std_logic_vector(DATA_INTERFACE_NUMBER*32-1 downto 0);
 
     --Data Input from FEE
     FEE_DATA_IN                  : in  std_logic_vector(DATA_INTERFACE_NUMBER*32-1 downto 0);
     FEE_DATA_WRITE_IN            : in  std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
     FEE_DATA_FINISHED_IN         : in  std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
     FEE_DATA_ALMOST_FULL_OUT     : out std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
-    FEE_DATA_STATUSBITS_IN       : in  std_logic_vector(DATA_INTERFACE_NUMBER*32-1 downto 0);
 
     --Debug
     DEBUG_LVL1_HANDLER_OUT       : out std_logic_vector(31 downto 0);
@@ -77,9 +75,108 @@ end entity;
 
 architecture handler_trigger_and_data_arch of handler_trigger_and_data is
 
-begin
 
+  signal fee_timing_trigger      : std_logic;
+  signal fee_trg_received        : std_logic;
+  signal fee_trg_type            : std_logic_vector(3 downto 0);
+  signal fee_trg_info            : std_logic_vector(23 downto 0);
+  signal fee_trg_code            : std_logic_vector(7 downto 0);
+  signal fee_trg_number          : std_logic_vector(15 downto 0);
+  signal fee_release             : std_logic;
+  signal fee_trg_statusbits      : std_logic_vector(31 downto 0);
+  signal dat_almost_full         : std_logic;
+  signal dat_statusbits          : std_logic_vector(31 downto 0);
+  
+  signal dat_buffer_warn         : std_logic;
+  signal dat_buffer_full         : std_logic;
+  signal dat_lvl1_statusbits     : std_logic_vector(31 downto 0);
+  signal ipu_data                : std_logic_vector(36*DATA_INTERFACE_NUMBER-1 downto 0);
+  signal ipu_data_read           : std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
+  signal ipu_data_empty          : std_logic_vector(DATA_INTERFACE_NUMBER-1 downto 0);
+  signal ipu_data_length         : std_logic_vector(16*DATA_INTERFACE_NUMBER-1 downto 0);
+  signal ipu_header              : std_logic_vector(31 downto 0);
+  signal ipu_header_empty        : std_logic;
+  signal ipu_header_read         : std_logic;
+  
 
+begin
 
+  THE_LVL1_HANDLER : handler_lvl1
+    port map(
+      RESET                      => RESET,
+      CLOCK                      => CLOCK,
+      --Timing Trigger
+      LVL1_TIMING_TRG_IN         => LVL1_TIMING_TRG_IN, 
+      --LVL1_handler connection
+      LVL1_TRG_TYPE_IN           => LVL1_TRG_TYPE_IN,
+      LVL1_TRG_RECEIVED_IN       => LVL1_TRG_RECEIVED_IN,
+      LVL1_TRG_NUMBER_IN         => LVL1_TRG_NUMBER_IN,
+      LVL1_TRG_CODE_IN           => LVL1_TRG_CODE_IN,
+      LVL1_TRG_INFORMATION_IN    => LVL1_TRG_INFORMATION_IN,
+      LVL1_ERROR_PATTERN_OUT     => LVL1_ERROR_PATTERN_OUT,
+      LVL1_TRG_RELEASE_OUT       => LVL1_TRG_RELEASE_OUT,
+      LVL1_INT_TRG_NUMBER_IN     => LVL1_INT_TRG_NUMBER_IN,
+
+      --FEE logic / Data Handler
+      FEE_TIMING_TRIGGER_OUT     => fee_timing_trigger,
+      FEE_TRG_RECEIVED_OUT       => fee_trg_received,
+      FEE_TRG_TYPE_OUT           => fee_trg_type,
+      FEE_TRG_INFO_OUT           => fee_trg_info,
+      FEE_TRG_CODE_OUT           => fee_trg_code,
+      FEE_TRG_NUMBER_OUT         => fee_trg_number,
+      FEE_BUSY_IN                => fee_busy,
+      FEE_BUFFER_WARN_IN         => fee_buffer_warn,
+      FEE_TRG_STATUSBITS_IN      => fee_trg_statusbits,
+
+      DAT_ALMOST_FULL_OUT        => dat_almost_full,
+      DAT_STATUSBITS_IN          => dat_statusbits,
+
+      --Debug
+      DEBUG_OUT                  => DEBUG_LVL1_HANDLER_OUT 
+      );
+
+  THE_DATA_HANDLER : handler_data
+    generic map(
+      DATA_INTERFACE_NUMBER        => DATA_INTERFACE_NUMBER,
+      DATA_BUFFER_DEPTH            => DATA_BUFFER_DEPTH,
+      DATA_BUFFER_FULL_THRESH      => DATA_BUFFER_FULL_THRESH,
+      HEADER_BUFFER_DEPTH          => HEADER_BUFFER_DEPTH,
+      HEADER_BUFFER_FULL_THRESH    => HEADER_BUFFER_FULL_THRESH
+      )
+    port map(
+      CLOCK                        => CLOCK,
+      RESET                        => RESET,
+
+      --From LVL1 Handler
+      LVL1_TRG_RECEIVED_IN         => fee_trigger_received,
+      LVL1_TRG_TYPE_IN             => fee_trg_type,
+      LVL1_TRG_INFO_IN             => fee_trg_info,
+      LVL1_TRG_NUMBER_IN           => fee_trg_number,
+      LVL1_BUFFER_WARN_OUT         => dat_buffer_warn,
+      LVL1_BUFFER_FULL_OUT         => dat_buffer_full,
+      LVL1_STATUSBITS_OUT          => dat_lvl1_statusbits,
+
+      --From FEE
+      FEE_DATA_IN                  => FEE_DATA_IN,
+      FEE_DATA_WRITE_IN            => FEE_DATA_WRITE_IN,
+      FEE_DATA_FINISHED_IN         => FEE_DATA_FINISHED_IN,
+      FEE_DATA_ALMOST_FULL_OUT     => FEE_DATA_ALMOST_FULL_OUT,
+
+      --To IPU Handler
+      IPU_DATA_OUT                 => ipu_data,
+      IPU_DATA_READ_IN             => ipu_data_read,
+      IPU_DATA_EMPTY_OUT           => ipu_data_empty,
+      IPU_DATA_LENGTH              => ipu_data_length,
+      IPU_HDR_DATA_OUT             => ipu_header,
+      IPU_HDR_DATA_READ_IN         => ipu_header_read,
+      IPU_HDR_DATA_EMPTY_OUT       => ipu_header_empty,
+
+      --Debug
+      DEBUG_OUT                    => DEBUG_DATA_HANDLER_OUT
+    );
+         
+-- combine LVL1 fee statusbits
+-- combine FEE Busy Release    
 
+  
 end architecture;
\ No newline at end of file
index 0681f3968638ad05461e4198db3b928b4749c1e5..763550b18a04068f7eebeddea3affbe89ff30019 100644 (file)
-library IEEE;\r
-use IEEE.STD_LOGIC_1164.ALL;\r
-use IEEE.STD_LOGIC_ARITH.ALL;\r
-use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
-\r
-library work;\r
---use work.adcmv3_components.all;\r
-\r
-\r
-entity slv_register is\r
-generic( RESET_VALUE   : std_logic_vector(31 downto 0) := x"0000_0000" );\r
-port( CLK_IN           : in    std_logic;\r
-         RESET_IN              : in    std_logic;\r
-         BUSY_IN               : in    std_logic;\r
-         -- Slave bus\r
-         SLV_READ_IN   : in    std_logic;\r
-         SLV_WRITE_IN  : in    std_logic;\r
-         SLV_BUSY_OUT  : out   std_logic;\r
-         SLV_ACK_OUT   : out   std_logic;\r
-         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);\r
-         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
-         -- I/O to the backend\r
-         REG_DATA_IN   : in    std_logic_vector(31 downto 0);\r
-         REG_DATA_OUT  : out   std_logic_vector(31 downto 0);\r
-         -- Status lines\r
-         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG\r
-       );\r
-end entity;\r
-\r
-architecture Behavioral of slv_register is\r
-\r
--- Signals\r
-\r
-       type STATES is (SLEEP,RD_BSY,WR_BSY,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE);\r
-       signal CURRENT_STATE, NEXT_STATE: STATES;\r
-\r
-       -- slave bus signals\r
-       signal slv_busy_x               : std_logic;\r
-       signal slv_busy                 : std_logic;\r
-       signal slv_ack_x                : std_logic;\r
-       signal slv_ack                  : std_logic;\r
-       signal store_wr_x               : std_logic;\r
-       signal store_wr                 : std_logic;\r
-       signal store_rd_x               : std_logic;\r
-       signal store_rd                 : std_logic;\r
-\r
-       signal reg_slv_data_in  : std_logic_vector(31 downto 0); -- registered data input\r
-       signal reg_slv_data_out : std_logic_vector(31 downto 0); -- read back data\r
-       signal reg_busy                 : std_logic;\r
-\r
-begin\r
-\r
--- Fake\r
-reg_busy <= busy_in;\r
-stat <= (others => '0');\r
-\r
----------------------------------------------------------\r
--- Statemachine                                        --\r
----------------------------------------------------------\r
--- State memory process\r
-STATE_MEM: process( clk_in )\r
-begin\r
-       if( rising_edge(clk_in) ) then\r
-               if( reset_in = '1' ) then\r
-                       CURRENT_STATE <= SLEEP;\r
-                       slv_busy      <= '0';\r
-                       slv_ack       <= '0';\r
-                       store_wr      <= '0';\r
-                       store_rd      <= '0';\r
-               else\r
-                       CURRENT_STATE <= NEXT_STATE;\r
-                       slv_busy      <= slv_busy_x;\r
-                       slv_ack       <= slv_ack_x;\r
-                       store_wr      <= store_wr_x;\r
-                       store_rd      <= store_rd_x;\r
-               end if;\r
-       end if;\r
-end process STATE_MEM;\r
-\r
--- Transition matrix\r
-TRANSFORM: process(CURRENT_STATE, slv_read_in, slv_write_in, reg_busy )\r
-begin\r
-       NEXT_STATE <= SLEEP;\r
-       slv_busy_x <= '0';\r
-       slv_ack_x  <= '0';\r
-       store_wr_x <= '0';\r
-       store_rd_x <= '0';\r
-       case CURRENT_STATE is\r
-               when SLEEP              =>      if   ( (reg_busy = '0') and (slv_read_in = '1') ) then\r
-                                                               NEXT_STATE <= RD_RDY;\r
-                                                               store_rd_x <= '1';\r
-                                                       elsif( (reg_busy = '0') and (slv_write_in = '1') ) then\r
-                                                               NEXT_STATE <= WR_RDY;\r
-                                                               store_wr_x <= '1';\r
-                                                       elsif( (reg_busy = '1') and (slv_read_in = '1') ) then\r
-                                                               NEXT_STATE <= RD_BSY;\r
-                                                               slv_busy_x <= '1'; -- added 23022009\r
-                                                       elsif( (reg_busy = '1') and (slv_write_in = '1') ) then\r
-                                                               NEXT_STATE <= WR_BSY;\r
-                                                               slv_busy_x <= '1'; -- added 23022009\r
-                                                       else    \r
-                                                               NEXT_STATE <= SLEEP;\r
-                                                       end if;\r
-               when RD_RDY             =>      NEXT_STATE <= RD_ACK;\r
-                                                       slv_ack_x  <= '1';\r
-               when WR_RDY             =>      NEXT_STATE <= WR_ACK;\r
-                                                       slv_ack_x  <= '1';\r
-               when RD_ACK             =>      if( slv_read_in = '0' ) then\r
-                                                               NEXT_STATE <= DONE;\r
-                                                       else\r
-                                                               NEXT_STATE <= RD_ACK;\r
-                                                               slv_ack_x  <= '1';\r
-                                                       end if;\r
-               when WR_ACK             =>      if( slv_write_in = '0' ) then\r
-                                                               NEXT_STATE <= DONE;\r
-                                                       else\r
-                                                               NEXT_STATE <= WR_ACK;\r
-                                                               slv_ack_x  <= '1';\r
-                                                       end if;\r
-               when RD_BSY             =>      if( slv_read_in = '0' ) then\r
-                                                               NEXT_STATE <= DONE;\r
-                                                       else\r
-                                                               NEXT_STATE <= RD_BSY;\r
-                                                               slv_busy_x <= '1';\r
-                                                       end if;\r
-               when WR_BSY             =>      if( slv_write_in = '0' ) then\r
-                                                               NEXT_STATE <= DONE;\r
-                                                       else\r
-                                                               NEXT_STATE <= WR_BSY;\r
-                                                               slv_busy_x <= '1';\r
-                                                       end if;\r
-               when DONE               =>      NEXT_STATE <= SLEEP;\r
-                       \r
-               when others             =>      NEXT_STATE <= SLEEP;\r
-       end case;\r
-end process TRANSFORM;\r
-\r
----------------------------------------------------------\r
--- data handling                                       --\r
----------------------------------------------------------\r
-\r
--- register write\r
-THE_WRITE_REG_PROC: process( clk_in )\r
-begin\r
-       if( rising_edge(clk_in) ) then\r
-               if   ( reset_in = '1' ) then\r
-                       reg_slv_data_in <= RESET_VALUE;\r
-               elsif( store_wr = '1' ) then\r
-                       reg_slv_data_in <= slv_data_in;\r
-               end if;\r
-       end if;\r
-end process THE_WRITE_REG_PROC;\r
-\r
--- register read\r
-THE_READ_REG_PROC: process( clk_in )\r
-begin\r
-       if( rising_edge(clk_in) ) then\r
-               if   ( reset_in = '1' ) then\r
-                       reg_slv_data_out <= (others => '0');\r
-               elsif( store_rd = '1' ) then\r
-                       reg_slv_data_out <= reg_data_in;\r
-               end if;\r
-       end if;\r
-end process THE_READ_REG_PROC;\r
-\r
--- output signals\r
-slv_ack_out  <= slv_ack;\r
-slv_busy_out <= slv_busy;\r
-slv_data_out <= reg_slv_data_out;\r
-\r
----------------------------------------------------------\r
--- signals to backend                                  --\r
----------------------------------------------------------\r
-\r
-reg_data_out <= reg_slv_data_in;\r
-\r
-end Behavioral;\r
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+library work;
+--use work.adcmv3_components.all;
+
+
+entity slv_register is
+generic( RESET_VALUE   : std_logic_vector(31 downto 0) := x"0000_0000" );
+port( CLK_IN           : in    std_logic;
+         RESET_IN              : in    std_logic;
+         BUSY_IN               : in    std_logic;
+         -- Slave bus
+         SLV_READ_IN   : in    std_logic;
+         SLV_WRITE_IN  : in    std_logic;
+         SLV_BUSY_OUT  : out   std_logic;
+         SLV_ACK_OUT   : out   std_logic;
+         SLV_DATA_IN   : in    std_logic_vector(31 downto 0);
+         SLV_DATA_OUT  : out   std_logic_vector(31 downto 0);
+         -- I/O to the backend
+         REG_DATA_IN   : in    std_logic_vector(31 downto 0);
+         REG_DATA_OUT  : out   std_logic_vector(31 downto 0);
+         -- Status lines
+         STAT                  : out   std_logic_vector(31 downto 0) -- DEBUG
+       );
+end entity;
+
+architecture Behavioral of slv_register is
+
+-- Signals
+
+       type STATES is (SLEEP,RD_BSY,WR_BSY,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE);
+       signal CURRENT_STATE, NEXT_STATE: STATES;
+
+       -- slave bus signals
+       signal slv_busy_x               : std_logic;
+       signal slv_busy                 : std_logic;
+       signal slv_ack_x                : std_logic;
+       signal slv_ack                  : std_logic;
+       signal store_wr_x               : std_logic;
+       signal store_wr                 : std_logic;
+       signal store_rd_x               : std_logic;
+       signal store_rd                 : std_logic;
+
+       signal reg_slv_data_in  : std_logic_vector(31 downto 0); -- registered data input
+       signal reg_slv_data_out : std_logic_vector(31 downto 0); -- read back data
+       signal reg_busy                 : std_logic;
+
+begin
+
+-- Fake
+reg_busy <= busy_in;
+stat <= (others => '0');
+
+---------------------------------------------------------
+-- Statemachine                                        --
+---------------------------------------------------------
+-- State memory process
+STATE_MEM: process( clk_in )
+begin
+       if( rising_edge(clk_in) ) then
+               if( reset_in = '1' ) then
+                       CURRENT_STATE <= SLEEP;
+                       slv_busy      <= '0';
+                       slv_ack       <= '0';
+                       store_wr      <= '0';
+                       store_rd      <= '0';
+               else
+                       CURRENT_STATE <= NEXT_STATE;
+                       slv_busy      <= slv_busy_x;
+                       slv_ack       <= slv_ack_x;
+                       store_wr      <= store_wr_x;
+                       store_rd      <= store_rd_x;
+               end if;
+       end if;
+end process STATE_MEM;
+
+-- Transition matrix
+TRANSFORM: process(CURRENT_STATE, slv_read_in, slv_write_in, reg_busy )
+begin
+       NEXT_STATE <= SLEEP;
+       slv_busy_x <= '0';
+       slv_ack_x  <= '0';
+       store_wr_x <= '0';
+       store_rd_x <= '0';
+       case CURRENT_STATE is
+               when SLEEP              =>      if   ( (reg_busy = '0') and (slv_read_in = '1') ) then
+                                                               NEXT_STATE <= RD_RDY;
+                                                               store_rd_x <= '1';
+                                                       elsif( (reg_busy = '0') and (slv_write_in = '1') ) then
+                                                               NEXT_STATE <= WR_RDY;
+                                                               store_wr_x <= '1';
+                                                       elsif( (reg_busy = '1') and (slv_read_in = '1') ) then
+                                                               NEXT_STATE <= RD_BSY;
+                                                               slv_busy_x <= '1'; -- added 23022009
+                                                       elsif( (reg_busy = '1') and (slv_write_in = '1') ) then
+                                                               NEXT_STATE <= WR_BSY;
+                                                               slv_busy_x <= '1'; -- added 23022009
+                                                       else    
+                                                               NEXT_STATE <= SLEEP;
+                                                       end if;
+               when RD_RDY             =>      NEXT_STATE <= RD_ACK;
+                                                       slv_ack_x  <= '1';
+               when WR_RDY             =>      NEXT_STATE <= WR_ACK;
+                                                       slv_ack_x  <= '1';
+               when RD_ACK             =>      if( slv_read_in = '0' ) then
+                                                               NEXT_STATE <= DONE;
+                                                       else
+                                                               NEXT_STATE <= RD_ACK;
+                                                               slv_ack_x  <= '1';
+                                                       end if;
+               when WR_ACK             =>      if( slv_write_in = '0' ) then
+                                                               NEXT_STATE <= DONE;
+                                                       else
+                                                               NEXT_STATE <= WR_ACK;
+                                                               slv_ack_x  <= '1';
+                                                       end if;
+               when RD_BSY             =>      if( slv_read_in = '0' ) then
+                                                               NEXT_STATE <= DONE;
+                                                       else
+                                                               NEXT_STATE <= RD_BSY;
+                                                               slv_busy_x <= '1';
+                                                       end if;
+               when WR_BSY             =>      if( slv_write_in = '0' ) then
+                                                               NEXT_STATE <= DONE;
+                                                       else
+                                                               NEXT_STATE <= WR_BSY;
+                                                               slv_busy_x <= '1';
+                                                       end if;
+               when DONE               =>      NEXT_STATE <= SLEEP;
+                       
+               when others             =>      NEXT_STATE <= SLEEP;
+       end case;
+end process TRANSFORM;
+
+---------------------------------------------------------
+-- data handling                                       --
+---------------------------------------------------------
+
+-- register write
+THE_WRITE_REG_PROC: process( clk_in )
+begin
+       if( rising_edge(clk_in) ) then
+               if   ( reset_in = '1' ) then
+                       reg_slv_data_in <= RESET_VALUE;
+               elsif( store_wr = '1' ) then
+                       reg_slv_data_in <= slv_data_in;
+               end if;
+       end if;
+end process THE_WRITE_REG_PROC;
+
+-- register read
+THE_READ_REG_PROC: process( clk_in )
+begin
+       if( rising_edge(clk_in) ) then
+               if   ( reset_in = '1' ) then
+                       reg_slv_data_out <= (others => '0');
+               elsif( store_rd = '1' ) then
+                       reg_slv_data_out <= reg_data_in;
+               end if;
+       end if;
+end process THE_READ_REG_PROC;
+
+-- output signals
+slv_ack_out  <= slv_ack;
+slv_busy_out <= slv_busy;
+slv_data_out <= reg_slv_data_out;
+
+---------------------------------------------------------
+-- signals to backend                                  --
+---------------------------------------------------------
+
+reg_data_out <= reg_slv_data_in;
+
+end Behavioral;
index aa2519bd6d870e8300104945bc3c1a2e4751ee01..683007c6118fea70baaa3d4ef91d6824674850f6 100755 (executable)
-library IEEE;\r
-use IEEE.STD_LOGIC_1164.ALL;\r
-use IEEE.STD_LOGIC_ARITH.ALL;\r
-use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
-\r
-library work;\r
-use work.trb_net_std.all;\r
-use work.trb_net_components.all;\r
-\r
-entity spi_master is\r
-  port(\r
-    CLK_IN          : in   std_logic;\r
-    RESET_IN        : in   std_logic;\r
-    -- Slave bus\r
-    BUS_READ_IN     : in   std_logic;\r
-    BUS_WRITE_IN    : in   std_logic;\r
-    BUS_BUSY_OUT    : out  std_logic;\r
-    BUS_ACK_OUT     : out  std_logic;\r
-    BUS_ADDR_IN     : in   std_logic_vector(0 downto 0);\r
-    BUS_DATA_IN     : in   std_logic_vector(31 downto 0);\r
-    BUS_DATA_OUT    : out  std_logic_vector(31 downto 0);\r
-    -- SPI connections\r
-    SPI_CS_OUT      : out  std_logic;\r
-    SPI_SDI_IN      : in   std_logic;\r
-    SPI_SDO_OUT     : out  std_logic;\r
-    SPI_SCK_OUT     : out  std_logic;\r
-    -- BRAM for read/write data\r
-    BRAM_A_OUT      : out  std_logic_vector(7 downto 0);\r
-    BRAM_WR_D_IN    : in   std_logic_vector(7 downto 0);\r
-    BRAM_RD_D_OUT   : out  std_logic_vector(7 downto 0);\r
-    BRAM_WE_OUT     : out  std_logic;\r
-    -- Status lines\r
-    STAT            : out  std_logic_vector(31 downto 0) -- DEBUG\r
-  );\r
-end entity;\r
-\r
-architecture Behavioral of spi_master is\r
-  -- Placer Directives\r
-  attribute HGROUP : string;\r
-  -- for whole architecture\r
-  attribute HGROUP of Behavioral : architecture  is "SPI_group";\r
-\r
--- Signals\r
-    type STATES is (SLEEP,RD_BSY,WR_BSY,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE);\r
-    signal CURRENT_STATE, NEXT_STATE: STATES;\r
-\r
-    signal status_data      : std_logic_vector(31 downto 0);\r
-    signal spi_busy         : std_logic;\r
-\r
-    signal reg_ctrl_data    : std_logic_vector(31 downto 0); -- CMD, ADH, ADM, ADL\r
-    signal reg_status_data  : std_logic_vector(31 downto 0); -- MAX\r
-\r
-    signal reg_bus_data_out : std_logic_vector(31 downto 0); -- readback\r
-\r
-    signal spi_bsm          : std_logic_vector(7 downto 0);\r
-       signal spi_debug                : std_logic_vector(31 downto 0);\r
-\r
-    signal spi_start_x      : std_logic;\r
-    signal spi_start        : std_logic;\r
-\r
-    -- State machine signals\r
-    signal bus_busy_x       : std_logic;\r
-    signal bus_busy         : std_logic;\r
-    signal bus_ack_x        : std_logic;\r
-    signal bus_ack          : std_logic;\r
-    signal store_wr_x       : std_logic;\r
-    signal store_wr         : std_logic;\r
-    signal store_rd_x       : std_logic;\r
-    signal store_rd         : std_logic;\r
-\r
-begin\r
-\r
----------------------------------------------------------\r
--- SPI master                                          --\r
----------------------------------------------------------\r
-\r
-THE_SPI_SLIM: spi_slim\r
-port map(\r
-  SYSCLK        => clk_in,\r
-  RESET         => reset_in,\r
-  -- Command interface\r
-  START_IN      => spi_start, -- not really nice, but should work\r
-  BUSY_OUT      => spi_busy,\r
-  CMD_IN        => reg_ctrl_data(31 downto 24),\r
-  ADH_IN        => reg_ctrl_data(23 downto 16),\r
-  ADM_IN        => reg_ctrl_data(15 downto 8),\r
-  ADL_IN        => reg_ctrl_data(7 downto 0),\r
-  MAX_IN        => reg_status_data(31 downto 24),\r
-  TXDATA_IN     => bram_wr_d_in,\r
-  TX_RD_OUT     => open, -- not needed\r
-  RXDATA_OUT    => bram_rd_d_out,\r
-  RX_WR_OUT     => bram_we_out,\r
-  TX_RX_A_OUT   => bram_a_out,\r
-  -- SPI interface\r
-  SPI_SCK_OUT   => spi_sck_out,\r
-  SPI_CS_OUT    => spi_cs_out,\r
-  SPI_SDI_IN    => spi_sdi_in,\r
-  SPI_SDO_OUT   => spi_sdo_out,\r
-  -- DEBUG\r
-  CLK_EN_OUT    => open, -- not needed\r
-  BSM_OUT       => spi_bsm,\r
-  DEBUG_OUT     => spi_debug --open -- BUG\r
-);\r
-\r
----------------------------------------------------------\r
--- Statemachine                                        --\r
----------------------------------------------------------\r
-STATE_MEM: process( clk_in )\r
-begin\r
-  if( rising_edge(clk_in) ) then\r
-    if( reset_in = '1' ) then\r
-      CURRENT_STATE <= SLEEP;\r
-      bus_busy      <= '0';\r
-      bus_ack       <= '0';\r
-      store_wr      <= '0';\r
-      store_rd      <= '0';\r
-    else\r
-      CURRENT_STATE <= NEXT_STATE;\r
-      bus_busy      <= bus_busy_x;\r
-      bus_ack       <= bus_ack_x;\r
-      store_wr      <= store_wr_x;\r
-      store_rd      <= store_rd_x;\r
-    end if;\r
-  end if;\r
-end process STATE_MEM;\r
-\r
-TRANSFORM: process(CURRENT_STATE, bus_read_in, bus_write_in, spi_busy, bus_addr_in )\r
-begin\r
-  NEXT_STATE <= SLEEP;\r
-  bus_busy_x <= '0';\r
-  bus_ack_x  <= '0';\r
-  store_wr_x <= '0';\r
-  store_rd_x <= '0';\r
-  case CURRENT_STATE is\r
-      when SLEEP        =>\r
-          if   ( (spi_busy = '0') and (bus_read_in = '1') ) then\r
-              NEXT_STATE <= RD_RDY;\r
-              store_rd_x <= '1';\r
-          elsif( (spi_busy = '0') and (bus_write_in = '1') ) then\r
-              NEXT_STATE <= WR_RDY;\r
-              store_wr_x <= '1';\r
-          elsif( (bus_addr_in(0) = '0') and (spi_busy = '1') and (bus_read_in = '1') ) then\r
-              NEXT_STATE <= RD_BSY; -- CMD register is busy protected\r
-              bus_busy_x <= '1';\r
-          elsif( (bus_addr_in(0) = '0') and (spi_busy = '1') and (bus_write_in = '1') ) then\r
-              NEXT_STATE <= WR_BSY; -- CMD register is busy protected\r
-              bus_busy_x <= '1';\r
-          elsif( (bus_addr_in(0) = '1') and (spi_busy = '1') and (bus_read_in = '1') ) then\r
-              NEXT_STATE <= RD_RDY; -- STATUS register is not\r
-              store_rd_x <= '1';\r
-          elsif( (bus_addr_in(0) = '1') and (spi_busy = '1') and (bus_write_in = '1') ) then\r
-              NEXT_STATE <= WR_RDY; -- STATUS register is not\r
-              store_wr_x <= '1';\r
-          else\r
-              NEXT_STATE <= SLEEP;\r
-          end if;\r
-      when RD_RDY        =>\r
-          NEXT_STATE <= RD_ACK;\r
-          bus_ack_x  <= '1';\r
-      when WR_RDY        =>\r
-          NEXT_STATE <= WR_ACK;\r
-          bus_ack_x  <= '1';\r
-      when RD_ACK        =>\r
-          if( bus_read_in = '0' ) then\r
-              NEXT_STATE <= DONE;\r
-          else\r
-              NEXT_STATE <= RD_ACK;\r
-              bus_ack_x  <= '1';\r
-          end if;\r
-      when WR_ACK        =>\r
-          if( bus_write_in = '0' ) then\r
-              NEXT_STATE <= DONE;\r
-          else\r
-              NEXT_STATE <= WR_ACK;\r
-              bus_ack_x  <= '1';\r
-          end if;\r
-      when RD_BSY        =>\r
-          if( bus_read_in = '0' ) then\r
-              NEXT_STATE <= DONE;\r
-          else\r
-              NEXT_STATE <= RD_BSY;\r
-              bus_busy_x <= '1';\r
-          end if;\r
-      when WR_BSY        =>\r
-          if( bus_write_in = '0' ) then\r
-              NEXT_STATE <= DONE;\r
-          else\r
-              NEXT_STATE <= WR_BSY;\r
-              bus_busy_x <= '1';\r
-          end if;\r
-      when DONE        =>\r
-          NEXT_STATE <= SLEEP;\r
-\r
-      when others      =>\r
-          NEXT_STATE <= SLEEP;\r
-  end case;\r
-end process TRANSFORM;\r
-\r
----------------------------------------------------------\r
--- data handling                                       --\r
----------------------------------------------------------\r
-\r
--- register write\r
-THE_WRITE_REG_PROC: process( clk_in )\r
-  begin\r
-      if( rising_edge(clk_in) ) then\r
-          if   ( reset_in = '1' ) then\r
-              reg_ctrl_data   <= (others => '0');\r
-              reg_status_data <= (others => '0');\r
-              spi_start       <= '0';\r
-          elsif( (store_wr = '1') and (bus_addr_in(0) = '0') ) then\r
-              reg_ctrl_data   <= bus_data_in;\r
-              spi_start       <= spi_start_x;\r
-          elsif( (store_wr = '1') and (bus_addr_in(0) = '1') ) then\r
-              reg_status_data <= bus_data_in;\r
-              spi_start       <= spi_start_x;\r
-          else\r
-                 spi_start       <= spi_start_x;\r
-          end if;\r
-      end if;\r
-  end process THE_WRITE_REG_PROC;\r
-\r
-spi_start_x <= '1' when ( (store_wr = '1') and (bus_addr_in(0) = '0') ) else '0';\r
-\r
--- register read\r
-THE_READ_REG_PROC: process( clk_in )\r
-  begin\r
-      if( rising_edge(clk_in) ) then\r
-          if   ( reset_in = '1' ) then\r
-              reg_bus_data_out <= (others => '0');\r
-          elsif( (store_rd = '1') and (bus_addr_in(0) = '0') ) then\r
-              reg_bus_data_out <= reg_ctrl_data;\r
-          elsif( (store_rd = '1') and (bus_addr_in(0) = '1') ) then\r
-              reg_bus_data_out(31 downto 24) <= reg_status_data(31 downto 24);\r
-              reg_bus_data_out(23 downto 16) <= x"00";\r
-              reg_bus_data_out(15 downto 8)  <= x"00";\r
-              reg_bus_data_out(7 downto 0)   <= spi_bsm;\r
-          end if;\r
-      end if;\r
-  end process THE_READ_REG_PROC;\r
-\r
--- debug signals\r
-status_data(31 downto 24) <= spi_bsm;\r
-status_data(23)           <= spi_start;\r
-status_data(22 downto 0)  <= (others => '0');\r
-\r
--- output signals\r
-bus_ack_out       <= bus_ack;\r
-bus_busy_out      <= bus_busy;\r
-bus_data_out      <= reg_bus_data_out;\r
-stat(31 downto 3) <= spi_debug(31 downto 3); --status_data;\r
-stat(2)           <= spi_start;\r
-stat(1)           <= bus_write_in;\r
-stat(0)           <= bus_read_in;\r
-\r
-end Behavioral;\r
+library IEEE;
+use IEEE.STD_LOGIC_1164.ALL;
+use IEEE.STD_LOGIC_ARITH.ALL;
+use IEEE.STD_LOGIC_UNSIGNED.ALL;
+
+library work;
+use work.trb_net_std.all;
+use work.trb_net_components.all;
+
+entity spi_master is
+  port(
+    CLK_IN          : in   std_logic;
+    RESET_IN        : in   std_logic;
+    -- Slave bus
+    BUS_READ_IN     : in   std_logic;
+    BUS_WRITE_IN    : in   std_logic;
+    BUS_BUSY_OUT    : out  std_logic;
+    BUS_ACK_OUT     : out  std_logic;
+    BUS_ADDR_IN     : in   std_logic_vector(0 downto 0);
+    BUS_DATA_IN     : in   std_logic_vector(31 downto 0);
+    BUS_DATA_OUT    : out  std_logic_vector(31 downto 0);
+    -- SPI connections
+    SPI_CS_OUT      : out  std_logic;
+    SPI_SDI_IN      : in   std_logic;
+    SPI_SDO_OUT     : out  std_logic;
+    SPI_SCK_OUT     : out  std_logic;
+    -- BRAM for read/write data
+    BRAM_A_OUT      : out  std_logic_vector(7 downto 0);
+    BRAM_WR_D_IN    : in   std_logic_vector(7 downto 0);
+    BRAM_RD_D_OUT   : out  std_logic_vector(7 downto 0);
+    BRAM_WE_OUT     : out  std_logic;
+    -- Status lines
+    STAT            : out  std_logic_vector(31 downto 0) -- DEBUG
+  );
+end entity;
+
+architecture Behavioral of spi_master is
+  -- Placer Directives
+  attribute HGROUP : string;
+  -- for whole architecture
+  attribute HGROUP of Behavioral : architecture  is "SPI_group";
+
+-- Signals
+    type STATES is (SLEEP,RD_BSY,WR_BSY,RD_RDY,WR_RDY,RD_ACK,WR_ACK,DONE);
+    signal CURRENT_STATE, NEXT_STATE: STATES;
+
+    signal status_data      : std_logic_vector(31 downto 0);
+    signal spi_busy         : std_logic;
+
+    signal reg_ctrl_data    : std_logic_vector(31 downto 0); -- CMD, ADH, ADM, ADL
+    signal reg_status_data  : std_logic_vector(31 downto 0); -- MAX
+
+    signal reg_bus_data_out : std_logic_vector(31 downto 0); -- readback
+
+    signal spi_bsm          : std_logic_vector(7 downto 0);
+       signal spi_debug                : std_logic_vector(31 downto 0);
+
+    signal spi_start_x      : std_logic;
+    signal spi_start        : std_logic;
+
+    -- State machine signals
+    signal bus_busy_x       : std_logic;
+    signal bus_busy         : std_logic;
+    signal bus_ack_x        : std_logic;
+    signal bus_ack          : std_logic;
+    signal store_wr_x       : std_logic;
+    signal store_wr         : std_logic;
+    signal store_rd_x       : std_logic;
+    signal store_rd         : std_logic;
+
+begin
+
+---------------------------------------------------------
+-- SPI master                                          --
+---------------------------------------------------------
+
+THE_SPI_SLIM: spi_slim
+port map(
+  SYSCLK        => clk_in,
+  RESET         => reset_in,
+  -- Command interface
+  START_IN      => spi_start, -- not really nice, but should work
+  BUSY_OUT      => spi_busy,
+  CMD_IN        => reg_ctrl_data(31 downto 24),
+  ADH_IN        => reg_ctrl_data(23 downto 16),
+  ADM_IN        => reg_ctrl_data(15 downto 8),
+  ADL_IN        => reg_ctrl_data(7 downto 0),
+  MAX_IN        => reg_status_data(31 downto 24),
+  TXDATA_IN     => bram_wr_d_in,
+  TX_RD_OUT     => open, -- not needed
+  RXDATA_OUT    => bram_rd_d_out,
+  RX_WR_OUT     => bram_we_out,
+  TX_RX_A_OUT   => bram_a_out,
+  -- SPI interface
+  SPI_SCK_OUT   => spi_sck_out,
+  SPI_CS_OUT    => spi_cs_out,
+  SPI_SDI_IN    => spi_sdi_in,
+  SPI_SDO_OUT   => spi_sdo_out,
+  -- DEBUG
+  CLK_EN_OUT    => open, -- not needed
+  BSM_OUT       => spi_bsm,
+  DEBUG_OUT     => spi_debug --open -- BUG
+);
+
+---------------------------------------------------------
+-- Statemachine                                        --
+---------------------------------------------------------
+STATE_MEM: process( clk_in )
+begin
+  if( rising_edge(clk_in) ) then
+    if( reset_in = '1' ) then
+      CURRENT_STATE <= SLEEP;
+      bus_busy      <= '0';
+      bus_ack       <= '0';
+      store_wr      <= '0';
+      store_rd      <= '0';
+    else
+      CURRENT_STATE <= NEXT_STATE;
+      bus_busy      <= bus_busy_x;
+      bus_ack       <= bus_ack_x;
+      store_wr      <= store_wr_x;
+      store_rd      <= store_rd_x;
+    end if;
+  end if;
+end process STATE_MEM;
+
+TRANSFORM: process(CURRENT_STATE, bus_read_in, bus_write_in, spi_busy, bus_addr_in )
+begin
+  NEXT_STATE <= SLEEP;
+  bus_busy_x <= '0';
+  bus_ack_x  <= '0';
+  store_wr_x <= '0';
+  store_rd_x <= '0';
+  case CURRENT_STATE is
+      when SLEEP        =>
+          if   ( (spi_busy = '0') and (bus_read_in = '1') ) then
+              NEXT_STATE <= RD_RDY;
+              store_rd_x <= '1';
+          elsif( (spi_busy = '0') and (bus_write_in = '1') ) then
+              NEXT_STATE <= WR_RDY;
+              store_wr_x <= '1';
+          elsif( (bus_addr_in(0) = '0') and (spi_busy = '1') and (bus_read_in = '1') ) then
+              NEXT_STATE <= RD_BSY; -- CMD register is busy protected
+              bus_busy_x <= '1';
+          elsif( (bus_addr_in(0) = '0') and (spi_busy = '1') and (bus_write_in = '1') ) then
+              NEXT_STATE <= WR_BSY; -- CMD register is busy protected
+              bus_busy_x <= '1';
+          elsif( (bus_addr_in(0) = '1') and (spi_busy = '1') and (bus_read_in = '1') ) then
+              NEXT_STATE <= RD_RDY; -- STATUS register is not
+              store_rd_x <= '1';
+          elsif( (bus_addr_in(0) = '1') and (spi_busy = '1') and (bus_write_in = '1') ) then
+              NEXT_STATE <= WR_RDY; -- STATUS register is not
+              store_wr_x <= '1';
+          else
+              NEXT_STATE <= SLEEP;
+          end if;
+      when RD_RDY        =>
+          NEXT_STATE <= RD_ACK;
+          bus_ack_x  <= '1';
+      when WR_RDY        =>
+          NEXT_STATE <= WR_ACK;
+          bus_ack_x  <= '1';
+      when RD_ACK        =>
+          if( bus_read_in = '0' ) then
+              NEXT_STATE <= DONE;
+          else
+              NEXT_STATE <= RD_ACK;
+              bus_ack_x  <= '1';
+          end if;
+      when WR_ACK        =>
+          if( bus_write_in = '0' ) then
+              NEXT_STATE <= DONE;
+          else
+              NEXT_STATE <= WR_ACK;
+              bus_ack_x  <= '1';
+          end if;
+      when RD_BSY        =>
+          if( bus_read_in = '0' ) then
+              NEXT_STATE <= DONE;
+          else
+              NEXT_STATE <= RD_BSY;
+              bus_busy_x <= '1';
+          end if;
+      when WR_BSY        =>
+          if( bus_write_in = '0' ) then
+              NEXT_STATE <= DONE;
+          else
+              NEXT_STATE <= WR_BSY;
+              bus_busy_x <= '1';
+          end if;
+      when DONE        =>
+          NEXT_STATE <= SLEEP;
+
+      when others      =>
+          NEXT_STATE <= SLEEP;
+  end case;
+end process TRANSFORM;
+
+---------------------------------------------------------
+-- data handling                                       --
+---------------------------------------------------------
+
+-- register write
+THE_WRITE_REG_PROC: process( clk_in )
+  begin
+      if( rising_edge(clk_in) ) then
+          if   ( reset_in = '1' ) then
+              reg_ctrl_data   <= (others => '0');
+              reg_status_data <= (others => '0');
+              spi_start       <= '0';
+          elsif( (store_wr = '1') and (bus_addr_in(0) = '0') ) then
+              reg_ctrl_data   <= bus_data_in;
+              spi_start       <= spi_start_x;
+          elsif( (store_wr = '1') and (bus_addr_in(0) = '1') ) then
+              reg_status_data <= bus_data_in;
+              spi_start       <= spi_start_x;
+          else
+                 spi_start       <= spi_start_x;
+          end if;
+      end if;
+  end process THE_WRITE_REG_PROC;
+
+spi_start_x <= '1' when ( (store_wr = '1') and (bus_addr_in(0) = '0') ) else '0';
+
+-- register read
+THE_READ_REG_PROC: process( clk_in )
+  begin
+      if( rising_edge(clk_in) ) then
+          if   ( reset_in = '1' ) then
+              reg_bus_data_out <= (others => '0');
+          elsif( (store_rd = '1') and (bus_addr_in(0) = '0') ) then
+              reg_bus_data_out <= reg_ctrl_data;
+          elsif( (store_rd = '1') and (bus_addr_in(0) = '1') ) then
+              reg_bus_data_out(31 downto 24) <= reg_status_data(31 downto 24);
+              reg_bus_data_out(23 downto 16) <= x"00";
+              reg_bus_data_out(15 downto 8)  <= x"00";
+              reg_bus_data_out(7 downto 0)   <= spi_bsm;
+          end if;
+      end if;
+  end process THE_READ_REG_PROC;
+
+-- debug signals
+status_data(31 downto 24) <= spi_bsm;
+status_data(23)           <= spi_start;
+status_data(22 downto 0)  <= (others => '0');
+
+-- output signals
+bus_ack_out       <= bus_ack;
+bus_busy_out      <= bus_busy;
+bus_data_out      <= reg_bus_data_out;
+stat(31 downto 3) <= spi_debug(31 downto 3); --status_data;
+stat(2)           <= spi_start;
+stat(1)           <= bus_write_in;
+stat(0)           <= bus_read_in;
+
+end Behavioral;