Line 62... |
Line 62... |
port (
|
port (
|
-- global control --
|
-- global control --
|
clk_i : in std_ulogic; -- global clock line
|
clk_i : in std_ulogic; -- global clock line
|
rstn_i : in std_ulogic; -- global reset line, low-active
|
rstn_i : in std_ulogic; -- global reset line, low-active
|
-- host access --
|
-- host access --
|
|
src_i : in std_ulogic; -- access type (0: data, 1:instruction)
|
addr_i : in std_ulogic_vector(31 downto 0); -- address
|
addr_i : in std_ulogic_vector(31 downto 0); -- address
|
rden_i : in std_ulogic; -- read enable
|
rden_i : in std_ulogic; -- read enable
|
wren_i : in std_ulogic; -- write enable
|
wren_i : in std_ulogic; -- write enable
|
ben_i : in std_ulogic_vector(03 downto 0); -- byte write enable
|
ben_i : in std_ulogic_vector(03 downto 0); -- byte write enable
|
data_i : in std_ulogic_vector(31 downto 0); -- data in
|
data_i : in std_ulogic_vector(31 downto 0); -- data in
|
data_o : out std_ulogic_vector(31 downto 0); -- data out
|
data_o : out std_ulogic_vector(31 downto 0); -- data out
|
cancel_i : in std_ulogic; -- cancel current bus transaction
|
cancel_i : in std_ulogic; -- cancel current bus transaction
|
ack_o : out std_ulogic; -- transfer acknowledge
|
ack_o : out std_ulogic; -- transfer acknowledge
|
err_o : out std_ulogic; -- transfer error
|
err_o : out std_ulogic; -- transfer error
|
|
priv_i : in std_ulogic_vector(1 downto 0); -- current CPU privilege level
|
-- wishbone interface --
|
-- wishbone interface --
|
|
wb_tag_o : out std_ulogic_vector(2 downto 0); -- tag
|
wb_adr_o : out std_ulogic_vector(31 downto 0); -- address
|
wb_adr_o : out std_ulogic_vector(31 downto 0); -- address
|
wb_dat_i : in std_ulogic_vector(31 downto 0); -- read data
|
wb_dat_i : in std_ulogic_vector(31 downto 0); -- read data
|
wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data
|
wb_dat_o : out std_ulogic_vector(31 downto 0); -- write data
|
wb_we_o : out std_ulogic; -- read/write
|
wb_we_o : out std_ulogic; -- read/write
|
wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable
|
wb_sel_o : out std_ulogic_vector(03 downto 0); -- byte enable
|
Line 110... |
Line 113... |
rdat : std_ulogic_vector(31 downto 0);
|
rdat : std_ulogic_vector(31 downto 0);
|
sel : std_ulogic_vector(3 downto 0);
|
sel : std_ulogic_vector(3 downto 0);
|
ack : std_ulogic;
|
ack : std_ulogic;
|
err : std_ulogic;
|
err : std_ulogic;
|
timeout : std_ulogic_vector(index_size_f(wb_timeout_c)-1 downto 0);
|
timeout : std_ulogic_vector(index_size_f(wb_timeout_c)-1 downto 0);
|
|
src : std_ulogic;
|
|
priv : std_ulogic_vector(1 downto 0);
|
end record;
|
end record;
|
signal ctrl : ctrl_t;
|
signal ctrl : ctrl_t;
|
|
signal stb_int : std_ulogic;
|
signal stb_int, cyc_int : std_ulogic;
|
signal cyc_int : std_ulogic;
|
|
|
begin
|
begin
|
|
|
-- Sanity Checks --------------------------------------------------------------------------
|
-- Sanity Checks --------------------------------------------------------------------------
|
-- -------------------------------------------------------------------------------------------
|
-- -------------------------------------------------------------------------------------------
|
Line 155... |
Line 160... |
ctrl.rdat <= (others => '0');
|
ctrl.rdat <= (others => '0');
|
ctrl.sel <= (others => '0');
|
ctrl.sel <= (others => '0');
|
ctrl.timeout <= (others => '0');
|
ctrl.timeout <= (others => '0');
|
ctrl.ack <= '0';
|
ctrl.ack <= '0';
|
ctrl.err <= '0';
|
ctrl.err <= '0';
|
|
ctrl.src <= '0';
|
|
ctrl.priv <= "00";
|
elsif rising_edge(clk_i) then
|
elsif rising_edge(clk_i) then
|
-- defaults --
|
-- defaults --
|
ctrl.state_prev <= ctrl.state;
|
ctrl.state_prev <= ctrl.state;
|
ctrl.rdat <= (others => '0');
|
ctrl.rdat <= (others => '0');
|
ctrl.ack <= '0';
|
ctrl.ack <= '0';
|
Line 175... |
Line 182... |
-- buffer all outgoing signals --
|
-- buffer all outgoing signals --
|
ctrl.we <= wren_i;
|
ctrl.we <= wren_i;
|
ctrl.adr <= addr_i;
|
ctrl.adr <= addr_i;
|
ctrl.wdat <= data_i;
|
ctrl.wdat <= data_i;
|
ctrl.sel <= ben_i;
|
ctrl.sel <= ben_i;
|
|
ctrl.src <= src_i;
|
|
ctrl.priv <= priv_i;
|
-- valid read/write access --
|
-- valid read/write access --
|
if ((wb_access and (wren_i or ctrl.wr_req or rden_i or ctrl.rd_req)) = '1') then
|
if ((wb_access and (wren_i or ctrl.wr_req or rden_i or ctrl.rd_req)) = '1') then
|
ctrl.state <= BUSY;
|
ctrl.state <= BUSY;
|
end if;
|
end if;
|
|
|
Line 212... |
Line 221... |
|
|
end case;
|
end case;
|
end if;
|
end if;
|
end process bus_arbiter;
|
end process bus_arbiter;
|
|
|
|
|
-- host access --
|
-- host access --
|
data_o <= ctrl.rdat;
|
data_o <= ctrl.rdat;
|
ack_o <= ctrl.ack;
|
ack_o <= ctrl.ack;
|
err_o <= ctrl.err;
|
err_o <= ctrl.err;
|
|
|
-- wishbone interface --
|
-- wishbone interface --
|
|
wb_tag_o(0) <= '1' when (ctrl.priv = priv_mode_m_c) else '0'; -- privileged access when in machine mode
|
|
wb_tag_o(1) <= '0'; -- 0=secure, 1=non-secure
|
|
wb_tag_o(2) <= ctrl.src; -- 0=data access, 1=instruction access
|
|
|
wb_adr_o <= ctrl.adr;
|
wb_adr_o <= ctrl.adr;
|
wb_dat_o <= ctrl.wdat;
|
wb_dat_o <= ctrl.wdat;
|
wb_we_o <= ctrl.we;
|
wb_we_o <= ctrl.we;
|
wb_sel_o <= ctrl.sel;
|
wb_sel_o <= ctrl.sel;
|
wb_stb_o <= stb_int when (WB_PIPELINED_MODE = true) else cyc_int;
|
wb_stb_o <= stb_int when (WB_PIPELINED_MODE = true) else cyc_int;
|