diff --git a/libraries/io/i2c/hdllib.cfg b/libraries/io/i2c/hdllib.cfg index f844cd8696bdada99af7ed351fe271dc0b0d7117..875b18fe4995e251309184b346aa954fef4f98fe 100644 --- a/libraries/io/i2c/hdllib.cfg +++ b/libraries/io/i2c/hdllib.cfg @@ -40,7 +40,7 @@ test_bench_files = $UNB/Firmware/modules/Lofar/i2c/tb/vhdl/tb_i2cslave.vhd $UNB/Firmware/modules/Lofar/i2c/tb/vhdl/tb_i2c_master.vhd $UNB/Firmware/modules/Lofar/i2c/tb/vhdl/tb_avs_i2c_master.vhd - $UNB/Firmware/modules/Lofar/i2c/tb/vhdl/tb_i2c_commander.vhd + tb/vhdl/tb_i2c_commander.vhd tb/vhdl/tb_tb_i2c_commander.vhd modelsim_copy_files = diff --git a/libraries/io/i2c/tb/vhdl/tb_i2c_commander.vhd b/libraries/io/i2c/tb/vhdl/tb_i2c_commander.vhd new file mode 100644 index 0000000000000000000000000000000000000000..34692956a6d10c507a072b73ecb32729ca104354 --- /dev/null +++ b/libraries/io/i2c/tb/vhdl/tb_i2c_commander.vhd @@ -0,0 +1,459 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2012 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + + +-- Purpose: Verify the i2c_commander and create a u_protocol_ram init file +-- +-- Description: +-- The protocols for the I2C slaves on UNB are stored in the dev_unb_pkg. +-- The protocols for the I2C slaves on ADU are stored in the dev_adu_pkg. +-- This tb can model both via g_board = "unb" or "adu". The protocols for the +-- board are concatenated into c_protocol_ram_init. +-- The p_mm_stimuli writes the c_protocol_ram_init bytes to u_protocol_ram +-- and in parallel they get written to a file by u_protocol_ram_init_file: +-- +-- data/adu_protocol_ram_init.txt +-- or +-- data/unb_protocol_ram_init.txt +-- +-- See data/how_to_create_memory_init_hex_file.txt for how to +-- create a memory initialization hex file from this. +-- +-- The p_mm_stimuli continues with executing all protocol lists and checking +-- the expected results and ASSERTs ERROR if an access went not OK and in +-- case of read data if the read data value was not OK. +-- +-- Remark: +-- . Use c_protocol_ram_init_file="UNUSED" to initialize the u_protocol_ram +-- with the c_protocol_ram_init sequence, +-- else use the actual protocol_ram_init.hex file and verify that it contains +-- the same as the c_protocol_ram_init sequence. +-- +-- Usage: +-- > do wave_i2c_commander.do +-- > run -all +-- In the Wave Window view the signal u_commander/protocol_index to observe +-- the progress + + +ENTITY tb_i2c_commander IS + GENERIC ( + g_board : STRING := "adu" -- else default to "unb" + --g_board : STRING := "unb" + ); +END tb_i2c_commander; + +LIBRARY IEEE, common_lib, tst_lib; +USE IEEE.std_logic_1164.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.common_mem_pkg.ALL; +USE common_lib.tb_common_pkg.ALL; +USE common_lib.tb_common_mem_pkg.ALL; +USE work.i2c_smbus_pkg.ALL; +USE work.i2c_dev_max1617_pkg.ALL; +USE work.i2c_dev_adu_pkg.ALL; +USE work.i2c_dev_unb_pkg.ALL; +USE work.i2c_pkg.ALL; +USE work.i2c_commander_pkg.ALL; +USE work.i2c_commander_aduh_pkg.ALL; +USE work.i2c_commander_unbh_pkg.ALL; + + +ARCHITECTURE tb OF tb_i2c_commander IS + + CONSTANT c_protocol_ram_init_file : STRING := sel_a_b(g_board="adu", "data/adu_protocol_ram_init.hex", "data/unb_protocol_ram_init.hex"); + --CONSTANT c_protocol_ram_init_file : STRING := "UNUSED"; + + CONSTANT c_use_result_ram : BOOLEAN := TRUE; + + CONSTANT c_sim : BOOLEAN := TRUE; --FALSE + --CONSTANT c_sim : BOOLEAN := FALSE; + CONSTANT c_clk_freq_in_MHz : NATURAL := 100; -- 100 MHz + CONSTANT c_clk_period : TIME := (10**3/c_clk_freq_in_MHz) * 1 ns; + CONSTANT c_rst_period : TIME := 4 * c_clk_period; + + CONSTANT c_phy_i2c : t_c_i2c_phy := func_i2c_sel_a_b(c_sim, c_i2c_phy_sim, func_i2c_calculate_phy(c_clk_freq_in_MHz)); + + -- Model I2C sensor slaves on the bus + CONSTANT ADR_MAX6652 : NATURAL := sel_a_b(g_board="adu", 0, I2C_UNB_MAX6652_ADR); + CONSTANT ADR_MAX1617 : NATURAL := sel_a_b(g_board="adu", I2C_ADU_MAX1617_ADR, I2C_UNB_MAX1617_ADR); + CONSTANT ADR_PCA9555 : NATURAL := sel_a_b(g_board="adu", I2C_ADU_PCA9555_ADR, 0); + + CONSTANT c_sens_volt_address : STD_LOGIC_VECTOR := TO_UVEC(ADR_MAX6652, 7); -- MAX6652 address GND + CONSTANT c_max6652_volt_1v2 : NATURAL := 92; -- 92 * 2.5/192 = 1.2 + CONSTANT c_max6652_volt_2v5 : NATURAL := 147; -- 147 * 3.3/192 = 2.5 + CONSTANT c_max6652_volt_nc : NATURAL := 13; -- 13 * 12 /192 = 0.1 + CONSTANT c_max6652_volt_3v3 : NATURAL := 127; -- 127 * 5.0/192 = 3.3 + CONSTANT c_max6652_temp : NATURAL := 40; + + --CONSTANT c_sens_temp_address : STD_LOGIC_VECTOR := TO_UVEC(MAX1617_ADR_LOW_MID, 7); -- use other slave address to force I2C errors + CONSTANT c_sens_temp_address : STD_LOGIC_VECTOR := TO_UVEC(ADR_MAX1617, 7); -- MAX1618 address MID MID + CONSTANT c_max1618_temp : INTEGER := 60; + + CONSTANT c_io_expander_address : STD_LOGIC_VECTOR := TO_UVEC(ADR_PCA9555, 7); -- ADR_PCA9555 address + + -- Select the expected read data arrays for the result data (the read data values are tb dependent, so therefore they are not obtained from a package) + CONSTANT c_max1618_expected_data_read_temp_arr : t_i2c_cmdr_natural_arr := (c_max1618_temp, c_i2c_cmdr_expected_x, c_i2c_cmdr_expected_x, c_i2c_cmdr_expected_x, + c_i2c_cmdr_expected_x, c_i2c_cmdr_expected_x, c_i2c_cmdr_expected_x, c_i2c_cmdr_expected_x); + CONSTANT c_max6652_expected_data_read_config_arr : t_i2c_cmdr_natural_arr := (c_max6652_volt_1v2, c_max6652_volt_2v5, c_max6652_volt_3v3, c_max6652_temp, + c_i2c_cmdr_expected_x, c_i2c_cmdr_expected_x, c_i2c_cmdr_expected_x, c_i2c_cmdr_expected_x); + + CONSTANT c_expected_data_0_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_max1618_expected_data_read_temp_arr, c_max1618_expected_data_read_temp_arr); + CONSTANT c_expected_data_1_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_max6652_expected_data_read_config_arr); + CONSTANT c_expected_data_2_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_3_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_4_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_5_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_6_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_7_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_8_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_9_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_10_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_11_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_12_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_13_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_14_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + CONSTANT c_expected_data_15_arr : t_i2c_cmdr_natural_arr := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_expected_data_none_arr, c_i2c_cmdr_expected_data_none_arr); + + CONSTANT c_expected_data_mat : t_i2c_cmdr_natural_mat(0 TO c_i2c_cmdr_max_nof_protocols-1) := (c_expected_data_0_arr, + c_expected_data_1_arr, + c_expected_data_2_arr, + c_expected_data_3_arr, + c_expected_data_4_arr, + c_expected_data_5_arr, + c_expected_data_6_arr, + c_expected_data_7_arr, + c_expected_data_8_arr, + c_expected_data_9_arr, + c_expected_data_10_arr, + c_expected_data_11_arr, + c_expected_data_12_arr, + c_expected_data_13_arr, + c_expected_data_14_arr, + c_expected_data_15_arr); + + -- RAM sizes + CONSTANT c_mem_i2c : t_c_i2c_mm := func_i2c_sel_a_b(g_board="adu", c_i2c_cmdr_aduh_i2c_mm, c_i2c_cmdr_unbh_i2c_mm); + + -- Commander parameters + CONSTANT c_protocol_ram_init : t_nat_natural_arr := sel_a_b(g_board="adu", c_i2c_cmdr_aduh_protocol_ram_init, c_i2c_cmdr_unbh_protocol_ram_init); + CONSTANT c_nof_result_data_arr : t_nat_natural_arr := sel_a_b(g_board="adu", c_i2c_cmdr_aduh_nof_result_data_arr, c_i2c_cmdr_unbh_nof_result_data_arr); + + CONSTANT c_protocol_commander : t_c_i2c_cmdr_commander := func_i2c_cmdr_sel_a_b(g_board="adu", c_i2c_cmdr_aduh_protocol_commander, c_i2c_cmdr_unbh_protocol_commander); + + -- Commander MM register word indexes + CONSTANT c_protocol_status_wi : NATURAL := 3*c_protocol_commander.nof_protocols; + CONSTANT c_result_error_cnt_wi : NATURAL := 3*c_protocol_commander.nof_protocols + 1; + CONSTANT c_result_data_wi : NATURAL := 3*c_protocol_commander.nof_protocols + 2; + + + -- Test bench PHY + SIGNAL tb_end : STD_LOGIC := '0'; + SIGNAL clk : STD_LOGIC := '0'; + SIGNAL rst : STD_LOGIC := '1'; + SIGNAL sync : STD_LOGIC := '1'; + + SIGNAL scl_stretch : STD_LOGIC := 'Z'; + SIGNAL scl : STD_LOGIC; + SIGNAL sda : STD_LOGIC; + + -- IO expander + SIGNAL iobank0 : STD_LOGIC_VECTOR(7 DOWNTO 0); + SIGNAL iobank1 : STD_LOGIC_VECTOR(7 DOWNTO 0); + + -- IO expander ADU + SIGNAL adu_sclk : STD_LOGIC; + SIGNAL adu_sdata : STD_LOGIC; + SIGNAL adu_led_scs_n : STD_LOGIC; + SIGNAL adu_cal_adc : STD_LOGIC; + SIGNAL adu_pwr_ctrl : STD_LOGIC_VECTOR(1 DOWNTO 0); + SIGNAL adu_pwr_ctrl_1_dig : STD_LOGIC; + SIGNAL adu_pwr_ctrl_0_ana : STD_LOGIC; + SIGNAL adu_ctrl : STD_LOGIC_VECTOR(3 DOWNTO 0); + SIGNAL adu_ctrl_0_atten_le : STD_LOGIC; + SIGNAL adu_ctrl_1_modem_on : STD_LOGIC; + SIGNAL adu_ctrl_2_atten_le : STD_LOGIC; + SIGNAL adu_ctrl_3_modem_on : STD_LOGIC; + + SIGNAL adu_atten_ctrl : STD_LOGIC_VECTOR(5 DOWNTO 0); + + -- File interface + SIGNAL file_miso : t_mem_miso; + SIGNAL file_mosi : t_mem_mosi; + + -- MM registers interface + SIGNAL commander_miso : t_mem_miso; + SIGNAL commander_mosi : t_mem_mosi; + SIGNAL protocol_miso : t_mem_miso; + SIGNAL protocol_mosi : t_mem_mosi; + SIGNAL result_miso : t_mem_miso; + SIGNAL result_mosi : t_mem_mosi; + + -- Commander results + SIGNAL protocol_data : NATURAL; + SIGNAL protocol_status : NATURAL; + SIGNAL result_data : NATURAL; + SIGNAL result_error_cnt : NATURAL; + +BEGIN + + -- run -all + + rst <= '0' AFTER 4*c_clk_period; + clk <= (NOT clk) OR tb_end AFTER c_clk_period/2; + + -- I2C bus + scl <= 'H'; -- model I2C pull up + sda <= 'H'; -- model I2C pull up, use '0' and '1' to verify SDA forced low or high error + + scl <= scl_stretch; + + sens_clk_stretch : PROCESS (scl) + BEGIN + IF falling_edge(scl) THEN + scl_stretch <= '0', 'Z' AFTER 50 ns; -- < 10 ns to effectively disable stretching, >= 50 ns to enable it + END IF; + END PROCESS; + + u_protocol_ram_init_file : ENTITY tst_lib.tst_output + GENERIC MAP ( + g_file_name => "data/" & g_board & "_protocol_ram_init.txt", + g_nof_data => 1, + g_data_width => c_byte_w, + g_data_type => "UNSIGNED" + ) + PORT MAP ( + clk => clk, + rst => rst, + in_dat => file_mosi.wrdata(c_byte_w-1 DOWNTO 0), + in_val => file_mosi.wr + ); + + p_mm_stimuli : PROCESS + BEGIN + -- Wait for reset release + commander_mosi <= c_mem_mosi_rst; + file_mosi <= c_mem_mosi_rst; + protocol_mosi <= c_mem_mosi_rst; + result_mosi <= c_mem_mosi_rst; + proc_common_wait_until_low(clk, rst); + proc_common_wait_some_cycles(clk, 10); + + ---------------------------------------------------------------------------- + -- Initialize the u_protocol_ram or verify its default contents + ---------------------------------------------------------------------------- + + IF c_protocol_ram_init_file="UNUSED" THEN + -- Write + FOR I IN 0 TO c_protocol_ram_init'LENGTH-1 LOOP + proc_mem_mm_bus_wr(I, c_protocol_ram_init(I), clk, protocol_miso, protocol_mosi); -- fill u_protocol_ram + END LOOP; + FOR I IN c_protocol_ram_init'LENGTH TO c_mem_i2c.protocol_nof_dat-1 LOOP + proc_mem_mm_bus_wr(I, SMBUS_C_END, clk, protocol_miso, protocol_mosi); -- fill remainder of u_protocol_ram with default + END LOOP; + + ELSE + -- Read and verify + FOR I IN 0 TO c_protocol_ram_init'LENGTH-1 LOOP + proc_mem_mm_bus_rd(I, clk, protocol_miso, protocol_mosi); + proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, clk); + protocol_data <= TO_UINT(protocol_miso.rddata(c_byte_w-1 DOWNTO 0)); + proc_common_wait_some_cycles(clk, 1); + ASSERT c_protocol_ram_init(I)=protocol_data + REPORT "Unexpected protocol data" SEVERITY ERROR; + END LOOP; + FOR I IN c_protocol_ram_init'LENGTH TO c_mem_i2c.protocol_nof_dat-1 LOOP + proc_mem_mm_bus_rd(I, clk, protocol_miso, protocol_mosi); + proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, clk); + protocol_data <= TO_UINT(protocol_miso.rddata(c_byte_w-1 DOWNTO 0)); + proc_common_wait_some_cycles(clk, 1); + ASSERT SMBUS_C_END=protocol_data + REPORT "Unexpected protocol end data" SEVERITY ERROR; + END LOOP; + END IF; + + proc_common_wait_some_cycles(clk, 10); + + + ---------------------------------------------------------------------------- + -- Create the u_protocol_ram_init_file + ---------------------------------------------------------------------------- + + FOR I IN 0 TO c_protocol_ram_init'LENGTH-1 LOOP + proc_mem_mm_bus_wr(I, c_protocol_ram_init(I), clk, file_miso, file_mosi); -- fill u_protocol_ram_init_file + END LOOP; + FOR I IN c_protocol_ram_init'LENGTH TO c_mem_i2c.protocol_nof_dat-1 LOOP + proc_mem_mm_bus_wr(I, SMBUS_C_END, clk, file_miso, file_mosi); -- fill remainder of u_protocol_ram_init_file with default + END LOOP; + + proc_common_wait_some_cycles(clk, 10); + + + ---------------------------------------------------------------------------- + -- Try and verify all commander protocols + ---------------------------------------------------------------------------- + + FOR P IN 0 TO c_protocol_commander.nof_protocols-1 LOOP + + -- Issue protocol list P + proc_mem_mm_bus_wr(P, 1, clk, commander_miso, commander_mosi); + + -- Wait for protocol done + WHILE protocol_status/=c_i2c_cmdr_state_done LOOP + -- read commander protocol status register + proc_mem_mm_bus_rd(c_protocol_status_wi, clk, commander_miso, commander_mosi); + proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, clk); + protocol_status <= TO_UINT(commander_miso.rddata); + proc_common_wait_some_cycles(clk, 1); + END LOOP; + + -- Read commander result error count + proc_mem_mm_bus_rd(c_result_error_cnt_wi, clk, commander_miso, commander_mosi); + proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, clk); + result_error_cnt <= TO_UINT(commander_miso.rddata); + proc_common_wait_some_cycles(clk, 1); + ASSERT result_error_cnt=0 + REPORT "The result error count is not 0" SEVERITY ERROR; + + -- Read commander result data + FOR I IN 0 TO c_nof_result_data_arr(P)-1 LOOP + proc_mem_mm_bus_rd(c_result_data_wi+I, clk, commander_miso, commander_mosi); + proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, clk); + result_data <= TO_UINT(commander_miso.rddata); + proc_common_wait_some_cycles(clk, 1); + ASSERT c_expected_data_mat(P)(I)=result_data + REPORT "Unexpected result data" SEVERITY ERROR; + END LOOP; + + -- Wait for protocol idle + WHILE protocol_status/=c_i2c_cmdr_state_idle LOOP + -- read commander protocol status register + proc_mem_mm_bus_rd(c_protocol_status_wi, clk, commander_miso, commander_mosi); + proc_mem_mm_bus_rd_latency(c_mem_reg_rd_latency, clk); + protocol_status <= TO_UINT(commander_miso.rddata); + proc_common_wait_some_cycles(clk, 1); + END LOOP; + + -- Wait some time between the protocols + proc_common_wait_some_cycles(clk, 100); + END LOOP; + + ---------------------------------------------------------------------------- + -- The end + ---------------------------------------------------------------------------- + + proc_common_wait_some_cycles(clk, 100); + tb_end <= '1'; + WAIT; + END PROCESS; + + + -- I2C commander + u_commander : ENTITY work.i2c_commander + GENERIC MAP ( + g_sim => c_sim, + g_i2c_cmdr => c_protocol_commander, + g_i2c_mm => c_mem_i2c, + g_i2c_phy => c_phy_i2c, + g_protocol_ram_init_file => c_protocol_ram_init_file, + g_use_result_ram => c_use_result_ram + ) + PORT MAP ( + rst => rst, + clk => clk, + sync => sync, + + --------------------------------------------------------------------------- + -- Memory Mapped slave interfaces + --------------------------------------------------------------------------- + commander_mosi => commander_mosi, + commander_miso => commander_miso, + + -- If the default protocol list in u_protocol_ram is fine, then the protocol slave port can be left no connected + protocol_mosi => protocol_mosi, + protocol_miso => protocol_miso, + + -- Typically the commander status registers are sufficient, so then the results slave port can be left no connected + result_mosi => result_mosi, + result_miso => result_miso, + + --------------------------------------------------------------------------- + -- I2C interface + --------------------------------------------------------------------------- + scl => scl, + sda => sda + ); + + -- I2C slaves + u_sens_volt : ENTITY work.dev_max6652 -- only on "unb" + GENERIC MAP ( + g_address => c_sens_volt_address + ) + PORT MAP ( + scl => scl, + sda => sda, + volt_2v5 => c_max6652_volt_1v2, + volt_3v3 => c_max6652_volt_2v5, + volt_12v => c_max6652_volt_nc, + volt_vcc => c_max6652_volt_3v3, + temp => c_max6652_temp + ); + + u_sens_temp : ENTITY work.dev_max1618 -- both on "unb" and on "adu" + GENERIC MAP ( + g_address => c_sens_temp_address + ) + PORT MAP ( + scl => scl, + sda => sda, + temp => c_max1618_temp + ); + + u_io_expander : ENTITY work.dev_pca9555 -- only on "adu" + GENERIC MAP ( + g_address => c_io_expander_address + ) + PORT MAP ( + scl => scl, + sda => sda, + iobank0 => iobank0, + iobank1 => iobank1 + ); + + -- ADU interpretation of the IO expander outputs + adu_sclk <= iobank0(4); + adu_sdata <= iobank0(5); + adu_led_scs_n <= iobank0(7); + adu_cal_adc <= iobank1(7); + adu_pwr_ctrl <= iobank0(6) & iobank1(6); + adu_pwr_ctrl_1_dig <= adu_pwr_ctrl(1); + adu_pwr_ctrl_0_ana <= adu_pwr_ctrl(0); + + adu_ctrl <= iobank0(3 DOWNTO 0); + adu_ctrl_0_atten_le <= adu_ctrl(0); + adu_ctrl_1_modem_on <= adu_ctrl(1); + adu_ctrl_2_atten_le <= adu_ctrl(2); + adu_ctrl_3_modem_on <= adu_ctrl(3); + + adu_atten_ctrl <= iobank1(5 DOWNTO 0); + +END tb; +