]> jspc29.x-matter.uni-frankfurt.de Git - trbnet.git/commitdiff
added locking feature for SPI port
authorJan Michel <j.michel@gsi.de>
Tue, 24 Jun 2014 14:07:58 +0000 (16:07 +0200)
committerJan Michel <j.michel@gsi.de>
Tue, 24 Jun 2014 14:07:58 +0000 (16:07 +0200)
special/spi_ltc2600.vhd

index ede76b617b7d1011c9df6f67e47ca51b386c8eed..07bc64f947b3df5bf6cc894b957e48636daada1b 100644 (file)
@@ -50,6 +50,8 @@ architecture spi_ltc2600_arch of spi_ltc2600 is
   signal bit_count  : integer range 0 to BITS-1;
   signal time_count : integer range 0 to WAITCYCLES;
   signal readback   : std_logic_vector(31 downto 0);
+  signal blocked    : std_logic;
+  signal sudolock   : std_logic;
 
   type   fsm_t is (IDLE, WAIT_STATE, SET, TOGGLE_CS, TOGGLE_CS_0, TOGGLE_CS_1, TOGGLE_CS_2, FINISH);
   signal fsm_state : fsm_t;
@@ -67,20 +69,24 @@ begin
     start        <= '0';
 
     if BUS_WRITE_IN = '1' then
-      if fsm_state = IDLE then
+      if fsm_state = IDLE and blocked = '0' then
         BUS_ACK_OUT <= '1';
-        if BUS_ADDR_IN(4) = '0' then
+        if BUS_ADDR_IN(4) = '0' then     --0x00..0x0F
           ram(addr) <= BUS_DATA_IN;
-        elsif BUS_ADDR_IN(2) = '1' then
+        elsif BUS_ADDR_IN(2) = '1' then  --0x14
           clear_reg <= BUS_DATA_IN(15 downto 0);
-        elsif BUS_ADDR_IN(3) = '1' then
+        elsif BUS_ADDR_IN(3) = '1' then  --0x18
           invert_reg <= BUS_DATA_IN(0);
-        elsif BUS_ADDR_IN(0) = '1' then
+        elsif BUS_ADDR_IN(0) = '1' then  --0x11
           ctrl_reg <= BUS_DATA_IN;
-          start    <= '1';
-        else                            --if BUS_ADDR_IN(0) = '0' then
+          blocked  <= BUS_DATA_IN(16);
+          start    <= not sudolock or BUS_DATA_IN(17) ;
+        else                             --0x10
           chipselect_reg <= BUS_DATA_IN(15 downto 0);
         end if;
+      elsif BUS_ADDR_IN = "10011" then   --Reg. 0x13
+        sudolock    <= BUS_DATA_IN(17);
+        BUS_ACK_OUT <= '1';
       else
         BUS_BUSY_OUT <= '1';
       end if;
@@ -99,6 +105,10 @@ begin
         BUS_DATA_OUT(31 downto 1) <= (others => '0');
       elsif BUS_ADDR_IN(1) = '1' then
         BUS_DATA_OUT <= readback;
+        blocked      <= '0';
+      elsif BUS_ADDR_IN(4 downto 0) = "10011" then
+        BUS_DATA_OUT     <= (others => '0');
+        BUS_DATA_OUT(17) <= sudolock;
       else                              --if BUS_ADDR_IN(1) = '0' then
         BUS_DATA_OUT(15 downto 0)  <= chipselect_reg;
         BUS_DATA_OUT(31 downto 16) <= x"0000";