Opa verteld:VHDL probleem,
Geplaatst: ma mei 04, 2020 5:45 pm
Geen vraag maar een uitdaging met een oplossing.
Voor mijn werk was ik bezig met het aansluiten van een aantal temperatuur sensors op een FPGA die dingen maken gebruik van een I2C Interface (wat ook een van de reden was om een FPGA te gebruiken) en om de temperatuur data eruit te halen moesten een aantal berichtjes uitgewisseld worden.
Daarvoor had ik vervolgens een state machiene (in mijn geval een basic microprocessor) geimplementeerd zodat elk I2C device zijn eigen ding kon doen.
Klinkt allemaal heel indrukwekkend, maar het is net als jongleren, als je dat kan weet je ook dat het niet bijster moeilijk is.
Aldus kwam de data vanuit de temperatuur sensor in de FPGA en had ik besloten dat om praktische reden in software elders het wel fijn zou zijn als
de temperatuur gewoon geconverteerd werd naar graden Celsius * 10 zoals ik in het hele systeem toepas, want ik gebruik enkel positieve integers en de wens was binnen een halve graad 'C nauwkeurig dus dan zorg je daar voor.
Pascal begint te tiepen, te solderen, te synthesizen en te compileren en ja hoor het werkt.
Totdat ik een live test deed.
Ineens bleek dan onder de 6.5'C de temperatuur weer omhoog begon te lopen ondanks dat het koel element vrolijk door ding.
Ook bleek bij verwarming dat bij pakweg 30'C de temperatuur ook 'hay ware ging' en de verwarming door ding tot een absoluut fatale 50'C (moest 37'C zijn)
Typisch gevalletje van Oops.
Dus: NO MORE OOPS (C) Will Smith
Al snel had ik door wat er aan de hand was.
Om te temperatuur te converteren naar 'C was er een berekening nodig met gebroken getallen (floating point)
Omdat ik echter enkel gehele getallen gebruikte die ook nog eens maal 10 moesten zijn bleek dat ik bij de berekening meer dan 20bits nodig had.
Standaard kent VHDL 20bits (signed) berekeningen en aldus werd bij de grensgevallen het resultaat geinverteerd.
Ik heb het opgelost door bij de berekening de 'scalling' aan te passen en ben daardoor gelimiteerd tot temperaturen tussen 1 en 45 'C ruim binnen het gestelde doel.
Heeft niets met Linux te maken maar was een leuke uitdaging.
Voor mijn werk was ik bezig met het aansluiten van een aantal temperatuur sensors op een FPGA die dingen maken gebruik van een I2C Interface (wat ook een van de reden was om een FPGA te gebruiken) en om de temperatuur data eruit te halen moesten een aantal berichtjes uitgewisseld worden.
Daarvoor had ik vervolgens een state machiene (in mijn geval een basic microprocessor) geimplementeerd zodat elk I2C device zijn eigen ding kon doen.
Klinkt allemaal heel indrukwekkend, maar het is net als jongleren, als je dat kan weet je ook dat het niet bijster moeilijk is.
Aldus kwam de data vanuit de temperatuur sensor in de FPGA en had ik besloten dat om praktische reden in software elders het wel fijn zou zijn als
de temperatuur gewoon geconverteerd werd naar graden Celsius * 10 zoals ik in het hele systeem toepas, want ik gebruik enkel positieve integers en de wens was binnen een halve graad 'C nauwkeurig dus dan zorg je daar voor.
Pascal begint te tiepen, te solderen, te synthesizen en te compileren en ja hoor het werkt.
Totdat ik een live test deed.
Ineens bleek dan onder de 6.5'C de temperatuur weer omhoog begon te lopen ondanks dat het koel element vrolijk door ding.
Ook bleek bij verwarming dat bij pakweg 30'C de temperatuur ook 'hay ware ging' en de verwarming door ding tot een absoluut fatale 50'C (moest 37'C zijn)
Typisch gevalletje van Oops.
Dus: NO MORE OOPS (C) Will Smith
Al snel had ik door wat er aan de hand was.
Om te temperatuur te converteren naar 'C was er een berekening nodig met gebroken getallen (floating point)
Omdat ik echter enkel gehele getallen gebruikte die ook nog eens maal 10 moesten zijn bleek dat ik bij de berekening meer dan 20bits nodig had.
Standaard kent VHDL 20bits (signed) berekeningen en aldus werd bij de grensgevallen het resultaat geinverteerd.
Ik heb het opgelost door bij de berekening de 'scalling' aan te passen en ben daardoor gelimiteerd tot temperaturen tussen 1 en 45 'C ruim binnen het gestelde doel.
Heeft niets met Linux te maken maar was een leuke uitdaging.