Hallo,
ich weiß, das es schon mal eine Anfrage wegen der Suche nach einem
Maximum gab, das was da behandelt wird ist auch nicht mein Problem.
Ich möchte auf einem komplexen Signal (signed, real/imag) das Maximum
finden. Es handelt sich um 512 Werte, die nacheinander von der Funktion
abgefragt werden. Da die Werte für jeden Takt geändert werden, sollte
die FUnktion auch jeden Wert abgreifen können.
Dieses Maximum will ich dann speichern, also den jeweiligen Realteil und
Imaginärteil.
Ich habe das auch schon mal probiert und einen Summenvektor definiert
und außerhalb eines Proßesses die Vektoren addiert. Das funktioniert
leider nur genau so lange, wie die Summe der beiden Vektoren (15 downto
0 ) die Grenze nicht überscheiten.
Hat jemand da eine Idee, wie man das lösen kann???
antonio23 schrieb:> Ich habe das auch schon mal probiert und einen Summenvektor definiert> und außerhalb eines Proßesses die Vektoren addiert.
Es ist an sich ganz egal, wo da was addiert wird...
> wie die Summe der beiden Vektoren (15 downto 0 ) die Grenze nicht> überscheiten.
Welche Grenze?
Was ist dein Problem?
Das kommt eben ganz drauf was du als "Maximum" definiert.
Anders gefragt; Was ist für dich größer: 5+5i oder 5-5i?
Ansonsten noch ein anderer Vorschlag:
Verschiebe doch einfach die Werte des Realteils und den Imaginärteils in
den positiven Bereich. Also einfach den Wert der Obergrenze aufaddieren.
Wenn du dein Maximum gefunden hast, brauchst du die Werte dann einfach
nur noch zurück verschieben.
Lothar Miller schrieb:> Welche Grenze?> Was ist dein Problem?
Wenn imaginärteil und realteil beide z. B. x"FFFF" sind, dann komme ich
ja mit meinem Vektor für das Maximum (Amplitude <= imag + real) nicht
mehr hin.
Andreas D. schrieb:> Anders gefragt; Was ist für dich größer: 5+5i oder 5-5i?
Anhand der Werte die rein kommen, kann diese Konstellation nicht
auftreten, es soll schon ein "klares" Maximum in den EIngangsdaten
vorhanden sein
antonio23 schrieb:> dann komme ich ja mit meinem Vektor für das Maximum> (Amplitude <= imag + real) nicht mehr hin.
Die Formel ist falsch!
Weil imag und real orthogonal zueinander stehen, müssen sie quadratisch
addiert werden...
Seis drum: mach deine Vektoren zum Rechnen einfach breiter.
Mit so einem signed Vektor kannst du einfach resize() aufrufen, und
fertig.
Also etwa so:
Lothar Miller schrieb:> Seis drum: mach deine Vektoren zum Rechnen einfach breiter.> Mit so einem signed Vektor kannst du einfach resize() aufrufen, und> fertig.
ah, so einen Befehl hatte ich gesucht.
Vielen Dank für die Hilfe
Er will damit drauf raus, dass Komplexe Zahlen nicht anordenbar sind. Du
kannst wenn dann ein Maximum im Betrag feststellen. Und wenn du hier
merkst, dass Du einen überlauf des Wertes sqrt(im(x)^2+re(x)^2) hast,
dann musst Du halt einfach ne größere Variable nehmen.
blubb schrieb:> Er will damit drauf raus, dass Komplexe Zahlen nicht anordenbar sind. Du> kannst wenn dann ein Maximum im Betrag feststellen. Und wenn du hier> merkst, dass Du einen überlauf des Wertes sqrt(im(x)^2+re(x)^2) hast,> dann musst Du halt einfach ne größere Variable nehmen.
ja, das war mir klar, ich hatte nur probleme damit die Addition der
Real- und Imaginärteile durchzuführen. Aber mit Resize sind dann alle
Probleme gelöst
Lothar Miller schrieb:> Amplitude <= resize(imag,33)*resize(imag,33) + resize(real,33)*resize(real,33);
hab die Sache jetzt eingefügt und entsprechend angepasst:
Amplitude <= resize(source_imag_input,33)*resize(source_imag_input,33) +
resize(source_imag_input,33)*resize(source_imag_input,33);
bekomme aber jetzt fogende Fehlermeldungen:
ERROR:HDLParsers:808 -
"C:/Users/Gensmantel/Documents/Xilinx/Maximum_01/Maximum_01/maximum_01.v
hd" Line 59. resize can not have such operands in this context.
hab folgende Libarys eingefügt:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.all;
source_imag_input ist ein in STD_LOGIC_VECTOR(15 downto 0);
source_real_input ist ebenfalls ein in STD_LOGIC_VECTOR(15 downto 0);
antonio23 schrieb:> hab folgende Libarys eingefügt:>> library IEEE;> use IEEE.std_logic_1164.all;> use IEEE.std_logic_arith.all;> use IEEE.std_logic_unsigned.all;> use IEEE.numeric_std.all;
Ach schlags kaputt. Warum muß man jedem immer das selbe sagen? :-/
Lies das: Beitrag "std_logic_vector zu integer"
Oder das: Beitrag "addition von std_logic"
Oder jeden anderen der 165534 Beiträge, in denen immer der selbe Fehler
gemacht wird....
> Line 59. resize can not have such operands in this context.>> source_imag_input ist ein in STD_LOGIC_VECTOR(15 downto 0);> source_real_input ist ebenfalls ein in STD_LOGIC_VECTOR(15 downto 0);
Ich meinte, vorhin erwähnt zu haben, dass resize() nur mit signed und
unsigned Vektoren funktioniert. Das war im
Beitrag "Re: Maximum suchen"
-- Abfrage und Zuweisung der Maximalwerte innerhalb eines Prozesses
32
33
Maximum_Berechnung:process(clk,reset_n,clk_enable)-- Begin der Maximum Berechnung
34
35
begin
36
ifreset_n='0'then-- asynchrones Rücksetzen
37
Maximum_Wert_real<=x"0000";
38
Maximum_Wert_imag<=x"0000";
39
elsifclk'eventandclk='1'then-- Synchrone Übernahme der Daten
40
ifclk_enable='1'then
41
if(Amplitude)>(Maximum_Wert_Amplitude)then
42
Maximum_Wert_real<=source_real_input;
43
Maximum_Wert_imag<=source_imag_input;
44
endif;
45
endif;
46
endif;
47
48
endprocessMaximum_Berechnung;
49
50
51
-- Zuweisung der internen Signale auf die externen Signale
52
source_imag_output<=Maximum_Wert_imag;
53
source_real_output<=Maximum_Wert_real;
54
55
endBehavioral;
Beim Kompilieren bekomme ich eine Warnung:
WARNING:Xst:653 - Signal <Maximum_Wert_Amplitude> is used but never
assigned. This sourceless signal will be automatically connected to
value 0000000000000000000000000000000000.
und in der Simulation mit Modelsim werden die Ausgangsvektoren nicht
aktualisiert. Siehe Bild.
antonio23 schrieb:> Beim Kompilieren bekomme ich eine Warnung:
Setz Maximum_Wert_Amplitude mal beim Reset oder bei der Definition auf
einen definierten Wert...
So wie bei denen:
Signal Maximum_Wert_real: std_logic_vector (15 downto 0):=x"0000";
antonio23 schrieb:> In Modelsim werden aber immer die aktuellen Werte übernommen und nicht> die Maximalen gespeichert (siehe Abbildung)...
Im Ernst: ein klein wenig Mitdenken könnte auch nicht schaden...
Du kannst dir die internen Signale eines Moduls im Modesim auch anzeigen
lassen. Dann würdest du sofort sehen, dass Maximum_Wert_Amplitude immer
0 bleibt...
Siehe den Beitrag "Modelsim: locale Signale anzeigen"
Stefan S. schrieb:> Du solltest noch "Maximum_Wert_Amplitude" aktualisieren
ach, shit... Hab so oft an dem Quelltext zwischenzeitig geändert, da hab
ich das glatt vergessen wieder mit rein zu nehmen... Jetzt funktioniert
es.
THX