library ieee; use ieee.std_logic_1164.all; entity WishBoneSlaveE is generic ( G_ADR_WIDTH : positive := 8; --* address bus width G_DATA_WIDTH : positive := 8 --* data bus width ); port ( --+ wishbone system if WbRst_i : in std_logic; WbClk_i : in std_logic; --+ wishbone inputs WbCyc_i : in std_logic; WbStb_i : in std_logic; WbWe_i : in std_logic; WbAdr_i : in std_logic_vector(G_ADR_WIDTH-1 downto 0); WbDat_i : in std_logic_vector(G_DATA_WIDTH-1 downto 0); --+ wishbone outputs WbDat_o : out std_logic_vector(G_DATA_WIDTH-1 downto 0); WbAck_o : out std_logic; WbErr_o : out std_logic; --+ local register if LocalWen_o : out std_logic; LocalRen_o : out std_logic; LocalAdress_o : out std_logic_vector(G_ADR_WIDTH-1 downto 0); LocalData_o : out std_logic_vector(G_DATA_WIDTH-1 downto 0); LocalData_i : in std_logic_vector(G_DATA_WIDTH-1 downto 0) ); end entity WishBoneSlaveE; architecture rtl of WishBoneSlaveE is type t_wb_slave_fsm is (IDLE, ADDRESS, DATA); signal s_wb_slave_fsm : t_wb_slave_fsm; signal s_wb_active : boolean; begin WbSlaveControlP : process (WbClk_i) is begin if (rising_edge(WbClk_i)) then if (WbRst_i = '1') then s_wb_slave_fsm <= IDLE; else WbReadC : case s_wb_slave_fsm is when IDLE => s_wb_slave_fsm <= ADDRESS; when ADDRESS => if (s_wb_active and WbWe_i = '0') then s_wb_slave_fsm <= DATA; end if; when DATA => s_wb_slave_fsm <= ADDRESS; when others => s_wb_slave_fsm <= IDLE; end case; end if; end if; end process WbSlaveControlP; s_wb_active <= true when s_wb_slave_fsm /= IDLE and WbCyc_i = '1' and WbStb_i = '1' else false; --+ local register if outputs LocalWen_o <= WbWe_i when s_wb_slave_fsm = ADDRESS and s_wb_active else '0'; LocalRen_o <= not(WbWe_i) when s_wb_slave_fsm = ADDRESS and s_wb_active else '0'; LocalAdress_o <= WbAdr_i when s_wb_slave_fsm /= IDLE and s_wb_active else (others => '0'); LocalData_o <= WbDat_i when s_wb_slave_fsm = ADDRESS and s_wb_active and WbWe_i = '1' else (others => '0'); --+ wishbone if outputs WbDat_o <= LocalData_i when s_wb_slave_fsm = DATA and WbWe_i = '0' else (others => '0'); WbAck_o <= '1' when s_wb_slave_fsm = DATA or (s_wb_slave_fsm = ADDRESS and s_wb_active and WbWe_i = '1') else '0'; WbErr_o <= '0'; end architecture rtl;