DS18s20 i VHDL
DS18s20 i VHDL
Håller på med ett projekt där jag använder några tempsensorer (ds18s20) för mätning. Styrning och avläsning ska göras i programmerbar logik (CPLD) och alltså programmeras med VHDL. Vet inte riktigt hur jag ska lägga upp programmet och hoppas att nån här på forumet kan ge lite tips eller dela med sig av erfarenheter...
Ge mig tips!!
Ge mig tips!!
Hur ska funktionen vara då? Man trycker på en knapp, tempen läses av för att sedan visas?
Du kan ju börja med att rita en tillståndsdiagram eller flödesschema så du vet hur det ska fungera från början. Sen är det bara att läsa datablad och koda.
Börja lite smått så kanske du kan ställa lite specifika frågor istället...
Du kan ju börja med att rita en tillståndsdiagram eller flödesschema så du vet hur det ska fungera från början. Sen är det bara att läsa datablad och koda.
Börja lite smått så kanske du kan ställa lite specifika frågor istället...
Jag har aldrig använt Dallas 1-wire någon gång men ögnade igenom databladet för DS20S80 på några minuter. Om du kommer till skott kan jag kanske hjälpa till med VHDL. Vad ska du ha det till och har du någon erfarenhet av VHDL?
Har du redan en CPLD på ett kort med strömförsörjning, klocka, anslutningar osv.
Saker att fundera på till en början:
*Vad har du för klocka och hur är timingen på interfacet.
*Ska du ansluta flera 1-wire produkter till samma buss?
*Vilka av funktionerna i kretsen ska du använda? (bara läsa av temperatur?)
*CPLD eller uProcessor? Det finns nog mycket färdigt för t.ex. en Pic eller Avr (mer än för CPLD).
*Vad ska du göra med temperaturvärdet när du har läst in den till CPLD:n?
Läs databladet, fundera lite och ställ sedan mer specifika frågor.
Har du redan en CPLD på ett kort med strömförsörjning, klocka, anslutningar osv.
Saker att fundera på till en början:
*Vad har du för klocka och hur är timingen på interfacet.
*Ska du ansluta flera 1-wire produkter till samma buss?
*Vilka av funktionerna i kretsen ska du använda? (bara läsa av temperatur?)
*CPLD eller uProcessor? Det finns nog mycket färdigt för t.ex. en Pic eller Avr (mer än för CPLD).
*Vad ska du göra med temperaturvärdet när du har läst in den till CPLD:n?
Läs databladet, fundera lite och ställ sedan mer specifika frågor.
Jag kommer använda en cpld och två sensorer (för enbart mätning). En tråd för varje sensor. Har en fungerande plattform med cpld och alla i/o. Klocka kommer ligga på 100 - 1000 KHz. Har färdiga block för skärmkontroller styrenhet osv för att presentera mätvärdena på. Så det som återstår är den byte/bitvisa kommunikationen med ds18s20. Man skickar ju byte i nästan "seriell" kommunikation. Det är just det att man ska använda olika tider för bitarna i följd som ställer till det, men nu har jag kommit på ett sätt som jag tror kan funka. Att bygga statemachines både på bit och bytenivå för att dela på svårigheterna.
Kruxet är att lyckas få plats med all kod på min begränsade cpld.
Tips på effektiv udda seriell kommunikation är välkommna
Som du (babbage) påpekar finns det många exempel på arbetssätt och även färdig kod för pic-processorer eller pc-interface. Men de blir inte till så myckewt hjälp för mig...
Kruxet är att lyckas få plats med all kod på min begränsade cpld.
Tips på effektiv udda seriell kommunikation är välkommna

Som du (babbage) påpekar finns det många exempel på arbetssätt och även färdig kod för pic-processorer eller pc-interface. Men de blir inte till så myckewt hjälp för mig...
Ok, om du bara ska läsa underlättar det ju en aning. Jag antar att du bara behöver läsa en åt gången, så då muxar du bara in och utgångarna beroende på vilken du ska läsa och har samma tillståndsmaskin för detta. Om du har ont om plats får man försöka att optimera koden, det finns kanske lite tricks, men för det skulle jag nog behöva sätta mig och skriva koden och fundera på det. Men det fixar du säkert själv.
Du måste väl först göra en initiering ("skip rom"-command). Sedan två kommandon ("read scratchpad" och "convert T").
Börja kanske med en eller några små tillståndsmaskiner och en räknare. Det underlättar om du bestämmer dig för en klockfrekvens om du ska få timingen att gå ihop.
Hur många register har du över för att implementera detta?
Du måste väl först göra en initiering ("skip rom"-command). Sedan två kommandon ("read scratchpad" och "convert T").
Börja kanske med en eller några små tillståndsmaskiner och en räknare. Det underlättar om du bestämmer dig för en klockfrekvens om du ska få timingen att gå ihop.
Hur många register har du över för att implementera detta?
Tack för hjälpen babbage.
Jag försvann från tråden häromdan när jag lyckades lösa problemen på egen hand
Men nu har det kört ihop sig igen. Jag har kontakt med tempgivaren och anser mig klar med den kommunikationen. Det var rätt lurigt men gick till slut.
För att kunna hantera tempvärdet och skriva ut det till en lcd vill jag göra om det 8-bitars ordet från tempsensorn (ett binärt värde) till en BCD-kod och lagra tecken-biten. Har gjort en kod med Xilinx Statecad till detta. MEN! den genererade vhdl-koden får inte plats på en CPLD (72 macroceller) som jag måste lyckas med.
Vet du hur man gör om till BCD i vhdl? eller har du nån exempelkod?
Eller någon annan som kan det?
Jag försvann från tråden häromdan när jag lyckades lösa problemen på egen hand

Men nu har det kört ihop sig igen. Jag har kontakt med tempgivaren och anser mig klar med den kommunikationen. Det var rätt lurigt men gick till slut.
För att kunna hantera tempvärdet och skriva ut det till en lcd vill jag göra om det 8-bitars ordet från tempsensorn (ett binärt värde) till en BCD-kod och lagra tecken-biten. Har gjort en kod med Xilinx Statecad till detta. MEN! den genererade vhdl-koden får inte plats på en CPLD (72 macroceller) som jag måste lyckas med.
Vet du hur man gör om till BCD i vhdl? eller har du nån exempelkod?
Eller någon annan som kan det?

Jag kan se om jag kommer på något, men det blir nog inte förrän tidigast imorgon om inte någon annan hinner före. Jag har nyss kommit hem och har lite annat att göra.
Vad menar du med ett binärt värde? Signed, unsigned, två-komplement, excess ... ? Om du inte svarar så utgår jag från det enklaste alternativet att det bara är positiva tal vilket väl "binärt värde" egentligen betyder. (jag frågar eftersom jag antar att sensorn även mäter minusgrader).
Vad menar du med ett binärt värde? Signed, unsigned, två-komplement, excess ... ? Om du inte svarar så utgår jag från det enklaste alternativet att det bara är positiva tal vilket väl "binärt värde" egentligen betyder. (jag frågar eftersom jag antar att sensorn även mäter minusgrader).
Jo det är åtta bitar i binär form som representerar ett decimalt tal. Vid inläsning fås även en nionde bit som representerar tecknet.babbage skrev:Vad menar du med ett binärt värde? Signed, unsigned, två-komplement, excess ... ? Om du inte svarar så utgår jag från det enklaste alternativet att det bara är positiva tal vilket väl "binärt värde" egentligen betyder. (jag frågar eftersom jag antar att sensorn även mäter minusgrader).
Jag började med att tänka att det skulle gå rätt fort att fixa till en omvandling från binär till bcd, men det tog mer än tre timmar
Hoppas att du får någon nytta av den. Eftersom det tog så lång tid har jag inte försökt att optimera den eller verifierat den så att jag kan garantera att den fungerar till 100%. Jag har gjort några godtyckliga tester och det gick bra efter vissa justeringar.

Kod: Markera allt
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity bin_till_bcd is
Port ( binary : in std_logic_vector(7 downto 0); -- data som ska omvandlas
hundratal : out std_logic_vector(3 downto 0); --resultat
tiotal : out std_logic_vector(3 downto 0); -- resultat
ental : out std_logic_vector(3 downto 0)); -- resultat
end bin_till_bcd;
architecture hmm of bin_till_bcd is
signal tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7 : STD_LOGIC_VECTOR(3 downto 0);
begin
hundratal <= "00"&tmp6(3)&tmp7(3);
tiotal <= tmp7(2 downto 0)&tmp5(3);
ental <= tmp5(2 downto 0)&binary(0);
process (binary)
begin -- process ouch, det blir många såna här, inte så snyggt
if ('0'&binary(7 downto 5) >= 5) then
tmp1 <= '0'&binary(7 downto 5)+3;
else
tmp1 <= '0'&binary(7 downto 5);
end if;
End Process;
process (binary,tmp1)
begin -- process, går väl att göra snyggare men det struntar jag i
if (tmp1(2 downto 0)&binary(4) >= 5) then
tmp2 <= tmp1(2 downto 0)&binary(4)+3;
else
tmp2 <= tmp1(2 downto 0)&binary(4);
end if;
End Process;
process (binary,tmp2)
begin -- process
if (tmp2(2 downto 0)&binary(3) >= 5) then
tmp3 <= tmp2(2 downto 0)&binary(3)+3;
else
tmp3 <= tmp2(2 downto 0)&binary(3);
end if;
End Process;
process (binary,tmp3)
begin -- process
if (tmp3(2 downto 0)&binary(2) >= 5) then
tmp4 <= tmp3(2 downto 0)&binary(2)+3;
else
tmp4 <= tmp3(2 downto 0)&binary(2);
end if;
End Process;
process (binary,tmp4)
begin -- process
if (tmp4(2 downto 0)&binary(1) >= 5) then
tmp5 <= tmp4(2 downto 0)&binary(1)+3;
else
tmp5 <= tmp4(2 downto 0)&binary(1);
end if;
End Process;
process (tmp1,tmp2,tmp3)
begin -- process
if ('0'&tmp1(3)&tmp2(3)&tmp3(3) >= 5) then
tmp6 <= '0'&tmp1(3)&tmp2(3)&tmp3(3)+3;
else
tmp6 <= '0'&tmp1(3)&tmp2(3)&tmp3(3);
end if;
End Process;
process (tmp4,tmp6)
begin -- process
if (tmp6(2 downto 0)&tmp4(3) >= 5) then
tmp7 <= tmp6(2 downto 0)&tmp4(3)+3;
else
tmp7 <= tmp6(2 downto 0)&tmp4(3);
end if;
End Process;
End hmm;
Hur stor plats tar den? Spontant känns det som den skulle rymmas på 72 macroceller utan problem, men jag har inte kollat. Hur stor plats tar den? Är det så att även annat ska rymmas på CPLD:n? Kanske klarar inte syntetiseringen att minimera "If - else" och "<=" på ett bra sätt. Man kan kanske göre det manuellt med "and, or" osv.
Du skulle kunna göra den till en skiftningsalgoritm, man använder då register men totalt sett mindre logik. Det kan kanske passa makrocellerna bättre.
Du skulle kunna göra den till en skiftningsalgoritm, man använder då register men totalt sett mindre logik. Det kan kanske passa makrocellerna bättre.
Hallå igen!
Nu funkar min konstruktion
Fick tack vare babbage en del tips och idéer som jag är tacksam för. *tummen upp*
Jag kan kort och gott säga att DS18S20 är en bra givare med en del smidiga funktioner... MEN INTE!! på CPLD där man dessutom har begränsat utrymme. Programmerar man i C eller liknande verkar den däremot smidig.
Fick lite hjälp med BCD'n av en polare, så den har jag fortfarande ingen tok-koll på.
Det som tog för mycket plats med BCD liknande den babbage gav mig var produkttermer. Makroceller var det rätt lungt med. Men min konstruktion krävde att rätt mycket funktioner skulle pressas in. Slutade med att jag använder 2 CPLD'er.
Nu funkar min konstruktion

Fick tack vare babbage en del tips och idéer som jag är tacksam för. *tummen upp*
Jag kan kort och gott säga att DS18S20 är en bra givare med en del smidiga funktioner... MEN INTE!! på CPLD där man dessutom har begränsat utrymme. Programmerar man i C eller liknande verkar den däremot smidig.
Fick lite hjälp med BCD'n av en polare, så den har jag fortfarande ingen tok-koll på.

Det som tog för mycket plats med BCD liknande den babbage gav mig var produkttermer. Makroceller var det rätt lungt med. Men min konstruktion krävde att rätt mycket funktioner skulle pressas in. Slutade med att jag använder 2 CPLD'er.