S
stelik
Guest
Heeft iemand een code of weet iets over interfacing een Sensirion SHT71 (of SHT75) sensor in VHDL?In het bijzonder ben ik met behulp van een Xilinx Coolrunner-II CPLD.Ik heb verschillende steekproef codes online (zoals uit de Sensirion
de website),
alsook montage-codes en dergelijke, maar niets in VHDL.Ik heb geprobeerd voor de dagen, maar ik heb niet eens kunnen synthetiseren mijn code!
Als iemand heeft alle info, dat zou geweldig zijn.Thanks in advance!
Hieronder is mijn code:
Code:library IEEE;
gebruik IEEE.STD_LOGIC_1164.ALL;
gebruik IEEE.STD_LOGIC_ARITH.ALL;
gebruik IEEE.STD_LOGIC_UNSIGNED.ALL;entiteit getdata is
Port (clk: in STD_LOGIC; - 500 KHz klok
TWI: inout STD_LOGIC; - P139
i2c: inout STD_LOGIC;
gegevens: uit std_logic_vector (19 downto 0);
clk_twi: Out STD_LOGIC; - P140
clk_i2c: Out STD_LOGIC);
einde getdata;Behavioral architectuur van getdata is
signaal counter_timing: std_logic_vector (18 downto 0): = "0000000000000000000";
signaal counter_comms: std_logic_vector (2 downto 0): = "000";
signaal timingclk: std_logic: ='1 '; - 1 Hz klok
signaal clk_comms: std_logic: ='1 '; - 100 KHz klok
signaal temp: std_logic_vector (7 downto 0): = "00000011"; - code voor maatregel temperatuur
signaal vochtigheid: std_logic_vector (7 downto 0): = "00000101"; - code voor de vochtigheid meting
signaal data_temp: std_logic_vector (15 downto 0): = "0000000000000000";
signaal data_humidity: std_logic_vector (15 downto 0): = "0000000000000000";
signaal ack: std_logic: ='0 ';
signaal start: std_logic: ='0 ';
signaal maatregel: std_logic: ='0 ';
signaal tellen: std_logic_vector (1 downto 0): = "00";
signaal count2: std_logic_vector (3 downto 0): = "0000";
signaal sturen: std_logic: ='0 ';
signaal ackq: std_logic: ='0 ';
signaal ontvangen: std_logic: ='0 ';
signaal ackt: std_logic: ='0 ';
beginnenslowclock: proces (clk)
beginnen
- indien rising_edge (clk) then
indien clk'Event en clk ='1 ', dan
counter_timing <= counter_timing 1;
counter_comms <= counter_comms 1;
indien counter_timing = "1111010000100011111" dan
timingclk <= niet timingclk;
counter_timing <= "0000000000000000000";
end if;
indien counter_comms = "100", dan
clk_comms <= niet clk_comms;
counter_comms <= "000";
end if;
end if;
einde proces;
ophalen: proces (clk, clk_comms, timingclk)
beginnen
- Tenzij de sensor is het nemen van een meting, de output van de 100 kHz klok te clk_twi en clk_i2c
als maatregel ='0 ', dan
clk_twi <= clk_comms;
- clk_i2c <= clk_comms;
anders
ack <= TWI;
indien ack ='0 ', dan
maatregel <='0 ';
ontvangen <='1 ';
end if;
end if;- indien rising_edge (timingclk) dan
indien timingclk'Event en timingclk ='1 ', dan
begin <='1 ';
TWI <='1 ';
- i2c <='1 ';
end if;- Stuur het begin sequentie
- als start ='1 'en falling_edge (clk) then
Als start ='1 'en clk'Event en clk ='1', dan
count <= count 1;
count2 <= count2 1;
als count = "10" en vervolgens
TWI <='0 ';
count <= "00";
end if;
indien count2 = "1100", dan
TWI <='1 ';
count <= "00";
count2 <= "0111"; - Opzetten teller te sturen temperatuur commando
begin <='0 ';
verzenden <='1 ';
end if;
end if;- indien sturen ='1 'en falling_edge (clk_comms) dan
indien sturen ='1 'en clk_comms'Event en clk_comms ='1', dan
indien count2 = "1111", dan
verzenden <='0 ';
TWI <='1 ';
ackq <='1 ';
ack <= TWI;
anders
TWI <= temp (conv_integer (count2));
count2 <= count2 - 1;
end if;
end if;- indien ackq ='1 'en ack ='0' en rising_edge (clk_comms) dan
indien ackq ='1 'en ack ='0' en clk_comms'Event en clk_comms ='1 ', dan
maatregel <='1 ';
ackq <='0 ';
- elsif ackq ='1 'en ack ='1' en rising_edge (clk_comms) dan
elsif ackq ='1 'en ack ='1' en clk_comms'Event en clk_comms ='1 ', dan
maatregel <='0 ';
ackq <='0 ';
end if;- indien ontvangen ='1 'en rising_edge (clk_comms) dan
indien ontvangen ='1 'en clk_comms'Event en clk_comms ='1', dan
indien count2 = "0111" en count = "01" en vervolgens
count <= count - 1;
anders
data_temp (conv_integer (count2)) <= TWI;
count2 <= count2 - 1;
indien count2 = "0111", dan
ackt <='1 ';
ontvangen <='0 ';
elsif count2 = "1111", dan
ontvangen <='0 ';
end if;
end if;
end if;- indien ackt ='1 'en falling_edge (clk_comms) dan
indien ackt ='1 'en clk_comms'Event en clk_comms ='1', dan
TWI <='0 ';
ackt <='0 ';
ontvangen <='1 ';
count <= "01";
end if;gegevens (19 downto 12) <= data_temp (7 downto 0);
- de gegevens (11 downto 0) <= data_humidity (11 downto 0);
einde proces;
einde Behavioral;
de website),
alsook montage-codes en dergelijke, maar niets in VHDL.Ik heb geprobeerd voor de dagen, maar ik heb niet eens kunnen synthetiseren mijn code!
Als iemand heeft alle info, dat zou geweldig zijn.Thanks in advance!
Hieronder is mijn code:
Code:library IEEE;
gebruik IEEE.STD_LOGIC_1164.ALL;
gebruik IEEE.STD_LOGIC_ARITH.ALL;
gebruik IEEE.STD_LOGIC_UNSIGNED.ALL;entiteit getdata is
Port (clk: in STD_LOGIC; - 500 KHz klok
TWI: inout STD_LOGIC; - P139
i2c: inout STD_LOGIC;
gegevens: uit std_logic_vector (19 downto 0);
clk_twi: Out STD_LOGIC; - P140
clk_i2c: Out STD_LOGIC);
einde getdata;Behavioral architectuur van getdata is
signaal counter_timing: std_logic_vector (18 downto 0): = "0000000000000000000";
signaal counter_comms: std_logic_vector (2 downto 0): = "000";
signaal timingclk: std_logic: ='1 '; - 1 Hz klok
signaal clk_comms: std_logic: ='1 '; - 100 KHz klok
signaal temp: std_logic_vector (7 downto 0): = "00000011"; - code voor maatregel temperatuur
signaal vochtigheid: std_logic_vector (7 downto 0): = "00000101"; - code voor de vochtigheid meting
signaal data_temp: std_logic_vector (15 downto 0): = "0000000000000000";
signaal data_humidity: std_logic_vector (15 downto 0): = "0000000000000000";
signaal ack: std_logic: ='0 ';
signaal start: std_logic: ='0 ';
signaal maatregel: std_logic: ='0 ';
signaal tellen: std_logic_vector (1 downto 0): = "00";
signaal count2: std_logic_vector (3 downto 0): = "0000";
signaal sturen: std_logic: ='0 ';
signaal ackq: std_logic: ='0 ';
signaal ontvangen: std_logic: ='0 ';
signaal ackt: std_logic: ='0 ';
beginnenslowclock: proces (clk)
beginnen
- indien rising_edge (clk) then
indien clk'Event en clk ='1 ', dan
counter_timing <= counter_timing 1;
counter_comms <= counter_comms 1;
indien counter_timing = "1111010000100011111" dan
timingclk <= niet timingclk;
counter_timing <= "0000000000000000000";
end if;
indien counter_comms = "100", dan
clk_comms <= niet clk_comms;
counter_comms <= "000";
end if;
end if;
einde proces;
ophalen: proces (clk, clk_comms, timingclk)
beginnen
- Tenzij de sensor is het nemen van een meting, de output van de 100 kHz klok te clk_twi en clk_i2c
als maatregel ='0 ', dan
clk_twi <= clk_comms;
- clk_i2c <= clk_comms;
anders
ack <= TWI;
indien ack ='0 ', dan
maatregel <='0 ';
ontvangen <='1 ';
end if;
end if;- indien rising_edge (timingclk) dan
indien timingclk'Event en timingclk ='1 ', dan
begin <='1 ';
TWI <='1 ';
- i2c <='1 ';
end if;- Stuur het begin sequentie
- als start ='1 'en falling_edge (clk) then
Als start ='1 'en clk'Event en clk ='1', dan
count <= count 1;
count2 <= count2 1;
als count = "10" en vervolgens
TWI <='0 ';
count <= "00";
end if;
indien count2 = "1100", dan
TWI <='1 ';
count <= "00";
count2 <= "0111"; - Opzetten teller te sturen temperatuur commando
begin <='0 ';
verzenden <='1 ';
end if;
end if;- indien sturen ='1 'en falling_edge (clk_comms) dan
indien sturen ='1 'en clk_comms'Event en clk_comms ='1', dan
indien count2 = "1111", dan
verzenden <='0 ';
TWI <='1 ';
ackq <='1 ';
ack <= TWI;
anders
TWI <= temp (conv_integer (count2));
count2 <= count2 - 1;
end if;
end if;- indien ackq ='1 'en ack ='0' en rising_edge (clk_comms) dan
indien ackq ='1 'en ack ='0' en clk_comms'Event en clk_comms ='1 ', dan
maatregel <='1 ';
ackq <='0 ';
- elsif ackq ='1 'en ack ='1' en rising_edge (clk_comms) dan
elsif ackq ='1 'en ack ='1' en clk_comms'Event en clk_comms ='1 ', dan
maatregel <='0 ';
ackq <='0 ';
end if;- indien ontvangen ='1 'en rising_edge (clk_comms) dan
indien ontvangen ='1 'en clk_comms'Event en clk_comms ='1', dan
indien count2 = "0111" en count = "01" en vervolgens
count <= count - 1;
anders
data_temp (conv_integer (count2)) <= TWI;
count2 <= count2 - 1;
indien count2 = "0111", dan
ackt <='1 ';
ontvangen <='0 ';
elsif count2 = "1111", dan
ontvangen <='0 ';
end if;
end if;
end if;- indien ackt ='1 'en falling_edge (clk_comms) dan
indien ackt ='1 'en clk_comms'Event en clk_comms ='1', dan
TWI <='0 ';
ackt <='0 ';
ontvangen <='1 ';
count <= "01";
end if;gegevens (19 downto 12) <= data_temp (7 downto 0);
- de gegevens (11 downto 0) <= data_humidity (11 downto 0);
einde proces;
einde Behavioral;