-- i2cTest.vhd -------------------------------------------------------- -------------------------------------------------------------------------------- -- Andreas Maeder 15-feb-2001 -- -testbench for I2cEeprom -- -procedural stimuli generation -- -- entity i2cTest -- architecture testenv -------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; use work.i2cPkg.all; entity i2cTest is end entity i2cTest; architecture testenv of i2cTest is type tokenTy is (start, stop, bit0, bit1, ackM, ackS, clk); constant tDelay : time := 5.0 us; signal scl, sda : std_logic := 'H'; signal fCntl : fControlTy := none; procedure sendToken ( signal scl : out std_logic; signal sda : inout std_logic; token : in tokenTy; tLow : in time := tDelay; tHigh : in time := tDelay; tSuSta : in time := tDelay; tHdSta : in time := tDelay; tSuDat : in time := tDelay; tHdDat : in time := tDelay; tSuSto : in time := tDelay; tBuf : in time := tDelay) is begin case token is when start => sda <= 'Z'; scl <= 'Z'; wait for tSuSta; sda <= '0'; wait for tHdSta; scl <= '0'; wait for tLow/2; when stop => sda <= '0'; scl <= '0'; wait for tLow/2; scl <= 'Z'; wait for tSuSto; sda <= 'Z'; wait for tBuf/2; when bit0 | ackM => sda <= '0'; scl <= '0'; wait for tSuDat; scl <= 'Z'; wait for tHigh; scl <= '0'; wait for tHdDat; when bit1 | clk => sda <= 'Z'; scl <= '0'; wait for tSuDat; scl <= 'Z'; wait for tHigh; scl <= '0'; wait for tHdDat; when ackS => sda <= 'Z'; scl <= '0'; wait for tSuDat; scl <= 'Z'; wait for tHigh; assert to_x01(sda) = '0' report "i2cTest: missing acknowledge from slave" severity warning; scl <= '0'; wait for tHdDat; end case; end procedure sendToken; begin sda <= 'H'; -- pull-up driver scl <= 'H'; testP: process begin fCntl <= dump; -- dump the eeprom wait for 1 ns; fCntl <= none; wait for 1 ns; sendToken(scl, sda, start); -- start sequence sendToken(scl, sda, bit0); -- slave address "0110" sendToken(scl, sda, bit1); sendToken(scl, sda, bit1); sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); -- data address "000" sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); sendToken(scl, sda, bit1); -- read cycle setup sendToken(scl, sda, ackS); -- slave acknowledge sendToken(scl, sda, bit0); -- data address "00010000" => 16 sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); sendToken(scl, sda, bit1); sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); sendToken(scl, sda, ackS); -- slave acknowledge for i in 1 to 2 loop -- 2 read cycle's for j in 1 to 8 loop -- 8 bit's sendToken(scl, sda, clk); -- read bit end loop; if i = 1 then sendToken(scl, sda, ackM); -- master ack else sendToken(scl, sda, clk); -- master not-ack end if; end loop; sendToken(scl, sda, stop); -- stop sequence sendToken(scl, sda, start); -- start sequence sendToken(scl, sda, bit0); -- slave address "0110" sendToken(scl, sda, bit1); sendToken(scl, sda, bit1); sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); -- data address "000" sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); -- write cycle setup sendToken(scl, sda, ackS); -- slave acknowledge sendToken(scl, sda, bit0); -- data address "00001000" => 8 sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); sendToken(scl, sda, bit1); sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); sendToken(scl, sda, bit0); sendToken(scl, sda, ackS); -- slave acknowledge for i in 1 to 2 loop -- 2 write cycle's for j in 1 to 4 loop -- "01010101" sendToken(scl, sda, bit0); sendToken(scl, sda, bit1); end loop; sendToken(scl, sda, ackS); -- slave acknowledge end loop; sendToken(scl, sda, stop); -- stop sequence wait; -- stop here! end process testP; eepromI: i2cEeprom port map (scl, sda, fCntl); end architecture testenv; -------------------------------------------------------------------------------- --configuration i2cTestCfg of i2cTest is -- for testenv -- end for; --end configuration i2cTestCfg; -------------------------------------------------------------------------------- -- i2cTest.vhd - end --------------------------------------------------------