Maximalwert ermitteln,vhdl

Gast #1568562
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ß
Gast #1568666
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.
Gast #1568696
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?
Gast #1568811
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
Gast #1568877
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.
Moderator (Firma: Titel) Persönliche Seite #1568895
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
Gast #1568939
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ß
Moderator (Firma: Titel) Persönliche Seite #1568951
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...
Gast #1598340
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ß
Moderator (Firma: Titel) Persönliche Seite #1598389
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren