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ß
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.
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.
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?
>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
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.
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
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ß
> 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...
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.