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;
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;
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";