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