mikrocontroller.net

Forum: FPGA, VHDL & Co. Maximalwert ermitteln,vhdl


Autor: Gast123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

versuche mich grad an vhdl und überlege grad wie ich am besten von einem 
Eingangssignal den Maximalen Wert ermittele? Angenommen ich taste das 
Signal mit 5MHZ und es würde sich um ein peak handeln der ca. 1 ms breit 
ist?

Ich dachte an so  ein Puffer der z.B 5 Werte sich einspeichert und dann 
den größten ermittelt und den wo anderes ablegt. Dies immer weiter macht 
bis das Signal auf Null ist und dann alle Werte die abgelegt wurden 
vergleicht und dann das maximum ausgibt. Klingt aber irgendwie auch 
wieder etwas kompliziert?

Gibt es da eine Bessere möglichkeit?



Gruß

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach dir ein Register, dessen Inhalt jedes Mal, wenn ein neuer Wert 
reinkommt, mit diesem verglichen wird. Ist der neue Wert größer, wird er 
in das Register gespeichert. Nachdem der letzte Wert eingelesen und 
evtl. gespeichert wurde, steht im Register der größte Wert. Zu Beginn 
der Messung sollte das Register auf 0 gesetzt werden.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau so macht man es:

Du vergleichst den aktuellen AD-Wandlerwert mit dem bisherigem Maximum. 
Das Maximum wird beim Start zu 0 gesetzt. Da jeder Wert vom AD-Wandler 
größer ist, wird dieser auch überschrieben. Wenn der nachfolgende 
AD-Wandlerwert wieder größer ist als das bisherige Maximum wird es 
wieder überschrieben.

Autor: Gast123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,


ok soweit hab ich es verstanden. Also so ca.

Signal Register_Eingang : std_logic_vector (7 downto 0);
Signal Aktueller_Wert  : std_logic_vector (7 downto 0):="00000000";


process (CLK)

if rising_edge (CLK) then
   Register_Eingang <= AD_Ausgang;
    Aktueller_Wert <= Register_Eingang;
    if Aktueller_Wert > Register_Eingang then 
        Maximum_Wert <= Maximum_Wert;
    else  
        Maximum_Wert <=Aktueller_Wert;
    end if;
end if:


end process;




So?

Autor: Besucher456 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>So?

Wohl nicht.

Wie war das mit Signalen in Prozessen?
Sie werden erst am Ende des Prozesses aktualisiert.

>   Aktueller_Wert <= Register_Eingang;
>    if Aktueller_Wert > Register_Eingang then

Signalzuweisung und gleich danach die Abfrage macht dann nicht so viel 
Sinn, bzw. die Abfrage wird dann erst im nächsten Takt wirksam.

Siehe Reichardt/Schwarz oder ein anderes Buch

Autor: iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ob das Sinn macht ist wohl geschmackssache. Je nach erforderlichen 
Taktverhältnissen macht sowas sehr wohl Sinn.

Allerdings bei 5mhz wohl auch wieder nicht.


Und if abfrage solte auch lauten :
if Aktueller_Wert > Maximum_Wert then 
   Maximum_Wert <=Aktueller_Wert;
end if;


ansonsten sehe ich nicht wie das funktionieren soll.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie sollte zudem auch die Übergabe des AD-Wertes noch validiert 
werden. Einen Bus einfach so über 2 Registerstufen einsynchronisieren 
zu wollen, ist utopisch.
Denn was würde denn z.B. passieren, wenn der Wert gerade mal von 
"10000000" nach "01111111" wechselt (sich also verringert), und 
zufälligerweise beim Übergang der Wechsel von 0 nach 1 schneller geht 
(z.B. bessere Treiberleistung bei steigender Flanke)? Dann ist für ein 
paar ps der Wert auf dem Bus "11111111". Wenn jetzt gerade der Takt 
kommt, wird der Wert so eingelesen und postwendend als Maximalwert 
abgespeichert  :-o

Autor: Gast123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm... also danke für die Antworten.



>Irgendwie sollte zudem auch die Übergabe des AD-Wertes noch validiert
>werden. Einen Bus einfach so über 2 Registerstufen einsynchronisieren
>zu wollen, ist utopisch.

Wie sollte die validierung aussehen? Was meinst du damit?


>Signalzuweisung und gleich danach die Abfrage macht dann nicht so viel
>Sinn, bzw. die Abfrage wird dann erst im nächsten Takt wirksam.

>Siehe Reichardt/Schwarz oder ein anderes Buch

Soll ich es dann in zwei Prozessen machen? In einem übergebe ich die 
Werte und im anderem mach ich die Abfrage? Oder wie ?



Gruß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie sollte die validierung aussehen? Was meinst du damit?
Bussignale werden üblicherweise mit einem Write- oder Read-Signal 
begleitet, an dem man erkennen kann, wenn die Daten auf dem Bus stabil 
sind. Sowas müsste da noch rein...

> Soll ich es dann in zwei Prozessen machen?
Nein. M.E. passt das schon. Der eine Takt Latency tut dir nicht weh...

Autor: Gast123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Tipps aber ich hab da noch paar Verständnissfragen. Ich 
verwende folgenden AD Wandler
http://cds.linear.com/docs/Datasheet/2226hfb.pdf

Also ich sehe da kein Write oder Read Signal bei dem Diagramm mit Daten 
( Seite 8) und Takten? Wie kann man das jetzt verstehen?


Meine zweite Frage ist, wie lösche ich den Maximalen Wert? Ich meine 
angenommen da kommen meherere Signal und das erste ist größer als alle 
die darauf kommen, dann würde immer der Maximal Amplitudenwert von der 
ersten  angezeigt werden. Ich will es aber für jedes einzelne 
Impulssignal unabhängig haben.... :(


Gruß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast123 schrieb:
> Also ich sehe da kein Write oder Read Signal bei dem Diagramm mit Daten
> ( Seite 8) und Takten? Wie kann man das jetzt verstehen?
Dass du spätestens 6ns nach der steigenden Taktflanke stabile 
Ausgangsdaten anliegen hast. Du könntest also einfach mit 
rising_edge(clk) die Daten übernehmen.

> Ich will es aber für jedes einzelne Impulssignal unabhängig haben.... :(
Dann wirst du irgendwie das Ende des Impulses erkennen müssen. Und wenn 
du dann einen erkannt hast den Maximalwert wieder zurücksetzen.

>>> Angenommen ...es würde sich um ein peak handeln der ca. 1 ms breit ist?
Hast du dazu evtl. auch ein Bild/eine Skizze?
Wie oft kommt der Puls?
Was ist anders, wenn der Puls kommt?
Wie unterscheidest du "normal" und "Puls"?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.