---------------------------------------------------------------------------------- -- Massimiliano De Gaspari -- 7 Aug 2006 -- Program to make the temperature sensor measure the temperature every -- "Delay" seconds and write it in a 14-bits register ---------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Temperature is Port ( Data : inout STD_LOGIC; -- Pull up resistor is already on the board Sck : out STD_LOGIC; Clk : in STD_LOGIC; -- Pull down Reset : in STD_LOGIC; -- Pull down Busy : out STD_LOGIC; Temp : out STD_LOGIC_VECTOR (13 downto 0)); end Temperature; architecture Behavioral of Temperature is signal cData: std_logic; signal DataVector: std_logic_vector(7 downto 0); signal ReadVector: std_logic_vector(16 downto 0); type MachineStates is (Idle, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, -- reset states T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, -- command transmission M1, M2, M3, -- read temperature E1, E2); -- end bit signal TempState: MachineStates; constant Nmax : integer:= 90; -- for Clock frequency 40MHz constant N : integer:= Nmax/2; -- for Clock frequency 40MHz constant N3 : integer:= Nmax/3; -- for Clock frequency 40MHz constant Delay : integer:= 3; -- in seconds constant L : integer:= Delay*40000000; -- for Clock frequency 40MHz signal TimeCounter: integer range 0 to L; signal BitCounter: integer range 0 to 16; begin Data <= cData; TempMaster: process(Clk, Reset) begin if Reset='1' then DataVector <= "00011110"; Sck <= '0'; cData <= 'Z'; TempState <= R1; Temp <= conv_std_logic_vector(0, 14); Busy <= '1'; TimeCounter <= Nmax; BitCounter <= 7; elsif rising_edge(CLK) then if TimeCounter = 0 then case TempState is when R1 => -- Transmission start Sck <= '1'; TimeCounter <= N; TempState <= R2; when R2 => cData <= '0'; TimeCounter <= N; TempState <= R3; when R3 => Sck <= '0'; TimeCounter <= N; TempState <= R4; when R4 => Sck <= '1'; TimeCounter <= N; TempState <= R5; when R5 => cData <= 'Z'; TimeCounter <= N; TempState <= R6; when R6 => Sck <= '0'; TimeCounter <= Nmax; TempState <= R7; when R7 => -- from this state on begins the transmission of the Reset command if DataVector(BitCounter) = '0' then cData <= '0'; end if; if DataVector(BitCounter) = '1' then cData <= 'Z'; end if; TimeCounter <= N3; TempState <= R8; when R8 => Sck <= '1'; TimeCounter <= N3; TempState <= R9; when R9 => Sck <= '0'; TimeCounter <= N3; if BitCounter = 0 then cData <= 'Z'; BitCounter <= 7; TempState <= R10; else BitCounter <= BitCounter-1; TempState <= R7; end if; when R10 => -- acknowledge bit Sck <= '1'; TimeCounter <= N3; TempState <= R11; when R11 => Sck <= '0'; TimeCounter <= N3; TempState <= R12; when R12 => TimeCounter <= L; Busy <= '0'; TempState <= Idle; -- end acknowledge bit when Idle => DataVector <= "00000011"; Sck <= '0'; cData <= 'Z'; TempState <= T1; Busy <= '1'; TimeCounter <= N3; BitCounter <= 7; when T1 => -- Transmission start Sck <= '1'; TimeCounter <= N; TempState <= T2; when T2 => cData <= '0'; TimeCounter <= N; TempState <= T3; when T3 => Sck <= '0'; TimeCounter <= N; TempState <= T4; when T4 => Sck <= '1'; TimeCounter <= N; TempState <= T5; when T5 => cData <= 'Z'; TimeCounter <= N; TempState <= T6; when T6 => Sck <= '0'; TimeCounter <= Nmax; TempState <= T7; when T7 => -- from this state on begins the transmission of the measure command if DataVector(BitCounter) = '0' then cData <= '0'; end if; if DataVector(BitCounter) = '1' then cData <= 'Z'; end if; TimeCounter <= N3; TempState <= T8; when T8 => Sck <= '1'; TimeCounter <= N3; TempState <= T9; when T9 => Sck <= '0'; TimeCounter <= N3; if BitCounter = 0 then cData <= 'Z'; BitCounter <= 7; TempState <= T10; else BitCounter <= BitCounter-1; TempState <= T7; end if; when T10 => -- acknowledge bit Sck <= '1'; TimeCounter <= N3; TempState <= T11; when T11 => Sck <= '0'; TimeCounter <= Nmax; TempState <= T12; -- end acknowledge bit when T12 => if Data = '0' then TempState <= M1; TimeCounter <= N; BitCounter <= 16; end if; when M1 => -- here starts the readout of the temperature from the sensor Sck <= '1'; TimeCounter <= N3; TempState <= M2; when M2 => ReadVector(BitCounter) <= Data; TimeCounter <= N3; TempState <= M3; when M3 => Sck <= '0'; if Bitcounter = 9 then cData <= '0'; else cData <= 'Z'; end if; TimeCounter <= N3; if BitCounter = 0 then TempState <= E1; else TempState <= M1; BitCounter <= BitCounter-1; end if; when E1 => Sck <= '1'; Temp(13 downto 8) <= ReadVector(14 downto 9); Temp(7 downto 0) <= ReadVector(7 downto 0); TimeCounter <= N3; TempState <= E2; when E2 => Sck <= '0'; TimeCounter <= L; TempState <= Idle; Busy <= '0'; when others => TempState <= R1; end case; else TimeCounter <= TimeCounter-1; end if; end if; end process; end Behavioral;