Line 70... |
Line 70... |
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
|
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
|
-- wishbone interface --
|
-- wishbone interface --
|
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
|
Line 106... |
Line 107... |
|
|
-- Sanity Check ---------------------------------------------------------------------------
|
-- Sanity Check ---------------------------------------------------------------------------
|
-- -------------------------------------------------------------------------------------------
|
-- -------------------------------------------------------------------------------------------
|
sanity_check: process(clk_i)
|
sanity_check: process(clk_i)
|
begin
|
begin
|
if rising_edge(clk_i) then -- just for simulation
|
if rising_edge(clk_i) then
|
if (INTERFACE_REG_STAGES > 2) then
|
if (INTERFACE_REG_STAGES > 2) then
|
assert false report "NEORV32 CONFIG ERROR! Number of external memory interface buffer stages must be 0, 1 or 2." severity error;
|
assert false report "NEORV32 CONFIG ERROR! Number of external memory interface buffer stages must be 0, 1 or 2." severity error;
|
end if;
|
end if;
|
end if;
|
end if;
|
end process sanity_check;
|
end process sanity_check;
|
Line 142... |
Line 143... |
wb_err_ff <= '0';
|
wb_err_ff <= '0';
|
elsif rising_edge(clk_i) then
|
elsif rising_edge(clk_i) then
|
-- bus cycle --
|
-- bus cycle --
|
if (INTERFACE_REG_STAGES = 0) then
|
if (INTERFACE_REG_STAGES = 0) then
|
wb_cyc_ff <= '0'; -- unused
|
wb_cyc_ff <= '0'; -- unused
|
elsif (INTERFACE_REG_STAGES = 1) then
|
else
|
wb_cyc_ff <= wb_access and ((not wb_ack_i) or (not wb_err_i));
|
wb_cyc_ff <= (wb_cyc_ff or wb_access) and ((not wb_ack_i) or (not wb_err_i)) and (not cancel_i);
|
elsif (INTERFACE_REG_STAGES = 2) then
|
|
wb_cyc_ff <= wb_access and ((not wb_ack_ff) or (not wb_err_ff));
|
|
end if;
|
end if;
|
-- bus strobe --
|
-- bus strobe --
|
wb_stb_ff1 <= wb_stb_ff0;
|
wb_stb_ff1 <= wb_stb_ff0;
|
wb_stb_ff0 <= wb_access;
|
wb_stb_ff0 <= wb_access;
|
-- bus ack --
|
-- bus ack --
|
Line 186... |
Line 185... |
interface_reg_level_one:
|
interface_reg_level_one:
|
if (INTERFACE_REG_STAGES = 1) generate -- 1 register levels: buffer outgoing signals
|
if (INTERFACE_REG_STAGES = 1) generate -- 1 register levels: buffer outgoing signals
|
buffer_stages_one: process(clk_i)
|
buffer_stages_one: process(clk_i)
|
begin
|
begin
|
if rising_edge(clk_i) then
|
if rising_edge(clk_i) then
|
|
if (wb_cyc_ff = '0') then
|
wb_adr_o <= addr_i;
|
wb_adr_o <= addr_i;
|
wb_dat_o <= data_i;
|
wb_dat_o <= data_i;
|
wb_sel_o <= ben_i;
|
wb_sel_o <= ben_i;
|
wb_we_o <= wren_i;
|
wb_we_o <= wren_i;
|
end if;
|
end if;
|
|
end if;
|
end process buffer_stages_one;
|
end process buffer_stages_one;
|
data_o <= wb_dat_i;
|
data_o <= wb_dat_i;
|
end generate;
|
end generate;
|
|
|
interface_reg_level_two:
|
interface_reg_level_two:
|
if (INTERFACE_REG_STAGES = 2) generate -- 2 register levels: buffer incoming and outgoing signals
|
if (INTERFACE_REG_STAGES = 2) generate -- 2 register levels: buffer incoming and outgoing signals
|
buffer_stages_two: process(clk_i)
|
buffer_stages_two: process(clk_i)
|
begin
|
begin
|
if rising_edge(clk_i) then
|
if rising_edge(clk_i) then
|
|
if (wb_cyc_ff = '0') then
|
wb_adr_o <= addr_i;
|
wb_adr_o <= addr_i;
|
wb_dat_o <= data_i;
|
wb_dat_o <= data_i;
|
wb_sel_o <= ben_i;
|
wb_sel_o <= ben_i;
|
wb_we_o <= wren_i;
|
wb_we_o <= wren_i;
|
data_o <= wb_dat_i;
|
data_o <= wb_dat_i;
|
end if;
|
end if;
|
|
end if;
|
end process buffer_stages_two;
|
end process buffer_stages_two;
|
end generate;
|
end generate;
|
|
|
|
|
end neorv32_wishbone_rtl;
|
end neorv32_wishbone_rtl;
|