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


von Gast123 (Gast)


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ß

von Niklas G. (erlkoenig) Benutzerseite


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.

von Johann (Gast)


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.

von Gast123 (Gast)


Lesenswert?

Hi,


ok soweit hab ich es verstanden. Also so ca.
1
Signal Register_Eingang : std_logic_vector (7 downto 0);
2
Signal Aktueller_Wert  : std_logic_vector (7 downto 0):="00000000";
3
4
5
process (CLK)
6
7
if rising_edge (CLK) then
8
   Register_Eingang <= AD_Ausgang;
9
    Aktueller_Wert <= Register_Eingang;
10
    if Aktueller_Wert > Register_Eingang then 
11
        Maximum_Wert <= Maximum_Wert;
12
    else  
13
        Maximum_Wert <=Aktueller_Wert;
14
    end if;
15
end if:
16
17
18
end process;


So?

von Besucher456 (Gast)


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

von iulius (Gast)


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 :
1
if Aktueller_Wert > Maximum_Wert then 
2
   Maximum_Wert <=Aktueller_Wert;
3
end if;


ansonsten sehe ich nicht wie das funktionieren soll.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Gast123 (Gast)


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ß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Gast123 (Gast)


Lesenswert?

Hallo,

danke für die Tipps aber ich hab da noch paar Verständnissfragen. Ich 
verwende folgenden AD Wandler
1
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ß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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"?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.