]> jspc29.x-matter.uni-frankfurt.de Git - trb3.git/commitdiff
breakpoint so far, have a nxyter now..lets see
authorhadaq <hadaq>
Thu, 8 Nov 2012 19:13:30 +0000 (19:13 +0000)
committerhadaq <hadaq>
Thu, 8 Nov 2012 19:13:30 +0000 (19:13 +0000)
19 files changed:
nxyter/source/adcmv3_components.vhd
nxyter/source/gray_decoder.vhd
nxyter/source/gray_encoder.vhd
nxyter/source/i2c_gstart.vhd
nxyter/source/i2c_master.vhd
nxyter/source/i2c_sendb.vhd
nxyter/source/i2c_slim.vhd
nxyter/source/nx_i2c_master.vhd [new file with mode: 0644]
nxyter/source/nx_i2c_master.vhd- [new file with mode: 0644]
nxyter/source/nx_i2c_sendbyte.vhd [new file with mode: 0644]
nxyter/source/nx_i2c_startstop.vhd [new file with mode: 0644]
nxyter/source/nx_i2c_timer.vhd [new file with mode: 0644]
nxyter/source/nx_timestamp_fifo_read.vhd
nxyter/source/nx_timestamp_sim.vhd
nxyter/source/nxyter.vhd
nxyter/source/nxyter_components.vhd
nxyter/source/nxyter_registers.vhd
nxyter/source/slave_bus.vhd [deleted file]
nxyter/source/slv_ped_thr_mem.vhd [deleted file]

index 8655c89964bfe854d643fc5f2d06c08391b6ff96..d94cb3fca9a6e480c4f05a27a47cd1ac3481c1b7 100644 (file)
@@ -83,10 +83,10 @@ component i2c_master
     SDA_OUT      : out std_logic;
     SCL_IN       : in  std_logic;
     SCL_OUT      : out std_logic;
-    STAT         : out std_logic_vector(31 downto 0));
+    STAT         : out std_logic_vector(31 downto 0)
+    );
 end component i2c_master;
 
-
 component I2C_GSTART
   port (
     CLK_IN       : in  std_logic;
@@ -111,7 +111,7 @@ component i2c_sendb
     CLK_IN       : in  std_logic;
     RESET_IN     : in  std_logic;
     DOBYTE_IN    : in  std_logic;
-    I2C_SPEED_IN : in  std_logic_vector(7 downto 0);
+    I2C_SPEED_IN : in  std_logic_vector(8 downto 0);
     I2C_BYTE_IN  : in  std_logic_vector(8 downto 0);
     I2C_BACK_OUT : out std_logic_vector(8 downto 0);
     SDA_IN       : in  std_logic;
@@ -131,7 +131,7 @@ component i2c_slim
     RESET_IN     : in  std_logic;
     I2C_GO_IN    : in  std_logic;
     ACTION_IN    : in  std_logic;
-    I2C_SPEED_IN : in  std_logic_vector(5 downto 0);
+    I2C_SPEED_IN : in  std_logic_vector(8 downto 0);
     I2C_ADR_IN   : in  std_logic_vector(7 downto 0);
     I2C_CMD_IN   : in  std_logic_vector(7 downto 0);
     I2C_DW_IN    : in  std_logic_vector(7 downto 0);
index cdcdcd5fefc5f88f8c5d9d2814d055275b49f077..cb7f6f61cc92bd35dfe08415170d26119c551cbd 100644 (file)
@@ -33,22 +33,23 @@ architecture Gray_Decoder of Gray_Decoder is
 begin  -- Gray_Decoder
 
   PROC_DECODER: process (CLK_IN)
+    variable b : std_logic_vector(WIDTH -1 downto 0) := (others => '0');
   begin
     if( rising_edge(CLK_IN) ) then
       if( RESET_IN = '1' ) then
-        binary_o <= (others => '0');
+        b := (others => '0');
       else
-        binary_o(WIDTH - 1) <= GRAY_IN(WIDTH - 1);
+        b(WIDTH - 1) := GRAY_IN(WIDTH - 1);
     
-        for I in (WIDTH - 2) to 0 loop
-          binary_o(I) <= binary_o(I + 1) xor GRAY_IN(I);
+        for I in (WIDTH - 2) downto 0 loop
+          b(I) := b(I + 1) xor GRAY_IN(I);
         end loop;
       end if;
     end if;
-    
+    binary_o <= b;
   end process PROC_DECODER;
 
-  -- Output
+-- Output
   BINARY_OUT <= binary_o;
     
 end Gray_Decoder;
index 8c642ff3e7afb470f750cdbe7f28d60149e966a6..7dc28a938644a25c4602d645239a9909999d7af9 100644 (file)
@@ -39,13 +39,12 @@ begin
         gray_o <= (others => '0');
       else
         gray_o(WIDTH - 1) <= BINARY_IN(WIDTH -1);
-        for I in (WIDTH - 2) to 0 loop
+        for I in (WIDTH - 2) downto 0 loop
           gray_o(I) <= BINARY_IN(I + 1) xor BINARY_IN(I);
         end loop;
       end if;
     end if;
 
-    GRAY_O <= gray_o; 
   end process PROC_ENCODER;
 
   -- Output
index 71aa45b4cc5c5d11bb4f5052028ed19e544df796..54b2c41312cdf65be82b22c6649e0eaeefcf2b98 100644 (file)
@@ -12,7 +12,7 @@ entity I2C_GSTART is
     RESET_IN        : in    std_logic;\r
     START_IN        : in    std_logic;\r
     DOSTART_IN      : in    std_logic;\r
-    I2C_SPEED_IN    : in    std_logic_vector(7 downto 0);\r
+    I2C_SPEED_IN    : in    std_logic_vector(8 downto 0);\r
     SDONE_OUT       : out   std_logic;\r
     SOK_OUT         : out   std_logic;\r
     SDA_IN          : in    std_logic;\r
@@ -42,7 +42,7 @@ architecture Behavioral of I2C_GSTART is
   signal CURRENT_STATE, NEXT_STATE: STATES;\r
 \r
   signal bsm          : std_logic_vector(3 downto 0);\r
-  signal cctr         : std_logic_vector(7 downto 0); -- counter for bit length\r
+  signal cctr         : unsigned(8 downto 0); -- counter for bit length\r
 \r
   signal cycdone_x    : std_logic;\r
   signal cycdone      : std_logic; -- one counter period done\r
@@ -80,7 +80,7 @@ begin
   end process THE_CYC_CTR_PROC;\r
 \r
 -- end of cycle recognition\r
-  cycdone_x <= '1' when (cctr = x"00") else '0';\r
+  cycdone_x <= '1' when (cctr = 0) else '0';\r
 \r
 -- The main state machine\r
 -- State memory process\r
index d61567443f422620993b18808a15edcb60a9f935..59c9769599d6b7d1949b79a06629cf06716d1dfe 100644 (file)
@@ -59,6 +59,8 @@ architecture Behavioral of i2c_master is
   signal status_data      : std_logic_vector(31 downto 0);\r
   signal i2c_debug        : std_logic_vector(31 downto 0);\r
 \r
+  signal i2c_speed_static : std_logic_vector(8 downto 0);\r
+  \r
 begin\r
 \r
 ---------------------------------------------------------\r
@@ -72,7 +74,7 @@ begin
       -- I2C command / setup\r
       I2C_GO_IN       => reg_slv_data_in(31),\r
       ACTION_IN       => reg_slv_data_in(30),\r
-      I2C_SPEED_IN    => reg_slv_data_in(29 downto 24),\r
+      I2C_SPEED_IN    => i2c_speed_static,\r
       I2C_ADR_IN      => reg_slv_data_in(23 downto 16),\r
       I2C_CMD_IN      => reg_slv_data_in(15 downto 8),\r
       I2C_DW_IN       => reg_slv_data_in(7 downto 0),\r
@@ -91,7 +93,8 @@ begin
   status_data(23 downto 21) <= (others => '0');\r
   status_data(20 downto 16) <= i2c_debug(4 downto 0);\r
   status_data(15 downto 8)  <= (others => '0');\r
-\r
+  i2c_speed_static          <= (others => '1');\r
+  \r
 -- Fake\r
   stat <= i2c_debug;\r
 \r
index 778878a4bd1dfc450b982d33e4e79c9dcc0fb229..af292479c1cac7bf4e0d2a8225c93d2afbd16e11 100644 (file)
@@ -11,13 +11,12 @@ entity i2c_sendb is
     CLK_IN          : in    std_logic;\r
     RESET_IN        : in    std_logic;\r
     DOBYTE_IN       : in    std_logic;\r
-    I2C_SPEED_IN    : in    std_logic_vector( 7 downto 0 );\r
+    I2C_SPEED_IN    : in    std_logic_vector( 8 downto 0 );\r
     I2C_BYTE_IN     : in    std_logic_vector( 8 downto 0 );\r
     I2C_BACK_OUT    : out   std_logic_vector( 8 downto 0 );\r
     SDA_IN          : in    std_logic;\r
     R_SDA_OUT       : out   std_logic;\r
     S_SDA_OUT       : out   std_logic;\r
---  SCL_IN          : in    std_logic;\r
     R_SCL_OUT       : out   std_logic;\r
     S_SCL_OUT       : out   std_logic;\r
     BDONE_OUT       : out   std_logic;\r
@@ -62,7 +61,7 @@ architecture Behavioral of i2c_sendb is
   signal s_scl        : std_logic; -- output for SCL\r
 \r
   signal bctr         : std_logic_vector( 3 downto 0 ); -- bit counter    (1...9)\r
-  signal cctr         : std_logic_vector( 7 downto 0 ); -- counter for bit length\r
+  signal cctr         : unsigned(8 downto 0); -- counter for bit length\r
   signal bok          : std_logic;\r
   signal cycdone      : std_logic; -- one counter period done\r
   signal bytedone     : std_logic; -- all bits sents\r
@@ -93,7 +92,7 @@ begin
   end process THE_BIT_CTR_PROC;\r
 \r
 -- end of byte recognition\r
-  bytedone <= '1' when (bctr = x"9") else '0';\r
+  bytedone <= '1' when (bctr = x"a") else '0';\r
 \r
 -- Countdown for one half of SCL (adjustable clock width)\r
   THE_CYC_CTR_PROC: process( clk_in )\r
@@ -110,7 +109,7 @@ begin
   end process THE_CYC_CTR_PROC;\r
 \r
 -- end of cycle recognition\r
-  cycdone <= '1' when (cctr = x"00") else '0';\r
+  cycdone <= '1' when (cctr = 0) else '0';\r
 \r
 -- Bit output\r
   THE_BIT_OUT_PROC: process( clk_in )\r
index 656f9c9b261227a286926dea9c22949c7cbc606f..a2193322f41dcc0050408b38817339e691655056 100644 (file)
@@ -6,18 +6,15 @@ use IEEE.STD_LOGIC_UNSIGNED.ALL;
 library work;\r
 use work.adcmv3_components.all;\r
 \r
--- BUG: does alway set bit 0 of address byte to zero !!!!\r
--- REMARK: this is not a bug, but a feature....\r
-\r
 entity i2c_slim is\r
-  port(\r
+  port (\r
     CLK_IN          : in    std_logic;\r
     RESET_IN        : in    std_logic;\r
 \r
     -- I2C command / setup\r
     I2C_GO_IN       : in    std_logic; -- startbit to trigger I2C actions\r
     ACTION_IN       : in    std_logic; -- '0' -> write, '1' -> read\r
-    I2C_SPEED_IN    : in    std_logic_vector( 5 downto 0 ); -- speed adjustment (to be defined)\r
+    I2C_SPEED_IN    : in    std_logic_vector( 8 downto 0 ); -- speed adjustment\r
     I2C_ADR_IN      : in    std_logic_vector( 7 downto 0 ); -- I2C address byte (R/W bit is ignored)\r
     I2C_CMD_IN      : in    std_logic_vector( 7 downto 0 ); -- I2C command byte (sent after address byte)\r
     I2C_DW_IN       : in    std_logic_vector( 7 downto 0 ); -- data word for write command\r
@@ -109,11 +106,11 @@ architecture Behavioral of i2c_slim is
 \r
   signal gs_debug     : std_logic_vector(3 downto 0);\r
 \r
-  signal i2c_speed    : std_logic_vector(7 downto 0);\r
+  signal i2c_speed    : std_logic_vector(8 downto 0);\r
 \r
 begin\r
 \r
-  i2c_speed <= i2c_speed_in & "00";\r
+  i2c_speed <= I2C_SPEED_IN & "00";\r
 \r
 -- Read phase indicator\r
   THE_PHASE_PROC: process( clk_in )\r
@@ -202,10 +199,10 @@ begin
                             NEXT_STATE <= LOADC; -- I2C write\r
                             load_c_x   <= '1';\r
                           elsif( (bdone = '1') and (bok = '1') and (action_in = '1') and (phase = '0') ) then\r
-                            NEXT_STATE <= LOADC;    -- I2C read, send register address\r
+                            NEXT_STATE <= LOADC; -- I2C read, send register address\r
                             load_c_x   <= '1';\r
                           elsif( (bdone = '1') and (bok = '1') and (action_in = '1') and (phase = '1') ) then\r
-                            NEXT_STATE <= LOADD;    -- I2C read, send 0xff dummy byte\r
+                            NEXT_STATE <= LOADD; -- I2C read, send 0xff dummy byte\r
                             load_d_x   <= '1';\r
                           elsif( (bdone = '1') and (bok = '0') and (phase = '0') ) then\r
                             NEXT_STATE <= E_ADDR; -- first address phase failed\r
@@ -310,7 +307,6 @@ begin
   end process DECODE;\r
 \r
 -- We need to load different data sets\r
---LOAD_DATA_PROC: process( clk_in, reset_in, CURRENT_STATE, action_in, phase)\r
   LOAD_DATA_PROC: process( clk_in )\r
   begin\r
     if( rising_edge(clk_in) ) then\r
@@ -321,9 +317,9 @@ begin
       elsif( (CURRENT_STATE = LOADA) and (phase = '1') ) then\r
         i2c_byte <= i2c_adr_in(6 downto 0) & '1' & '1'; -- send read address, receive ACK\r
       elsif( (CURRENT_STATE = LOADC) and (action_in = '0') ) then\r
-        i2c_byte <= i2c_cmd_in(7 downto 1) & '0' & '1'; -- send command byte (WRITE), receive ACK\r
+        i2c_byte <= i2c_cmd_in(7 downto 0) & '1'; -- send command byte, receive ACK\r
       elsif( (CURRENT_STATE = LOADC) and (action_in = '1') ) then\r
-        i2c_byte <= i2c_cmd_in(7 downto 1) & '1' & '1'; -- send command byte (READ), receive ACK\r
+        i2c_byte <= i2c_cmd_in(7 downto 0) & '1'; -- send command byte, receive ACK\r
       elsif( (CURRENT_STATE = LOADD) and (action_in = '0') ) then\r
         i2c_byte <= i2c_dw_in & '1'; -- send data byte, receive ACK\r
       elsif( (CURRENT_STATE = LOADD) and (action_in = '1') ) then\r
@@ -343,8 +339,7 @@ begin
       I2C_BACK_OUT    => i2c_dr,\r
       SDA_IN          => sda_in,\r
       R_SDA_OUT       => r_sda_sb,\r
-      S_SDA_OUT      => s_sda_sb,\r
---  SCL_IN          => scl_in,\r
+      S_SDA_OUT       => s_sda_sb,\r
       R_SCL_OUT       => r_scl_sb,\r
       S_SCL_OUT       => s_scl_sb,\r
       BDONE_OUT       => bdone,\r
diff --git a/nxyter/source/nx_i2c_master.vhd b/nxyter/source/nx_i2c_master.vhd
new file mode 100644 (file)
index 0000000..d092a06
--- /dev/null
@@ -0,0 +1,382 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.numeric_std.all;\r
+\r
+library work;\r
+use work.nxyter_components.all;\r
+\r
+entity nx_i2c_master is\r
+  generic (\r
+    i2c_speed : unsigned(11 downto 0) := x"3e8"\r
+    );\r
+  port(\r
+    CLK_IN               : in    std_logic;\r
+    RESET_IN             : in    std_logic;\r
+\r
+    -- I2C connections\r
+    SDA_INOUT            : inout std_logic;\r
+    SCL_INOUT            : inout std_logic;\r
+\r
+    -- Slave bus         \r
+    SLV_READ_IN          : in  std_logic;\r
+    SLV_WRITE_IN         : in  std_logic;\r
+    SLV_DATA_OUT         : out std_logic_vector(31 downto 0);\r
+    SLV_DATA_IN          : in  std_logic_vector(31 downto 0);\r
+    SLV_ACK_OUT          : out std_logic;\r
+    SLV_NO_MORE_DATA_OUT : out std_logic;\r
+    SLV_UNKNOWN_ADDR_OUT : out std_logic;\r
+    \r
+    -- Debug Line\r
+    DEBUG_OUT            : out std_logic_vector(15 downto 0)\r
+    );\r
+end entity;\r
+\r
+architecture Behavioral of nx_i2c_master is\r
+\r
+  signal sda_i : std_logic;\r
+  signal sda_x : std_logic;\r
+  signal sda   : std_logic;\r
+\r
+  signal scl_i : std_logic;\r
+  signal scl_x : std_logic;\r
+  signal scl   : std_logic;\r
+\r
+  -- I2C Master  \r
+  signal sda_o                 : std_logic;\r
+  signal scl_o                 : std_logic;\r
+  signal i2c_start             : std_logic;\r
+  \r
+  signal startstop_select      : std_logic;\r
+  signal startstop_seq_start   : std_logic;\r
+  signal sendbyte_seq_start    : std_logic;\r
+  signal sendbyte_byte         : std_logic_vector(7 downto 0);\r
+\r
+  signal startstop_select_x    : std_logic;\r
+  signal startstop_seq_start_x : std_logic;\r
+  signal wait_timer_init_x     : std_logic_vector(11 downto 0);\r
+  signal sendbyte_seq_start_x  : std_logic;\r
+  signal sendbyte_byte_x       : std_logic_vector(7 downto 0);\r
+  signal i2c_ack_x             : std_logic;\r
+  \r
+  signal sda_startstop         : std_logic;\r
+  signal scl_startstop         : std_logic;\r
+  signal sda_sendbyte          : std_logic;\r
+  signal scl_sendbyte          : std_logic;\r
+  signal startstop_done        : std_logic;\r
+\r
+  signal sendbyte_done         : std_logic;\r
+  signal sendbyte_ack          : std_logic;\r
+  signal i2c_ack               : std_logic;\r
+  signal i2c_notready          : std_logic;\r
+  signal i2c_error             : std_logic_vector(3 downto 0);\r
+\r
+  type STATES is (S_IDLE,\r
+                  S_START,\r
+                  S_START_WAIT,\r
+\r
+                  S_SEND_CHIP_ID,\r
+                  S_SEND_CHIP_ID_WAIT,\r
+                  S_SEND_REGISTER,\r
+                  S_SEND_REGISTER_WAIT,\r
+\r
+                  S_STOP,\r
+                  S_STOP_WAIT\r
+                  );\r
+  signal STATE, NEXT_STATE : STATES;\r
+\r
+  \r
+  -- I2C Timer\r
+  signal wait_timer_init         : unsigned(11 downto 0);\r
+  signal wait_timer_done         : std_logic;\r
+                                 \r
+  -- TRBNet Slave Bus            \r
+  signal slv_data_out_o          : std_logic_vector(31 downto 0);\r
+  signal slv_no_more_data_o      : std_logic;\r
+  signal slv_unknown_addr_o      : std_logic;\r
+  signal slv_ack_o               : std_logic;\r
+  signal reg_data                : std_logic_vector(31 downto 0);\r
+  signal i2c_chipid              : std_logic_vector(6 downto 0);\r
+  signal i2c_rw_bit              : std_logic;\r
+  signal i2c_registerid          : std_logic_vector(7 downto 0);\r
+  signal i2c_register_data       : std_logic_vector(7 downto 0);\r
+  signal i2c_register_value_read : std_logic_vector(7 downto 0);\r
+\r
+begin\r
+\r
+  -- Timer\r
+  nx_i2c_timer_1: nx_i2c_timer\r
+    port map (\r
+      CLK_IN         => CLK_IN,\r
+      RESET_IN       => RESET_IN,\r
+      TIMER_START_IN => wait_timer_init,\r
+      TIMER_DONE_OUT => wait_timer_done\r
+      );\r
+\r
+  -- Start / Stop Sequence\r
+  nx_i2c_startstop_1: nx_i2c_startstop\r
+    generic map (\r
+      i2c_speed => i2c_speed\r
+      )\r
+    port map (\r
+      CLK_IN            => CLK_IN,\r
+      RESET_IN          => RESET_IN,\r
+      START_IN          => startstop_seq_start,\r
+      SELECT_IN         => startstop_select,\r
+      SEQUENCE_DONE_OUT => startstop_done,\r
+      SDA_OUT           => sda_startstop,\r
+      SCL_OUT           => scl_startstop,\r
+      NREADY_OUT        => i2c_notready\r
+      );\r
+\r
+  nx_i2c_sendbyte_1: nx_i2c_sendbyte\r
+    generic map (\r
+      i2c_speed => i2c_speed\r
+      )\r
+    port map (\r
+      CLK_IN            => CLK_IN,\r
+      RESET_IN          => RESET_IN,\r
+      START_IN          => sendbyte_seq_start,\r
+      BYTE_IN           => sendbyte_byte,\r
+      SEQUENCE_DONE_OUT => sendbyte_done,\r
+      SDA_OUT           => sda_sendbyte,\r
+      SCL_OUT           => scl_sendbyte,\r
+      SDA_IN            => sda,\r
+      ACK_OUT           => sendbyte_ack\r
+      );\r
+  \r
+  -- Debug Line\r
+  DEBUG_OUT(0) <= sda_o;\r
+  DEBUG_OUT(1) <= scl_o;\r
+  DEBUG_OUT(2) <= i2c_start;\r
+  DEBUG_OUT(3) <= startstop_done;\r
+  DEBUG_OUT(4) <= sda_startstop;\r
+  DEBUG_OUT(5) <= scl_startstop;\r
+  DEBUG_OUT(6) <= sda_sendbyte;\r
+  DEBUG_OUT(7) <= scl_sendbyte;\r
+  \r
+--  DEBUG_OUT(11 downto 8)  <= i2c_error;\r
+\r
+  DEBUG_OUT(15 downto 8) <= (others => '0');\r
+\r
+  i2c_error(0)          <= i2c_notready;\r
+  i2c_error(1)          <= not sendbyte_ack;\r
+  i2c_error(3 downto 2) <= (others => '0');\r
+  \r
+  -- Sync I2C Lines\r
+  sda_i <= SDA_INOUT;\r
+  scl_i <= SCL_INOUT;\r
+\r
+  PROC_I2C_LINES_SYNC: process(CLK_IN)\r
+  begin\r
+    if( rising_edge(CLK_IN) ) then\r
+      if( RESET_IN = '1' ) then\r
+        sda_x <= '1';\r
+        sda   <= '1';\r
+\r
+        scl_x <= '1';\r
+        scl   <= '1';\r
+      else\r
+        sda_x <= sda_i;\r
+        sda   <= sda_x;\r
+\r
+        scl_x <= scl_i;\r
+        scl   <= scl_x;\r
+      end if;\r
+    end if;\r
+  end process PROC_I2C_LINES_SYNC;\r
+\r
+  PROC_I2C_MASTER_TRANSFER: process(CLK_IN)\r
+  begin \r
+    if( rising_edge(CLK_IN) ) then\r
+      if( RESET_IN = '1' ) then\r
+        i2c_ack               <= '0';\r
+        startstop_select      <= '0';\r
+        startstop_seq_start   <= '0';\r
+        sendbyte_seq_start    <= '0';\r
+        sendbyte_byte         <= (others => '0');\r
+        wait_timer_init       <= (others => '0');\r
+        STATE                 <= S_IDLE;\r
+      else\r
+        i2c_ack               <= i2c_ack_x;\r
+        startstop_select      <= startstop_select_x;\r
+        startstop_seq_start   <= startstop_seq_start_x;\r
+        sendbyte_seq_start    <= sendbyte_seq_start_x;\r
+        sendbyte_byte         <= sendbyte_byte_x;\r
+        wait_timer_init       <= wait_timer_init_x;\r
+        STATE                 <= NEXT_STATE;\r
+      end if;\r
+    end if;\r
+  end process PROC_I2C_MASTER_TRANSFER;\r
+  \r
+        \r
+  PROC_I2C_MASTER: process(STATE)\r
+  begin\r
+    -- Defaults\r
+    sda_o                   <= '1';\r
+    scl_o                   <= '1';\r
+    i2c_ack_x               <= '0';\r
+    startstop_select_x      <= '0';\r
+    startstop_seq_start_x   <= '0';\r
+    sendbyte_seq_start_x    <= '0';\r
+    sendbyte_byte_x         <= (others => '0');\r
+    wait_timer_init_x       <= (others => '0');\r
+    \r
+    case STATE is\r
+\r
+      when S_IDLE =>\r
+        if (i2c_start = '1') then\r
+          NEXT_STATE <= S_START;\r
+        else\r
+          NEXT_STATE <= S_IDLE;\r
+        end if;\r
+            \r
+        -- I2C START Sequence \r
+      when S_START =>\r
+        startstop_select_x    <= '1';\r
+        startstop_seq_start_x <= '1';\r
+        NEXT_STATE            <= S_START_WAIT;\r
+        \r
+      when S_START_WAIT =>\r
+        if (startstop_done = '0') then\r
+          NEXT_STATE <= S_START_WAIT;\r
+        else\r
+          sda_o      <= '0';\r
+          scl_o      <= '0';\r
+          NEXT_STATE <= S_SEND_CHIP_ID;\r
+        end if;\r
+                   \r
+        -- I2C SEND ChipId Sequence\r
+      when S_SEND_CHIP_ID =>\r
+        sda_o <= '0';\r
+        scl_o <= '0';\r
+        sendbyte_byte_x(7 downto 1) <= i2c_chipid;\r
+        sendbyte_byte_x(0)          <= i2c_rw_bit;\r
+        sendbyte_seq_start_x        <= '1';\r
+        NEXT_STATE                  <= S_SEND_CHIP_ID_WAIT;\r
+        \r
+      when S_SEND_CHIP_ID_WAIT =>\r
+        if (sendbyte_done = '0') then\r
+          NEXT_STATE <= S_SEND_CHIP_ID_WAIT;\r
+        else\r
+          sda_o      <= '0';\r
+          scl_o      <= '0';\r
+          NEXT_STATE <= S_SEND_REGISTER;\r
+        end if;\r
+\r
+        -- I2C SEND RegisterId Sequence\r
+\r
+      when S_SEND_REGISTER =>\r
+        sda_o <= '0';\r
+        scl_o <= '0';\r
+        sendbyte_byte_x        <= i2c_registerid;\r
+        sendbyte_seq_start_x   <= '1';\r
+        NEXT_STATE             <= S_SEND_REGISTER_WAIT;\r
+        \r
+      when S_SEND_REGISTER_WAIT =>\r
+        if (sendbyte_done = '0') then\r
+          NEXT_STATE <= S_SEND_REGISTER_WAIT;\r
+        else\r
+          sda_o      <= '0';\r
+          scl_o      <= '0';\r
+          NEXT_STATE <= S_STOP;\r
+        end if;\r
+                \r
+        -- I2C STOP Sequence \r
+      when S_STOP =>\r
+        sda_o                 <= '0';\r
+        scl_o                 <= '0';\r
+        startstop_select_x    <= '0';\r
+        startstop_seq_start_x <= '1';\r
+        NEXT_STATE            <= S_STOP_WAIT;\r
+        \r
+      when S_STOP_WAIT =>\r
+        if (startstop_done = '0') then\r
+          NEXT_STATE <= S_STOP_WAIT;\r
+        else\r
+          NEXT_STATE <= S_IDLE;\r
+        end if;\r
+        \r
+    end case;\r
+  end process PROC_I2C_MASTER;\r
+\r
+  -----------------------------------------------------------------------------\r
+  -- TRBNet Slave Bus\r
+  -----------------------------------------------------------------------------\r
+\r
+  PROC_SLAVE_BUS: process(CLK_IN)\r
+  begin\r
+    if( rising_edge(CLK_IN) ) then\r
+      if( RESET_IN = '1' ) then\r
+        reg_data           <= x"affeaffe";\r
+        slv_data_out_o     <= (others => '0');\r
+        slv_no_more_data_o <= '0';\r
+        slv_unknown_addr_o <= '0';\r
+        slv_ack_o          <= '0';\r
+        i2c_start          <= '0';\r
+\r
+        i2c_chipid              <= (others => '0');    \r
+        i2c_rw_bit              <= '0';    \r
+        i2c_registerid          <= (others => '0');    \r
+        i2c_register_data       <= (others => '0');    \r
+        i2c_register_value_read <= (others => '0');\r
+            \r
+      else\r
+        slv_ack_o <= '1';\r
+        slv_unknown_addr_o <= '0';\r
+        slv_no_more_data_o <= '0';\r
+        slv_data_out_o     <= (others => '0');\r
+        i2c_start          <= '0';\r
+        \r
+        if (SLV_WRITE_IN  = '1') then\r
+          i2c_chipid        <= SLV_DATA_IN(30 downto 24);\r
+          i2c_registerid    <= SLV_DATA_IN(23 downto 16);\r
+          i2c_rw_bit        <= SLV_DATA_IN(8);\r
+          i2c_register_data <= SLV_DATA_IN(7 downto 0); \r
+          i2c_start         <= '1';\r
+        elsif (SLV_READ_IN = '1') then\r
+          slv_data_out_o    <= reg_data;\r
+          \r
+        else\r
+          slv_ack_o <= '0';\r
+        end if;\r
+      end if;\r
+    end if;           \r
+  end process PROC_SLAVE_BUS;\r
+\r
+\r
+\r
+--   Write bit definition OLD boehmer\r
+--   ====================\r
+-- \r
+-- \r
+--   D[31]    I2C_GO          0 => don't do anything on I2C, 1 => start I2C access\r
+--   D[30]    I2C_ACTION      0 => write byte, 1 => read byte\r
+--   D[29:24] I2C_SPEED       set to all '1'\r
+--   D[23:16] I2C_ADDRESS     address of I2C chip\r
+--   D[15:8]  I2C_CMD         command byte for access\r
+--   D[7:0]   I2C_DATA        data to be written\r
+--\r
+--\r
+  \r
+  -----------------------------------------------------------------------------\r
+  -- Output Signals\r
+  -----------------------------------------------------------------------------\r
+\r
+  -- I2c Outputs\r
+  SDA_INOUT <= '0' when (sda_o = '0' or\r
+                         sda_startstop = '0' or\r
+                         sda_sendbyte = '0')\r
+               else 'Z';\r
+  \r
+  SCL_INOUT <= '0' when (scl_o = '0' or\r
+                         scl_startstop = '0' or\r
+                         scl_sendbyte = '0')\r
+               else 'Z';\r
+\r
+  -- Slave Bus\r
+  SLV_DATA_OUT         <= slv_data_out_o;    \r
+  SLV_NO_MORE_DATA_OUT <= slv_no_more_data_o; \r
+  SLV_UNKNOWN_ADDR_OUT <= slv_unknown_addr_o;\r
+  SLV_ACK_OUT          <= slv_ack_o; \r
+\r
+end Behavioral;\r
diff --git a/nxyter/source/nx_i2c_master.vhd- b/nxyter/source/nx_i2c_master.vhd-
new file mode 100644 (file)
index 0000000..18eba6a
--- /dev/null
@@ -0,0 +1,381 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.numeric_std.all;\r
+\r
+library work;\r
+use work.nxyter_components.all;\r
+\r
+entity nx_i2c_master is\r
+  generic (\r
+    i2c_speed : unsigned(11 downto 0) := x"3e8"\r
+    );\r
+  port(\r
+    CLK_IN               : in    std_logic;\r
+    RESET_IN             : in    std_logic;\r
+\r
+    -- I2C connections\r
+    SDA_INOUT            : inout std_logic;\r
+    SCL_INOUT            : inout std_logic;\r
+\r
+    -- Slave bus         \r
+    SLV_READ_IN          : in  std_logic;\r
+    SLV_WRITE_IN         : in  std_logic;\r
+    SLV_DATA_OUT         : out std_logic_vector(31 downto 0);\r
+    SLV_DATA_IN          : in std_logic_vector(31 downto 0);\r
+    SLV_ACK_OUT          : out std_logic;\r
+    SLV_NO_MORE_DATA_OUT : out std_logic;\r
+    SLV_UNKNOWN_ADDR_OUT : out std_logic;\r
+    \r
+    -- Debug Line\r
+    DEBUG_OUT            : out std_logic_vector(15 downto 0)\r
+    );\r
+end entity;\r
+\r
+architecture Behavioral of nx_i2c_master is\r
+\r
+  signal sda_i : std_logic;\r
+  signal sda_x : std_logic;\r
+  signal sda   : std_logic;\r
+\r
+  signal scl_i : std_logic;\r
+  signal scl_x : std_logic;\r
+  signal scl   : std_logic;\r
+\r
+  -- I2C Master  \r
+  signal sda_o               : std_logic;\r
+  signal scl_o               : std_logic;\r
+  signal i2c_start           : std_logic;\r
+\r
+  signal sda_startstop       : std_logic;\r
+  signal scl_startstop       : std_logic;\r
+  signal startstop_select    : std_logic;\r
+  signal startstop_seq_start : std_logic;\r
+  signal startstop_done      : std_logic;\r
+\r
+  signal sda_sendbyte        : std_logic;\r
+  signal scl_sendbyte        : std_logic;\r
+  signal sendbyte_seq_start  : std_logic;\r
+  signal sendbyte_byte       : std_logic_vector(7 downto 0);\r
+  signal sendbyte_done       : std_logic;\r
+  signal sendbyte_ack        : std_logic;\r
+\r
+  signal i2c_byte   : unsigned(7 downto 0);\r
+  signal bit_ctr    : unsigned(3 downto 0);\r
+  signal i2c_ack    : std_logic;\r
+  signal i2c_error  : std_logic_vector(3 downto 0);\r
+\r
+  type STATES is (S_IDLE,\r
+                  S_START,\r
+                  S_START_WAIT,\r
+                  \r
+                  S_SEND_BYTE,\r
+                  S_SET_SDA,\r
+                  S_SET_SCL,\r
+                  S_UNSET_SCL,\r
+                  S_NEXT_BIT,\r
+\r
+                  S_GET_ACK,\r
+                  S_ACK_SET_SCL,\r
+                  S_STORE_ACK,\r
+                  S_ACK_UNSET_SCL,\r
+                  S_VERIFY_ACK,\r
+                  S_ACK_ERROR,\r
+                  \r
+                  S_STOP,\r
+                  S_STOP_WAIT\r
+                  );\r
+  signal STATE : STATES;\r
+\r
+  \r
+  -- I2C Timer\r
+  signal wait_timer_init    : unsigned(11 downto 0);\r
+  signal wait_timer_done    : std_logic;\r
+  \r
+  -- TRBNet Slave Bus\r
+  signal slv_data_out_o     : std_logic_vector(31 downto 0);\r
+  signal slv_no_more_data_o : std_logic;\r
+  signal slv_unknown_addr_o : std_logic;\r
+  signal slv_ack_o          : std_logic;\r
+  signal reg_data           : std_logic_vector(31 downto 0);\r
+  signal i2c_chipid         : std_logic_vector(6 downto 0);\r
+  signal i2c_rw_bit         : std_logic;\r
+\r
+\r
+begin\r
+\r
+  -- Timer\r
+  nx_i2c_timer_1: nx_i2c_timer\r
+    port map (\r
+      CLK_IN         => CLK_IN,\r
+      RESET_IN       => RESET_IN,\r
+      TIMER_START_IN => wait_timer_init,\r
+      TIMER_DONE_OUT => wait_timer_done\r
+      );\r
+\r
+  -- Start / Stop Sequence\r
+  nx_i2c_startstop_1: nx_i2c_startstop\r
+    generic map (\r
+      i2c_speed => i2c_speed\r
+      )\r
+    port map (\r
+      CLK_IN            => CLK_IN,\r
+      RESET_IN          => RESET_IN,\r
+      START_IN          => startstop_seq_start,\r
+      SELECT_IN         => startstop_select,\r
+      SEQUENCE_DONE_OUT => startstop_done,\r
+      SDA_OUT           => sda_startstop,\r
+      SCL_OUT           => scl_startstop\r
+      );\r
+\r
+  nx_i2c_sendbyte_1: nx_i2c_sendbyte\r
+    generic map (\r
+      i2c_speed => i2c_speed\r
+      )\r
+    port map (\r
+      CLK_IN            => CLK_IN,\r
+      RESET_IN          => RESET_IN,\r
+      START_IN          => sendbyte_seq_start,\r
+      BYTE_IN           => sendbyte_byte,\r
+      SEQUENCE_DONE_OUT => sendbyte_done,\r
+      SDA_OUT           => sda_sendbyte,\r
+      SCL_OUT           => scl_sendbyte,\r
+      SDA_IN            => sda,\r
+      ACK_OUT           => sendbyte_ack\r
+      );\r
+  \r
+  -- Debug Line\r
+  DEBUG_OUT(0) <= sda_o;\r
+  DEBUG_OUT(1) <= scl_o;\r
+  DEBUG_OUT(2) <= i2c_start;\r
+  DEBUG_OUT(3) <= wait_timer_done;\r
+  DEBUG_OUT(7 downto 4)  <= i2c_error;\r
+\r
+  DEBUG_OUT(15 downto 8) <= (others => '0');\r
+  \r
+  -- Sync I2C Lines\r
+  sda_i <= SDA_INOUT;\r
+  scl_i <= SCL_INOUT;\r
+\r
+  PROC_I2C_LINES_SYNC: process(CLK_IN)\r
+  begin\r
+    if( rising_edge(CLK_IN) ) then\r
+      if( RESET_IN = '1' ) then\r
+        sda_x <= '1';\r
+        sda   <= '1';\r
+\r
+        scl_x <= '1';\r
+        scl   <= '1';\r
+      else\r
+        sda_x <= sda_i;\r
+        sda   <= sda_x;\r
+\r
+        scl_x <= scl_i;\r
+        scl   <= scl_x;\r
+      end if;\r
+    end if;\r
+  end process PROC_I2C_LINES_SYNC;\r
+\r
+  PROC_I2C_MASTER: process(CLK_IN)\r
+  begin \r
+    if( rising_edge(CLK_IN) ) then\r
+      if( RESET_IN = '1' ) then\r
+        sda_o               <= '1';\r
+        scl_o               <= '1';\r
+        wait_timer_init     <= (others => '0');\r
+        bit_ctr             <= (others => '0');\r
+        i2c_ack             <= '0';\r
+        i2c_error           <= (others => '0');\r
+        startstop_select    <= '0';\r
+        startstop_seq_start <= '0';\r
+        STATE <= S_IDLE;\r
+      else\r
+        sda_o <= '1';\r
+        scl_o <= '1';\r
+        wait_timer_init     <= (others => '0');\r
+        startstop_select    <= '0';\r
+        startstop_seq_start <= '0';\r
+        case STATE is\r
+          when S_IDLE =>\r
+            if (i2c_start = '1') then\r
+              STATE <= S_START;\r
+            else\r
+              STATE <= S_IDLE;\r
+            end if;\r
+            \r
+            -- I2C START Sequence \r
+          when S_START =>\r
+            i2c_ack <= '0';\r
+            startstop_select <= '1';\r
+            startstop_seq_start <= '1';\r
+            STATE <= S_START_WAIT;\r
+\r
+          when S_START_WAIT =>\r
+            if (startstop_done = '0') then\r
+              STATE <= S_START_WAIT;\r
+            else\r
+              STATE <= S_SEND_BYTE;\r
+            end if;\r
+                        \r
+            -- I2C Send byte\r
+          when S_SEND_BYTE =>\r
+            bit_ctr <= x"7";\r
+            sda_o   <= '0';\r
+            scl_o   <= '0';\r
+            i2c_byte(7 downto 1) <= i2c_chipid;\r
+            i2c_byte(0)          <= i2c_rw_bit;\r
+            wait_timer_init <= i2c_speed srl 2;\r
+            STATE <= S_SET_SDA;\r
+\r
+          when S_SET_SDA =>\r
+            sda_o <= i2c_byte(7);\r
+            scl_o <= '0';\r
+            if (wait_timer_done = '0') then\r
+              STATE <= S_SET_SDA;\r
+            else\r
+              wait_timer_init <= i2c_speed srl 1;\r
+              STATE <= S_SET_SCL;\r
+            end if;\r
+\r
+          when S_SET_SCL =>\r
+            sda_o <= i2c_byte(7);\r
+            if (wait_timer_done = '0') then\r
+              STATE <= S_SET_SCL;\r
+            else\r
+              wait_timer_init <= i2c_speed srl 2;\r
+              STATE <= S_UNSET_SCL;\r
+            end if;\r
+\r
+          when S_UNSET_SCL =>\r
+            sda_o <= i2c_byte(7);\r
+            scl_o <= '0';\r
+            if (wait_timer_done = '0') then\r
+              STATE <= S_UNSET_SCL;\r
+            else\r
+              STATE <= S_NEXT_BIT;\r
+            end if;\r
+            \r
+          when S_NEXT_BIT =>\r
+            sda_o <= i2c_byte(7);\r
+            scl_o <= '0';\r
+            if (bit_ctr > 0) then\r
+              bit_ctr         <= bit_ctr - 1;\r
+              i2c_byte        <= i2c_byte sll 1;\r
+              wait_timer_init <= i2c_speed srl 2;\r
+              STATE <= S_SET_SDA;\r
+            else\r
+              wait_timer_init <= i2c_speed srl 2;\r
+              STATE <= S_GET_ACK;\r
+            end if;\r
+\r
+            -- I2C Check ACK Sequence\r
+          when S_GET_ACK =>\r
+            scl_o <= '0';\r
+            if (wait_timer_done = '0') then\r
+              STATE <= S_GET_ACK;\r
+            else\r
+              wait_timer_init <= i2c_speed srl 2;\r
+              STATE <= S_ACK_SET_SCL;\r
+            end if;\r
+\r
+          when S_ACK_SET_SCL =>\r
+            if (wait_timer_done = '0') then\r
+              STATE <= S_ACK_SET_SCL;\r
+            else\r
+              STATE <= S_STORE_ACK;\r
+            end if; \r
+\r
+          when S_STORE_ACK =>\r
+            i2c_ack <= sda;\r
+            wait_timer_init <= i2c_speed srl 2;\r
+            STATE <= S_ACK_UNSET_SCL;\r
+            \r
+          when S_ACK_UNSET_SCL =>\r
+            scl_o <= '0';\r
+            if (wait_timer_done = '0') then\r
+              STATE <= S_ACK_UNSET_SCL;\r
+            else\r
+              STATE <= S_VERIFY_ACK;\r
+            end if;\r
+\r
+          when S_VERIFY_ACK =>\r
+            scl_o <= '0';\r
+            if (i2c_ack = '0') then\r
+              STATE <= S_STOP;\r
+            else\r
+              STATE <= S_ACK_ERROR;\r
+            end if;\r
+\r
+          when S_ACK_ERROR =>\r
+            scl_o <= '0';\r
+            i2c_error(1) <= '1';\r
+            STATE <= S_STOP;\r
+\r
+            -- I2C STOP Sequence \r
+          when S_STOP =>\r
+            startstop_select <= '0';\r
+            startstop_seq_start <= '1';\r
+            STATE <= S_STOP_WAIT;\r
+\r
+          when S_STOP_WAIT =>\r
+            if (startstop_done = '0') then\r
+              STATE <= S_STOP_WAIT;\r
+            else\r
+              STATE <= S_IDLE;\r
+            end if;\r
+\r
+        end case;\r
+\r
+      end if;\r
+    end if;\r
+  end process PROC_I2C_MASTER;\r
+\r
+  -----------------------------------------------------------------------------\r
+  -- TRBNet Slave Bus\r
+  -----------------------------------------------------------------------------\r
+\r
+  PROC_SLAVE_BUS: process(CLK_IN)\r
+  begin\r
+    if( rising_edge(CLK_IN) ) then\r
+      if( RESET_IN = '1' ) then\r
+        reg_data           <= x"affeaffe";\r
+        slv_data_out_o     <= (others => '0');\r
+        slv_no_more_data_o <= '0';\r
+        slv_unknown_addr_o <= '0';\r
+        slv_ack_o          <= '0';\r
+        i2c_start          <= '0';\r
+      else\r
+        slv_ack_o <= '1';\r
+        slv_unknown_addr_o <= '0';\r
+        slv_no_more_data_o <= '0';\r
+        slv_data_out_o     <= (others => '0');\r
+        i2c_start          <= '0';\r
+        \r
+        if (SLV_WRITE_IN  = '1') then\r
+          i2c_chipid     <= SLV_DATA_IN(6 downto 0);\r
+          i2c_rw_bit     <= SLV_DATA_IN(7);\r
+          i2c_start      <= '1';\r
+        elsif (SLV_READ_IN = '1') then\r
+          slv_data_out_o     <= reg_data;\r
+          \r
+        else\r
+          slv_ack_o <= '0';\r
+        end if;\r
+      end if;\r
+    end if;           \r
+  end process PROC_SLAVE_BUS;\r
+\r
+  -----------------------------------------------------------------------------\r
+  -- Output Signals\r
+  -----------------------------------------------------------------------------\r
+\r
+  -- I2c Outputs\r
+  SDA_INOUT <= '0' when (sda_o = '0' or sda_startstop = '0') else 'Z';\r
+  SCL_INOUT <= '0' when (scl_o = '0' or scl_startstop = '0') else 'Z';\r
+\r
+  -- Slave Bus\r
+  SLV_DATA_OUT         <= slv_data_out_o;    \r
+  SLV_NO_MORE_DATA_OUT <= slv_no_more_data_o; \r
+  SLV_UNKNOWN_ADDR_OUT <= slv_unknown_addr_o;\r
+  SLV_ACK_OUT          <= slv_ack_o; \r
+\r
+end Behavioral;\r
diff --git a/nxyter/source/nx_i2c_sendbyte.vhd b/nxyter/source/nx_i2c_sendbyte.vhd
new file mode 100644 (file)
index 0000000..2044e31
--- /dev/null
@@ -0,0 +1,236 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.numeric_std.all;\r
+\r
+library work;\r
+use work.nxyter_components.all;\r
+\r
+\r
+entity nx_i2c_sendbyte is\r
+  generic (\r
+    i2c_speed : unsigned(11 downto 0) := x"3e8"\r
+    );\r
+  port(\r
+    CLK_IN               : in  std_logic;\r
+    RESET_IN             : in  std_logic;\r
+\r
+    START_IN             : in  std_logic;\r
+    BYTE_IN              : in  std_logic_vector(7 downto 0);\r
+    SEQUENCE_DONE_OUT    : out std_logic;\r
+\r
+    -- I2C connections\r
+    SDA_OUT              : out std_logic;\r
+    SCL_OUT              : out std_logic;\r
+    SDA_IN               : in  std_logic;\r
+    ACK_OUT              : out std_logic\r
+    );\r
+end entity;\r
+\r
+architecture Behavioral of nx_i2c_sendbyte is\r
+\r
+  -- Send Byte  \r
+  signal sda_o             : std_logic;\r
+  signal scl_o             : std_logic;\r
+  signal i2c_start         : std_logic;\r
+\r
+  signal sequence_done_o   : std_logic;\r
+  signal i2c_byte          : unsigned(7 downto 0);\r
+  signal bit_ctr           : unsigned(3 downto 0);\r
+  signal i2c_ack_o         : std_logic;\r
+  signal wait_timer_init    : unsigned(11 downto 0);\r
+\r
+  signal sequence_done_o_x : std_logic;\r
+  signal i2c_byte_x        : unsigned(7 downto 0);\r
+  signal bit_ctr_x         : unsigned(3 downto 0);\r
+  signal i2c_ack_o_x       : std_logic;\r
+  signal wait_timer_init_x : unsigned(11 downto 0);\r
+  \r
+  type STATES is (S_IDLE,\r
+                  S_INIT,\r
+                  S_INIT_WAIT,\r
+\r
+                  S_SEND_BYTE,\r
+                  S_SET_SDA,\r
+                  S_SET_SCL,\r
+                  S_UNSET_SCL,\r
+                  S_NEXT_BIT,\r
+\r
+                  S_GET_ACK,\r
+                  S_ACK_SET_SCL,\r
+                  S_STORE_ACK,\r
+                  S_ACK_UNSET_SCL\r
+                  );\r
+  signal STATE, NEXT_STATE : STATES;\r
+  \r
+  -- Wait Timer\r
+  signal wait_timer_done    : std_logic;\r
+\r
+begin\r
+\r
+  -- Timer\r
+  nx_i2c_timer_1: nx_i2c_timer\r
+    port map (\r
+      CLK_IN         => CLK_IN,\r
+      RESET_IN       => RESET_IN,\r
+      TIMER_START_IN => wait_timer_init,\r
+      TIMER_DONE_OUT => wait_timer_done\r
+      );\r
+\r
+\r
+  PROC_SEND_BYTE_TRANSFER: process(CLK_IN)\r
+  begin \r
+    if( rising_edge(CLK_IN) ) then\r
+      if( RESET_IN = '1' ) then\r
+        sequence_done_o  <= '0';\r
+        bit_ctr          <= (others => '0');\r
+        i2c_ack_o        <= '0';\r
+        wait_timer_init  <= (others => '0');\r
+        STATE            <= S_IDLE;\r
+      else\r
+        sequence_done_o  <= sequence_done_o_x;\r
+        i2c_byte         <= i2c_byte_x;\r
+        bit_ctr          <= bit_ctr_x;\r
+        i2c_ack_o        <= i2c_ack_o_x;\r
+        wait_timer_init  <= wait_timer_init_x;\r
+        STATE            <= NEXT_STATE;\r
+      end if;\r
+    end if;\r
+  end process PROC_SEND_BYTE_TRANSFER;  \r
+  \r
+  PROC_SEND_BYTE: process(STATE)\r
+  begin \r
+    sda_o              <= '1';\r
+    scl_o              <= '1';\r
+    sequence_done_o_x  <= '0';\r
+    i2c_byte_x         <= i2c_byte;\r
+    bit_ctr_x          <= bit_ctr;       \r
+    i2c_ack_o_x        <= i2c_ack_o;\r
+    wait_timer_init_x  <= (others => '0');\r
+    \r
+    case STATE is\r
+      when S_IDLE =>\r
+        if (START_IN = '1') then\r
+          sda_o       <= '0';\r
+          scl_o       <= '0';\r
+          i2c_byte_x  <= BYTE_IN;\r
+          NEXT_STATE  <= S_INIT;\r
+        else\r
+          NEXT_STATE <= S_IDLE;\r
+        end if;\r
+\r
+        -- INIT\r
+      when S_INIT =>\r
+        sda_o              <= '0';\r
+        scl_o              <= '0';\r
+        wait_timer_init_x  <= i2c_speed srl 1;\r
+        NEXT_STATE <= S_INIT_WAIT;\r
+\r
+      when S_INIT_WAIT =>\r
+        sda_o              <= '0';\r
+        scl_o              <= '0';\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_INIT_WAIT;\r
+        else\r
+          NEXT_STATE <= S_SEND_BYTE;\r
+        end if;\r
+        \r
+        -- I2C Send byte\r
+      when S_SEND_BYTE =>\r
+        sda_o             <= '0';\r
+        scl_o             <= '0';\r
+        bit_ctr_x         <= x"7";\r
+        wait_timer_init_x <= i2c_speed srl 2;\r
+        NEXT_STATE        <= S_SET_SDA;\r
+\r
+      when S_SET_SDA =>\r
+        sda_o <= i2c_byte(7);\r
+        scl_o <= '0';\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_SET_SDA;\r
+        else\r
+          wait_timer_init_x <= i2c_speed srl 1;\r
+          NEXT_STATE <= S_SET_SCL;\r
+        end if;\r
+\r
+      when S_SET_SCL =>\r
+        sda_o <= i2c_byte(7);\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_SET_SCL;\r
+        else\r
+          wait_timer_init_x <= i2c_speed srl 2;\r
+          NEXT_STATE        <= S_UNSET_SCL;\r
+        end if;\r
+\r
+      when S_UNSET_SCL =>\r
+        sda_o <= i2c_byte(7);\r
+        scl_o <= '0';\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_UNSET_SCL;\r
+        else\r
+          NEXT_STATE <= S_NEXT_BIT;\r
+        end if;\r
+        \r
+      when S_NEXT_BIT =>\r
+        sda_o <= i2c_byte(7);\r
+        scl_o <= '0';\r
+        if (bit_ctr > 0) then\r
+          bit_ctr_x          <= bit_ctr - 1;\r
+          i2c_byte_x         <= i2c_byte sll 1;\r
+          wait_timer_init_x  <= i2c_speed srl 2;\r
+          NEXT_STATE         <= S_SET_SDA;\r
+        else\r
+          wait_timer_init_x  <= i2c_speed srl 2;\r
+          NEXT_STATE         <= S_GET_ACK;\r
+        end if;\r
+\r
+        -- I2C Check ACK Sequence\r
+      when S_GET_ACK =>\r
+        scl_o <= '0';\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_GET_ACK;\r
+        else\r
+          wait_timer_init_x <= i2c_speed srl 2;\r
+          NEXT_STATE        <= S_ACK_SET_SCL;\r
+        end if;\r
+\r
+      when S_ACK_SET_SCL =>\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_ACK_SET_SCL;\r
+        else\r
+          wait_timer_init_x <= i2c_speed srl 2;\r
+          NEXT_STATE        <= S_STORE_ACK;\r
+        end if; \r
+        \r
+      when S_STORE_ACK =>\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_STORE_ACK;\r
+        else\r
+          i2c_ack_o_x       <= not SDA_IN;\r
+          wait_timer_init_x <= i2c_speed srl 2;\r
+          NEXT_STATE        <= S_ACK_UNSET_SCL;\r
+        end if;\r
+        \r
+      when S_ACK_UNSET_SCL =>\r
+        scl_o <= '0';\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_ACK_UNSET_SCL;\r
+        else\r
+          sequence_done_o_x <= '1';\r
+          NEXT_STATE        <= S_IDLE;\r
+        end if;\r
+\r
+    end case;\r
+  end process PROC_SEND_BYTE;\r
+\r
+  -----------------------------------------------------------------------------\r
+  -- Output Signals\r
+  -----------------------------------------------------------------------------\r
+\r
+  SEQUENCE_DONE_OUT <= sequence_done_o;\r
+  ACK_OUT           <= i2c_ack_o;\r
+  \r
+  -- I2c Outputs\r
+  SDA_OUT <= sda_o;\r
+  SCL_OUT <= scl_o;\r
+  \r
+end Behavioral;\r
diff --git a/nxyter/source/nx_i2c_startstop.vhd b/nxyter/source/nx_i2c_startstop.vhd
new file mode 100644 (file)
index 0000000..daba5fd
--- /dev/null
@@ -0,0 +1,182 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.numeric_std.all;\r
+\r
+library work;\r
+use work.nxyter_components.all;\r
+\r
+entity nx_i2c_startstop is\r
+  generic (\r
+    i2c_speed : unsigned(11 downto 0) := x"3e8"\r
+    );\r
+  port(\r
+    CLK_IN               : in  std_logic;\r
+    RESET_IN             : in  std_logic;\r
+\r
+    START_IN             : in  std_logic;  -- Start Sequence\r
+    SELECT_IN            : in  std_logic;  -- '1' -> Start, '0'-> Stop\r
+    SEQUENCE_DONE_OUT    : out std_logic;\r
+    \r
+    -- I2C connections\r
+    SDA_OUT              : out std_logic;\r
+    SCL_OUT              : out std_logic;\r
+    NREADY_OUT           : out std_logic\r
+    );\r
+end entity;\r
+\r
+architecture Behavioral of nx_i2c_startstop is\r
+\r
+  -- I2C Bus  \r
+  signal sda_o             : std_logic;\r
+  signal scl_o             : std_logic;\r
+  signal sequence_done_o   : std_logic;\r
+  signal wait_timer_init   : unsigned(11 downto 0);\r
+\r
+  signal sequence_done_o_x : std_logic;\r
+  signal wait_timer_init_x : unsigned(11 downto 0);\r
+  \r
+  type STATES is (S_IDLE,\r
+                  S_START,\r
+                  S_WAIT_START_1,\r
+                  S_WAIT_START_2,\r
+                  S_WAIT_START_3,\r
+                  \r
+                  S_STOP,\r
+                  S_WAIT_STOP_1,\r
+                  S_WAIT_STOP_2,\r
+                  S_WAIT_STOP_3\r
+                  );\r
+  signal STATE, NEXT_STATE : STATES;\r
+\r
+  -- I2C Timer\r
+  signal wait_timer_done    : std_logic;\r
+\r
+begin\r
+\r
+  -- Timer\r
+  nx_i2c_timer_1: nx_i2c_timer\r
+    port map (\r
+      CLK_IN         => CLK_IN,\r
+      RESET_IN       => RESET_IN,\r
+      TIMER_START_IN => wait_timer_init,\r
+      TIMER_DONE_OUT => wait_timer_done\r
+      );\r
+\r
+  PROC_START_STOP_TRANSFER: process(CLK_IN)\r
+  begin \r
+    if( rising_edge(CLK_IN) ) then\r
+      if( RESET_IN = '1' ) then\r
+        sequence_done_o  <= '0';\r
+        wait_timer_init  <= (others => '0');\r
+        STATE <= S_IDLE;\r
+      else\r
+        sequence_done_o  <= sequence_done_o_x;\r
+        wait_timer_init  <= wait_timer_init_x;\r
+        STATE            <= NEXT_STATE;\r
+      end if;\r
+    end if;\r
+  end process PROC_START_STOP_TRANSFER;\r
+  \r
+  PROC_START_STOP: process(STATE)\r
+  begin\r
+\r
+    sda_o             <= '1';\r
+    scl_o             <= '1';\r
+    wait_timer_init_x <= (others => '0');\r
+    sequence_done_o_x <= '0';\r
+    \r
+    case STATE is\r
+      when S_IDLE =>\r
+        if (START_IN = '1') then\r
+          if (SELECT_IN = '1') then\r
+            NEXT_STATE <= S_START;\r
+          else\r
+            sda_o      <= '0';\r
+            scl_o      <= '0';\r
+            NEXT_STATE <= S_STOP;\r
+          end if;\r
+        else\r
+          NEXT_STATE <= S_IDLE;\r
+        end if;\r
+        \r
+        -- I2C START Sequence \r
+      when S_START =>\r
+        wait_timer_init_x <= i2c_speed srl 1;\r
+        NEXT_STATE <= S_WAIT_START_1;\r
+\r
+      when S_WAIT_START_1 =>\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_WAIT_START_1;\r
+        else\r
+          wait_timer_init_x <= i2c_speed srl 1;\r
+          NEXT_STATE <= S_WAIT_START_2;\r
+        end if;\r
+\r
+      when S_WAIT_START_2 =>\r
+        sda_o         <= '0';\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_WAIT_START_2;\r
+        else\r
+          wait_timer_init_x <= i2c_speed srl 1;\r
+          NEXT_STATE <= S_WAIT_START_3;\r
+        end if;\r
+\r
+      when S_WAIT_START_3 =>\r
+        sda_o         <= '0';\r
+        scl_o         <= '0';\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_WAIT_START_3;\r
+        else\r
+          sequence_done_o_x <= '1';\r
+          NEXT_STATE <= S_IDLE;\r
+        end if;\r
+\r
+        -- I2C STOP Sequence \r
+      when S_STOP =>\r
+        sda_o           <= '0';\r
+        scl_o           <= '0';\r
+        wait_timer_init_x <= i2c_speed srl 1;\r
+        NEXT_STATE <= S_WAIT_STOP_1;\r
+\r
+      when S_WAIT_STOP_1 =>\r
+        sda_o           <= '0';\r
+        scl_o           <= '0';\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_WAIT_STOP_1;\r
+        else\r
+          wait_timer_init_x <= i2c_speed srl 1;\r
+          NEXT_STATE <= S_WAIT_STOP_2;\r
+        end if;\r
+\r
+      when S_WAIT_STOP_2 =>\r
+        sda_o <= '0';\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_WAIT_STOP_2;\r
+        else\r
+          wait_timer_init_x <= i2c_speed srl 1;\r
+          NEXT_STATE <= S_WAIT_STOP_3;\r
+        end if;\r
+\r
+      when S_WAIT_STOP_3 =>\r
+        if (wait_timer_done = '0') then\r
+          NEXT_STATE <= S_WAIT_STOP_3;\r
+        else\r
+          sequence_done_o_x <= '1';\r
+          NEXT_STATE <= S_IDLE;\r
+        end if;\r
+\r
+    end case;\r
+  end process PROC_START_STOP;\r
+\r
+\r
+\r
+  -----------------------------------------------------------------------------\r
+  -- Output Signals\r
+  -----------------------------------------------------------------------------\r
+\r
+  SEQUENCE_DONE_OUT <= sequence_done_o;\r
+  SDA_OUT           <= sda_o;\r
+  SCL_OUT           <= scl_o;\r
+  NREADY_OUT        <= '0';\r
+  \r
+end Behavioral;\r
diff --git a/nxyter/source/nx_i2c_timer.vhd b/nxyter/source/nx_i2c_timer.vhd
new file mode 100644 (file)
index 0000000..15d5ab9
--- /dev/null
@@ -0,0 +1,82 @@
+library ieee;\r
+use ieee.std_logic_1164.all;\r
+use ieee.numeric_std.all;\r
+\r
+entity nx_i2c_timer is\r
+  port(\r
+    CLK_IN               : in    std_logic;\r
+    RESET_IN             : in    std_logic;\r
+\r
+    TIMER_START_IN       : in unsigned(11 downto 0);\r
+    TIMER_DONE_OUT       : out std_logic\r
+    );\r
+end entity;\r
+\r
+architecture Behavioral of nx_i2c_timer is\r
+\r
+  -- Timer\r
+  signal timer_ctr       : unsigned(11 downto 0);\r
+  signal timer_done_o    : std_logic;\r
+\r
+  signal timer_ctr_x     : unsigned(11 downto 0);\r
+  signal timer_done_o_x  : std_logic;\r
+\r
+  type STATES is (S_IDLE,\r
+                  S_COUNT,\r
+                  S_DONE\r
+                  );\r
+  signal STATE, NEXT_STATE : STATES;\r
+\r
+begin\r
+\r
+  PROC_TIMER_TRANSFER: process(CLK_IN)\r
+  begin\r
+    if( rising_edge(CLK_IN) ) then\r
+      if( RESET_IN = '1' ) then\r
+        timer_ctr     <= (others => '0');\r
+        timer_done_o  <= '0';\r
+        STATE         <= S_IDLE;\r
+      else\r
+        timer_ctr     <= timer_ctr_x;\r
+        timer_done_o  <= timer_done_o_x;\r
+        STATE         <= NEXT_STATE;\r
+      end if;\r
+    end if;\r
+  end process PROC_TIMER_TRANSFER;\r
+  \r
+  PROC_TIMER: process(STATE)\r
+  begin \r
+\r
+    timer_done_o_x <= '0';\r
+\r
+    case STATE is\r
+      when S_IDLE =>\r
+        if (TIMER_START_IN = 0) then\r
+          NEXT_STATE <= S_IDLE;\r
+        else\r
+          timer_ctr_x <= TIMER_START_IN;\r
+          NEXT_STATE <= S_COUNT;\r
+        end if;\r
+            \r
+      when S_COUNT =>\r
+        if (timer_ctr > 0) then\r
+          timer_ctr_x <= timer_ctr - 1;\r
+          NEXT_STATE <= S_COUNT;\r
+        else\r
+          NEXT_STATE <= S_DONE;\r
+        end if;\r
+        \r
+      when S_DONE =>\r
+        timer_done_o_x <= '1';\r
+        NEXT_STATE <= S_IDLE;\r
+        \r
+    end case;\r
+  end process PROC_TIMER;\r
+  \r
+  -----------------------------------------------------------------------------\r
+  -- Output Signals\r
+  -----------------------------------------------------------------------------\r
+\r
+  TIMER_DONE_OUT <= timer_done_o;\r
+\r
+end Behavioral;\r
index 6c27eb2f0f6619d8b60448b0251cf08dfdce4aee..250b819304db887e3536ba7a7cb1ec3c013680da 100644 (file)
@@ -4,7 +4,6 @@ use IEEE.STD_LOGIC_ARITH.ALL;
 use IEEE.STD_LOGIC_UNSIGNED.ALL;\r
 \r
 library work;\r
-use work.adcmv3_components.all;\r
 use work.nxyter_components.all;\r
 \r
 entity nx_timestamp_fifo_read is\r
@@ -17,6 +16,7 @@ entity nx_timestamp_fifo_read is
     NX_TIMESTAMP_IN      : in std_logic_vector (7 downto 0);\r
     NX_FRAME_CLOCK_OUT   : out std_logic;\r
     NX_FRAME_SYNC_OUT    : out std_logic;\r
+    NX_TIMESTAMP_OUT     : out std_logic_vector(31 downto 0);\r
     \r
     -- Slave bus         \r
     SLV_READ_IN          : in  std_logic;\r
@@ -26,7 +26,9 @@ entity nx_timestamp_fifo_read is
     SLV_ADDR_IN          : in std_logic_vector(15 downto 0);\r
     SLV_ACK_OUT          : out std_logic;\r
     SLV_NO_MORE_DATA_OUT : out std_logic;\r
-    SLV_UNKNOWN_ADDR_OUT : out std_logic\r
+    SLV_UNKNOWN_ADDR_OUT : out std_logic;\r
+\r
+    DEBUG_OUT            : out std_logic_vector(7 downto 0)\r
     );\r
 end entity;\r
 \r
@@ -34,6 +36,7 @@ architecture Behavioral of nx_timestamp_fifo_read is
 \r
 \r
   -- FIFO Input Handler\r
+  signal nx_timestamp_n      : std_logic_vector(7 downto 0);\r
   signal fifo_skip_write_x   : std_logic;\r
   signal fifo_skip_write_l   : std_logic;\r
   signal fifo_skip_write     : std_logic;\r
@@ -56,8 +59,14 @@ architecture Behavioral of nx_timestamp_fifo_read is
   signal fifo_skip_write_s   : std_logic;\r
 \r
   -- SYNC NX Frame Process\r
-  signal nx_frame_resync_ctr   : unsigned(7 downto 0);\r
+  \r
+  -- RS Sync FlipFlop\r
   signal nx_frame_synced_o     : std_logic;\r
+  signal rs_sync_set           : std_logic;\r
+  signal rs_sync_reset         : std_logic;\r
+  \r
+  -- Sync Process\r
+  signal nx_frame_resync_ctr   : unsigned(7 downto 0);\r
   signal frame_sync_wait_ctr   : unsigned (7 downto 0);\r
   \r
   -- Slave Bus\r
@@ -87,13 +96,37 @@ architecture Behavioral of nx_timestamp_fifo_read is
   \r
 begin\r
 \r
+  DEBUG_OUT(0) <= fifo_write_enable_o;\r
+  DEBUG_OUT(1) <= fifo_full;\r
+  DEBUG_OUT(2) <= fifo_read_enable_o;\r
+  DEBUG_OUT(3) <= fifo_empty;\r
+\r
+  DEBUG_OUT(4) <= nx_frame_synced_o;\r
+  DEBUG_OUT(5) <= fifo_skip_write_o;\r
+  DEBUG_OUT(6) <= nx_frame_clock_o;\r
+  DEBUG_OUT(7) <= CLK_IN;\r
+  \r
   -----------------------------------------------------------------------------\r
   -- Dual Clock FIFO 8bit to 32bit\r
   -----------------------------------------------------------------------------\r
 \r
+  -- First Decode\r
+  --  Gray_Decoder_1: Gray_Decoder\r
+  --   generic map (\r
+  --     WIDTH => 8)\r
+  --   port map (\r
+  --     CLK_IN     => NX_TIMESTAMP_CLK_IN,\r
+  --     RESET_IN   => RESET_IN,\r
+  --     GRAY_IN    => NX_TIMESTAMP_IN,\r
+  --     BINARY_OUT => nx_timestamp_n\r
+  --     );\r
+  nx_timestamp_n <= NX_TIMESTAMP_IN;\r
+  \r
+  \r
+  -- Second send data to FIFO\r
   fifo_dc_8to32_1: fifo_dc_8to32\r
     port map (\r
-      Data    => NX_TIMESTAMP_IN,\r
+      Data    => nx_timestamp_n,\r
       WrClock => NX_TIMESTAMP_CLK_IN,\r
       RdClock => CLK_IN,\r
       WrEn    => fifo_write_enable_o,\r
@@ -105,10 +138,11 @@ begin
       Full    => fifo_full_i\r
       );\r
 \r
+  \r
   -----------------------------------------------------------------------------\r
   -- FIFO Input Handler\r
   -----------------------------------------------------------------------------\r
-\r
+  \r
   -- Cross ClockDomain CLK_IN --> NX_TIMESTAMP_CLK_IN for signal\r
   -- fifo_skip_write\r
   PROC_FIFO_IN_HANDLER_SYNC: process(NX_TIMESTAMP_CLK_IN)\r
@@ -125,13 +159,13 @@ begin
   end process PROC_FIFO_IN_HANDLER_SYNC;\r
 \r
   -- Signal fifo_skip_write might 2 clocks long --> I need 1\r
- level_to_pulse_1: level_to_pulse\r
-   port map (\r
-     CLK_IN    => NX_TIMESTAMP_CLK_IN,\r
-     RESET_IN  => RESET_IN,\r
-     LEVEL_IN  => fifo_skip_write_l,\r
-     PULSE_OUT => fifo_skip_write\r
-     );\r
 level_to_pulse_1: level_to_pulse\r
+    port map (\r
+      CLK_IN    => NX_TIMESTAMP_CLK_IN,\r
+      RESET_IN  => RESET_IN,\r
+      LEVEL_IN  => fifo_skip_write_l,\r
+      PULSE_OUT => fifo_skip_write\r
+      );\r
   \r
   -- Write only in case FIFO is not full, skip one write cycle in case\r
   -- fifo_skip_write is true (needed by the synchronization process\r
@@ -171,7 +205,6 @@ begin
 \r
   NX_FRAME_CLOCK_OUT <= nx_frame_clock_o;\r
   \r
-\r
   -----------------------------------------------------------------------------\r
   -- FIFO Output Handler and Sync FIFO\r
   -----------------------------------------------------------------------------\r
@@ -204,48 +237,60 @@ begin
       end if;\r
     end if;\r
   end process PROC_FIFO_READ;\r
+  \r
 \r
+  -- RS FlipFlop to hold Sync Status\r
+  PROC_RS_FRAME_SYNCED: process(CLK_IN)\r
+  begin\r
+    if( rising_edge(CLK_IN) ) then\r
+      if (RESET_IN = '1' or rs_sync_reset = '1') then\r
+        nx_frame_synced_o <= '0';\r
+      elsif (rs_sync_set = '1') then\r
+        nx_frame_synced_o <= '1';\r
+      end if;\r
+    end if;\r
+  end process PROC_RS_FRAME_SYNCED;\r
 \r
-  -- Sync to NX NO_DATA FRAME\r
+  -- Sync to NX NO_DATA FRAME \r
   PROC_SYNC_TO_NO_DATA: process(CLK_IN)\r
   begin\r
     if( rising_edge(CLK_IN) ) then\r
       if( RESET_IN = '1' ) then\r
-        nx_frame_synced_o <= '0';\r
+        rs_sync_set          <= '0';\r
+        rs_sync_reset        <= '1';\r
         nx_frame_resync_ctr  <= (others => '0');\r
         frame_sync_wait_ctr  <= (others => '0');\r
-        fifo_skip_write_s <= '0';\r
-        STATE_SYNC <= SYNC_CHECK;\r
+        fifo_skip_write_s    <= '0';\r
+        STATE_SYNC           <= SYNC_CHECK;\r
       else\r
+        rs_sync_set       <= '0';\r
+        rs_sync_reset     <= '0';\r
         fifo_skip_write_s <= '0';\r
-\r
+        \r
         case STATE_SYNC is\r
 \r
           when SYNC_CHECK =>\r
             case fifo_out is\r
               when x"7f7f7f06" =>\r
-                nx_frame_synced_o <= '1';\r
-                STATE_SYNC <= SYNC_CHECK;\r
+                rs_sync_set <= '1';\r
+                STATE_SYNC  <= SYNC_CHECK;\r
 \r
               when x"067f7f7f" =>\r
-                nx_frame_synced_o <= '0';\r
                 STATE_SYNC <= SYNC_RESYNC;\r
 \r
               when x"7f067f7f" =>\r
-                nx_frame_synced_o <= '0';\r
                 STATE_SYNC <= SYNC_RESYNC;\r
                 \r
               when x"7f7f067f" =>\r
-                nx_frame_synced_o <= '0';\r
                 STATE_SYNC <= SYNC_RESYNC;\r
 \r
               when others =>\r
-                nx_frame_synced_o <= nx_frame_synced_o;\r
                 STATE_SYNC <= SYNC_CHECK;\r
-               \r
+                \r
             end case;\r
 \r
           when SYNC_RESYNC =>\r
+            rs_sync_reset     <= '1';\r
             fifo_skip_write_s <= '1';\r
             nx_frame_resync_ctr <= nx_frame_resync_ctr + 1;\r
             frame_sync_wait_ctr <= x"ff";\r
@@ -266,7 +311,8 @@ begin
   end process PROC_SYNC_TO_NO_DATA;\r
 \r
   NX_FRAME_SYNC_OUT <= nx_frame_synced_o;\r
-  \r
+  NX_TIMESTAMP_OUT  <= register_fifo_data;\r
+\r
 -------------------------------------------------------------------------------\r
 -- TRBNet Slave Bus\r
 -------------------------------------------------------------------------------\r
index 30588eb63fb42bbe3e588b410d6b0e60f99a277b..47ce26f4ccecf54f50470d116d5f8daab3d74340 100644 (file)
@@ -54,22 +54,22 @@ begin
     end if;           \r
   end process PROC_NX_TIMESTAMP;\r
 \r
-  \r
-\r
---  Gray_Encoder_1: Gray_Encoder\r
---    generic map (\r
---      WIDTH => 8\r
---      )\r
---    port map (\r
---      CLK_IN    => CLK_IN,\r
---      RESET_IN  => RESET_IN,\r
---      BINARY_IN => timestamp_n,\r
---      GRAY_OUT  => timestamp_g \r
---      );\r
+--   Gray_Encoder_1: Gray_Encoder\r
+--     generic map (\r
+--       WIDTH => 8\r
+--       )\r
+--     port map (\r
+--       CLK_IN    => CLK_IN,\r
+--       RESET_IN  => RESET_IN,\r
+--       BINARY_IN => timestamp_n,\r
+--       GRAY_OUT  => timestamp_g \r
+--       );\r
 -- \r
-\r
+  timestamp_g <= timestamp_n;\r
+  \r
+  \r
 -- Output Signals\r
-  TIMESTAMP_OUT <= timestamp_n;\r
+  TIMESTAMP_OUT <= timestamp_g;\r
   CLK128_OUT    <= CLK_IN;\r
   \r
 end Behavioral;\r
index e09a6da91256214c98ba5866872200f878fe4c30..69b9fa6788b957794ce9afc725081b1d3aae2c1c 100644 (file)
@@ -1,6 +1,6 @@
 -----------------------------------------------------------------------------
 --
---One  nXyter FEB 
+-- One  nXyter FEB 
 --
 -----------------------------------------------------------------------------
 library ieee;
@@ -10,8 +10,8 @@ use ieee.numeric_std.all;
 library work;
 use work.trb_net_std.all;
 use work.trb_net_components.all;
-use work.adcmv3_components.all;
 use work.nxyter_components.all;
+-- ADCM use work.adcmv3_components.all;
 
 entity nXyter_FEE_board is
   
@@ -21,13 +21,13 @@ entity nXyter_FEE_board is
     
     -- I2C Ports
     I2C_SDA_INOUT      : inout std_logic;   -- nXyter I2C fdata line
-    I2C_SCL_OUT        : out std_logic;     -- nXyter I2C Clock line
+    I2C_SCL_INOUT      : inout std_logic;   -- nXyter I2C Clock line
     I2C_SM_RESET_OUT   : out std_logic;     -- reset nXyter I2C StateMachine 
     I2C_REG_RESET_OUT  : out std_logic;     -- reset I2C registers to default
 
     -- ADC SPI
     SPI_SCLK_OUT       : out std_logic;
-    SPI_SDIO_INOUT     : in std_logic;
+    SPI_SDIO_INOUT     : inout std_logic;
     SPI_CSB_OUT        : out std_logic;    
 
     -- nXyter Timestamp Ports
@@ -56,7 +56,11 @@ entity nXyter_FEE_board is
     REGIO_DATAREADY_OUT     : out   std_logic;
     REGIO_WRITE_ACK_OUT     : out   std_logic;
     REGIO_NO_MORE_DATA_OUT  : out   std_logic;
-    REGIO_UNKNOWN_ADDR_OUT  : out   std_logic
+    REGIO_UNKNOWN_ADDR_OUT  : out   std_logic;
+    
+    -- Debug Signals
+    CLK_128_IN              : in    std_logic;
+    DEBUG_LINE_OUT          : out   std_logic_vector(15 downto 0)
     );
   
 end nXyter_FEE_board;
@@ -67,11 +71,13 @@ architecture Behavioral of nXyter_FEE_board is
 -------------------------------------------------------------------------------
 -- Signals
 -------------------------------------------------------------------------------
+  -- Clock 256
+  signal clk_256_o            : std_logic;
   
   -- Bus Handler
   signal slv_read             : std_logic_vector(8-1 downto 0);
   signal slv_write            : std_logic_vector(8-1 downto 0);
-  signal slv_busy             : std_logic_vector(8-1 downto 0);
+  signal slv_no_more_data     : std_logic_vector(8-1 downto 0);
   signal slv_ack              : std_logic_vector(8-1 downto 0);
   signal slv_addr             : std_logic_vector(8*16-1 downto 0);
   signal slv_data_rd          : std_logic_vector(8*32-1 downto 0);
@@ -79,34 +85,90 @@ architecture Behavioral of nXyter_FEE_board is
   signal slv_unknown_addr     : std_logic_vector(8-1 downto 0);
 
   -- I2C Master
-  signal i2c_sda_o            : std_logic; -- I2C SDA
-  signal i2c_sda_i            : std_logic;
-  signal i2c_scl_o            : std_logic; -- I2C SCL
-  signal i2c_scl_i            : std_logic;
-
+-- ADCM   signal i2c_sda_o            : std_logic;
+-- ADCM   signal i2c_sda_i            : std_logic;
+-- ADCM   signal i2c_scl_o            : std_logic;
+-- ADCM   signal i2c_scl_i            : std_logic;
+  signal i2c_sm_reset_o       : std_logic;   
+  signal i2c_reg_reset_o      : std_logic;
+  
   -- SPI Interface ADC
   signal spi_sdi              : std_logic;
   signal spi_sdo              : std_logic;        
 
+  -- FIFO Read
+  signal nx_frame_clock_o     : std_logic;
+  signal nx_frame_sync_o      : std_logic;
+  
+    
+  -- Timestamp Handlers
+  signal nx_timestamp_o       : std_logic_vector(31 downto 0);
+
+  
 begin
 
+-------------------------------------------------------------------------------
+-- DEBUG
+-------------------------------------------------------------------------------
+--   DEBUG_LINE_OUT(0)           <= CLK_IN;
+--   DEBUG_LINE_OUT(1)           <= clk_256_o;
+--   DEBUG_LINE_OUT(2)           <= NX_CLK128_IN;
+--   DEBUG_LINE_OUT(3)           <= nx_frame_clock_o;
+--   DEBUG_LINE_OUT(4)           <= nx_frame_sync_o;
+--   DEBUG_LINE_OUT(7 downto 5)  <= (others => '0');
+--   DEBUG_LINE_OUT(15 downto 8) <= NX_TIMESTAMP_IN;
+--   DEBUG_LINE_OUT(8)            <= i2c_sda_o;
+--   DEBUG_LINE_OUT(9)            <= i2c_sda_i;
+--   DEBUG_LINE_OUT(10)           <= i2c_scl_o;
+--   DEBUG_LINE_OUT(11)           <= i2c_scl_i;
+--  DEBUG_LINE_OUT(15 downto 12) <= (others => '0');
+
+  DEBUG_LINE_OUT(0) <= CLK_IN;
+  DEBUG_LINE_OUT(1) <= I2C_SDA_INOUT;
+  DEBUG_LINE_OUT(2) <= I2C_SCL_INOUT;
+  
+  DEBUG_LINE_OUT(7 downto 3) <= (others => '0');
+  
 -------------------------------------------------------------------------------
 -- Port Maps
 -------------------------------------------------------------------------------
 
+
+
+  -- pll_nx_clk256_1: pll_nx_clk256
+  --   port map (
+  --     CLK   => CLK_IN,
+  --     CLKOP => clk_256_o,
+  --     LOCK  => open
+  --     );
+
+  -- pll_25_1: pll_25
+  --   port map (
+  --     CLK   => CLK_IN,
+  --     CLKOP => clk_256_o,
+  --     LOCK  => open
+  --     );
+  clk_256_o      <= CLK_128_IN;
+
+  NX_RESET_OUT       <= '0';
+  NX_CLK256A_OUT     <= clk_256_o;
+  NX_TESTPULSE_OUT   <= '0';
+
   -- TRBNet Bus Handler
   THE_BUS_HANDLER: trb_net16_regio_bus_handler
     generic map(
-      PORT_NUMBER         => 3,
-      PORT_ADDRESSES      => ( 0 => x"0000", -- Control Register Handler
-                               1 => x"0040", -- I2C master
-                               2 => x"0100", -- Timestamp Fifo
-                               -- 3 => x"d100", -- SPI data memory
+      PORT_NUMBER         => 4,
+      PORT_ADDRESSES      => ( 0 => x"0000",    -- Control Register Handler
+                               1 => x"0040",    -- I2C master
+                               2 => x"0100",    -- Timestamp Fifo
+                               3 => x"0200",    -- Data Buffer
+                               -- 3 => x"d100",   -- SPI data memory
                                others => x"0000"),
-      PORT_ADDR_MASK      => ( 0 => 3, -- Control Register Handler
-                               1 => 0, -- I2C master
-                               2 => 1, -- Timestamp Fifo
-                               -- 3 => 6,  -- SPI data memory
+      PORT_ADDR_MASK      => ( 0 => 3,          -- Control Register Handler
+                               1 => 0,          -- I2C master
+                               2 => 1,          -- Timestamp Fifo
+                               3 => 1,          -- Data Buffer
+                               -- 3 => 6,         -- SPI data memory
                                others => 0)
       )
     port map(
@@ -133,7 +195,7 @@ begin
       BUS_TIMEOUT_OUT(0)                  => open,
       BUS_DATAREADY_IN(0)                 => slv_ack(0),
       BUS_WRITE_ACK_IN(0)                 => slv_ack(0),
-      BUS_NO_MORE_DATA_IN(0)              => slv_busy(0),
+      BUS_NO_MORE_DATA_IN(0)              => slv_no_more_data(0),
       BUS_UNKNOWN_ADDR_IN(0)              => slv_unknown_addr(0),
 
       -- I2C master
@@ -145,8 +207,8 @@ begin
       BUS_TIMEOUT_OUT(1)                  => open,
       BUS_DATAREADY_IN(1)                 => slv_ack(1),
       BUS_WRITE_ACK_IN(1)                 => slv_ack(1),
-      BUS_NO_MORE_DATA_IN(1)              => slv_busy(1),
-      BUS_UNKNOWN_ADDR_IN(1)              => '0',
+      BUS_NO_MORE_DATA_IN(1)              => slv_no_more_data(1),
+      BUS_UNKNOWN_ADDR_IN(1)              => slv_unknown_addr(1),
 
       -- Timestamp Fifo
       BUS_READ_ENABLE_OUT(2)              => slv_read(2),
@@ -159,9 +221,23 @@ begin
       BUS_TIMEOUT_OUT(2)                  => open,
       BUS_DATAREADY_IN(2)                 => slv_ack(2),
       BUS_WRITE_ACK_IN(2)                 => slv_ack(2),
-      BUS_NO_MORE_DATA_IN(2)              => slv_busy(2),
+      BUS_NO_MORE_DATA_IN(2)              => slv_no_more_data(2),
       BUS_UNKNOWN_ADDR_IN(2)              => slv_unknown_addr(2),
 
+      -- DataBuffer
+      BUS_READ_ENABLE_OUT(3)              => slv_read(3),
+      BUS_WRITE_ENABLE_OUT(3)             => slv_write(3),
+      BUS_DATA_OUT(3*32+31 downto 3*32)   => slv_data_wr(3*32+31 downto 3*32),
+      BUS_DATA_IN(3*32+31 downto 3*32)    => slv_data_rd(3*32+31 downto 3*32),
+--      BUS_ADDR_OUT(3*16+0 downto 2*16)    => slv_addr(3*16+0 downto 0*16),
+      BUS_ADDR_OUT(3*16+0)                => slv_addr(3*16+0),
+      BUS_ADDR_OUT(3*16+15 downto 3*16+1) => open,
+      BUS_TIMEOUT_OUT(3)                  => open,
+      BUS_DATAREADY_IN(3)                 => slv_ack(3),
+      BUS_WRITE_ACK_IN(3)                 => slv_ack(3),
+      BUS_NO_MORE_DATA_IN(3)              => slv_no_more_data(3),
+      BUS_UNKNOWN_ADDR_IN(3)              => slv_unknown_addr(3),
+      
       ---- SPI control registers
       --BUS_READ_ENABLE_OUT(4)              => slv_read(4),
       --BUS_WRITE_ENABLE_OUT(4)             => slv_write(4),
@@ -171,7 +247,7 @@ begin
       --BUS_TIMEOUT_OUT(4)                  => open,
       --BUS_DATAREADY_IN(4)                 => slv_ack(4),
       --BUS_WRITE_ACK_IN(4)                 => slv_ack(4),
-      --BUS_NO_MORE_DATA_IN(4)              => slv_busy(4),
+      --BUS_NO_MORE_DATA_IN(4)              => slv_no_more_data(4),
       --BUS_UNKNOWN_ADDR_IN(4)              => '0',
 
       ---- SPI data memory
@@ -183,11 +259,10 @@ begin
       --BUS_TIMEOUT_OUT(5)                  => open,
       --BUS_DATAREADY_IN(5)                 => slv_ack(5),
       --BUS_WRITE_ACK_IN(5)                 => slv_ack(5),
-      --BUS_NO_MORE_DATA_IN(5)              => slv_busy(5),
+      --BUS_NO_MORE_DATA_IN(5)              => slv_no_more_data(5),
       --BUS_UNKNOWN_ADDR_IN(5)              => '0',
 
       ---- debug
-      --STAT_DEBUG          => stat
       STAT_DEBUG          => open
       );
 
@@ -206,35 +281,61 @@ begin
       SLV_DATA_IN          => slv_data_wr(0*32+31 downto 0*32),
       SLV_ADDR_IN          => slv_addr(0*16+15 downto 0*16),
       SLV_ACK_OUT          => slv_ack(0),
-      SLV_NO_MORE_DATA_OUT => slv_busy(0),
-      SLV_UNKNOWN_ADDR_OUT => slv_unknown_addr(0)
+      SLV_NO_MORE_DATA_OUT => slv_no_more_data(0),
+      SLV_UNKNOWN_ADDR_OUT => slv_unknown_addr(0),
+
+      DEBUG_OUT            => open
       );
 
 -------------------------------------------------------------------------------
 -- I2C master block for accessing the nXyter
 -------------------------------------------------------------------------------
-  THE_I2C_MASTER: i2c_master
-    port map(
-      CLK_IN          => CLK_IN,
-      RESET_IN        => RESET_IN,
-      -- Slave bus
-      SLV_READ_IN     => slv_read(1),
-      SLV_WRITE_IN    => slv_write(1),
-      SLV_BUSY_OUT    => slv_busy(1),
-      SLV_ACK_OUT     => slv_ack(1),
-      SLV_DATA_IN     => slv_data_wr(1*32+31 downto 1*32),
-      SLV_DATA_OUT    => slv_data_rd(1*32+31 downto 1*32),
-
-      -- I2C connections
-      SDA_IN          => open,
-      SDA_OUT         => open,
-      SCL_IN          => open,
-      SCL_OUT         => open,
-
-      -- Status lines
-      STAT            => open
+  nx_i2c_master_1: nx_i2c_master
+    generic map (
+      i2c_speed => x"3e8"
+      )
+    port map (
+      CLK_IN                => CLK_IN,
+      RESET_IN              => RESET_IN,
+      SDA_INOUT             => I2C_SDA_INOUT,
+      SCL_INOUT             => I2C_SCL_INOUT,
+      SLV_READ_IN           => slv_read(1),
+      SLV_WRITE_IN          => slv_write(1),
+      SLV_DATA_OUT          => slv_data_rd(1*32+31 downto 1*32),
+      SLV_DATA_IN           => slv_data_wr(1*32+31 downto 1*32),
+      SLV_ACK_OUT           => slv_ack(1), 
+      SLV_NO_MORE_DATA_OUT  => slv_no_more_data(1),
+      SLV_UNKNOWN_ADDR_OUT  => slv_unknown_addr(1),
+      DEBUG_OUT(7 downto 0) => DEBUG_LINE_OUT(15 downto 8)
       );
 
+
+-- ADCM   i2c_master_1: i2c_master
+-- ADCM     port map (
+-- ADCM       CLK_IN       => CLK_IN,
+-- ADCM       RESET_IN     => RESET_IN,
+-- ADCM       SLV_READ_IN  => slv_read(1),
+-- ADCM       SLV_WRITE_IN => slv_write(1),
+-- ADCM       SLV_BUSY_OUT => open,
+-- ADCM       SLV_ACK_OUT  => slv_ack(1),
+-- ADCM       SLV_DATA_IN  => slv_data_wr(1*32+31 downto 1*32),
+-- ADCM       SLV_DATA_OUT => slv_data_rd(1*32+31 downto 1*32),
+-- ADCM       SDA_IN       => i2c_sda_i,
+-- ADCM       SDA_OUT      => i2c_sda_o,
+-- ADCM       SCL_IN       => i2c_scl_i,
+-- ADCM       SCL_OUT      => i2c_scl_o,
+-- ADCM       STAT         => open
+-- ADCM       );
+-- ADCM 
+-- ADCM   -- I2c Outputs
+-- ADCM   I2C_SDA_INOUT <= '0' when (i2c_sda_o = '0') else 'Z';
+-- ADCM   i2c_sda_i     <= I2C_SDA_INOUT;
+-- ADCM   I2C_SCL_INOUT <= '0' when (i2c_scl_o = '0') else 'Z';
+-- ADCM   i2c_scl_i     <= I2C_SCL_INOUT;
+  
+  i2c_sm_reset_o    <= not '0';
+  i2c_reg_reset_o   <= not '0';
+  
 -------------------------------------------------------------------------------
 -- nXyter TimeStamp Read
 -------------------------------------------------------------------------------
@@ -243,39 +344,59 @@ begin
     port map (
       CLK_IN               => CLK_IN,
       RESET_IN             => RESET_IN,
+
       NX_TIMESTAMP_CLK_IN  => NX_CLK128_IN,
       NX_TIMESTAMP_IN      => NX_TIMESTAMP_IN,
-      NX_FRAME_CLOCK_OUT   => open,
-
+      NX_FRAME_CLOCK_OUT   => nx_frame_clock_o,
+      NX_FRAME_SYNC_OUT    => nx_frame_sync_o,
+      NX_TIMESTAMP_OUT     => nx_timestamp_o,
+      
       SLV_READ_IN          => slv_read(2),
       SLV_WRITE_IN         => slv_write(2),
       SLV_DATA_OUT         => slv_data_rd(2*32+31 downto 2*32),
       SLV_DATA_IN          => slv_data_wr(2*32+31 downto 2*32),
       SLV_ADDR_IN          => slv_addr(2*16+15 downto 2*16),
       SLV_ACK_OUT          => slv_ack(2),
-      SLV_NO_MORE_DATA_OUT => slv_busy(2),
-      SLV_UNKNOWN_ADDR_OUT => slv_unknown_addr(2)
+      SLV_NO_MORE_DATA_OUT => slv_no_more_data(2),
+      SLV_UNKNOWN_ADDR_OUT => slv_unknown_addr(2),
+
+--      DEBUG_OUT           => DEBUG_LINE_OUT(7 downto 0)
+      DEBUG_OUT           => open
       );
 
-  -----------------------------------------------------------------------------
-  -- nXyter Signals
-  -----------------------------------------------------------------------------
-  -----------------------------------------------------------------------------
-  -- I2C Signals
-  -----------------------------------------------------------------------------
+-------------------------------------------------------------------------------
+-- Data Buffer FIFO
+-------------------------------------------------------------------------------
+  nx_data_buffer_1: nx_data_buffer
+    port map (
+      CLK_IN               => CLK_IN,
+      RESET_IN             => RESET_IN,
 
-  -- SDA line output
-  I2C_SDA_INOUT <= '0' when (i2c_sda_o = '0') else 'Z';
+      FIFO_DATA_IN         => nx_timestamp_o,
+      FIFO_WRITE_ENABLE_IN => '1',
+      FIFO_READ_ENABLE_IN  => '1',
+      
+      SLV_READ_IN          => slv_read(3),
+      SLV_WRITE_IN         => slv_write(3),
+      SLV_DATA_OUT         => slv_data_rd(3*32+31 downto 3*32),
+      SLV_DATA_IN          => slv_data_wr(3*32+31 downto 3*32),
+      SLV_ADDR_IN          => slv_addr(3*16+15 downto 3*16),
+      SLV_ACK_OUT          => slv_ack(3),
+      SLV_NO_MORE_DATA_OUT => slv_no_more_data(3),
+      SLV_UNKNOWN_ADDR_OUT => slv_unknown_addr(3)
+      );
 
-  -- SDA line input (wired OR negative logic)
-  -- i2c_sda_i <= i2c_sda;
 
-  -- SCL line output
-  I2C_SCL_OUT <= '0' when (i2c_scl_o = '0') else 'Z';
+-------------------------------------------------------------------------------
+-- nXyter Signals
+-------------------------------------------------------------------------------
+  
+-------------------------------------------------------------------------------
+-- I2C Signals
+-------------------------------------------------------------------------------
 
-  -- SCL line input (wired OR negative logic)
-  -- i2c_scl_i <= i2c_scl;
+  I2C_SM_RESET_OUT  <= i2c_sm_reset_o;
+  I2C_REG_RESET_OUT <= i2c_reg_reset_o;
 
 -------------------------------------------------------------------------------
 -- END
index e2ef4aeda8375b99ff36eff7ff62c242d1d5bd8d..cdb9ab56d30aefdb320db93edcbc3505ae984da8 100644 (file)
@@ -3,7 +3,6 @@ use IEEE.STD_LOGIC_1164.ALL;
 use IEEE.STD_LOGIC_ARITH.ALL;
 use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
-
 package nxyter_components is
 
 -------------------------------------------------------------------------------
@@ -16,12 +15,12 @@ component nXyter_FEE_board
     RESET_IN               : in    std_logic;
 
     I2C_SDA_INOUT          : inout std_logic;
-    I2C_SCL_OUT            : out   std_logic;
+    I2C_SCL_INOUT          : inout std_logic;
     I2C_SM_RESET_OUT       : out   std_logic;
     I2C_REG_RESET_OUT      : out   std_logic;
 
     SPI_SCLK_OUT           : out   std_logic;
-    SPI_SDIO_INOUT         : in    std_logic;
+    SPI_SDIO_INOUT         : inout std_logic;
     SPI_CSB_OUT            : out   std_logic;
 
     NX_CLK128_IN           : in    std_logic;
@@ -47,10 +46,84 @@ component nXyter_FEE_board
     REGIO_DATAREADY_OUT    : out   std_logic;
     REGIO_WRITE_ACK_OUT    : out   std_logic;
     REGIO_NO_MORE_DATA_OUT : out   std_logic;
-    REGIO_UNKNOWN_ADDR_OUT : out   std_logic
+    REGIO_UNKNOWN_ADDR_OUT : out   std_logic;
+
+    CLK_128_IN             : in    std_logic;
+    DEBUG_LINE_OUT         : out   std_logic_vector(15 downto 0)
     );
 end component;
 
+-------------------------------------------------------------------------------
+-- nXyter I2C Interface
+-------------------------------------------------------------------------------
+
+
+component nx_i2c_master
+  generic (
+    i2c_speed : unsigned(11 downto 0)
+    );
+  port (
+    CLK_IN               : in    std_logic;
+    RESET_IN             : in    std_logic;
+    SDA_INOUT            : inout std_logic;
+    SCL_INOUT            : inout std_logic;
+    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_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 component;
+
+component nx_i2c_timer
+  port (
+    CLK_IN         : in  std_logic;
+    RESET_IN       : in  std_logic;
+    TIMER_START_IN : in  unsigned(11 downto 0);
+    TIMER_DONE_OUT : out std_logic
+    );
+end component;
+
+component nx_i2c_startstop
+  generic (
+    i2c_speed : unsigned(11 downto 0));
+  port (
+    CLK_IN            : in  std_logic;
+    RESET_IN          : in  std_logic;
+    START_IN          : in  std_logic;  -- Start Sequence
+    SELECT_IN         : in  std_logic;  -- '1' -> Start, '0'-> Stop
+    SEQUENCE_DONE_OUT : out std_logic;
+    SDA_OUT           : out std_logic;
+    SCL_OUT           : out std_logic;
+    NREADY_OUT        : out std_logic
+    );
+end component;
+
+component nx_i2c_sendbyte
+  generic (
+    i2c_speed : unsigned(11 downto 0)
+    );
+  port (
+    CLK_IN            : in  std_logic;
+    RESET_IN          : in  std_logic;
+    START_IN          : in  std_logic;
+    BYTE_IN           : in  std_logic_vector(7 downto 0);
+    SEQUENCE_DONE_OUT : out std_logic;
+    SDA_OUT           : out std_logic;
+    SCL_OUT           : out std_logic;
+    SDA_IN            : in  std_logic;
+    ACK_OUT           : out std_logic
+    );
+end component;
+
+-------------------------------------------------------------------------------
+-- TRBNet Registers
+-------------------------------------------------------------------------------
+
+
 component nxyter_registers
   port (
     CLK_IN               : in  std_logic;
@@ -62,7 +135,8 @@ component nxyter_registers
     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
+    SLV_UNKNOWN_ADDR_OUT : out std_logic;
+    DEBUG_OUT            : out std_logic_vector(15 downto 0)
     );
 end component;
 
@@ -84,9 +158,13 @@ component nx_timestamp_fifo_read
   port (
     CLK_IN               : in  std_logic;
     RESET_IN             : in  std_logic;
-    NX_TIMESTAMP_CLK_IN  : in std_logic;
-    NX_TIMESTAMP_IN      : in std_logic_vector (7 downto 0);
-    NX_FRAME_CLOCK_OUT   : out std_logic; 
+    NX_TIMESTAMP_CLK_IN  : in  std_logic;
+
+    NX_TIMESTAMP_IN      : in  std_logic_vector (7 downto 0);
+    NX_FRAME_CLOCK_OUT   : out std_logic;
+    NX_FRAME_SYNC_OUT    : out std_logic;
+    NX_TIMESTAMP_OUT     : out std_logic_vector(31 downto 0);
+
     SLV_READ_IN          : in  std_logic;
     SLV_WRITE_IN         : in  std_logic;
     SLV_DATA_OUT         : out std_logic_vector(31 downto 0);
@@ -94,7 +172,9 @@ component nx_timestamp_fifo_read
     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
+    SLV_UNKNOWN_ADDR_OUT : out std_logic;
+
+    DEBUG_OUT            : out std_logic_vector(7 downto 0)
     );
 end component;
 
@@ -114,7 +194,8 @@ component Gray_Decoder
     CLK_IN     : in  std_logic;
     RESET_IN   : in  std_logic;
     GRAY_IN    : in  std_logic_vector(WIDTH - 1 downto 0);
-    BINARY_OUT : out std_logic_vector(WIDTH - 1 downto 0));
+    BINARY_OUT : out std_logic_vector(WIDTH - 1 downto 0)
+    );
 end component;
 
 
@@ -125,7 +206,54 @@ component Gray_Encoder
     CLK_IN    : in  std_logic;
     RESET_IN  : in  std_logic;
     BINARY_IN : in  std_logic_vector(WIDTH - 1 downto 0);
-    GRAY_OUT  : out std_logic_vector(WIDTH - 1 downto 0));
+    GRAY_OUT  : out std_logic_vector(WIDTH - 1 downto 0)
+    );
+end component;
+
+component fifo_32_data
+  port (
+    Data  : in  std_logic_vector(31 downto 0);
+    Clock : in  std_logic;
+    WrEn  : in  std_logic;
+    RdEn  : in  std_logic;
+    Reset : in  std_logic;
+    Q     : out std_logic_vector(31 downto 0);
+    Empty : out std_logic;
+    Full  : out std_logic
+    );
+end component;
+
+component nx_data_buffer
+  port (
+    CLK_IN               : in  std_logic;
+    RESET_IN             : in  std_logic;
+    FIFO_DATA_IN         :     std_logic_vector(31 downto 0);
+    FIFO_WRITE_ENABLE_IN :     std_logic;
+    FIFO_READ_ENABLE_IN  :     std_logic;
+    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
+    );
+end component;
+
+
+component pll_nx_clk256
+  port (
+    CLK   : in  std_logic;
+    CLKOP : out std_logic;
+    LOCK  : out std_logic);
+end component;
+
+component pll_25
+  port (
+    CLK   : in  std_logic;
+    CLKOP : out std_logic;
+    LOCK  : out std_logic);
 end component;
 
 -------------------------------------------------------------------------------
index 7937a18bad977d8a5a0b23aa1a5b050fc1bd6435..fc5290eb8892ec4f8d41c32b258ad967b0fd5231 100644 (file)
@@ -18,7 +18,8 @@ entity nxyter_registers is
     SLV_ADDR_IN          : in std_logic_vector(15 downto 0);\r
     SLV_ACK_OUT          : out std_logic;\r
     SLV_NO_MORE_DATA_OUT : out std_logic;\r
-    SLV_UNKNOWN_ADDR_OUT : out std_logic\r
+    SLV_UNKNOWN_ADDR_OUT : out std_logic;\r
+    DEBUG_OUT            : out std_logic_vector(15 downto 0)\r
     );\r
 end entity;\r
 \r
@@ -34,6 +35,8 @@ architecture Behavioral of nxyter_registers is
   \r
 begin\r
 \r
+  DEBUG_OUT  <= reg_data(0)(15 downto 0);\r
+  \r
   PROC_NX_REGISTERS: process(CLK_IN)\r
   begin\r
     if( rising_edge(CLK_IN) ) then\r
diff --git a/nxyter/source/slave_bus.vhd b/nxyter/source/slave_bus.vhd
deleted file mode 100755 (executable)
index cea38f9..0000000
+++ /dev/null
@@ -1,332 +0,0 @@
-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;
-use work.adcmv3_components.all;
-use work.nxyter_components.all;
-
-entity slave_bus is
-  port(
-    CLK_IN                  : in    std_logic;
-    RESET_IN                : in    std_logic;
-
-    -- RegIO signals
-    REGIO_ADDR_IN           : in    std_logic_vector(15 downto 0); -- address bus
-    REGIO_DATA_IN           : in    std_logic_vector(31 downto 0); -- data from TRB endpoint
-    REGIO_DATA_OUT          : out   std_logic_vector(31 downto 0); -- data to TRB endpoint
-    REGIO_READ_ENABLE_IN    : in    std_logic; -- read pulse
-    REGIO_WRITE_ENABLE_IN   : in    std_logic; -- write pulse
-    REGIO_TIMEOUT_IN        : in    std_logic; -- access timed out
-    REGIO_DATAREADY_OUT     : out   std_logic; -- your data, master, as requested
-    REGIO_WRITE_ACK_OUT     : out   std_logic; -- data accepted
-    REGIO_NO_MORE_DATA_OUT  : out   std_logic; -- don't disturb me now
-    REGIO_UNKNOWN_ADDR_OUT  : out   std_logic; -- noone here to answer your request
-
-    -- I2C connections
-    SDA_IN                  : in    std_logic;
-    SDA_OUT                 : out   std_logic;
-    SCL_IN                  : in    std_logic;
-    SCL_OUT                 : out   std_logic;
-    
-    -- SPI connections
-    SPI_CS_OUT              : out   std_logic;
-    SPI_SCK_OUT             : out   std_logic;
-    SPI_SDI_IN              : in    std_logic;
-    SPI_SDO_OUT             : out   std_logic;
-
-    -- Timestamp Read
-    NX_CLK128_IN            : in std_logic;
-    NX_TIMESTAMP_IN         : in std_logic_vector(7 downto 0)
-    );
-end entity;
-
-architecture Behavioral of slave_bus is
-
--- Signals
-  signal slv_read             : std_logic_vector(8-1 downto 0);
-  signal slv_write            : std_logic_vector(8-1 downto 0);
-  signal slv_busy             : std_logic_vector(8-1 downto 0);
-  signal slv_ack              : std_logic_vector(8-1 downto 0);
-  signal slv_addr             : std_logic_vector(8*16-1 downto 0);
-  signal slv_data_rd          : std_logic_vector(8*32-1 downto 0);
-  signal slv_data_wr          : std_logic_vector(8*32-1 downto 0);
-  signal slv_unknown_addr     : std_logic_vector(8-1 downto 0);
-    
--- SPI controller BRAM lines
-  signal spi_bram_addr        : std_logic_vector(7 downto 0);
-  signal spi_bram_wr_d        : std_logic_vector(7 downto 0);
-  signal spi_bram_rd_d        : std_logic_vector(7 downto 0);
-  signal spi_bram_we          : std_logic;
-
-  signal spi_cs               : std_logic;
-  signal spi_sck              : std_logic;
-  signal spi_sdi              : std_logic;
-  signal spi_sdo              : std_logic;
-  signal spi_debug            : std_logic_vector(31 downto 0);
-
-  signal ctrl_lvl             : std_logic_vector(31 downto 0);
-  signal ctrl_trg             : std_logic_vector(31 downto 0);
-  signal ctrl_pll             : std_logic_vector(15 downto 0);
-
-  signal debug                : std_logic_vector(63 downto 0);
-  
-  -- Register Stuff
-  -- type reg_18bit_t is array (0 to 15) of std_logic_vector(17 downto 0);
-
-  signal reg_data             : std_logic_vector(31 downto 0);
-  
-  
-begin
-
--- Bus handler: acts as bridge between RegIO and the FPGA internal slave bus
-  THE_BUS_HANDLER: trb_net16_regio_bus_handler
-    generic map(
-      PORT_NUMBER         => 3,
-      PORT_ADDRESSES      => ( 0 => x"0000", -- Control Register Handler
-                               1 => x"0040", -- I2C master
-                               2 => x"0100", -- Timestamp Fifo
-                               -- 3 => x"d100", -- SPI data memory
-                               others => x"0000"),
-      PORT_ADDR_MASK      => ( 0 => 3, -- Control Register Handler
-                               1 => 0, -- I2C master
-                               2 => 2, -- Timestamp Fifo
-                               -- 3 => 6,  -- SPI data memory
-                               others => 0)
-      )
-    port map(
-      CLK                                 => CLK_IN,
-      RESET                               => RESET_IN,
-      DAT_ADDR_IN                         => REGIO_ADDR_IN,
-      DAT_DATA_IN                         => REGIO_DATA_IN,
-      DAT_DATA_OUT                        => REGIO_DATA_OUT,
-      DAT_READ_ENABLE_IN                  => REGIO_READ_ENABLE_IN,
-      DAT_WRITE_ENABLE_IN                 => REGIO_WRITE_ENABLE_IN,
-      DAT_TIMEOUT_IN                      => REGIO_TIMEOUT_IN,
-      DAT_DATAREADY_OUT                   => REGIO_DATAREADY_OUT,
-      DAT_WRITE_ACK_OUT                   => REGIO_WRITE_ACK_OUT,
-      DAT_NO_MORE_DATA_OUT                => REGIO_NO_MORE_DATA_OUT,
-      DAT_UNKNOWN_ADDR_OUT                => REGIO_UNKNOWN_ADDR_OUT,
-
-      -- Control Registers
-      BUS_READ_ENABLE_OUT(0)              => slv_read(0),
-      BUS_WRITE_ENABLE_OUT(0)             => slv_write(0),
-      BUS_DATA_OUT(0*32+31 downto 0*32)   => slv_data_wr(0*32+31 downto 0*32),
-      BUS_DATA_IN(0*32+31 downto 0*32)    => slv_data_rd(0*32+31 downto 0*32),
-      BUS_ADDR_OUT(0*16+2 downto 0*16)    => slv_addr(0*16+2 downto 0*16),
-      BUS_ADDR_OUT(0*16+15 downto 0*16+3) => open,
-      BUS_TIMEOUT_OUT(0)                  => open,
-      BUS_DATAREADY_IN(0)                 => slv_ack(0),
-      BUS_WRITE_ACK_IN(0)                 => slv_ack(0),
-      BUS_NO_MORE_DATA_IN(0)              => slv_busy(0),
-      BUS_UNKNOWN_ADDR_IN(0)              => slv_unknown_addr(0),
-
-      -- I2C master
-      BUS_READ_ENABLE_OUT(1)              => slv_read(1),
-      BUS_WRITE_ENABLE_OUT(1)             => slv_write(1),
-      BUS_DATA_OUT(1*32+31 downto 1*32)   => slv_data_wr(1*32+31 downto 1*32),
-      BUS_DATA_IN(1*32+31 downto 1*32)    => slv_data_rd(1*32+31 downto 1*32),
-      BUS_ADDR_OUT(1*16+15 downto 1*16)   => open,
-      BUS_TIMEOUT_OUT(1)                  => open,
-      BUS_DATAREADY_IN(1)                 => slv_ack(1),
-      BUS_WRITE_ACK_IN(1)                 => slv_ack(1),
-      BUS_NO_MORE_DATA_IN(1)              => slv_busy(1),
-      BUS_UNKNOWN_ADDR_IN(1)              => '0',
-
-      -- Timestamp Fifo
-      BUS_READ_ENABLE_OUT(2)              => slv_read(2),
-      BUS_WRITE_ENABLE_OUT(2)             => slv_write(2),
-      BUS_DATA_OUT(2*32+31 downto 2*32)   => slv_data_wr(2*32+31 downto 2*32),
-      BUS_DATA_IN(2*32+31 downto 2*32)    => slv_data_rd(2*32+31 downto 2*32),
-      BUS_ADDR_OUT(2*16+1 downto 2*16)    => slv_addr(2*16+1 downto 2*16),
-      BUS_ADDR_OUT(2*16+15 downto 2*16+2) => open,
-      BUS_TIMEOUT_OUT(2)                  => open,
-      BUS_DATAREADY_IN(2)                 => slv_ack(2),
-      BUS_WRITE_ACK_IN(2)                 => slv_ack(2),
-      BUS_NO_MORE_DATA_IN(2)              => slv_busy(2),
-      BUS_UNKNOWN_ADDR_IN(2)              => slv_unknown_addr(2),
-
-      ---- SPI control registers
-      --BUS_READ_ENABLE_OUT(4)              => slv_read(4),
-      --BUS_WRITE_ENABLE_OUT(4)             => slv_write(4),
-      --BUS_DATA_OUT(4*32+31 downto 4*32)   => slv_data_wr(4*32+31 downto 4*32),
-      --BUS_DATA_IN(4*32+31 downto 4*32)    => slv_data_rd(4*32+31 downto 4*32),
-      --BUS_ADDR_OUT(4*16+15 downto 4*16)   => slv_addr(4*16+15 downto 4*16),
-      --BUS_TIMEOUT_OUT(4)                  => open,
-      --BUS_DATAREADY_IN(4)                 => slv_ack(4),
-      --BUS_WRITE_ACK_IN(4)                 => slv_ack(4),
-      --BUS_NO_MORE_DATA_IN(4)              => slv_busy(4),
-      --BUS_UNKNOWN_ADDR_IN(4)              => '0',
-      ---- SPI data memory
-      --BUS_READ_ENABLE_OUT(5)              => slv_read(5),
-      --BUS_WRITE_ENABLE_OUT(5)             => slv_write(5),
-      --BUS_DATA_OUT(5*32+31 downto 5*32)   => slv_data_wr(5*32+31 downto 5*32),
-      --BUS_DATA_IN(5*32+31 downto 5*32)    => slv_data_rd(5*32+31 downto 5*32),
-      --BUS_ADDR_OUT(5*16+15 downto 5*16)   => slv_addr(5*16+15 downto 5*16),
-      --BUS_TIMEOUT_OUT(5)                  => open,
-      --BUS_DATAREADY_IN(5)                 => slv_ack(5),
-      --BUS_WRITE_ACK_IN(5)                 => slv_ack(5),
-      --BUS_NO_MORE_DATA_IN(5)              => slv_busy(5),
-      --BUS_UNKNOWN_ADDR_IN(5)              => '0',
-
-      ---- debug
-      --STAT_DEBUG          => stat
-      STAT_DEBUG          => open
-      );
-
--------------------------------------------------------------------------------
--- Registers
--------------------------------------------------------------------------------
-  nxyter_registers_1: nxyter_registers
-    port map (
-      CLK_IN               => CLK_IN,
-      RESET_IN             => RESET_IN,
-
-      SLV_READ_IN          => slv_read(0),
-      SLV_WRITE_IN         => slv_write(0),
-      SLV_DATA_OUT         => slv_data_rd(0*32+31 downto 0*32),
-      SLV_DATA_IN          => slv_data_wr(0*32+31 downto 0*32),
-      SLV_ADDR_IN          => slv_addr(0*16+15 downto 0*16),
-      SLV_ACK_OUT          => slv_ack(0),
-      SLV_NO_MORE_DATA_OUT => slv_busy(0),
-      SLV_UNKNOWN_ADDR_OUT => slv_unknown_addr(0)
-      );
-    
--------------------------------------------------------------------------------
--- I2C master block for accessing APVs
--------------------------------------------------------------------------------
-  THE_I2C_MASTER: i2c_master
-    port map(
-      CLK_IN          => CLK_IN,
-      RESET_IN        => RESET_IN,
-      -- Slave bus
-      SLV_READ_IN     => slv_read(1),
-      SLV_WRITE_IN    => slv_write(1),
-      SLV_BUSY_OUT    => slv_busy(1),
-      SLV_ACK_OUT     => slv_ack(1),
-      SLV_DATA_IN     => slv_data_wr(1*32+31 downto 1*32),
-      SLV_DATA_OUT    => slv_data_rd(1*32+31 downto 1*32),
-      -- I2C connections
-      SDA_IN          => SDA_IN,
-      SDA_OUT         => SDA_OUT,
-      SCL_IN          => SCL_IN,
-      SCL_OUT         => SCL_OUT,
-      -- Status lines
-      STAT            => open
-      );
--------------------------------------------------------------------------------
--- TimeStamp Read
--------------------------------------------------------------------------------
-  nx_timestamp_read_1: nx_timestamp_read
-    port map (
-      CLK_IN               => CLK_IN,
-      RESET_IN             => RESET_IN,
-      NX_CLK128_IN         => NX_CLK128_IN,
-      NX_TIMESTAMP_IN      => NX_TIMESTAMP_IN,
-
-      SLV_READ_IN          => slv_read(2),
-      SLV_WRITE_IN         => slv_write(2),
-      SLV_DATA_OUT         => slv_data_rd(2*32+31 downto 2*32),
-      SLV_DATA_IN          => slv_data_wr(2*32+31 downto 2*32),
-      SLV_ADDR_IN          => slv_addr(2*16+15 downto 2*16),
-      SLV_ACK_OUT          => slv_ack(2),
-      SLV_NO_MORE_DATA_OUT => slv_busy(2),
-      SLV_UNKNOWN_ADDR_OUT => slv_unknown_addr(2)
-      );
-
------------------------------------------------------------------------------
--- Test Register
------------------------------------------------------------------------------
---   slv_register_1: slv_register
---     generic map (
---       RESET_VALUE  => x"dead_beef"
---       )
---     port map (
---       CLK_IN       => CLK_IN,
---       RESET_IN     => RESET_IN,
---       BUSY_IN      => '0',
---       
---       SLV_READ_IN  => slv_read(0),
---       SLV_WRITE_IN => slv_write(0),
---       SLV_BUSY_OUT => slv_busy(0),
---       SLV_ACK_OUT  => slv_ack(0),
---       SLV_DATA_IN  => slv_data_wr(0*32+31 downto 0*32),
---       SLV_DATA_OUT => slv_data_rd(0*32+31 downto 0*32),
--- 
---       REG_DATA_IN  => reg_data_in,
---       REG_DATA_OUT => reg_data_out,
---       STAT         => open
---     );
---   slv_busy(0) <= '0';
-  
--- ------------------------------------------------------------------------------------
--- -- SPI master
--- ------------------------------------------------------------------------------------
---   THE_SPI_MASTER: spi_master
---     port map(
---       CLK_IN          => CLK_IN,
---       RESET_IN        => RESET_IN,
---       -- Slave bus
---       BUS_READ_IN     => slv_read(4),
---       BUS_WRITE_IN    => slv_write(4),
---       BUS_BUSY_OUT    => slv_busy(4),
---       BUS_ACK_OUT     => slv_ack(4),
---       BUS_ADDR_IN     => slv_addr(4*16+0 downto 4*16),
---       BUS_DATA_IN     => slv_data_wr(4*32+31 downto 4*32),
---       BUS_DATA_OUT    => slv_data_rd(4*32+31 downto 4*32),
---       -- SPI connections
---       SPI_CS_OUT      => spi_cs,
---       SPI_SDI_IN      => spi_sdi,
---       SPI_SDO_OUT     => spi_sdo,
---       SPI_SCK_OUT     => spi_sck,
---       -- BRAM for read/write data
---       BRAM_A_OUT      => spi_bram_addr,
---       BRAM_WR_D_IN    => spi_bram_wr_d,
---       BRAM_RD_D_OUT   => spi_bram_rd_d,
---       BRAM_WE_OUT     => spi_bram_we,
---       -- Status lines
---       STAT            => spi_debug --open
---       );
--- 
--- ------------------------------------------------------------------------------------
--- -- data memory for SPI accesses
--- ------------------------------------------------------------------------------------
---   THE_SPI_MEMORY: spi_databus_memory
---     port map(
---       CLK_IN              => CLK_IN,
---       RESET_IN            => RESET_IN,
---       -- Slave bus
---       BUS_ADDR_IN         => slv_addr(5*16+5 downto 5*16),
---       BUS_READ_IN         => slv_read(5),
---       BUS_WRITE_IN        => slv_write(5),
---       BUS_ACK_OUT         => slv_ack(5),
---       BUS_DATA_IN         => slv_data_wr(5*32+31 downto 5*32),
---       BUS_DATA_OUT        => slv_data_rd(5*32+31 downto 5*32),
---       -- state machine connections
---       BRAM_ADDR_IN        => spi_bram_addr,
---       BRAM_WR_D_OUT       => spi_bram_wr_d,
---       BRAM_RD_D_IN        => spi_bram_rd_d,
---       BRAM_WE_IN          => spi_bram_we,
---       -- Status lines
---       STAT                => open
---       );
---   slv_busy(5) <= '0';
--- 
-
--- unusable pins
-  debug(63 downto 43) <= (others => '0');
--- connected pins
-  debug(42 downto 0)  <= (others => '0');
-
--- input signals
-  spi_sdi       <= SPI_SDI_IN;
-
--- Output signals
-  SPI_CS_OUT    <= spi_cs;
-  SPI_SCK_OUT   <= spi_sck;
-  SPI_SDO_OUT   <= spi_sdo;
-
-end Behavioral;
diff --git a/nxyter/source/slv_ped_thr_mem.vhd b/nxyter/source/slv_ped_thr_mem.vhd
deleted file mode 100644 (file)
index 05e46e1..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-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
-entity slv_ped_thr_mem is\r
-  port(\r
-    CLK_IN          : in    std_logic;\r
-    RESET_IN        : in    std_logic;\r
-\r
-    -- Slave bus\r
-    SLV_ADDR_IN     : in    std_logic_vector(10 downto 0);\r
-    SLV_READ_IN     : in    std_logic;\r
-    SLV_WRITE_IN    : in    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
-\r
-    -- I/O to the backend\r
-    MEM_CLK_IN      : in    std_logic;\r
-    MEM_ADDR_IN     : in    std_logic_vector(6 downto 0);\r
-    MEM_0_D_OUT     : out   std_logic_vector(17 downto 0);\r
-\r
-    -- Status lines\r
-    STAT            : out   std_logic_vector(31 downto 0) -- DEBUG\r
-    );\r
-end entity;\r
-\r
-architecture Behavioral of slv_ped_thr_mem is\r
-\r
--- Signals\r
-  type STATES is (SLEEP,\r
-                  RD_RDY,\r
-                  RD_DEL0,\r
-                  RD_DEL1,\r
-                  WR_DEL0,\r
-                  WR_DEL1,\r
-                  WR_RDY,\r
-                  RD_ACK,\r
-                  WR_ACK,\r
-                  DONE);\r
-  signal CURRENT_STATE, NEXT_STATE: STATES;\r
-\r
--- statemachine signals\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 block_addr       : std_logic_vector(3 downto 0);\r
-\r
-  signal ped_data             : std_logic_vector(17 downto 0);\r
-  signal mem_data             : std_logic_vector(17 downto 0);\r
-\r
-  signal mem_wr_x             : std_logic;\r
-  signal mem_wr               : std_logic;\r
-  signal mem_sel              : std_logic;\r
-\r
-  signal rdback_data          : std_logic_vector(17 downto 0);\r
-\r
-begin\r
-\r
----------------------------------------------------------\r
--- Mapping of backplanes                               --\r
----------------------------------------------------------\r
---  THE_APV_ADC_MAP_MEM: apv_adc_map_mem\r
---    port map (\r
---      ADDRESS(6 downto 4) => backplane_in,\r
---      ADDRESS(3 downto 0) => slv_addr_in(10 downto 7),\r
---      Q                   => block_addr\r
---      );\r
---\r
-  THE_MEM_SEL_PROC: process( clk_in )\r
-  begin\r
-    if( rising_edge(clk_in) ) then\r
-      mem_sel     <= '1';\r
-      rdback_data <= mem_data;\r
-    end if;\r
-  end process THE_MEM_SEL_PROC;\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_ack       <= '0';\r
-        store_wr      <= '0';\r
-        store_rd      <= '0';\r
-      else\r
-        CURRENT_STATE <= NEXT_STATE;\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 )\r
-  begin\r
-    NEXT_STATE <= SLEEP;\r
-    slv_ack_x  <= '0';\r
-    store_wr_x <= '0';\r
-    store_rd_x <= '0';\r
-    case CURRENT_STATE is\r
-      when SLEEP      =>  if   ( slv_read_in = '1' ) then\r
-                            NEXT_STATE <= RD_DEL0;\r
-                            store_rd_x <= '1';\r
-                          elsif( slv_write_in = '1' ) then\r
-                            NEXT_STATE <= WR_DEL0;\r
-                            store_wr_x <= '1';\r
-                          else\r
-                            NEXT_STATE <= SLEEP;\r
-                          end if;\r
-      when RD_DEL0    =>  NEXT_STATE <= RD_DEL1;\r
-      when RD_DEL1    =>  NEXT_STATE <= RD_RDY;\r
-      when RD_RDY     =>  NEXT_STATE <= RD_ACK;\r
-      when RD_ACK     =>  if( slv_read_in = '0' ) then\r
-                            NEXT_STATE <= DONE;\r
-                            slv_ack_x  <= '1';\r
-                          else\r
-                            NEXT_STATE <= RD_ACK;\r
-                            slv_ack_x  <= '1';\r
-                          end if;\r
-      when WR_DEL0    =>  NEXT_STATE <= WR_DEL1;\r
-      when WR_DEL1    =>  NEXT_STATE <= WR_RDY;\r
-      when WR_RDY     =>  NEXT_STATE <= WR_ACK;\r
-      when WR_ACK     =>  if( slv_write_in = '0' ) then\r
-                            NEXT_STATE <= DONE;\r
-                            slv_ack_x  <= '1';\r
-                          else\r
-                            NEXT_STATE <= WR_ACK;\r
-                            slv_ack_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
--- block memories                                      --\r
----------------------------------------------------------\r
-  -- Port A: SLV_BUS\r
-  -- Port B: state machine\r
-  THE_PED_MEM: ped_thr_true\r
-    port map(\r
-      DATAINA     => slv_data_in(17 downto 0),\r
-      DATAINB     => b"00_0000_0000_0000_0000",\r
-      ADDRESSA    => slv_addr_in(6 downto 0),\r
-      ADDRESSB    => mem_addr_in,\r
-      CLOCKA      => clk_in,\r
-      CLOCKB      => mem_clk_in,\r
-      CLOCKENA    => '1',\r
-      CLOCKENB    => '1',\r
-      WRA         => mem_wr, -- BUGBUGBUG\r
-      WRB         => '0', -- state machine never writes!\r
-      RESETA      => reset_in,\r
-      RESETB      => reset_in,\r
-      QA          => mem_data,\r
-      QB          => ped_data\r
-      );\r
--- Write signals\r
-  mem_wr_x <= '1' when ( (mem_sel = '1') and (store_wr = '1') ) else '0';\r
-\r
-\r
--- Synchronize\r
-  THE_SYNC_PROC: process(clk_in)\r
-  begin\r
-    if( rising_edge(clk_in) ) then\r
-      mem_wr <= mem_wr_x;\r
-    end if;\r
-  end process THE_SYNC_PROC;\r
-\r
----------------------------------------------------------\r
--- output signals                                      --\r
----------------------------------------------------------\r
-  slv_ack_out  <= slv_ack;\r
-  slv_data_out <= b"0000_0000_0000_00" & rdback_data;\r
-\r
-  mem_0_d_out  <= ped_data;\r
-\r
-  stat(31 downto 20) <= (others => '0');\r
-  stat(19 downto 16) <= block_addr;\r
-  stat(15 downto 1)  <= (others => '0');\r
-  stat(0)            <= mem_sel;\r
-\r
-end Behavioral;\r