S
stelik
Guest
Har någon kod eller vet något om gränsssnittsanslutning en Sensirion SHT71 (eller SHT75) sensor i VHDL?Framför allt, jag använder en Xilinx Coolrunner-II CPLD.Jag har hittat olika prov koder online (som från Sensirion webbplats) samt montering koder och sådant, men ingenting i VHDL.Jag har försökt i flera dagar, men jag har inte ens kunnat syntetisera mitt nummer!
Om någon har någon info, det vore toppen.Tack på förhand!
Här är min kod:
Kod:library IEEE;
använda IEEE.STD_LOGIC_1164.ALL;
använda IEEE.STD_LOGIC_ARITH.ALL;
använda IEEE.STD_LOGIC_UNSIGNED.ALL;enhet getdata är
Port (clk: i STD_LOGIC - 500 KHz klocka
Twi: inout STD_LOGIC - P139
i2c: inout STD_LOGIC;
data: ut std_logic_vector (19 downto 0);
clk_twi: ut STD_LOGIC - P140
clk_i2c: ut STD_LOGIC);
slutet getdata;architecture Behavioral av getdata är
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 klocka
signal clk_comms: std_logic: ='1 '; - 100 KHz klocka
signal temp: std_logic_vector (7 downto 0): = "00000011" - kod för mäta temperaturen
signal luftfuktighet: std_logic_vector (7 downto 0): = "00000101" - kod för fukt mätning
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 ';
signalen start: std_logic: ='0 ';
signal åtgärd: std_logic: ='0 ';
signal count: std_logic_vector (1 downto 0): = "00";
signal count2: std_logic_vector (3 downto 0): = "0000";
signal skickar: std_logic: ='0 ';
signal ackq: std_logic: ='0 ';
signal emot: std_logic: ='0 ';
signal ackt: std_logic: ='0 ';
startaslowclock: process (clk)
starta
- Om rising_edge (clk) then
om clk'Event och clk ='1 'då
counter_timing <= counter_timing 1;
counter_comms <= counter_comms 1;
om counter_timing = "1111010000100011111" sedan
timingclk <= inte timingclk;
counter_timing <= "0000000000000000000";
end if;
om counter_comms = "100" och sedan
clk_comms <= inte clk_comms;
counter_comms <= "000";
end if;
end if;
slutet process;
hämta: process (clk, clk_comms, timingclk)
starta
- Om sensorn tar en mätning, produktion på 100 KHz klocka till clk_twi och clk_i2c
om åtgärden ='0 'då
clk_twi <= clk_comms;
- clk_i2c <= clk_comms;
annan
ack <= Twi;
om ack ='0 'då
åtgärd <='0 ';
få <='1 ';
end if;
end if;- Om rising_edge (timingclk) sedan
om timingclk'Event och timingclk = "1" och sedan
start <='1 ';
Twi <='1 ';
- i2c <='1 ';
end if;- Skicka start sekvens
- Om start = "1" och falling_edge (clk) then
om start = "1" och clk'Event och clk ='1 'då
count <= count 1;
count2 <= count2 1;
om count = "10" och sedan
Twi <='0 ';
count <= "00";
end if;
om count2 = "1100" och sedan
Twi <='1 ';
count <= "00";
count2 <= "0111"; - Inrätta motverka att skicka temperatur kommandot
start <='0 ';
skicka <='1 ';
end if;
end if;- Om skicka = "1" och falling_edge (clk_comms) sedan
Om skicka = "1" och clk_comms'Event och clk_comms = "1" och sedan
om count2 = "1111" och sedan
skicka <='0 ';
Twi <='1 ';
ackq <='1 ';
ack <= Twi;
annan
Twi <= temp (conv_integer (count2));
count2 <= count2 - 1;
end if;
end if;- Om ackq = "1" och ack ='0 'och rising_edge (clk_comms) sedan
om ackq = "1" och ack ='0 'och clk_comms'Event och clk_comms = "1" och sedan
åtgärd <='1 ';
ackq <='0 ';
- elsif ackq = "1" och ack = "1" och rising_edge (clk_comms) sedan
elsif ackq = "1" och ack = "1" och clk_comms'Event och clk_comms = "1" och sedan
åtgärd <='0 ';
ackq <='0 ';
end if;- om få = "1" och rising_edge (clk_comms) sedan
om få = "1" och clk_comms'Event och clk_comms = "1" och sedan
om count2 = "0111" och räkna = "01" och sedan
count <= count - 1;
annan
data_temp (conv_integer (count2)) <= Twi;
count2 <= count2 - 1;
om count2 = "0111" och sedan
ackt <='1 ';
få <='0 ';
elsif count2 = "1111" och sedan
få <='0 ';
end if;
end if;
end if;- Om ackt = "1" och falling_edge (clk_comms) sedan
om ackt = "1" och clk_comms'Event och clk_comms = "1" och sedan
Twi <='0 ';
ackt <='0 ';
få <='1 ';
count <= "01";
end if;data (19 downto 12) <= data_temp (7 downto 0);
- uppgifter (11 downto 0) <= data_humidity (11 downto 0);
slutet process;
slutet Behavioral;
Om någon har någon info, det vore toppen.Tack på förhand!
Här är min kod:
Kod:library IEEE;
använda IEEE.STD_LOGIC_1164.ALL;
använda IEEE.STD_LOGIC_ARITH.ALL;
använda IEEE.STD_LOGIC_UNSIGNED.ALL;enhet getdata är
Port (clk: i STD_LOGIC - 500 KHz klocka
Twi: inout STD_LOGIC - P139
i2c: inout STD_LOGIC;
data: ut std_logic_vector (19 downto 0);
clk_twi: ut STD_LOGIC - P140
clk_i2c: ut STD_LOGIC);
slutet getdata;architecture Behavioral av getdata är
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 klocka
signal clk_comms: std_logic: ='1 '; - 100 KHz klocka
signal temp: std_logic_vector (7 downto 0): = "00000011" - kod för mäta temperaturen
signal luftfuktighet: std_logic_vector (7 downto 0): = "00000101" - kod för fukt mätning
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 ';
signalen start: std_logic: ='0 ';
signal åtgärd: std_logic: ='0 ';
signal count: std_logic_vector (1 downto 0): = "00";
signal count2: std_logic_vector (3 downto 0): = "0000";
signal skickar: std_logic: ='0 ';
signal ackq: std_logic: ='0 ';
signal emot: std_logic: ='0 ';
signal ackt: std_logic: ='0 ';
startaslowclock: process (clk)
starta
- Om rising_edge (clk) then
om clk'Event och clk ='1 'då
counter_timing <= counter_timing 1;
counter_comms <= counter_comms 1;
om counter_timing = "1111010000100011111" sedan
timingclk <= inte timingclk;
counter_timing <= "0000000000000000000";
end if;
om counter_comms = "100" och sedan
clk_comms <= inte clk_comms;
counter_comms <= "000";
end if;
end if;
slutet process;
hämta: process (clk, clk_comms, timingclk)
starta
- Om sensorn tar en mätning, produktion på 100 KHz klocka till clk_twi och clk_i2c
om åtgärden ='0 'då
clk_twi <= clk_comms;
- clk_i2c <= clk_comms;
annan
ack <= Twi;
om ack ='0 'då
åtgärd <='0 ';
få <='1 ';
end if;
end if;- Om rising_edge (timingclk) sedan
om timingclk'Event och timingclk = "1" och sedan
start <='1 ';
Twi <='1 ';
- i2c <='1 ';
end if;- Skicka start sekvens
- Om start = "1" och falling_edge (clk) then
om start = "1" och clk'Event och clk ='1 'då
count <= count 1;
count2 <= count2 1;
om count = "10" och sedan
Twi <='0 ';
count <= "00";
end if;
om count2 = "1100" och sedan
Twi <='1 ';
count <= "00";
count2 <= "0111"; - Inrätta motverka att skicka temperatur kommandot
start <='0 ';
skicka <='1 ';
end if;
end if;- Om skicka = "1" och falling_edge (clk_comms) sedan
Om skicka = "1" och clk_comms'Event och clk_comms = "1" och sedan
om count2 = "1111" och sedan
skicka <='0 ';
Twi <='1 ';
ackq <='1 ';
ack <= Twi;
annan
Twi <= temp (conv_integer (count2));
count2 <= count2 - 1;
end if;
end if;- Om ackq = "1" och ack ='0 'och rising_edge (clk_comms) sedan
om ackq = "1" och ack ='0 'och clk_comms'Event och clk_comms = "1" och sedan
åtgärd <='1 ';
ackq <='0 ';
- elsif ackq = "1" och ack = "1" och rising_edge (clk_comms) sedan
elsif ackq = "1" och ack = "1" och clk_comms'Event och clk_comms = "1" och sedan
åtgärd <='0 ';
ackq <='0 ';
end if;- om få = "1" och rising_edge (clk_comms) sedan
om få = "1" och clk_comms'Event och clk_comms = "1" och sedan
om count2 = "0111" och räkna = "01" och sedan
count <= count - 1;
annan
data_temp (conv_integer (count2)) <= Twi;
count2 <= count2 - 1;
om count2 = "0111" och sedan
ackt <='1 ';
få <='0 ';
elsif count2 = "1111" och sedan
få <='0 ';
end if;
end if;
end if;- Om ackt = "1" och falling_edge (clk_comms) sedan
om ackt = "1" och clk_comms'Event och clk_comms = "1" och sedan
Twi <='0 ';
ackt <='0 ';
få <='1 ';
count <= "01";
end if;data (19 downto 12) <= data_temp (7 downto 0);
- uppgifter (11 downto 0) <= data_humidity (11 downto 0);
slutet process;
slutet Behavioral;