Compiling, intermediate version for MBSr2, register renumber, interrupt generation, not tested
This commit is contained in:
parent
ef784c054e
commit
aed7bf198a
|
|
@ -1,6 +1,8 @@
|
|||
-- synthesis VHDL_INPUT_VERSION VHDL_2008
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.numeric_std.all;
|
||||
use ieee.std_logic_misc.all;
|
||||
use work.sim_switcher_pkg.all;
|
||||
|
||||
entity sim_switcher_top is
|
||||
|
|
@ -32,6 +34,7 @@ entity sim_switcher_top is
|
|||
|
||||
-- FPGA interrupt to CPU
|
||||
fpga_int_o : out std_logic; -- FPGA_INTn_V18, PIN_F12, active high
|
||||
|
||||
-- I2C slave interface
|
||||
i2c_scl_io : inout std_logic;
|
||||
i2c_sda_io : inout std_logic;
|
||||
|
|
@ -181,8 +184,26 @@ architecture rtl of sim_switcher_top is
|
|||
-- Expansion card IO tri-state control
|
||||
signal reg_expio_line : std_logic_vector(5 downto 0);
|
||||
signal reg_expio_output : std_logic_vector(5 downto 0);
|
||||
signal reg_expio_dir : std_logic_vector(5 downto 0);
|
||||
signal reg_expio_intdirh2l : std_logic_vector(5 downto 0);
|
||||
signal reg_expio_intdirl2h : std_logic_vector(5 downto 0);
|
||||
signal reg_expio_intstatus : std_logic_vector(5 downto 0);
|
||||
signal s_exp_card_i : std_logic_vector(5 downto 0);
|
||||
signal s_dbexp_card_i : std_logic_vector(5 downto 0);
|
||||
signal s_dbexp_card_prev : std_logic_vector(5 downto 0);
|
||||
signal s_expio_intl2h : std_logic_vector(5 downto 0);
|
||||
signal s_expio_inth2l : std_logic_vector(5 downto 0);
|
||||
|
||||
-- Interrupt related signals
|
||||
signal reg_int_reason : std_logic_vector(7 downto 0);
|
||||
signal s_int_reason_gpio : std_logic;
|
||||
signal s_int_reason_reset : std_logic;
|
||||
signal s_int_reason_reset_ack : std_logic;
|
||||
signal s_int_expio_reset : std_logic;
|
||||
signal s_int_expio_reset_ack : std_logic;
|
||||
signal s_fpga_int_o : std_logic;
|
||||
signal sdb_pse_intn : std_logic;
|
||||
signal sdb_pse_intn_prev : std_logic;
|
||||
|
||||
-- State machine signals and types
|
||||
type state_t is (idle, mod_to_sim, sim_to_mod);
|
||||
|
|
@ -194,8 +215,8 @@ architecture rtl of sim_switcher_top is
|
|||
|
||||
begin
|
||||
|
||||
-- Interrupt generation
|
||||
fpga_int_o <= not pse_intn;
|
||||
-- Interrupt output routing
|
||||
fpga_int_o <= s_fpga_int_o;
|
||||
|
||||
-- Currently unused SIM data lines for VirtualSIM
|
||||
s_sim_data_i(15 downto 8) <= (others => '1');
|
||||
|
|
@ -254,9 +275,11 @@ begin
|
|||
-- Expansion card IO control
|
||||
gen_expio_dbnc: for i in 0 to 5 generate
|
||||
|
||||
s_exp_card_i(i) <= exp_card_io(i);
|
||||
exp_card_io(i) <= '0' when reg_expio_output(i) = '0' else 'Z';
|
||||
reg_expio_line(i) <= s_dbexp_card_i(i);
|
||||
s_exp_card_i(i) <= exp_card_io(i);
|
||||
reg_expio_line(i) <= s_dbexp_card_i(i);
|
||||
exp_card_io(i) <= '0' when reg_expio_output(i) = '0' and reg_expio_dir(i) = '1'
|
||||
else '1' when reg_expio_output(i) = '1' and reg_expio_dir(i) = '1'
|
||||
else 'Z';
|
||||
|
||||
expio_debounce : debounce
|
||||
generic map (
|
||||
|
|
@ -267,9 +290,78 @@ begin
|
|||
signal_in => s_exp_card_i(i),
|
||||
signal_out => s_dbexp_card_i(i)
|
||||
);
|
||||
|
||||
end generate gen_expio_dbnc;
|
||||
|
||||
---------------------------------------------------------
|
||||
pseint_debounce : debounce
|
||||
generic map (
|
||||
WAIT_CYCLES => DEBOUNCING_WAIT_CYCLES
|
||||
)
|
||||
port map (
|
||||
clk => clk25_i,
|
||||
signal_in => pse_intn,
|
||||
signal_out => sdb_pse_intn
|
||||
);
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
--------------------------
|
||||
-- Interrupt generation --
|
||||
--------------------------
|
||||
reg_expio_intstatus <= s_expio_intl2h or s_expio_inth2l;
|
||||
|
||||
int_gen_proc: process(clk25_i, s_rstn_i, sdb_pse_intn, sdb_pse_intn_prev, s_int_expio_reset, s_expio_intl2h, s_expio_inth2l, reg_expio_intdirl2h, reg_expio_intdirh2l, s_dbexp_card_i, s_dbexp_card_prev) is
|
||||
begin
|
||||
if s_rstn_i = '0' then
|
||||
s_fpga_int_o <= '0';
|
||||
s_expio_intl2h <= (others => '0');
|
||||
s_expio_inth2l <= (others => '0');
|
||||
reg_int_reason <= (others => '0');
|
||||
|
||||
elsif (rising_edge(clk25_i)) then
|
||||
s_dbexp_card_prev <= s_dbexp_card_i;
|
||||
sdb_pse_intn_prev <= sdb_pse_intn;
|
||||
|
||||
-- Catch IO line transitions for interrupt generating
|
||||
for i in 0 to 5 loop
|
||||
-- Generate Low-to-High IO transition interrupt
|
||||
if (reg_expio_intdirl2h(i) = '1' and s_dbexp_card_prev(i) = '0' and s_dbexp_card_i(i) = '1') then
|
||||
s_expio_intl2h(i) <= '1';
|
||||
end if;
|
||||
-- Generate High-to-Low IO transition interrupt
|
||||
if (reg_expio_intdirh2l(i) = '1' and s_dbexp_card_prev(i) = '1' and s_dbexp_card_i(i) = '0') then
|
||||
s_expio_inth2l(i) <= '1';
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
-- Write the interrupt reason is IO bit
|
||||
reg_int_reason(0) <= OR_REDUCE(s_expio_intl2h) or OR_REDUCE(s_expio_inth2l);
|
||||
|
||||
-- Write interrupt reason is PSE bit
|
||||
if (sdb_pse_intn_prev = '1' and sdb_pse_intn = '0') then
|
||||
reg_int_reason(1) <= '1';
|
||||
end if;
|
||||
|
||||
|
||||
if (s_int_expio_reset = '1') then
|
||||
s_expio_intl2h <= (others => '0');
|
||||
s_expio_inth2l <= (others => '0');
|
||||
s_int_expio_reset_ack <= '1';
|
||||
else
|
||||
s_int_expio_reset_ack <= '0';
|
||||
end if;
|
||||
|
||||
if (s_int_reason_reset = '1') then
|
||||
reg_int_reason <= (others => '0');
|
||||
s_int_reason_reset_ack <= '1';
|
||||
else
|
||||
s_int_reason_reset_ack <= '0';
|
||||
end if;
|
||||
|
||||
s_fpga_int_o <= OR_REDUCE(s_expio_intl2h) or OR_REDUCE(s_expio_inth2l) or not sdb_pse_intn;
|
||||
|
||||
end if;
|
||||
end process;
|
||||
|
||||
----------------------------------
|
||||
-- Power-On FPGA IP-cores reset --
|
||||
|
|
@ -434,235 +526,316 @@ begin
|
|||
reg_fan_ctl <= (others => '0'); -- FANs are off
|
||||
reg_pse_ctl <= (others => '0'); -- POE out is on
|
||||
reg_poepd_ctl <= '0'; -- POE PD enabled
|
||||
reg_expio_output <= (others => '1'); -- All Expansion card IOs in HighZ at start
|
||||
reg_expio_output <= (others => '1'); -- All Expansion card IOs in HighZ at start
|
||||
reg_expio_dir <= (others => '0'); -- All Expansion card IOs direction is IN
|
||||
reg_expio_intdirh2l <= (others => '0'); -- Expansion card GPIO default line interrupt generation for High-to-Low transition is off
|
||||
reg_expio_intdirl2h <= (others => '0'); -- Expansion card GPIO default line interrupt generation for Low-to-High transition is off
|
||||
|
||||
elsif (rising_edge(clk25_i)) then
|
||||
case i2c_slv_state is
|
||||
when ready =>
|
||||
wait_cnt := 0;
|
||||
i2c_data_to_master <= (others => '0');
|
||||
if (i2c_data_valid = '1') then -- master sent a register addr byte
|
||||
-- Save register address for later use in write procedure
|
||||
s_reg_to_write <= i2c_data_from_master;
|
||||
if (s_int_expio_reset_ack = '1') then
|
||||
s_int_expio_reset <= '0';
|
||||
end if;
|
||||
|
||||
case i2c_data_from_master is
|
||||
when x"10" => -- Read ID byte
|
||||
i2c_data_to_master <= x"18";
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
if (s_int_reason_reset_ack = '1') then
|
||||
s_int_reason_reset <= '0';
|
||||
end if;
|
||||
|
||||
case i2c_slv_state is
|
||||
when ready =>
|
||||
wait_cnt := 0;
|
||||
i2c_data_to_master <= (others => '0');
|
||||
if (i2c_data_valid = '1') then -- master sent a register addr byte
|
||||
-- Save register address for later use in write procedure
|
||||
s_reg_to_write <= i2c_data_from_master;
|
||||
|
||||
when x"11" => -- Read SW Version byte (v1.0=0x18 MBCr1, v1.1=0x19 MBSr1, v2.0=0x28 MBSr2)
|
||||
i2c_data_to_master <= x"28";
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
case i2c_data_from_master is
|
||||
when x"10" => -- Read ID byte
|
||||
i2c_data_to_master <= x"18";
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"12" => -- Read SIM board model regiser
|
||||
i2c_data_to_master <= "00000" & reg_sim_board_conf;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"11" => -- Read SW Version byte (v1.0=0x18 MBCr1, v1.1=0x19 MBSr1, v2.0=0x28 MBSr2)
|
||||
i2c_data_to_master <= x"28";
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"13" => -- Read FAN control regiser
|
||||
i2c_data_to_master <= "000000" & reg_fan_ctl;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"12" => -- Read SIM board model regiser
|
||||
i2c_data_to_master <= "00000" & reg_sim_board_conf;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"14" => -- Read POE OUT status register
|
||||
i2c_data_to_master <= "000000" & reg_pse_status;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"15" => -- Read interrupt reason register (autocleared on read)
|
||||
i2c_data_to_master <= reg_int_reason;
|
||||
s_int_reason_reset <= '1'; -- Clear reg on read
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"15" => -- Read POE OUT control register
|
||||
i2c_data_to_master <= "000000" & reg_pse_ctl;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"20" => -- Read SIM1 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(0),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"16" => -- Read POE IN status register
|
||||
i2c_data_to_master <= "00000" & reg_poepd_status;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"21" => -- Read SIM2 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(1),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"17" => -- Read POE IN control register
|
||||
i2c_data_to_master <= "0000000" & reg_poepd_ctl;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"22" => -- Read SIM3 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(2),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"18" => -- Read Expansion card IO lines
|
||||
i2c_data_to_master <= "00" & reg_expio_line;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"23" => -- Read SIM4 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(3),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"19" => -- Read Expansion card output register
|
||||
i2c_data_to_master <= "00" & reg_expio_output;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"24" => -- Read SIM5 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(4),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"05" => -- Read M.2 modem wake host register
|
||||
i2c_data_to_master <= "0000"®_mod_hstwake(3 downto 0);
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"25" => -- Read SIM6 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(5),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"06" => -- Read modem LED register
|
||||
i2c_data_to_master <= reg_mod_led(7 downto 0);
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"26" => -- Read SIM7 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(6),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"07" => -- Read modem power register
|
||||
i2c_data_to_master <= reg_mod_pwr(7 downto 0);
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"08" => -- Read PCIe RSTn register
|
||||
i2c_data_to_master <= reg_pcie_rstn(7 downto 5)&"00000";
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"27" => -- Read SIM8 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(7),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"09" => -- Read PCIe WAKEn register
|
||||
i2c_data_to_master <= reg_pcie_waken(7 downto 5)&"00000";
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"35" => -- Read M.2 modem wake host register
|
||||
i2c_data_to_master <= "0000"®_mod_hstwake(3 downto 0);
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"0A" => -- Read SIM detect register (LSB)
|
||||
i2c_data_to_master <= reg_sim_det(7 downto 0);
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
-- when x"0B" => -- Read SIM detect register (MSB)
|
||||
-- i2c_data_to_master <= reg_sim_det(15 downto 8);
|
||||
-- i2c_slv_state <= wait_while_sent;
|
||||
when x"0C" => -- Read SIM power register (LSB)
|
||||
i2c_data_to_master <= reg_sim_pwr(7 downto 0);
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
-- when x"0D" => -- Read SIM power register (MSB)
|
||||
-- i2c_data_to_master <= reg_sim_pwr(15 downto 8);
|
||||
-- i2c_slv_state <= wait_while_sent;
|
||||
when x"36" => -- Read modem LED register
|
||||
i2c_data_to_master <= reg_mod_led(7 downto 0);
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"20" => -- Read SIM1 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(0),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"21" => -- Read SIM2 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(1),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"22" => -- Read SIM3 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(2),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"23" => -- Read SIM4 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(3),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"24" => -- Read SIM5 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(4),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"25" => -- Read SIM6 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(5),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"26" => -- Read SIM7 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(6),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"27" => -- Read SIM8 modem register
|
||||
i2c_data_to_master <= "0000" & std_logic_vector(to_unsigned(reg_sim_modemnum(7),4));
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
when x"37" => -- Read modem power register
|
||||
i2c_data_to_master <= reg_mod_pwr(7 downto 0);
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"86" => -- Write modem LED register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"87" => -- Write modem power register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"88" => -- Write PCIe RSTn register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"38" => -- Read PCIe RSTn register
|
||||
i2c_data_to_master <= reg_pcie_rstn(7 downto 5)&"00000";
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"8C" => -- Write SIMs power register (LSB)
|
||||
i2c_slv_state <= receive_byte;
|
||||
-- when x"8D" => -- Write SIMs power register (MSB)
|
||||
-- i2c_slv_state <= receive_byte;
|
||||
when x"39" => -- Read PCIe WAKEn register
|
||||
i2c_data_to_master <= reg_pcie_waken(7 downto 5)&"00000";
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"93" => -- Write FAN control regiser
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"3A" => -- Read SIM detect register (LSB)
|
||||
i2c_data_to_master <= reg_sim_det(7 downto 0);
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"95" => -- Write POE OUT control register
|
||||
i2c_slv_state <= receive_byte;
|
||||
-- when x"3B" => -- Read SIM detect register (MSB)
|
||||
-- i2c_data_to_master <= reg_sim_det(15 downto 8);
|
||||
-- i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"97" => -- Write POE IN control register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"3C" => -- Read SIM power register (LSB)
|
||||
i2c_data_to_master <= reg_sim_pwr(7 downto 0);
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"99" => -- Write Expansion card output register
|
||||
i2c_slv_state <= receive_byte;
|
||||
-- when x"3D" => -- Read SIM power register (MSB)
|
||||
-- i2c_data_to_master <= reg_sim_pwr(15 downto 8);
|
||||
-- i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"A0" => -- Write SIM1 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"A1" => -- Write SIM2 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"A2" => -- Write SIM3 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"A3" => -- Write SIM4 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"A4" => -- Write SIM5 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"A5" => -- Write SIM6 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"A6" => -- Write SIM7 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"A7" => -- Write SIM8 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
when x"41" => -- Read Expansion card IO lines
|
||||
i2c_data_to_master <= "00" & reg_expio_line;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when others =>
|
||||
i2c_slv_state <= ready;
|
||||
end case;
|
||||
end if;
|
||||
when x"42" => -- Read Expansion card output value register
|
||||
i2c_data_to_master <= "00" & reg_expio_output;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when receive_byte =>
|
||||
if (i2c_data_valid = '1') then
|
||||
case s_reg_to_write is
|
||||
when x"86" => -- Write modem LED register
|
||||
reg_mod_led(7 downto 0) <= i2c_data_from_master(7 downto 0);
|
||||
when x"87" => -- Write modem power register
|
||||
reg_mod_pwr(7 downto 0) <= i2c_data_from_master(7 downto 0);
|
||||
when x"88" => -- Write PCIe RSTn register
|
||||
reg_pcie_rstn(7 downto 5) <= i2c_data_from_master(7 downto 5);
|
||||
when x"43" => -- Read Expansion card direction (0 - IN, 1 - OUT) register
|
||||
i2c_data_to_master <= "00" & reg_expio_dir;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"8C" => -- Write SIMs power register (LSB)
|
||||
reg_sim_pwr(7 downto 0) <= i2c_data_from_master(7 downto 0);
|
||||
-- when x"8D" => -- Write SIMs power register (MSB)
|
||||
-- reg_sim_pwr(15 downto 8) <= i2c_data_from_master(7 downto 0);
|
||||
when x"44" => -- Read Expansion card GPIO interrupt generation for High-to-Low transition register
|
||||
i2c_data_to_master <= "00" & reg_expio_intdirh2l;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"93" => -- Write FAN control regiser
|
||||
reg_fan_ctl(1 downto 0) <= i2c_data_from_master(1 downto 0);
|
||||
when x"45" => -- Read Expansion card GPIO interrupt generation for Low-to-High transition register
|
||||
i2c_data_to_master <= "00" & reg_expio_intdirl2h;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"95" => -- Write POE OUT control register
|
||||
reg_pse_ctl(1 downto 0) <= i2c_data_from_master(1 downto 0);
|
||||
when x"46" => -- Read Expansion card GPIO interrupt status register (autocleared on read)
|
||||
i2c_data_to_master <= "00" & reg_expio_intstatus;
|
||||
s_int_expio_reset <= '1'; -- Clear reg on read
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"97" => -- Write POE IN control register
|
||||
reg_poepd_ctl <= i2c_data_from_master(0);
|
||||
when x"51" => -- Read FAN control regiser
|
||||
i2c_data_to_master <= "000000" & reg_fan_ctl;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"99" => -- Write Expansion card output register
|
||||
reg_expio_output <= i2c_data_from_master(5 downto 0);
|
||||
when x"52" => -- Read POE OUT status register
|
||||
i2c_data_to_master <= "000000" & reg_pse_status;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when x"A0" => -- Write SIM1 modem register
|
||||
reg_sim_modemnum(0) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
when x"A1" => -- Write SIM2 modem register
|
||||
reg_sim_modemnum(1) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
when x"A2" => -- Write SIM3 modem register
|
||||
reg_sim_modemnum(2) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
when x"A3" => -- Write SIM4 modem register
|
||||
reg_sim_modemnum(3) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
when x"A4" => -- Write SIM5 modem register
|
||||
reg_sim_modemnum(4) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
when x"A5" => -- Write SIM6 modem register
|
||||
reg_sim_modemnum(5) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
when x"A6" => -- Write SIM7 modem register
|
||||
reg_sim_modemnum(6) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
when x"A7" => -- Write SIM8 modem register
|
||||
reg_sim_modemnum(7) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
when x"53" => -- Read POE OUT control register
|
||||
i2c_data_to_master <= "000000" & reg_pse_ctl;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
i2c_slv_state <= ready;
|
||||
else
|
||||
-- Wait timer to prevent freeze in waiting state
|
||||
if (wait_cnt > I2C_MAX_WAIT) then
|
||||
i2c_slv_state <= ready;
|
||||
else
|
||||
wait_cnt := wait_cnt + 1;
|
||||
end if;
|
||||
end if;
|
||||
when x"54" => -- Read POE IN status register
|
||||
i2c_data_to_master <= "00000" & reg_poepd_status;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when wait_while_sent =>
|
||||
if (i2c_read_req = '1') then
|
||||
i2c_slv_state <= ready;
|
||||
else
|
||||
-- Wait timer to prevent freeze in waiting state
|
||||
if (wait_cnt > I2C_MAX_WAIT) then
|
||||
i2c_slv_state <= ready;
|
||||
else
|
||||
wait_cnt := wait_cnt + 1;
|
||||
end if;
|
||||
end if;
|
||||
when x"55" => -- Read POE IN control register
|
||||
i2c_data_to_master <= "0000000" & reg_poepd_ctl;
|
||||
i2c_slv_state <= wait_while_sent;
|
||||
|
||||
when others =>
|
||||
i2c_slv_state <= ready;
|
||||
when x"A0" => -- Write SIM1 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
end case;
|
||||
when x"A1" => -- Write SIM2 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"A2" => -- Write SIM3 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"A3" => -- Write SIM4 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"A4" => -- Write SIM5 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"A5" => -- Write SIM6 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"A6" => -- Write SIM7 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"A7" => -- Write SIM8 modem register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"B6" => -- Write modem LED register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"B7" => -- Write modem power register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"B8" => -- Write PCIe RSTn register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"BC" => -- Write SIMs power register (LSB)
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
-- when x"BD" => -- Write SIMs power register (MSB)
|
||||
-- i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"C2" => -- Write Expansion card output register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"C3" => -- Write Expansion card direction register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"C4" => -- Write Expansion card GPIO interrupt generation for High-to-Low transition register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"C5" => -- Write Expansion card GPIO interrupt generation for Low-to-High transition register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"D1" => -- Write FAN control regiser
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"D3" => -- Write POE OUT control register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when x"D5" => -- Write POE IN control register
|
||||
i2c_slv_state <= receive_byte;
|
||||
|
||||
when others =>
|
||||
i2c_slv_state <= ready;
|
||||
end case;
|
||||
end if;
|
||||
|
||||
when receive_byte =>
|
||||
if (i2c_data_valid = '1') then
|
||||
case s_reg_to_write is
|
||||
when x"A0" => -- Write SIM1 modem register
|
||||
reg_sim_modemnum(0) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
|
||||
when x"A1" => -- Write SIM2 modem register
|
||||
reg_sim_modemnum(1) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
|
||||
when x"A2" => -- Write SIM3 modem register
|
||||
reg_sim_modemnum(2) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
|
||||
when x"A3" => -- Write SIM4 modem register
|
||||
reg_sim_modemnum(3) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
|
||||
when x"A4" => -- Write SIM5 modem register
|
||||
reg_sim_modemnum(4) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
|
||||
when x"A5" => -- Write SIM6 modem register
|
||||
reg_sim_modemnum(5) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
|
||||
when x"A6" => -- Write SIM7 modem register
|
||||
reg_sim_modemnum(6) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
|
||||
when x"A7" => -- Write SIM8 modem register
|
||||
reg_sim_modemnum(7) <= to_integer(unsigned(i2c_data_from_master(3 downto 0)));
|
||||
|
||||
when x"B6" => -- Write modem LED register
|
||||
reg_mod_led(7 downto 0) <= i2c_data_from_master(7 downto 0);
|
||||
|
||||
when x"B7" => -- Write modem power register
|
||||
reg_mod_pwr(7 downto 0) <= i2c_data_from_master(7 downto 0);
|
||||
|
||||
when x"B8" => -- Write PCIe RSTn register
|
||||
reg_pcie_rstn(7 downto 5) <= i2c_data_from_master(7 downto 5);
|
||||
|
||||
when x"BC" => -- Write SIMs power register (LSB)
|
||||
reg_sim_pwr(7 downto 0) <= i2c_data_from_master(7 downto 0);
|
||||
|
||||
-- when x"BD" => -- Write SIMs power register (MSB)
|
||||
-- reg_sim_pwr(15 downto 8) <= i2c_data_from_master(7 downto 0);
|
||||
|
||||
when x"C2" => -- Write Expansion card output register
|
||||
reg_expio_output <= i2c_data_from_master(5 downto 0);
|
||||
|
||||
when x"C3" => -- Write Expansion card direction register
|
||||
reg_expio_dir <= i2c_data_from_master(5 downto 0);
|
||||
|
||||
when x"C4" => -- Write Expansion card GPIO interrupt generation for High-to-Low transition register
|
||||
reg_expio_intdirh2l <= i2c_data_from_master(5 downto 0);
|
||||
|
||||
when x"C5" => -- Write Expansion card GPIO interrupt generation for Low-to-High transition register
|
||||
reg_expio_intdirl2h <= i2c_data_from_master(5 downto 0);
|
||||
|
||||
when x"D1" => -- Write FAN control regiser
|
||||
reg_fan_ctl(1 downto 0) <= i2c_data_from_master(1 downto 0);
|
||||
|
||||
when x"D3" => -- Write POE OUT control register
|
||||
reg_pse_ctl(1 downto 0) <= i2c_data_from_master(1 downto 0);
|
||||
|
||||
when x"D5" => -- Write POE IN control register
|
||||
reg_poepd_ctl <= i2c_data_from_master(0);
|
||||
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
i2c_slv_state <= ready;
|
||||
else
|
||||
-- Wait timer to prevent freeze in waiting state
|
||||
if (wait_cnt > I2C_MAX_WAIT) then
|
||||
i2c_slv_state <= ready;
|
||||
else
|
||||
wait_cnt := wait_cnt + 1;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when wait_while_sent =>
|
||||
if (i2c_read_req = '1') then
|
||||
i2c_slv_state <= ready;
|
||||
else
|
||||
-- Wait timer to prevent freeze in waiting state
|
||||
if (wait_cnt > I2C_MAX_WAIT) then
|
||||
i2c_slv_state <= ready;
|
||||
else
|
||||
wait_cnt := wait_cnt + 1;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
when others =>
|
||||
i2c_slv_state <= ready;
|
||||
|
||||
end case;
|
||||
end if;
|
||||
end process i2c_slv_process;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue