Friday 13 October 2017

Moving Average Verilog


Hausgemachter GPS-Empfänger Abbildung oben ist der Front-End, der erste Mixer und der ZF-Verstärker eines experimentellen GPS-Empfängers. Der am weitesten links liegende SMA ist mit einer kommerziellen Antenne mit integriertem LNA - und SAW-Filter verbunden. Ein synthetischer erster lokaler Oszillator treibt die untere SMA an. Pin-Header auf der rechten Seite sind Stromversorgung und IF-Ausgang. Letztere ist mit einem Xilinx FPGA verbunden, das nicht nur DSP, sondern auch einen Bruch-N Frequenzsynthesizer aufnimmt. Mehr dazu später. Ich war motiviert, diesen Receiver nach dem Lesen der Arbeit 1 von Matjax017E Vidmar, S53MV, die einen GPS-Empfänger von Grund auf, mit vorwiegend diskreten Komponenten entwickelt, vor über 20 Jahren zu entwerfen. Seine Verwendung von DSP nach einer harten Begrenzung IF und 1-Bit-ADC interessiert mich. Der hier beschriebene Empfänger arbeitet nach dem gleichen Prinzip. Sein 1-Bit-ADC ist der 6-polige IC in der Nähe der Pin-Header, ein LVDS-Ausgangskomparator. Unter dem Rauschen versteckt, aber nicht in dem zweistufigen quantisierten Brei, der entsteht, sind Signale von jedem Satelliten in Sicht. Alle GPS-Satelliten senden auf der gleichen Frequenz, 1575,42 MHz, mit Direct Sequence Spreadspektrum (DSSS). Der L1-Träger ist über eine 2 MHz Bandbreite verteilt und seine Stärke an der Erdoberfläche beträgt -130 dBm. Die thermische Rauschleistung in der gleichen Bandbreite beträgt -111 dBm, so dass ein GPS-Signal an der Empfangsantenne 20 dB unter dem Rauschenboden ist. Daß irgendwelche der vorhandenen Signale, die einander überlagert und in Rauschen vergraben sind, wiederhergestellt werden können, nachdem die zweistufige Quantisierung kontraintuitiv erscheint, schrieb ich eine Simulation, um mich selbst zu überzeugen. GPS stützt sich auf die Korrelationseigenschaften von Pseudozufallssequenzen, die Goldcodes genannt werden, um Signale von Rauschen und voneinander zu trennen. Jeder Satellit sendet eine eindeutige Folge. Alle unkorrelierten Signale sind Rauschen, einschließlich derjenigen von anderen Satelliten und harten Begrenzer-Quantisierungsfehlern. Das Mischen mit demselben Code in der richtigen Phase dekodiert das gewünschte Signal und verbreitet weiter alles. Die schmalbandige Filterung entfernt dann Breitbandrauschen, ohne das (nochmals enge) Nutzsignal zu beeinflussen. Hard-Limiting (1-Bit-ADC) degradiert SNR um weniger als 3 dB, ein Preis wert, um Hardware-AGC zu vermeiden. Mai 2013 Update Dies ist jetzt ein tragbarer, batteriebetriebener 12-Kanal-GPS-Empfänger mit schlüsselfertiger Software, der Satelliten erfasst und verfolgt und seine Position ohne Benutzereingriff kontinuierlich neu berechnet. Das komplette System (unten links) umfasst: 16x2 LCD-Display, Raspberry Pi Model A Computer, zwei benutzerdefinierte Leiterplatten, kommerzielle Patch-Antenne und Li-Ion-Akku. Die Gesamtstromaufnahme des Systems beträgt 0,4 A bei einer Batterielebensdauer von 5 Stunden. Das Raspberry Pi wird über das Flachbandkabel mit seinem GPIO-Header mit der Frac7 FPGA-Platine versorgt und benötigt keine anderen Anschlüsse. Derzeit läuft das Pi Raspbian Linux. Eine kleinere Distro verkürzt die Zeit zum ersten Fixieren. Nach dem Booten von der SD-Karte startet die GPS-Anwendungssoftware automatisch. Beim Beenden stellt es ein Mittel bereit, das Pi vor dem Ausschalten ordnungsgemäß abzuschalten. Pi Software-Entwicklung wurde head-less über SSH und FTP über einen USB-Wi-Fi-Dongle. Quellcode und Dokumentation finden Sie am Ende dieser Seite gefunden werden. Beide kundenspezifischen Leiterplatten sind einfache 2-Schicht PTH-Karten mit durchgehenden Grundebenen auf der Unterseite. Im Uhrzeigersinn um die Xilinx Spartan 3 auf der Frac7 FPGA-Platine: von 12 Uhr bis 3 Uhr sind Schleifenfilter, VCO, Power Splitter und Prescaler des Mikrowellenfrequenzsynthesizers unten rechts der Joystick und JTAG-Stecker und um 6 Uhr Stiftleiste für das Raspberry Pi-Flachbandkabel. Ganz links ist der LCD-Anschluss. Direkt links ist ein temperaturkompensierter spannungsgesteuerter Quarzoszillator (TCVCXO), der für den GPS-Empfang eine stabile Referenzfrequenz liefert. Die TCVCXO ist gut, aber nicht ganz bis zu GPS-Standard beim Betrieb un-boxed an windigen Standorten. Durch Blasen wird der 10,000000 MHz-Quarzoszillator um etwa 1 Teil in 10 Millionen oder 1 Hz verschoben, der durch den Synthesizer PLL 150 mal vergrößert wird. Dies ist ausreichend, um die Satelliten-Tracking-Schleifen vorübergehend zu entsperren, wenn sie plötzlich ausgeführt werden. Die Vorrichtung ist auch leicht empfindlich gegenüber Infrarot, z. B. Von Halogen-Glühlampen und TV-Fernbedienungen Als der erste 2011 veröffentlicht wurde, war dies ein Vier-Kanal-Empfänger, was bedeutet, dass es nur vier Satelliten gleichzeitig verfolgen konnte. Mindestens vier sind erforderlich, um für Benutzerposition und Empfänger-Taktvorspannung zu lösen, aber größere Genauigkeit ist mit mehr möglich. In der ursprünglichen Version füllten vier identische Instanzen des Tracker-Moduls das FPGA. Aber die meisten Flops wurden nur einmal pro Millisekunde getaktet. Nun ist eine benutzerdefinierte Soft-Core-CPU im FPGA serialisiert die Verarbeitung und nur 50 der FPGA-Gewebe ist für einen 8-Kanal-Empfänger oder 67 für 12-Kanäle erforderlich. Anzahl der Kanäle ist ein Parameter in der Quelle und könnte höher gehen. Positionsgenauigkeit ist am besten, wenn die Antenne 360deg des Himmels sehen und Signale von allen Richtungen empfangen kann. Im Allgemeinen, je mehr Satelliten in Sicht, desto besser. Zwei oder mehr Satelliten auf demselben Lager können zu einer schlechten Geometrie führen. Die beste Lösung war bis jetzt plusmn1 Meter an einem sehr offenen Standort mit 12 Satelliten, aber Genauigkeit ist in der Regel plusmn5 Meter in ärmeren Standorten mit weniger Satelliten. September 2014 Update Der Quellcode für dieses Projekt wurde unter der GNU General Public License (GPL) wieder veröffentlicht. Architektur Die Verarbeitung wird zwischen FPGA und Pi durch Komplexität und Dringlichkeit aufgeteilt. Das Pi behandelt math-intensive Schwer-Lifting in seinem eigenen Tempo. Das FPGA synthetisiert den ersten lokalen Oszillator, dienstt hochrangige Ereignisse in Echtzeit und verfolgt die Satelliten autonom. Der Pi steuert das FPGA über eine SPI-Schnittstelle. Praktischerweise wird das gleiche SPI verwendet, um den FPGA-Konfigurationsbitstrom und den binären ausführbaren Code für die eingebettete CPU zu laden. Das FPGA kann auch über ein Xilinx Platform USB JTAG-Kabel von einem Windows PC gesteuert werden und erkennt automatisch, welche Schnittstelle verwendet wird. L1-Frequenzen werden durch Mischen mit einem Lokaloszillator von 1552,82 MHz auf der GPS3-Front-End-Platine auf ein 1. IF von 22,6 MHz heruntergezählt. Die anschließende IF - und Basisband-Signalverarbeitung erfolgt digital im FPGA. Zwei Proportional-Integral (PI) - Regler pro Satellit, Gleisträger und Codephase. Die von den Satelliten gesendeten NAV-Daten werden im FPGA-Speicher gesammelt. Dies wird in den Pi geladen, der die Parität prüft und Ephemeride aus dem Bitstrom extrahiert. Wenn alle erforderlichen Orbitalparameter gesammelt werden, wird eine Momentaufnahme von bestimmten internen FPGA-Zählern vorgenommen, von der die Übertragungszeit bis zu einer Genauigkeit von 15 ns berechnet wird. Ein Großteil des 1552,82 MHz-Synthesizers ist im FPGA implementiert. Man könnte erwarten, Jitter Probleme, Co-Hosting ein Phasendetektor mit einer anderen Logik, aber es funktioniert. Synthesizer-Ausgang Spektral-Reinheit ist ausgezeichnet, auch wenn der FPGA-Kern ist wütend weg und nicht alle auf harmonisch verwandte Frequenzen. Dieser Ansatz wurde unternommen, weil eine Platte ähnlich Frac7 bereits aus einem früheren Synthesizer-Projekt bestand. Das Hinzufügen eines Frontends war der kürzeste Weg zu einem Prototypempfänger. Aber diese erste Version war nicht tragbar: es hatte unbequeme Stromversorgung und keine On-Board-Frequenz-Standard. Signalverarbeitung bis hin zum Hard-Limiter: Der Komparator LMH7220 hat eine maximale Eingangs-Offsetspannung von 9,5mV. Verstärktes thermisches Rauschen muss dies deutlich übersteigen, um es umzuschalten. Weak GPS-Signale beeinflussen nur den Komparator in der Nähe von Nulldurchgängen Sie werden durch das Rauschen abgetastet Zum Schätzen des Rauschpegels am Komparatoreingang tabellieren wir Verstärkungen, Einfügungsverluste und Rauschzahlen: In-Band-Rauschen am Mischerausgang ist -1740.828-1.5-3.920- 610 log10 (2,5e6) -73 dBm oder 52microV RMS. Der Mischer wird in 50 Ohm resistiv abgeschlossen und die Stufen danach mit höherer Impedanz arbeiten. Der diskrete ZF-Streifen weist eine Gesamtspannungsverstärkung von 1000 auf, so daß der Komparatoreingangspegel 52 mV RMS beträgt. Der LMH7220 fügt insgesamt 59 dB Verstärkung hinzu, was insgesamt 119 dB für das gesamte IF ergibt. Die Bereitstellung von so viel Gewinn auf einer Frequenz war ein Risiko. Um es zu minimieren, wurde eine ausgewogene Schaltung über eine feste Grundplatte verwendet und abgeschirmtes Twisted-Pair trägt den Ausgang zum FPGA. Die Motivation war Einfachheit, Vermeidung einer zweiten Umwandlung. In der Praxis ist die Schaltung stabil, so dass das Glücksspiel ausgezahlt. Der aktive Entkoppler Q1 liefert 5V für den entfernten LNA. Der MMIC-Verstärker U2 bietet eine Verstärkung von 20 dB (nicht bei IF) und sorgt für einen niedrigen Gesamtrahmen, auch wenn lange Antennenkabel verwendet werden. L1 und L2 sind handgezogene Mikrowellen-Drosseln mit sehr hoher Eigenresonanzfrequenz, die senkrecht zueinander und frei von der Grundebene angeordnet sind. Wind 14 Umdrehungen, luftgekürzt, 1mm Innendurchmesser von 7cm Längen von 32swg emailliertem Kupferdraht. Geprüft mit dem Tracking-Generator auf einer Marconi 2383 SA, waren diese gut bis 4 GHz. Der Mini-Schaltkreis MBA-15L DBM wurde für seinen niedrigen 6 dB Umwandlungsverlust bei 1,5 GHz und einem niedrigen 4 dBm LO-Antriebsbedarf gewählt. R9 beendet den IF-Port. Drei volldifferenzielle ZF-Verstärkerstufen folgen dem Mischer. Niedrig-Q parallele abgestimmte Schaltungen zwischen Kollektoren setzen die -3 dB Bandbreite um 2,5 MHz und verhindern den Aufbau von DC-Offsets. L4, L5 und L6 sind gesiebt Toko 7mm Spulen. Der BFS17 wurde für seine hohe (aber nicht zu hohe) 1 GHz f T gewählt. I e ist 2mA für geringstes Rauschen und vernünftige Beta e. Der 22,6 MHz 1. IF wird durch Unterabtastung bei 10 MHz im FPGA digital auf 2,6 MHz herabgesetzt. 2,6 MHz liegt nahe der Mitte der 5 MHz Nyquist-Bandbreite. Es ist am besten, die genaue Mitte zu vermeiden, aus Gründen, die später erklärt werden. Mehrere andere IF-Frequenzen sind möglich: 27,5 MHz, die die Spektrumsinversion bei der 2. IF erzeugen, wurde ebenfalls erfolgreich versucht. Es gibt einen Kompromiss zwischen Bildproblemen bei niedrigeren und verfügbaren BFS17-Verstärkungen bei höheren Frequenzen. Die Signalerkennung beinhaltet die Auflösung von drei Unbekannten: welche Satelliten sind im Blick, ihre Doppler-Verschiebungen und Code-Phasen. Eine sequentielle Suche dieses dreidimensionalen Raums nach einem sogenannten Kaltstart könnte viele Minuten dauern. Ein Warmstart unter Verwendung von Almanachdaten zur Vorhersage von Positionen und Geschwindigkeiten erfordert noch eine Codesuche. Alle 1023 Codephasen müssen getestet werden, um die maximale Korrelationsspitze zu finden. Die Berechnung von 1023 Korrelationsintegralen im Zeitbereich ist sehr teuer und redundant. Dieser GPS-Empfänger verwendet einen FFT-basierten Algorithmus, der alle Codephasen parallel testet. Von Kalte dauert es 2,5 Sekunden auf einem 1,7 GHz Pentium, um die Signalstärke, die Dopplerverschiebung und die Codephase jedes sichtbaren Satelliten zu messen. Die Himbeer-Pi ist etwas langsamer. Mit Über-Balken-Konjugation ist die Kreuzkorrelationsfunktion y (Tau) des komplexen Signals s (t) und des durch den Versatz Tau verschobenen Codes c (t): Der Korrelationstheorem besagt, daß die Fourier-Transformation eines Korrelationsintegrals gleich ist Das FFT (y) - Konjugat (FFT) FFT (c) Die Korrelation wird im Basisband durchgeführt. Der 1.023 Mbps CA-Code ist 1023 Chips oder 1ms lang. Die Forward-FFT-Länge muss ein Vielfaches davon sein. Eine Abtastung bei 10 MHz für 4 ms führt zu einer FFT-Bin-Größe von 250 Hz. 41 Dopplerverschiebungen müssen getestet werden, indem die Frequenzdomänendaten, jeweils ein Bin, bis zu plusmn20 Bins plusmn5 KHz gedreht werden. Die Rotation kann auf jede Funktion angewendet werden. Der 22,6 MHz 1. IF von dem 1-Bit-ADC wird durch einen 10 MHz-Takt in dem FPGA unterabgetastet und digital in einen zweiten IF von 2,6 MHz umgewandelt. In Software wird die 2. IF mit Quadratur-Lokaloszillatoren auf komplexes Basisband (IQ) herunterkonvertiert. Bei Zweistufensignalen sind die Mischer einfach XOR-Gatter. Obwohl nicht oben gezeigt, werden die Abtastwerte vorübergehend im FPGA-Speicher gepuffert. Der Pi kann sie nicht mit 10 Mbit / s akzeptieren. 1,023 Mbps und 2,6 MHz werden durch numerisch gesteuerte Oszillator - (NCO) Phasenakkumulatoren erzeugt. Diese Frequenzen sind im Vergleich zur Abtastrate ziemlich groß und sind nicht exakte Teilharmonische davon. Folglich haben die NCOs gebrochene Sporen. Die Anzahl der Samples pro Code-Chip dithers zwischen 9 und 10. Glücklicherweise sind DSSS-Empfänger tolerant von schmalbandigen Interferern, extern oder selbst generiert. Das komplexe Basisband wird durch eine Vorwärts-FFT in den Frequenzbereich transformiert, die nur einmal berechnet werden müssen. Eine FFT jedes Satelliten-CA-Codes wird vorberechnet. Die Bearbeitungszeit wird durch die innerste Schleife dominiert, die eine Verschiebung, Konjugation, komplexe Multiplikation und eine Umkehr-FFT pro Satelliten-Doppler-Test durchführt. Die Raspberry Pis Videocore GPU könnte genutzt werden, um die Dinge zu beschleunigen. Bei einer Abtastrate von 10 MHz wird die Codephase auf die nächsten 100 ns aufgelöst. Die typische CCF-Ausgabe ist nachstehend dargestellt: Die Berechnung der Spitzen - bis Mittelwerte über diese Daten liefert eine gute Schätzung des SNR und wird verwendet, um die stärksten Signale zu finden. Am 4. März 2011 wurden in Cambridge, Großbritannien, 20:14 GMT empfangen. Die Antenne befindet sich auf einer nordfensterseitigen Fensterseite: Von den nördlichen Breiten sind mehr GPS-Satelliten im südlichen Himmel zu finden, d. H. Zum Äquator hin. Wenn Sie längere Proben nehmen, erhöht sich das SNR, was schwächere Signale zeigt, aber eine Aufhebung tritt auf, wenn die Erfassung NAV-Datenübergänge überspannt. Die Vorwärts-FFT-Länge ist eine Ganzzahl von Millisekunden, jedoch kann die inverse FFT verkürzt werden, einfach durch das Wegwerfen von Daten in höherfrequente Bins. SNR bleibt erhalten, aber Codephase ist nicht so scharf aufgelöst. Nichtsdestoweniger wird eine gute Schätzung der Spitzenposition durch gewichtete Mittelung der zwei stärksten benachbarten Behälter erhalten, und Off-Air-Tests deuten darauf hin, dass dies sogar bis zu ziemlich kurzen inversen FFT-Längen funktionieren könnte. Nach dem Erfassen eines Signals wird der nächste Schritt zum Sperren, Verfolgen und Demodulieren der 50 bps NAV-Daten verwendet. Dies erfordert zwei voneinander abhängige Phasenregelschleifen (PLLs), um die Code - und Trägerphase zu verfolgen. Diese PLLs müssen in Echtzeit arbeiten und als DSP-Funktionen im FPGA implementiert sein. Pi-Software hat eine Überwachungsfunktion: Entscheiden, welche Satelliten zu verfolgen, den Sperrstatus zu überwachen und die empfangenen NAV-Daten zu verarbeiten. Die Verfolgungsschleifen sind gut bei der Aufrechterhaltung der Verriegelung, da sie sehr enge Bandbreiten aufweisen, jedoch macht diese gleiche Eigenschaft sie schlecht, wenn sie das Schloss ohne Hilfe erwirbt. Sie können nicht sehen, über Schleife Bandbreite, um etwas weiter weg zu erfassen. Initialphasen und Frequenzen müssen auf die gemessene Codephase und die Dopplerverschiebung des Zielsatelliten voreingestellt werden. Dies wird unter Pi-Steuerung orchestriert. Die Schleifen sollten von Anfang an verriegelt sein und so bleiben. Die Codephase wird relativ zur FFT-Probe gemessen. Der Code NCO in dem FPGA wird zu Beginn der Abtastung zurückgesetzt und akkumuliert die Phase bei einer festen 1,023 MHz. Es wird später mit dem empfangenen Code durch kurzzeitiges Anhalten des Phasenakkumulators ausgerichtet. Die Dopplerverschiebung auf dem 1575,42 MHz Träger beträgt plusmn5 KHz oder plusmn3 ppm. Es beeinflusst auch die 1.023 Mbit / s-Code-Rate von plusmn3 Chips pro Sekunde. Die Länge der Pause wird in der Zeit, in der die Probe entnommen wurde, auf Code-Creep eingestellt. Glücklicherweise ist der Code-Doppler proportional zum Träger-Doppler, für den wir eine gute Schätzung haben. Hardware-Software aufgeteilt Im folgenden Diagramm zeigt die Farbcodierung, wie die Implementierung des Tracking-DSP jetzt zwischen Hardware und Software aufgeteilt ist. Früher war dies alles in der Hardware getan, mit identischen parallelen Instanzen für jeden Kanal wiederholt, wodurch ineffiziente Nutzung der FPGA-Ressourcen. Nun wird die langsamere 1-KHz-Verarbeitung per Software durchgeführt, und doppelt so viele Kanäle können in der Hälfte der FPGA-Immobilien untergebracht werden. Die sechs Integrations-und-Dump-Akkumulatoren (Sigma) werden in einem Schieberegister in der Code-Epoche gespeichert. Ein Dienstanforderungsflag signalisiert der CPU, die die Daten bitseriell liest. Mit 8 Kanälen aktiv, 8 der CPU-Zeit verbrachte die Ausführung der oprdBit Anweisung Aber es gibt viel Zeit, und serielle IO verwendet FPGA-Stoff wirtschaftlich. Luxuries wie RSSI und IQ-Logging (z. B. für Streudiagramme) können nun gewährt werden. Die F (z) Schleifenfilter-Übertragungsfunktionen verschlingen 2 der CPU-Bandbreite pro aktivem Kanal. Dabei handelt es sich um Standard-Proportional-Integral - (PI) - Controller: 64-Bit-Präzision wird verwendet, und die Verstärkungskoeffizienten KI und KP, obwohl auf die Leistung von 2 beschränkt, sind dynamisch einstellbar. Jeder Kanal muss auf seine Kurve warten, NCO-Rate-Updates können durch Zehn oder Hunderte von Mikrosekunden nach einer Code-Epoche verzögert werden, aber dies führt zu einer vernachlässigbaren Phasenverschiebung bei Frequenzen, bei denen der Phasenrand bestimmt wird. Dünne Spuren sind 1-Bit, was repräsentativ für plusmn1 ist. Der 2.6 MHz Träger wird zuerst durch Vermischen mit frühen, späten und pünktlichen Codes de verbreitet. I und Q komplexe Basisbandprodukte aus dem zweiten Rang der XOR-Gate-Mischer werden über 10000 Abtastwerte oder 1ms summiert. Diese Tiefpaßfilterung verringert drastisch die Rauschbandbreite und erhöht dadurch das SNR. Downsampling auf 1 KHz erfordert weitergehende Datenwege im Softwarebereich. Die Codephase wird unter Verwendung eines herkömmlichen verzögerten Regelkreises oder eines frühen späten Gatters verfolgt. Die Leistung in den frühen und späten Kanälen wird unter Verwendung von P I 2 Q 2 berechnet, das gegenüber der Phase unempfindlich ist. Frühe und späte Codes sind ein Chip auseinander, d. h. frac12 Chip vor und hinter pünktlich. Dieses Diagramm hilft, den Fehler richtig zu erkennen: Ein Costas Loop wird für die Trägerverfolgung und die NAV-Datenwiederherstellung im pünktlichen Kanal verwendet. Die NAV-Daten m werden aus dem I-Arm-Vorzeichenbit mit 180-Grad-Phasenunsicherheit entnommen. K die empfangene Signalamplitude und theta die Phasendifferenz zwischen dem empfangenen Träger (SAN-Modulation) und dem lokalen NCO ist. K variiert von etwa 400 für die schwächsten wiederherstellbaren Signale bis zu über 2000 für die stärksten. Beachten Sie, dass der Fehlerdetektor, der dem F (z) - Anlagencontroller im Costas-Loop zurückgegeben wird, proportional zur Empfangssignalleistung ksup2 ist. Die Verfolgungssteigung und somit die Schleifenverstärkung variieren auch mit der Signalleistung in der Code-Schleife. Unten ist ein Bode-Diagramm der Open-Loop-Verstärkung für den Costas Loop bei k500: Die Costas-Schleifenbandbreite beträgt etwa 20 Hz, was für die Trägerverfolgung optimal ist. Die Schleifenbandbreite beträgt 1 Hz. Die Rauschleistung bei derartigen Bandbreiten ist gering und die Schleifen können sehr schwache Signale verfolgen. Die oben genannten kI und kP arbeiten für die meisten Signale, aber müssen eine Kerbe für die sehr stärksten fallen. Scilab prognostiziert, und Streudiagramme bestätigen, der Beginn der Instabilität bei kge1500. Paritätsfehler treten nicht auf, es sei denn, dass Proben in die gegenüberliegende Hälfte der IQ-Ebene verlaufen. (I) Instabilität bei kge1500 Die obigen sind 2 aufeinanderfolgende Frames mit jeweils 5 Subframes. Subframes sind 300 Bits lang und nehmen 6 Sekunden zum Senden. Spalte 1 ist die Präambel 10001011. Diese erscheint am Anfang jedes Unterrahmens, kann aber irgendwo in den Daten auftreten. Der 17-Bit-Zähler in Spalte 5 ist wöchentlich (TOW) und wird mittags Sonntag auf Null zurückgesetzt. Der 3-Bit-Zähler in Spalte 7 ist der Unterrahmen ID 1 bis 5. Subframes 4 und 5 werden auf jeweils 25 Seiten subkommutiert und eine vollständige Datennachricht mit 25 Vollbildern dauert 12,5 Minuten zum Senden. Ich verwende nur Daten in Subframes 1, 2 und 3 zur Zeit. Lösung für die Benutzerposition Jeder GPS-Satellit sendet seine Position und die Zeit. Die Subtrahierzeit, die von der empfangenen Zeit gesendet wird, und die Multiplikation mit der Lichtgeschwindigkeit ist, wie ein Empfänger die Entfernung zwischen sich und den Satelliten misst. Dies würde mit drei Satelliten zu drei gleichzeitigen Gleichungen in drei Unbekannten führen (Benutzerposition: x, y, z), wenn die genaue Zeit verfügbar war. In der Praxis sind die Empfängertakte nicht genau genug, die genaue Zeit ist ein vierter unbekannter, daher sind vier Satelliten erforderlich und es sind vier simultane Gleichungen zu lösen: Eine iterative Methode wird verwendet, da die Gleichungen nicht linear sind. Unter Verwendung des Erdzentrums (0, 0, 0) und der ungefähren Zeit als Ausgangspunkt konvergiert der Algorithmus nur in fünf oder sechs Iterationen. Die Lösung wird auch dann gefunden, wenn der Benutzer-Taktfehler groß ist. Die Satelliten tragen Atomuhren, aber diese haben auch Fehler und Korrekturkoeffizienten im Teilrahmen 1 müssen zum Zeitpunkt der Übertragung angewendet werden. Typische Einstellungen können Hunderte von Mikrosekunden sein. Die unkorrigierte Übertragungszeit wird durch Skalierung und Addition mehrerer Zähler gebildet. Zeit der Woche (TOW) in Sekunden seit Mitternacht Sonntag wird gesendet jeden Unterrahmen. Datenränder markieren 20ms Intervalle innerhalb von 300-Bit-Subframes. Der Code wiederholt sich 20 mal pro Datenbit. Code-Länge ist 1023 Chips und Chip-Rate ist 1.023 Mbit / s. Schließlich werden die 6 höchstwertigen Bits der Code-NCO-Phase angehängt, die Fixierungszeit der Übertragung auf plusmn 15ns. Satellitenpositionen zur korrigierten Übertragungszeit werden unter Verwendung von Ephemeriden in den Teilrahmen 2 und 3 berechnet. Die Orbitalposition zu einem Referenzzeitpunkt (Ephemeridezeit) wird zusammen mit Parametern bereitgestellt, die (x, y, z) Position bis zu wenigen berechnen lassen Stunden vor oder nach. Ephemeride werden regelmäßig aktualisiert und Satelliten senden nur ihre eigenen. Langzeitbahnen der gesamten Konstellation können mit den Almanach-Daten in den Teilbildern 4 und 5 weniger genau vorhergesagt werden, dies ist jedoch nicht wesentlich, wenn eine schnelle FFT-basierte Suche verwendet wird. Lösungen werden in Erd-zentrierten, Erdfesten (ECEF) Koordinaten berechnet. Der Benutzerstandort wird in Breitengrad, Längengrad und Höhe mit einer Korrektur für die Exzentrizität der Erde konvertiert, die sich am Äquator ausbucht. Die nachfolgenden Streudiagramme veranschaulichen die Wiederholbarkeit, den Nutzen der Mittelung und die Auswirkung von schlechten Satellitenentscheidungen. Gitterquadrate sind 0,001 deg auf jeder Seite. Blaue Punkte markieren 1000 Fixes. Gelbe Dreiecke markieren die Schwerpunkte: (i) Fensterfront nach Norden (ii) Dachantenne (iii) Fensterfront nach Osten Der dichte Cluster (ii) wurde unter Verwendung von Satelliten in vier verschiedenen Vierteln des Himmels erhalten. Nur die Dachantenne hatte eine freie Sicht in alle Richtungen. Aber gute Korrekturen wurden durch Mittelung erhalten, auch wenn die Hälfte des Himmels verdunkelt war. Rooftop fixes zeigen auch Ausbreitung wie (i) und (iii), wenn die falschen Satelliten gewählt werden. Die obigen Lösungen wurden ohne Kompensation ionosphärischer Ausbreitungsverzögerungen unter Verwendung von Parametern in Seite 18 des Teilrahmens 4 erzeugt, die angewendet werden sollten, da es sich um einen Einzelfrequenzempfänger handelt. Die Ionosphären-Brechung erhöht die Pfadlängen zwischen Benutzern und Satelliten. Im April 2012 habe ich einen Fehler behoben, der zu erheblichen Fehlern in der Benutzerposition führte. Ursprünglich ignorierte ich die Erdumdrehung während der 60 bis 80 ms, während die Signale im Flug waren, weil sie keine Satellitenpositionen von Erde-zentrierten-Erde-fixierten (ECEF) zu Erde-zentrierten-Trägheits-Koordinaten (ECI) transformierten. Ich bin jetzt sehen Positionslösung Genauigkeiten von plusmn 5 Meter nach Mittelung, auch mit eingeschränkter Sichtbarkeit des Satelliten. Ive erstellte einen Anhang, der zeigt, wie die iterative Lösung entwickelt wird, ausgehend von einer geometrischen Bereichsgleichung, die unter Verwendung einer Taylor - Reihenentwicklung linearisiert wird und durch Matrixmethoden, für den speziellen Fall von vier Satelliten oder den allgemeinen Fall von mehr, mit dem gelöst wird Möglichkeit, gewichtete kleinste Quadrate zu verwenden, um den Einfluss bestimmter Satelliten zu kontrollieren. Youll finden Sie diese und Lösung C-Quellcode in den Links am unteren Rand der Seite. Ich danke Dan Doberstein für das Senden von mir einen frühen Entwurf seines GPS-Buches 2, das mir half, den Lösungsalgorithmus zu verstehen. Die offizielle GPS-Spezifikation 3 der US-Regierung ist eine wesentliche Referenz. Signalüberwachung Die oben beschriebene Schaltungsanordnung, die meistens in FPGA implementiert ist, dekomprimiert sich, indem das Produkt aus dem 1-Bit-IF und dem punktuellen Code genommen wird, was eine 50-Bit-Datenmodulation gestattet. Eine kleine Kerbe durch BPSK-Trägerunterdrückung ist nur zu sehen: Diese Spektren zeigen die gleiche De-Transmission bei unterschiedlichen Spannen und Auflösungsbandbreiten (RBW). Die Dopplerverschiebung betrug -1,2 kHz. Das Rauschenboden ist das thermische Rauschen der Antenne, das durch den ZF-Streifen verstärkt und gefiltert wird. -3 dB Bandbreite schaut um 3 MHz, etwas breiter als geplant. Der de ausgebreitete Träger beträgt 5 dB über Rauschen bei 30 KHz RBW und 25 dB bei 300 Hz RBW. Die empfangene Signalstärke an der Antenne kann als -174110 log10 (30e3) 5 -123 dBm geschätzt werden. Es erstaunt mich noch, wie gut die Frequenzbereichsinformation durch harte Begrenzung erhalten bleibt Der LVDS-Sender hat einen konstanten Ausgangsstrom von 1mW in 100 Ohm. Die an der SA sichtbare Spitzenleistung darf 0 dBm nicht überschreiten. Hier sehen wir diese verfügbare Leistungsverteilung über einen Bereich von Frequenzen. Wideband integrierte Leistung spektrale Dichte muss erste lokale Oszillator Ive gebaut experimentelle Fractional-N-Synthesizer mit universellen programmierbaren Logik für mehrere Jahre: Xilinx Spartan 3 FPGA Frac7 wurde für diesen Zweck gebaut, aber ich hatte keine Ahnung Frac5 würde in einem GPS verwendet werden Wenn ich es ursprünglich entworfen habe. Das Foto unten zeigt, wie der ROS-1455 VCO Ausgang auf Frac5 resistiv zwischen dem Ausgang SMA und einem Hittite HMC363 divide-by-8 Precaler aufgeteilt wurde. Der 200 MHz-Teilerausgang wird (differentiell) in das FPGA geleitet, wobei die Phase es mit einer Masterreferenz unter Verwendung von Methoden verriegelt, die in meinen früheren Projekten dokumentiert sind. Microwave Circuity auf Frac7 ist ähnlich, aber verwendet einen Mini-Circuits 3dB Splitter. Hohe Stabilität und geringes Phasenrauschen werden erreicht, wie aus den unten gezeigten VCO-Ausgangsspektren ersichtlich ist. Wenn Frac5 ursprünglich als eigenständiger Frequenzsynthesizer entwickelt wurde, wurde das gleichzeitige Umschalten auf nicht harmonisch zusammenhängende Frequenzen vermieden, um Intermodulationsspuren zu minimieren. Das FPGA war statisch, wenn Taktimpulse, die den Phasendetektorausgang tauschten, das Gewebe überquerten. Keiner derartige Luxus ist praktisch, wenn das FPGA einen GPS-Empfänger hostet, aber glücklicherweise ist der lokale Oszillatorausgang gut genug: Der Marconi 2383 Spektrumanalysierer 50 MHz STD OUTPUT wurde als die Hauptreferenzquelle für Frac5 und alle internen GPS-Empfängertakte verwendet. GPS-Empfänger benötigen Genauigkeiten besser als 1 ppm (parts per million), um plusmn5 KHz-Doppler-Verschiebungen auf dem 1575,42 MHz L1-Träger zu messen. Jede Frequenzunsicherheit würde einen breiteren Suchbereich erfordern. Eingebettete CPU Mein ursprünglicher GPS-Empfänger konnte nur 4 Satelliten aufspüren. Das verfügbare Gewebe wurde nicht effizient genutzt und das FPGA war voll. Eine identische Logik wurde für jeden Kanal repliziert und nur in der 1-KHz-Code-Epoche clock-enabled. GPS-Aktualisierungsraten sind ziemlich unaufwendig, und die meisten der parallelen Verarbeitung können sequentiell einfach durchgeführt werden. Das Einbetten einer CPU für diese Aufgabe hat sowohl die Anzahl der Kanäle erhöht als auch den freien Platz im FPGA freigegeben. Diese CPU führt direkt FORTH-Primitive als native Anweisungen aus. Die Besucher meiner Mark 1 FORTH Computer Seite werden sich bereits mit meinem Interesse an der Sprache auskennen. FORTH ist nicht Mainstream und seine Verwendung hier könnte eine esoterische Barriere, aber ich konnte nicht widerstehen, eine andere FORTH-CPU, diesmal in FPGA, nachdem ich das hervorragende J1-Projekt, das war eine Inspiration. FORTH ist eine Stack-basierte Sprache, die im Grunde bedeutet, dass die CPU Stacks anstelle von Allzweckregistern hat. Wikipedia hat einen guten Überblick. FPGA-Ressourcen: 360 Slices 2 BRAMs Einzelzyklus-Befehlsausführung FORTH-ähnliche Dual-Stack-Architektur 32-Bit-Stack und ALU-Datenpfade 64-Bit-Doppelpräzisionsoperationen Hardware-Multiplikator 2 KByte (erweiterbar auf 4 KByte) Code und Daten-RAM Makro Assembler-Code Entwicklung Speicher und IO Zwei BRAMs werden verwendet: eine für den Hauptspeicher, die andere für Stacks. Der Xilinx-Block-RAM ist dual portiert, so dass eine Instanz sowohl Daten als auch Rückgabestapel hosten kann. Jeder Stapelzeiger reicht über die Hälfte des Arrays. Die doppelte Portierung des Hauptspeichers erlaubt den Datenzugriff gleichzeitig mit dem Befehlsabruf. Ein Speicher-Port wird durch den Programmzähler, der andere durch T, die Spitze des Stapels adressiert. Schreiben an den PC-adressierten Port werden auch für den Code-Download verwendet, wobei der Programmzähler inkrementierende Adressen liefert. Code und Daten teilen sich den Hauptspeicher, der als 1024 (erweiterbar auf 2048) 16-Bit-Wörter organisiert ist. Speicherzugriffe können 16-, 32- oder 64-Bit, wortweise, sein. Alle Anweisungen sind 16-bit. Der gesamte Code plus die Datengröße der GPS-Anwendung beträgt weniger als 750 Worte, obwohl alle Loops abgerollt sind. IO ist nicht speichergemappt und belegt seinen eigenen 36-Bit-Auswahlbereich (12 in 12 von 12 Ereignissen). Eine Heißkodierung wird verwendet, um die Auswahldekodierung zu vereinfachen. IO-Operationen sind unterschiedlich 1-Bit seriell, 16- oder 32-Bit parallel. Serielle Datenverschiebungen 1 Bit pro Taktzyklus. Ereignisse werden hauptsächlich als Hardware-Strobes verwendet und unterscheiden sich von Schreibvorgängen, indem sie nicht den Stapel öffnen. Befehlsformat Im Befehlscode-Raum h80XX-h9FXX werden derzeit 24 Befehle aus möglichen 32 zugewiesen. Dies sind meistens Nulloperandenstapel-ALU-Operationen. Die Option ret, die die Rückkehr von der Subroutine ausführt, wird parallel ausgeführt, in demselben Zyklus. Add-immediate ist die einzige Ein-Operand-Anweisung. Eine Carry-In-Option verlängert (Stack, implizite) Addition Präzision. HF0000 - hFFFF ist spare. Stack - und ALU-Datenpfade sind 32-Bit, jedoch werden 16-, 32- und 64-Bit-Operationen unterstützt. 64-Bit-Werte belegen zwei Stellen auf dem Stapel, wobei die niedrigstwertigen Bits an der Oberseite liegen. Die Oberseite des Stapels, T und die nächste auf dem Stapel, N, werden außerhalb des BRAM für den Wirkungsgrad registriert. Abgesehen von der 64-Bit-Linksverschiebung (opshl64), die für eine Einzelzyklus-Ausführung fest verdrahtet ist, sind alle anderen doppelten Präzisionsfunktionen Software-Subroutinen. Versionssprache Die eingebettete GPS-Binärdatei wurde mithilfe von Microsofts Macro Assembler MASM erstellt. Dies unterstützt nur x86 mnemonics aber Opcodes sind deklariert mit equ und Code wird mit dw-Richtlinien zusammengebaut. MASM bietet nicht nur Etikettenauflösung, Makroexpansion und Expressionsauswertung, sondern auch Datenstrukturen Der MASM dup () - Operator wird weitgehend verwendet, um Schleifen, z. B. Dw N dup (opcall dest) ruft eine Subroutine N mal auf. Dieses Fragment gibt etwas Geschmack des Quellstils. Stack-Effekt wird in jeder Zeile kommentiert: opfetch16 und opstore16 sind Primitive. Opstore32 und opstore64 sind Subroutinen oder zusammengesetzte Anweisungen, die so verwendbar sind, als wären sie Primitive. T ist tatsächlich 15: 0,31: 16 nach opswap16. Aber wir interessieren uns nicht um die oberen 16 Bits hier. Opstore16 verlässt die Adresse Stack Tiefe kann nur plusmn1 pro Zyklus ändern. Puristen können es vorziehen: dw N addi Host serielle Schnittstellen Das FPGA kann über SPI durch das Raspberry Pi oder über einen Windows PC mit einem Xilinx Platform USB JTAG Kabel gesteuert werden. Es gibt zwei Stufen der Anforderungspriorität: Senden eines neuen Befehls und Abfrage für die Antwort auf vorherige Neue Codebilder werden in den Hauptspeicher über einen dritten BRAM kopiert, der die CPU - und seriellen Taktdomänen überbrückt. So heruntergeladen, binäre Bilder automatisch ausführen. Host-Befehle werden in der Brücke BRAM erfasst und die CPU wird signalisiert, sie zu aktivieren. Seine Antworten werden vom Host von der Brücke beim nächsten Scan gesammelt. Die Hauptschleife der obersten Ebene fragt nach Host-Dienstanforderungen ab. Das erste Wort einer beliebigen Host-Nachricht ist ein Befehlscode. Anfragen werden über die Sprungtabelle Commands gesendet: optor bewegt den Vektor in den Rückgabestapel. Einige Hostanforderungen (z. B. CmdGetSamples) lösen langwierige Antworten aus. Daten-Ports auf der CPU-Seite der Brücke sind 16-Bit. Die CPU kann diese über den Datenstapel lesen und schreiben, es existieren jedoch mehr direkte Pfade zum Hochladen des Hauptspeichers und der GPS-IF-Abtastwerte. Die Anweisung opwrEvt GETMEMORY überträgt ein Speicherwort direkt an die Brücke, wobei T als Autoinkrementierungszeiger verwendet wird. GETMEMORY ist das einzige Ereignis, das Stack-Effekt hat. Die Anweisung opwrEvt GETSAMPLES überträgt 16 Bits vom IF-Sampler: Abwickeln von Schleifen zur Montagezeit mit dup () Trades-Code Größe für die Performance, Vermeidung eines Dekrement-Test-Branch Hit und die gesamte Anwendung binäre ist noch winzig, aber lange Schleifen müssen verschachtelt werden , as illustrated above. CHANNEL data structure An array of structures holds state variables and buffered NAV data for the channels. MASM has excellent support for data structures. Field offsets are automatically defined as constants and the sizeof operator is useful. The epoch service routine (labelled Method: ) is called with a pointer to a CHANNEL structure on the stack. Affecting OO-airs, stack-effect comments refer to it as this throughout the routine. A copy is conveniently kept on the return stack for accessing structure members like so: The Chans array is regularly uploaded to the host. Raspberry Pi application software The Raspberry Pi software is multi-tasked using what are variously known as coroutines, continuations, user-mode or light-weight threads. These co-operatively yield control, in round-robin fashion, using the C library setjmplongjmp non-local goto, avoiding the cost of a kernel context-switch: Up to 16 threads can be active:Slideshare uses cookies to improve functionality and performance, and to provide you with relevant advertising. Wenn Sie fortfahren, die Website zu durchsuchen, stimmen Sie der Verwendung von Cookies auf dieser Website zu. Siehe unsere Benutzervereinbarung und Datenschutzbestimmungen. Slideshare verwendet Cookies, um Funktionalität und Leistung zu verbessern und Ihnen relevante Werbung zu bieten. Wenn Sie fortfahren, die Website zu durchsuchen, stimmen Sie der Verwendung von Cookies auf dieser Website zu. Siehe unsere Datenschutzrichtlinie und Benutzervereinbarung für Details. Explore all your favorite topics in the SlideShare app Get the SlideShare app to Save for Later even offline Continue to the mobile site Upload Login Signup Double tap to zoom out Designing of 8 BIT Arithmetic and Logical Unit and implementing on Xilinx Vertex 4 FPGA Share this SlideShare LinkedIn Corporation copy 2017

No comments:

Post a Comment