Skip to content
Snippets Groups Projects
Commit 8bc23caf authored by Grzegorz Daniluk's avatar Grzegorz Daniluk
Browse files

adding Axi4lite Master to WB Slave bridge

parent a472d47f
Branches
Tags
No related merge requests found
files = [
"axi4_pkg.vhd",
"wb_axi4lite_bridge.vhd",
"xwb_axi4lite_bridge.vhd"
"xwb_axi4lite_bridge.vhd",
"xaxi4lite_wb_bridge.vhd"
]
-------------------------------------------------------------------------------
-- Title : WB-to-AXI4Lite bridge
-- Project : General Cores
-------------------------------------------------------------------------------
-- File : xaxi4lite_wb_bridge.vhd
-- Author : Grzegorz Daniluk
-- Company : CERN
-- Platform : FPGA-generics
-- Standard : VHDL '93
-------------------------------------------------------------------------------
-- Description:
--
-- This module is a WB Slave Classic to AXI4-Lite Master bridge.
-------------------------------------------------------------------------------
-- Copyright (c) 2019 CERN
--------------------------------------------------------------------------------
-- Copyright and related rights are licensed under the Solderpad Hardware
-- License, Version 2.0 (the "License"); you may not use this file except
-- in compliance with the License. You may obtain a copy of the License at
-- http://solderpad.org/licenses/SHL-2.0.
-- Unless required by applicable law or agreed to in writing, software,
-- hardware and materials distributed under this License is distributed on an
-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
-- or implied. See the License for the specific language governing permissions
-- and limitations under the License.
--------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use work.axi4_pkg.all;
use work.wishbone_pkg.all;
entity xaxi4lite_wb_bridge is
port (
clk_i : in std_logic;
rst_n_i : in std_logic;
wb_slave_i : in t_wishbone_slave_in;
wb_slave_o : out t_wishbone_slave_out;
axi4_master_o : out t_axi4_lite_master_out_32;
axi4_master_i : in t_axi4_lite_master_in_32);
end xaxi4lite_wb_bridge;
architecture behav of xaxi4lite_wb_bridge is
type t_state is (IDLE, READ, WRITE, WB_END);
signal state : t_state;
begin
wb_slave_o.stall <= '0';
process(clk_i)
begin
if rising_edge(clk_i) then
if rst_n_i = '0' then
wb_slave_o.ack <= '0';
wb_slave_o.err <= '0';
axi4_master_o <= c_axi4_lite_default_master_out_32;
state <= IDLE;
else
case state is
-------------------------------------------
when IDLE =>
wb_slave_o.ack <= '0';
wb_slave_o.err <= '0';
axi4_master_o.ARVALID <= '0';
axi4_master_o.ARADDR <= (others=>'X');
axi4_master_o.RREADY <= '0';
axi4_master_o.AWVALID <= '0';
axi4_master_o.AWADDR <= (others=>'X');
axi4_master_o.WVALID <= '0';
axi4_master_o.WDATA <= (others=>'X');
axi4_master_o.WSTRB <= "0000";
axi4_master_o.BREADY <= '0';
if wb_slave_i.stb = '1' and wb_slave_i.we = '0' then
-- AXI: set address for read cycle
axi4_master_o.ARVALID <= '1';
axi4_master_o.ARADDR <= wb_slave_i.adr;
-- AXI: ready to accept data from slave
axi4_master_o.RREADY <= '1';
state <= READ;
elsif (wb_slave_i.stb = '1' and wb_slave_i.we = '1') then
-- AXI: set address for write cycle
axi4_master_o.AWVALID <= '1';
axi4_master_o.AWADDR <= wb_slave_i.adr;
-- AXI: set data for write cycle
axi4_master_o.WVALID <= '1';
axi4_master_o.WDATA <= wb_slave_i.dat;
axi4_master_o.WSTRB <= wb_slave_i.sel;
state <= WRITE;
end if;
-------------------------------------------
-- READ CYCLE --
-------------------------------------------
when READ =>
wb_slave_o.ack <= '0';
wb_slave_o.err <= '0';
axi4_master_o.RREADY <= '1';
if (axi4_master_i.ARREADY = '1') then
-- AXI: address received by slave
axi4_master_o.ARVALID <= '0';
end if;
if (axi4_master_i.RVALID = '1' and axi4_master_i.RRESP = c_AXI4_RESP_OKAY) then
-- received valid data, pass it to wishbone
wb_slave_o.dat <= axi4_master_i.RDATA;
wb_slave_o.ack <= '1';
wb_slave_o.err <= '0';
elsif (axi4_master_i.RVALID = '1') then
wb_slave_o.ack <= '0';
wb_slave_o.err <= '1';
else
wb_slave_o.ack <= '0';
wb_slave_o.err <= '0';
end if;
if (axi4_master_i.RVALID = '1') then
axi4_master_o.RREADY <= '0';
state <= WB_END;
end if;
-------------------------------------------
-- WRITE CYCLE --
-------------------------------------------
when WRITE =>
wb_slave_o.ack <= '0';
wb_slave_o.err <= '0';
axi4_master_o.BREADY <= '1';
if (axi4_master_i.AWREADY = '1') then
axi4_master_o.AWVALID <= '0';
end if;
if (axi4_master_i.WREADY = '1') then
axi4_master_o.WVALID <= '0';
end if;
if (axi4_master_i.BVALID = '1' and axi4_master_i.BRESP = c_AXI4_RESP_OKAY) then
wb_slave_o.ack <= '1';
wb_slave_o.err <= '0';
elsif (axi4_master_i.BVALID = '1') then
wb_slave_o.ack <= '0';
wb_slave_o.err <= '1';
else
wb_slave_o.ack <= '0';
wb_slave_o.err <= '0';
end if;
if (axi4_master_i.BVALID = '1') then
axi4_master_o.BREADY <= '0';
state <= WB_END;
end if;
-------------------------------------------
when WB_END =>
wb_slave_o.ack <= '0';
wb_slave_o.err <= '0';
-- WB: wait for the cycle to end
if (wb_slave_i.stb = '0') then
state <= IDLE;
end if;
end case;
end if;
end if;
end process;
end behav;
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment