From 104f0e3cd069a823ec5323eda739966f2b79b9b5 Mon Sep 17 00:00:00 2001 From: Jan Michel Date: Tue, 24 Jun 2014 16:07:58 +0200 Subject: [PATCH] added locking feature for SPI port --- special/spi_ltc2600.vhd | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/special/spi_ltc2600.vhd b/special/spi_ltc2600.vhd index ede76b6..07bc64f 100644 --- a/special/spi_ltc2600.vhd +++ b/special/spi_ltc2600.vhd @@ -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"; -- 2.43.0