S
stelik
Guest
Ar kas nors kodas ar kas dėl sąveikos su Sensirion SHT71 (arba SHT75) jutiklio į VHDL?Visų pirma, aš naudojant Xilinx Coolrunner II CPLD.Radau įvairių imties kodai internete (pavyzdžiui, iš Sensirion tinklalapyje), taip pat surinkimo kodais ir toks, bet nieko VHDL.Aš bandė dienas, tačiau jų dar nėra pajėgi sintetinti savo kodą!
Jei kas neturi informacijos, kad būtų didelis.Thanks in advance!
Žemiau yra mano kodas:
Kodas:biblioteka IEEE;
naudoti IEEE.STD_LOGIC_1164.ALL;
naudoti IEEE.STD_LOGIC_ARITH.ALL;
naudoti IEEE.STD_LOGIC_UNSIGNED.ALL;subjektas getdata yra
Uostas (CLK: į STD_LOGIC; - 500 kHz laikrodis
TWI: Inout STD_LOGIC; - P139
i2c: Inout STD_LOGIC;
duomenis: iš std_logic_vector (19 downto 0);
clk_twi: iš STD_LOGIC; - P140
clk_i2c: iš STD_LOGIC);
pabaigos getdata;Architektūra Elgesys su getdata yra
signalo counter_timing: std_logic_vector (18 downto 0): = "0000000000000000000";
signalo counter_comms: std_logic_vector (2 downto 0): = "000";
signalo timingclk: std_logic: ='1 '; - 1 Hz, laikrodis
signalo clk_comms: std_logic: ='1 '; - 100 kHz laikrodis
signalo temperatūra: std_logic_vector (7 downto 0): = "00000011"; - kodas priemonė temperatūra
signalo drėgmė: std_logic_vector (7 downto 0): = "00000101"; - kodas drėgmės matavimas
signalo data_temp: std_logic_vector (15 downto 0): = "0000000000000000";
signalo data_humidity: std_logic_vector (15 downto 0): = "0000000000000000";
signalo ack: std_logic: ='0 ';
signalas pradėti: std_logic: ='0 ';
signalo priemonė: std_logic: ='0 ';
signalų skaičius: std_logic_vector (1 downto 0): = "00";
signalo count2: std_logic_vector (3 downto 0): = "0000";
signalą siųsti: std_logic: ='0 ';
signalo ackq: std_logic: ='0 ';
signalas yra: std_logic: ='0 ';
signalo ackt: std_logic: ='0 ';
pradėtislowclock: procesas (CLK)
pradėti
- jei rising_edge (CLK), tada
jei clk'Event ir CLK = "1", tada
counter_timing <= counter_timing 1;
counter_comms <= counter_comms 1;
jei counter_timing = "1111010000100011111", tada
timingclk <= ne timingclk;
counter_timing <= "0000000000000000000";
end if;
jei counter_comms = "100", tada
clk_comms <= ne clk_comms;
counter_comms <= "000";
end if;
end if;
galutinio proceso;
priimti: procesas (CLK, clk_comms, timingclk)
pradėti
- Jeigu jutiklis atsižvelgiant matavimo, išvesties 100 KHz laikrodis su clk_twi ir clk_i2c
jei priemonė ='0 ', tada
clk_twi <= clk_comms;
- clk_i2c <= clk_comms;
kitas
ack <= TWI;
jei ack ='0 ', tada
priemonę <='0 ';
gauti <='1 ';
end if;
end if;- jei rising_edge (timingclk), tada
jei timingclk'Event ir timingclk = "1", tada
Start <='1 ';
TWI <='1 ';
- i2c <='1 ';
end if;- Siųsti pradžioje seka
- jei start ='1 'ir falling_edge (CLK), tada
Jei start ='1 'ir clk'Event ir CLK = "1", tada
count <= count 1;
count2 <= count2 1;
jei count = "10", tada
TWI <='0 ';
count <= "00";
end if;
jei count2 = "1100", tada
TWI <='1 ';
count <= "00";
count2 <= "0111"; - Sukurti kovos siųsti temperatūra komandą
Start <='0 ';
siųsti <='1 ';
end if;
end if;- jei siunčia ='1 'ir falling_edge (clk_comms), tada
jei siųsti = "1" ir clk_comms'Event ir clk_comms = "1", tada
jei count2 = "1111", tada
siųsti <='0 ';
TWI <='1 ';
ackq <='1 ';
ack <= TWI;
kitas
TWI <= temperatūra (conv_integer (count2));
count2 <= count2 - 1;
end if;
end if;- jei ackq ='1 'ir ack ='0' ir rising_edge (clk_comms), tada
jei ackq ='1 'ir ack ='0' ir clk_comms'Event ir clk_comms = "1", tada
priemonę <='1 ';
ackq <='0 ';
- elsif ackq ='1 'ir ack ='1' ir rising_edge (clk_comms), tada
elsif ackq ='1 'ir ack ='1' ir clk_comms'Event ir clk_comms = "1", tada
priemonę <='0 ';
ackq <='0 ';
end if;- jei gaunate ='1 'ir rising_edge (clk_comms), tada
jei gaunate ='1 'ir clk_comms'Event ir clk_comms = "1", tada
jei count2 = "0111" ir count = "01", tada
count <= count - 1;
kitas
data_temp (conv_integer (count2)) <= TWI;
count2 <= count2 - 1;
jei count2 = "0111", tada
ackt <='1 ';
gauti <='0 ';
elsif count2 = "1111", tada
gauti <='0 ';
end if;
end if;
end if;- jei ackt ='1 'ir falling_edge (clk_comms), tada
jei ackt ='1 'ir clk_comms'Event ir clk_comms = "1", tada
TWI <='0 ';
ackt <='0 ';
gauti <='1 ';
count <= "01";
end if;duomenų (19 downto 12) <= data_temp (7 downto 0);
- duomenys (11 downto 0) <= data_humidity (11 downto 0);
galutinio proceso;
pabaigos elgesio;
Jei kas neturi informacijos, kad būtų didelis.Thanks in advance!
Žemiau yra mano kodas:
Kodas:biblioteka IEEE;
naudoti IEEE.STD_LOGIC_1164.ALL;
naudoti IEEE.STD_LOGIC_ARITH.ALL;
naudoti IEEE.STD_LOGIC_UNSIGNED.ALL;subjektas getdata yra
Uostas (CLK: į STD_LOGIC; - 500 kHz laikrodis
TWI: Inout STD_LOGIC; - P139
i2c: Inout STD_LOGIC;
duomenis: iš std_logic_vector (19 downto 0);
clk_twi: iš STD_LOGIC; - P140
clk_i2c: iš STD_LOGIC);
pabaigos getdata;Architektūra Elgesys su getdata yra
signalo counter_timing: std_logic_vector (18 downto 0): = "0000000000000000000";
signalo counter_comms: std_logic_vector (2 downto 0): = "000";
signalo timingclk: std_logic: ='1 '; - 1 Hz, laikrodis
signalo clk_comms: std_logic: ='1 '; - 100 kHz laikrodis
signalo temperatūra: std_logic_vector (7 downto 0): = "00000011"; - kodas priemonė temperatūra
signalo drėgmė: std_logic_vector (7 downto 0): = "00000101"; - kodas drėgmės matavimas
signalo data_temp: std_logic_vector (15 downto 0): = "0000000000000000";
signalo data_humidity: std_logic_vector (15 downto 0): = "0000000000000000";
signalo ack: std_logic: ='0 ';
signalas pradėti: std_logic: ='0 ';
signalo priemonė: std_logic: ='0 ';
signalų skaičius: std_logic_vector (1 downto 0): = "00";
signalo count2: std_logic_vector (3 downto 0): = "0000";
signalą siųsti: std_logic: ='0 ';
signalo ackq: std_logic: ='0 ';
signalas yra: std_logic: ='0 ';
signalo ackt: std_logic: ='0 ';
pradėtislowclock: procesas (CLK)
pradėti
- jei rising_edge (CLK), tada
jei clk'Event ir CLK = "1", tada
counter_timing <= counter_timing 1;
counter_comms <= counter_comms 1;
jei counter_timing = "1111010000100011111", tada
timingclk <= ne timingclk;
counter_timing <= "0000000000000000000";
end if;
jei counter_comms = "100", tada
clk_comms <= ne clk_comms;
counter_comms <= "000";
end if;
end if;
galutinio proceso;
priimti: procesas (CLK, clk_comms, timingclk)
pradėti
- Jeigu jutiklis atsižvelgiant matavimo, išvesties 100 KHz laikrodis su clk_twi ir clk_i2c
jei priemonė ='0 ', tada
clk_twi <= clk_comms;
- clk_i2c <= clk_comms;
kitas
ack <= TWI;
jei ack ='0 ', tada
priemonę <='0 ';
gauti <='1 ';
end if;
end if;- jei rising_edge (timingclk), tada
jei timingclk'Event ir timingclk = "1", tada
Start <='1 ';
TWI <='1 ';
- i2c <='1 ';
end if;- Siųsti pradžioje seka
- jei start ='1 'ir falling_edge (CLK), tada
Jei start ='1 'ir clk'Event ir CLK = "1", tada
count <= count 1;
count2 <= count2 1;
jei count = "10", tada
TWI <='0 ';
count <= "00";
end if;
jei count2 = "1100", tada
TWI <='1 ';
count <= "00";
count2 <= "0111"; - Sukurti kovos siųsti temperatūra komandą
Start <='0 ';
siųsti <='1 ';
end if;
end if;- jei siunčia ='1 'ir falling_edge (clk_comms), tada
jei siųsti = "1" ir clk_comms'Event ir clk_comms = "1", tada
jei count2 = "1111", tada
siųsti <='0 ';
TWI <='1 ';
ackq <='1 ';
ack <= TWI;
kitas
TWI <= temperatūra (conv_integer (count2));
count2 <= count2 - 1;
end if;
end if;- jei ackq ='1 'ir ack ='0' ir rising_edge (clk_comms), tada
jei ackq ='1 'ir ack ='0' ir clk_comms'Event ir clk_comms = "1", tada
priemonę <='1 ';
ackq <='0 ';
- elsif ackq ='1 'ir ack ='1' ir rising_edge (clk_comms), tada
elsif ackq ='1 'ir ack ='1' ir clk_comms'Event ir clk_comms = "1", tada
priemonę <='0 ';
ackq <='0 ';
end if;- jei gaunate ='1 'ir rising_edge (clk_comms), tada
jei gaunate ='1 'ir clk_comms'Event ir clk_comms = "1", tada
jei count2 = "0111" ir count = "01", tada
count <= count - 1;
kitas
data_temp (conv_integer (count2)) <= TWI;
count2 <= count2 - 1;
jei count2 = "0111", tada
ackt <='1 ';
gauti <='0 ';
elsif count2 = "1111", tada
gauti <='0 ';
end if;
end if;
end if;- jei ackt ='1 'ir falling_edge (clk_comms), tada
jei ackt ='1 'ir clk_comms'Event ir clk_comms = "1", tada
TWI <='0 ';
ackt <='0 ';
gauti <='1 ';
count <= "01";
end if;duomenų (19 downto 12) <= data_temp (7 downto 0);
- duomenys (11 downto 0) <= data_humidity (11 downto 0);
galutinio proceso;
pabaigos elgesio;