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