From 6fba0fb8b7be2b2d555738e2eb869b49febcdb0a Mon Sep 17 00:00:00 2001 From: Tomasz Wlostowski <tomasz.wlostowski@cern.ch> Date: Wed, 5 Oct 2011 15:53:46 +0200 Subject: [PATCH] wishbone: wb_i2c_master: added WB slave adapter and xwb_ wrapper --- .../wishbone/wb_i2c_master/wb_i2c_master.vhd | 113 ++++++++++++++++-- .../wishbone/wb_i2c_master/xwb_i2c_master.vhd | 62 ++++------ 2 files changed, 129 insertions(+), 46 deletions(-) diff --git a/modules/wishbone/wb_i2c_master/wb_i2c_master.vhd b/modules/wishbone/wb_i2c_master/wb_i2c_master.vhd index 20348670..6dca5a44 100644 --- a/modules/wishbone/wb_i2c_master/wb_i2c_master.vhd +++ b/modules/wishbone/wb_i2c_master/wb_i2c_master.vhd @@ -1,22 +1,54 @@ +------------------------------------------------------------------------------ +-- Title : Wishbone I2C Master +-- Project : General Core Collection (gencores) Library +------------------------------------------------------------------------------ +-- Author : Tomasz Wlostowski +-- Company : CERN BE-Co-HT +-- Created : 2010-05-18 +-- Last update: 2011-10-05 +-- Platform : FPGA-generic +-- Standard : VHDL'87 +------------------------------------------------------------------------------- +-- Description: A Wishbone I2C Master core. +-- +------------------------------------------------------------------------------- +-- wb_i2c_master.vhd Copyright (c) 2010 CERN +-- +-- Uses I2C core from: http://www.opencores.org/projects/i2c/ +-- Copyright (C) 2000 Richard Herveille <richard@asics.ws> +-- See i2c_master_top.vhd for the licensing terms. +-- +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 2010-05-18 1.0 twlostow Created +-- 2010-10-04 1.1 twlostow Added WB slave adapter +------------------------------------------------------------------------------- + library ieee; use ieee.std_logic_1164.all; use work.wishbone_pkg.all; entity wb_i2c_master is + generic ( + g_interface_mode : t_wishbone_interface_mode := CLASSIC; + g_address_granularity : t_wishbone_address_granularity := WORD + ); port ( clk_sys_i : in std_logic; rst_n_i : in std_logic; - wb_adr_i : in std_logic_vector(2 downto 0); - wb_dat_i : in std_logic_vector(31 downto 0); - wb_dat_o : out std_logic_vector(31 downto 0); - wb_sel_i : in std_logic_vector(3 downto 0); - wb_stb_i : in std_logic; - wb_cyc_i : in std_logic; - wb_we_i : in std_logic; - wb_ack_o : out std_logic; - wb_int_o : out std_logic; + wb_adr_i : in std_logic_vector(4 downto 0); + wb_dat_i : in std_logic_vector(31 downto 0); + wb_dat_o : out std_logic_vector(31 downto 0); + wb_sel_i : in std_logic_vector(3 downto 0); + wb_stb_i : in std_logic; + wb_cyc_i : in std_logic; + wb_we_i : in std_logic; + wb_ack_o : out std_logic; + wb_int_o : out std_logic; + wb_stall_o : out std_logic; scl_pad_i : in std_logic; -- i2c clock line input scl_pad_o : out std_logic; -- i2c clock line output @@ -50,8 +82,69 @@ architecture rtl of wb_i2c_master is sda_pad_o : out std_logic; sda_padoen_o : out std_logic); end component; -begin -- rtl + signal dat_out : std_logic_vector(7 downto 0); + signal rst : std_logic; + + signal wb_in : t_wishbone_slave_in; + signal wb_out : t_wishbone_slave_out; + + signal resized_addr : std_logic_vector(c_wishbone_address_width-1 downto 0); +begin + + resized_addr(4 downto 0) <= wb_adr_i; + resized_addr(c_wishbone_address_width-1 downto 5) <= (others => '0'); + + U_Adapter : wb_slave_adapter + generic map ( + g_master_use_struct => true, + g_master_mode => CLASSIC, + g_master_granularity => WORD, + g_slave_use_struct => false, + g_slave_mode => g_interface_mode, + g_slave_granularity => g_address_granularity) + port map ( + clk_sys_i => clk_sys_i, + rst_n_i => rst_n_i, + master_i => wb_out, + master_o => wb_in, + sl_adr_i => resized_addr, + sl_dat_i => wb_dat_i, + sl_sel_i => wb_sel_i, + sl_cyc_i => wb_cyc_i, + sl_stb_i => wb_stb_i, + sl_we_i => wb_we_i, + sl_dat_o => wb_dat_o, + sl_ack_o => wb_ack_o, + sl_stall_o => wb_stall_o, + sl_int_o => wb_int_o); + + rst <= not rst_n_i; + + Wrapped_I2C : i2c_master_top + generic map ( + ARST_LVL => '0') + port map ( + wb_clk_i => clk_sys_i, + wb_rst_i => rst, + arst_i => '1', + wb_adr_i => wb_in.adr(2 downto 0), + wb_dat_i => wb_in.dat(7 downto 0), + wb_dat_o => dat_out, + wb_we_i => wb_in.we, + wb_stb_i => wb_in.stb, + wb_cyc_i => wb_in.cyc, + wb_ack_o => wb_out.ack, + wb_inta_o => wb_out.int, + scl_pad_i => scl_pad_i, + scl_pad_o => scl_pad_o, + scl_padoen_o => scl_padoen_o, + sda_pad_i => sda_pad_i, + sda_pad_o => sda_pad_o, + sda_padoen_o => sda_padoen_o); + + wb_out.dat(7 downto 0) <= dat_out; + wb_out.dat(wb_out.dat'left downto 8) <= (others => '0'); end rtl; diff --git a/modules/wishbone/wb_i2c_master/xwb_i2c_master.vhd b/modules/wishbone/wb_i2c_master/xwb_i2c_master.vhd index 8e151a46..3d672e06 100644 --- a/modules/wishbone/wb_i2c_master/xwb_i2c_master.vhd +++ b/modules/wishbone/wb_i2c_master/xwb_i2c_master.vhd @@ -5,7 +5,8 @@ use work.wishbone_pkg.all; entity xwb_i2c_master is generic( - g_interface_mode : t_wishbone_interface_mode := CLASSIC + g_interface_mode : t_wishbone_interface_mode := CLASSIC; + g_address_granularity : t_wishbone_address_granularity := WORD ); port ( clk_sys_i : in std_logic; @@ -26,21 +27,23 @@ end xwb_i2c_master; architecture rtl of xwb_i2c_master is - component i2c_master_top + component wb_i2c_master generic ( - ARST_LVL : std_logic); + g_interface_mode : t_wishbone_interface_mode; + g_address_granularity : t_wishbone_address_granularity); port ( - wb_clk_i : in std_logic; - wb_rst_i : in std_logic := '0'; - arst_i : in std_logic := not ARST_LVL; - wb_adr_i : in std_logic_vector(2 downto 0); - wb_dat_i : in std_logic_vector(7 downto 0); - wb_dat_o : out std_logic_vector(7 downto 0); - wb_we_i : in std_logic; + clk_sys_i : in std_logic; + rst_n_i : in std_logic; + wb_adr_i : in std_logic_vector(4 downto 0); + wb_dat_i : in std_logic_vector(31 downto 0); + wb_dat_o : out std_logic_vector(31 downto 0); + wb_sel_i : in std_logic_vector(3 downto 0); wb_stb_i : in std_logic; wb_cyc_i : in std_logic; + wb_we_i : in std_logic; wb_ack_o : out std_logic; - wb_inta_o : out std_logic; + wb_int_o : out std_logic; + wb_stall_o : out std_logic; scl_pad_i : in std_logic; scl_pad_o : out std_logic; scl_padoen_o : out std_logic; @@ -48,45 +51,32 @@ architecture rtl of xwb_i2c_master is sda_pad_o : out std_logic; sda_padoen_o : out std_logic); end component; - - signal rst : std_logic; - signal dat_out : std_logic_vector(7 downto 0); begin -- rtl - gen_test_mode : if(g_interface_mode /= CLASSIC) generate - - assert false report "xwb_i2c_master: this module can only work with CLASSIC wishbone interface" severity failure; - - end generate gen_test_mode; - - rst <= not rst_n_i; - - Wrapped_I2C : i2c_master_top + U_Wrapped_I2C : wb_i2c_master generic map ( - ARST_LVL => '0') + g_interface_mode => g_interface_mode, + g_address_granularity => g_address_granularity) port map ( - wb_clk_i => clk_sys_i, - wb_rst_i => rst, - arst_i => '1', - wb_adr_i => slave_i.adr(2 downto 0), - wb_dat_i => slave_i.dat(7 downto 0), - wb_dat_o => dat_out, - wb_we_i => slave_i.we, + clk_sys_i => clk_sys_i, + rst_n_i => rst_n_i, + wb_adr_i => slave_i.adr(4 downto 0), + wb_dat_i => slave_i.dat, + wb_dat_o => slave_o.dat, + wb_sel_i => slave_i.sel, wb_stb_i => slave_i.stb, wb_cyc_i => slave_i.cyc, + wb_we_i => slave_i.we, wb_ack_o => slave_o.ack, - wb_inta_o => slave_o.int, + wb_int_o => slave_o.int, + wb_stall_o => slave_o.stall, scl_pad_i => scl_pad_i, scl_pad_o => scl_pad_o, scl_padoen_o => scl_padoen_o, sda_pad_i => sda_pad_i, sda_pad_o => sda_pad_o, sda_padoen_o => sda_padoen_o); - - slave_o.dat(7 downto 0) <= dat_out; - slave_o.dat(slave_o.dat'left downto 8) <= (others => '0'); - end rtl; -- GitLab