Friday 20 January 2017

Moving Average Filter Vhdl Code

Ich habe eine Frage im Zusammenhang mit kontinuierlichen Mittelung von ADCs Wert. Der Ansatz, den ich verwendete, ist die kontinuierliche Mittelung von Beispiel 256 Proben. Der Adcaout-Wert (angezeigt im Code unten), den ich auf meiner GUI empfange, schritt langsam. Als Beispiel, wenn ich erwarte Wert 100mA, Meine GUI zeigt 4mA, 8mA, 15mA. Und dann endlich nach 2 Minuten bekomme ich einen stabilen 100mA Wert. Ich möchte sehen, die 100mA direkt auf meiner GUI von adcaout statt Inkrement Werte und Stabilisierung nach einiger Zeit. Eine andere Frage ist, dass, kann ich irgendwie machen diesen Prozess schnell, so dass ich nicht für 3 Minuten für den Empfang stabil 100 mA von adcaout warten müssen. Die Clock im digitalen Design unten ist 20 MHz. Die Uhr zum Empfangen der ADC-Werte auf der FPGA-Platine beträgt 15 KHz. - die adc. vhd-Datei ist unten: Ihr Code wird wie folgt geändert: Die endgültige Ausgabe, die ich auf meiner GUI sehe, ist slvvalue1 und slvvalue2 Wie über dieses: am Rücksetzen (oder zu jeder anderen Zeit, wenn Sie wollen), weisen Sie die Datain-Wert für alle Elemente in Ihrem Array. Dies sollte sofort den Durchschnitt auf den aktuellen Wert einstellen: Das folgende Beispiel zeigt den kompletten Code für einen gleitenden Durchschnittsrechner. Mein Vorschlag ist, dass Sie es studieren, bis Sie es verstehen. Dann versuchen Sie es in Ihrem Design verwenden. Schließlich, und nur, nachdem Sie eine grundlegende Schaltung arbeiten, können Sie es ändern, um Ihre Design-Einschränkungen (Datenbreite, Anzahl der Proben, Bereich der Ganzzahlen, die Verwendung von signierten vs Integer etc.) Endlich, wenn Sie verwenden möchten Den obigen Code, um zwei separate Mittelwerte für zwei verschiedene Signale zu halten, einfach Instanziieren der Mittelung Einheit zweimal: Edit: Wie ich aus Ihren Kommentaren zu verstehen, müssen Sie möglicherweise eine zusätzliche Eingabe, um den Durchschnitt sofort auf den aktuellen Eingangswert. In diesem Fall können Sie eine Lasteingabe wie unten gezeigt verwenden: antwortete Nov 26 13 um 15: 45Mittel / Einfacher gleitender Durchschnitt Durchschnittswerte / Einfacher gleitender Durchschnitt Sie werden aufgefordert, diese Aufgabe entsprechend der Aufgabenbeschreibung zu lösen, und zwar in jeder beliebigen Sprache . Berechnen der einfachen gleitenden Durchschnitt einer Reihe von Zahlen. Erstellen Sie eine Stateful-Funktion / Klasse / Instanz, die einen Punkt dauert und gibt eine Routine zurück, die eine Zahl als Argument annimmt und einen einfachen gleitenden Durchschnitt ihrer Argumente zurückgibt. Ein einfacher gleitender Durchschnitt ist ein Verfahren zum Berechnen eines Durchschnitts eines Stroms von Zahlen durch nur Mittelung der letzten 160 P 160-Nummern aus dem Strom 160, wobei 160 P 160 als Periode bekannt ist. Sie kann implementiert werden, indem eine Initialisierungsroutine mit 160 P 160 als Argument 160 I (P) 160 aufgerufen wird, die dann eine Routine zurückgeben sollte, die, wenn sie mit einzelnen aufeinanderfolgenden Elementen eines Stroms von Zahlen aufgerufen wird, den Mittelwert von (up To), die letzten 160 P 160 von ihnen, rufen Sie diese 160 SMA (). Das Wort 160 stateful 160 in der Aufgabenbeschreibung bezieht sich auf die Notwendigkeit für 160 SMA () 160, sich an bestimmte Informationen zwischen Anrufen zu erinnern: 160 Der Zeitraum 160 P 160 Ein geordneter Container von mindestens den letzten 160 P 160 Nummern von jedem von Seine individuellen Anrufe. Stateful 160 bedeutet auch, dass sukzessive Aufrufe von 160 I (), 160 der Initialisierer, 160 separate Routinen zurückgeben sollten, die 160 nicht den gespeicherten Zustand teilen, so dass sie auf zwei unabhängigen Datenströmen verwendet werden können. Pseudocode für eine Implementierung von 160 SMA 160 ist: Diese Version verwendet eine persistente Warteschlange, um die letzten p-Werte zu halten. Jede Funktion, die von init-moving-average zurückgegeben wird, hat ihren Zustand in einem Atom mit einem Queue-Wert. Diese Implementierung verwendet eine zirkuläre Liste, um die Zahlen in dem Fenster am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert hält, der sich gerade aus dem Fenster bewegt und durch den gerade addierten Wert ersetzt wird. Verwenden eines Closure-Edit derzeit Diese sma kann nicht nogc, weil es eine Schließung auf dem Heap zugeordnet. Einige Escape-Analyse konnte die Heap-Zuweisung entfernen. Verwenden einer Strukturbearbeitung Diese Version vermeidet die Heapzuweisung des Verschlusses, der die Daten im Stapelrahmen der Hauptfunktion hält. Gleiche Ausgabe: Um zu verhindern, dass die Gleitkomma-Näherungen aufeinandertreiben und wachsen, könnte der Code eine periodische Summe auf dem gesamten kreisförmigen Warteschlangen-Array ausführen. Diese Implementierung erzeugt zwei (Funktions-) Objekte, die den Zustand teilen. Es ist idiomatisch in E, die Eingabe von der Ausgabe (Lesen von Schreiben) zu trennen, anstatt sie zu einem Objekt zu kombinieren. Die Struktur ist die gleiche wie die Implementierung von Standard DeviationE. Das Elixierprogramm unten erzeugt eine anonyme Funktion mit einer eingebetteten Periode p, die als Periode des einfachen gleitenden Durchschnitts verwendet wird. Die run-Funktion liest die numerische Eingabe und übergibt sie an die neu erstellte anonyme Funktion und prüft dann das Ergebnis auf STDOUT. Die Ausgabe ist unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Grundlage für jeden gleitenden Durchschnitt bildet. Erlang hat Verschlüsse, aber unveränderliche Variablen. Eine Lösung besteht dann darin, Prozesse und eine einfache Message passing based API zu verwenden. Matrixsprachen haben Routinen, um die Gleitabschnitte für eine gegebene Reihenfolge von Elementen zu berechnen. Es ist weniger effizient Schleife wie in den folgenden Befehlen. Fordert kontinuierlich einen Eingang I auf. Die dem Ende einer Liste L1 hinzugefügt wird. L1 kann durch Drücken von 2ND / 1 gefunden werden, und Mittelwert kann in Liste / OPS gefunden werden. Drücken Sie ON, um das Programm zu beenden. Funktion, die eine Liste mit den gemittelten Daten des bereitgestellten Arguments zurückgibt Programm, das bei jedem Aufruf einen einfachen Wert zurückgibt: list ist die gemittelte Liste: p ist die Periode: 5 gibt die gemittelte Liste zurück: Beispiel 2: Verwenden des Programms movinav2 (i , 5) - Initialisieren der gleitenden Durchschnittsberechnung und Definieren des Zeitraums von 5 movinav2 (3, x): x - neue Daten in der Liste (Wert 3), und das Ergebnis wird auf der Variablen x gespeichert und movinav2 (4, : X - neue Daten (Wert 4), und das neue Ergebnis wird auf Variable x gespeichert und angezeigt (43) / 2. Beschreibung der Funktion movinavg: Variable r - ist das Ergebnis (die gemittelte Liste), die zurückgegeben wird Variable i - ist die Index-Variable, und es zeigt auf das Ende der Unterliste die Liste gemittelt wird. Variable z - eine Helpervariable Die Funktion nutzt die Variable i, um zu bestimmen, welche Werte der Liste bei der nächsten Durchschnittsberechnung berücksichtigt werden. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird. Also müssen wir nur herausfinden, welcher der erste Wert in der Liste sein wird. Normalerweise müssen p Elemente berücksichtigt werden, also wird das erste Element dasjenige sein, das durch (i-p1) indexiert wird. Jedoch wird bei den ersten Iterationen die Berechnung gewöhnlich negativ sein, so daß die folgende Gleichung negative Indexe vermeiden wird: max (i-p1,1) oder die Anordnung der Gleichung max (i-p, 0) 1. Die Anzahl der Elemente auf den ersten Iterationen wird ebenfalls kleiner sein, der korrekte Wert ist (Endindex - Anfangsindex 1) oder die Anordnung der Gleichung (i - (max (ip, 0) 1) 1) , (I-max (ip, 0)). Die Variable z enthält den gemeinsamen Wert (max (ip), 0), so dass der Anfangsindex (z1) ist und die Anzahl der Elemente (iz) mid (Liste, z1, iz) .) Wird summe sie sum (.) / (Iz) ri wird sie durchschnittlich und speichern Sie das Ergebnis an der entsprechenden Stelle in der Ergebnisliste Verwenden eines Schließens und Erstellen einer Funktion Für mein Projekt muss ich ein Rauschen von einem ADC-Ausgang zu reduzieren und zu implementieren Ein einfacher gleitender Durchschnittsfilter in VHDL. Obwohl es funktioniert in der Simulation (siehe das Bild): es hat einige seltsame Verhalten, wenn ich es auf dem Chipscope, wenn das System läuft im FPGA (siehe das Bild): Der VHDL - Code, den ich für den gleitenden Durchschnitt ist wie folgt: I Verwenden Sie Xilinx Vivado Tool 2015.2 auf Ubuntu 14.04 x64 ausgeführt. Könnten Sie mir bitte helfen, das Problem zu identifizieren, so dass Ergebnisse in der Simulation entsprechen Ergebnisse nach der Synthese


No comments:

Post a Comment