stelik
Newbie level 3
sht71 0000000000000000
Does anyone have code or know anything on interfacing a Sensirion SHT71 (or SHT75) sensor in VHDL? In particular, I am using a Xilinx Coolrunner-II CPLD. I have found various sample codes online (like from the Sensirion's website) as well as assembly codes and such, but nothing in VHDL. I have tried for days, but I haven't even been able to synthesize my code!
If anyone has any info, that would be great. Thanks in advance!
Below is my code:
Does anyone have code or know anything on interfacing a Sensirion SHT71 (or SHT75) sensor in VHDL? In particular, I am using a Xilinx Coolrunner-II CPLD. I have found various sample codes online (like from the Sensirion's website) as well as assembly codes and such, but nothing in VHDL. I have tried for days, but I haven't even been able to synthesize my code!
If anyone has any info, that would be great. Thanks in advance!
Below is my code:
Code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity getdata is
Port ( clk : in STD_LOGIC; --500 KHz clock
twi : inout STD_LOGIC; --P139
i2c : inout STD_LOGIC;
data : out std_logic_vector(19 downto 0);
clk_twi : out STD_LOGIC; --P140
clk_i2c : out STD_LOGIC);
end getdata;
architecture Behavioral of getdata is
signal counter_timing : std_logic_vector(18 downto 0) := "0000000000000000000";
signal counter_comms : std_logic_vector(2 downto 0) := "000";
signal timingclk : std_logic := '1'; --1 Hz clock
signal clk_comms : std_logic := '1'; --100 KHz clock
signal temp : std_logic_vector(7 downto 0) := "00000011"; --code for measure temperature
signal humidity : std_logic_vector(7 downto 0) := "00000101"; --code for humidity measurement
signal data_temp : std_logic_vector(15 downto 0) := "0000000000000000";
signal data_humidity : std_logic_vector(15 downto 0) := "0000000000000000";
signal ack : std_logic := '0';
signal start : std_logic := '0';
signal measure : std_logic := '0';
signal count : std_logic_vector(1 downto 0) := "00";
signal count2 : std_logic_vector(3 downto 0) := "0000";
signal send : std_logic := '0';
signal ackq : std_logic := '0';
signal receive : std_logic := '0';
signal ackt : std_logic := '0';
begin
slowclock: process (clk)
begin
--if rising_edge(clk) then
if clk'Event and clk='1' then
counter_timing <= counter_timing + 1;
counter_comms <= counter_comms + 1;
if counter_timing = "1111010000100011111" then
timingclk <= not timingclk;
counter_timing <= "0000000000000000000";
end if;
if counter_comms = "100" then
clk_comms <= not clk_comms;
counter_comms <= "000";
end if;
end if;
end process;
retrieve: process(clk,clk_comms,timingclk)
begin
--Unless the sensor is taking a measurement, output the 100 KHz clock to clk_twi and clk_i2c
if measure = '0' then
clk_twi <= clk_comms;
--clk_i2c <= clk_comms;
else
ack <= twi;
if ack = '0' then
measure <= '0';
receive <= '1';
end if;
end if;
--if rising_edge(timingclk) then
if timingclk'Event and timingclk = '1' then
start <= '1';
twi <= '1';
--i2c <= '1';
end if;
--Send the start sequence
--if start = '1' and falling_edge(clk) then
if start = '1' and clk'Event and clk='1' then
count <= count + 1;
count2 <= count2 + 1;
if count = "10" then
twi <= '0';
count <= "00";
end if;
if count2 = "1100" then
twi <= '1';
count <= "00";
count2 <= "0111"; --Set up counter to send temperature command
start <= '0';
send <= '1';
end if;
end if;
--if send = '1' and falling_edge(clk_comms) then
if send = '1' and clk_comms'Event and clk_comms = '1' then
if count2 = "1111" then
send <= '0';
twi <= '1';
ackq <= '1';
ack <= twi;
else
twi <= temp(conv_integer(count2));
count2 <= count2 - 1;
end if;
end if;
--if ackq = '1' and ack = '0' and rising_edge(clk_comms) then
if ackq = '1' and ack = '0' and clk_comms'Event and clk_comms = '1' then
measure <= '1';
ackq <= '0';
--elsif ackq = '1' and ack = '1' and rising_edge(clk_comms) then
elsif ackq = '1' and ack = '1' and clk_comms'Event and clk_comms = '1' then
measure <= '0';
ackq <= '0';
end if;
--if receive = '1' and rising_edge(clk_comms) then
if receive = '1' and clk_comms'Event and clk_comms = '1' then
if count2 = "0111" and count = "01" then
count <= count - 1;
else
data_temp(conv_integer(count2)) <= twi;
count2 <= count2 - 1;
if count2 = "0111" then
ackt <= '1';
receive <= '0';
elsif count2 = "1111" then
receive <= '0';
end if;
end if;
end if;
--if ackt = '1' and falling_edge(clk_comms) then
if ackt = '1' and clk_comms'Event and clk_comms = '1' then
twi <= '0';
ackt <= '0';
receive <= '1';
count <= "01";
end if;
data(19 downto 12) <= data_temp(7 downto 0);
--data(11 downto 0) <= data_humidity(11 downto 0);
end process;
end Behavioral;