Friday 6 January 2017

Gleitender Durchschnitt Vhdl

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: Antwort # 1 am: November 26, 2010, um 15:45 Uhr versuchen, ein VHDL gleitenden Durchschnitt (gleichmäßig gewichtet) - Modul, das FSMD (ata) verwendet zu schreiben. Von dem, was ich verstehe, die Zustände benötigt würde etwas wie holen, teilen, Ausgabe. Unten ist der Prozess, den ich geschrieben habe, aber ich fühle mich wie meine Logik ist ein bisschen aus. Beachten Sie, dass die Daten Im Mittelung nur ein konstantes Array von 8-Bit-Zahlen ist, so dass ich dachte, es sollte gut sein, ein nicht-kausalen Design verwenden. Die Daten haben 64 Einträge, und im Moment ist das Fenster für den Durchschnitt 4. Wie falsch ist dies aussehen Ein paar Probleme kann ich sofort sehen: Sie dont neu initialisieren Temp irgendwo. Sie haben keine Limit-Checks für count (ist es ein Subtyp oder nur eine natürliche Integer.) Was passiert mit Muster (Counti), wenn Sie die Grenze zu nähern Wie rollen Sie über) Ihre for-Schleife ist 0 bis len - sind Sie sicher, Sie Didnt mean 0 to (len - 1) Da Ihre gesamte Zustand decodieren Prozess getaktet ist, brauchen Sie nicht wirklich nstate überhaupt. Beachten Sie, dass Sie nicht sogar initialisieren cstate (aber youre immer noch decodiert). Entweder machen Sie Ihren Zustand decodieren einen separaten kombinatorischen Prozess oder einfach nur loswerden nstate und zuweisen cstate direkt. Ansonsten hängt es von Ihren Design-Ziele. Wenn Sie nicht über Durchsatz kümmern, aber Notwendigkeit, an einer sehr hohen Taktrate laufen zu lassen, möchten Sie möglicherweise Ihre Ergänzung sequentiell anstelle von parallel, zum Beispiel durchführen. Antwortete am 5. September 14 um 13:32 dank, dass definitiv macht die Dinge besser. Über die count Rollover, I39m nicht sicher, wie es zu tun, weil für jedes Muster (count) bis zu 63, möchte ich seinen Wert und den Durchschnitt des Fensters um es anzuzeigen. So dass, wenn ich Rollover bei coun-len, es shouldn39t gehen von Grenzen, aber es wird nicht zeigen, alle Daten. Wenn ich eine kausale Implementierung würde ich eine gewisse Verzögerung am Anfang haben, ist es eine ähnliche Sache, die ich hier brauchen, aber am Ende ndash user1710566 Sep 5 14 um 23:23 meine Lösung war: elsif (Clk-Ereignis) dann, wenn Zählung 64 Dann zählen lt 0 sonst berechnen end if. Und in der for-Schleife habe ich einen Ausgang, wenn count i größer als 63. ndash user1710566 Sep 6 14 at 0:05


No comments:

Post a Comment