Hallo, möchte gerne in FPGA einen Algorithmus für die Sptizenwert-Berechnung implementiren. hat jemand schon mal so was gemacht? Gruß ftec
cetec Ftec schrieb: > hat jemand schon mal so was gemacht? Ja. Und damit ist deine Frage beantwortet. Oder, war da noch was?
cetec Ftec schrieb: > wie habt ihr gemacht? Indem ich erstmal geguckt habe, von wievielen Werten ich den Spitzenwert suche, in welchem Format die Daten vorliegen, wie schnell neue Daten dazukommen und wie häufig das Ergebnis gebraucht wird. All das beeinflußt das Design erheblich. Magst Du uns vielleicht Deine Anforderungen mitteilen? Duke
cetec Ftec schrieb: > Sptizenwert-Berechnung Berechung klingt nach Abschätzung durch Betrachtung einer Wertegruppe (und zwar dann, wenn man den Spitzenwert überlesen haben kann). Sowas habe ich nämlich schon mal gemacht. Das andere wäre, "Spitzenwert merken". Das hat wohl jeder schon mal gemacht. waiting for cetec's spec ...
wie ist es, wenn ich dafür ein Digital-Filter (aus Integrator und differentiator) implementiere?
cetec Ftec schrieb: > wie ist es, wenn ich dafür ein Digital-Filter (aus Integrator und > differentiator) implementiere? Nein. Falsches Buch. "Spitzenwert merken" ist besser.
Danke, habt ihr schon als Beispiel eine fertige Vhdl Code? Das hilft mir bestimmt sehr. Gruß Ftec
cetec Ftec schrieb: > Das hilft mir > bestimmt sehr. Nein. Bestimmt nicht. Weil Du uns Deine Anforderungen noch nicht mitgeteilt hast. Duke
also die Anforderungen sind: - Es ist ein Projekt, in dem ich versciedene Signale vom Stromquellen über FPGA zu einigen Bus (Bsp. can) Systemen weiterleite. Diese Signale werden zuerst mittels ADW umgewandelt und über serielle Schnittstellen in die FPGA gebracht und in FPGA muss ich diese Signale irgendwie vergleichen (bzw. Spitzenwert von dem merken.) ich wollte zuerst eine Quadratische Mittelwert bilden, habe aber festgestellt, dass die Wurzel-Imlementierung viel kompliziert ist.Deswegen habe ich mich für Spitzenwertbildung entschieden.
cetec Ftec schrieb: > ich wollte zuerst eine Quadratische Mittelwert bilden, habe aber > festgestellt, dass die Wurzel-Imlementierung viel kompliziert > ist. Und warum nimmst du nicht statt des quadratischen Mittelwerts einen arithmetischen Mittelwert. Das einfachste wäre ein Filter erster Ordnung. > Deswegen habe ich mich für Spitzenwertbildung entschieden. Das sind ja zwei komplett grundlegend unterschiedliche mathematische Funktionen. Wenn es dir im Prinzip egal ist, was du macht, dann stelle ich die Frage: Und was willst du eigentlich machen? > und in FPGA muss ich diese Signale irgendwie vergleichen Und was folgt auf den Vergleich? > (bzw. Spitzenwert von dem merken.) Das ist doch schon die Lösung deiner Aufgabe: du bekommst einen Wert, und dann schaust du, ob dieser Wert höher ist als der von dir gespeicherte, und falls ja: neuer Spitzenwert. Damit später mal kleinere Werte auch wieder durchkommen, kannst du dieses "Merkregister" dann mit einer vernünftigen Zeitkonstante langsam gegen Null laufen lassen. Dein Problem ist, dass du Signale zu verarbeiten hast, und offenbar nicht weißt, was du damit machen must, um das zu bekommen, was du willst. Das hat mit FPGAs eigentlich nichts zu tun...
> Und warum nimmst du nicht statt des quadratischen Mittelwerts einen > arithmetischen Mittelwert. Das einfachste wäre ein Filter erster > Ordnung. hast vollkommen recht :) arithmetische Mittelwert sollte sein. > Das ist doch schon die Lösung deiner Aufgabe: du bekommst einen Wert, > und dann schaust du, ob dieser Wert höher ist als der von dir > gespeicherte, und falls ja: neuer Spitzenwert. > Damit später mal kleinere Werte auch wieder durchkommen, kannst du > dieses "Merkregister" dann mit einer vernünftigen Zeitkonstante langsam > gegen Null laufen lassen. hier hast nochmal richtigen Ausdrücke erwischt :) Danke. Ich möchte genau so machen. nun brauche ich ein VHDL Bsp.Code für den arithmetischen Mittelwert,weil ich überhaupt kein Plan habe, wie es realisiere :((
> nun brauche ich ein VHDL Bsp.Code für den arithmetischen Mittelwert,weil > ich überhaupt kein Plan habe, wie es realisiere :(( ...und den wird dir keiner liefern, wenn du zumindest nicht mals selbst anfaengst und uns zeigst, was du bis jetzt schon gemacht hast... ich kanns
cetec Ftec schrieb: > nun brauche ich ein VHDL Bsp.Code für den arithmetischen Mittelwert,weil > ich überhaupt kein Plan habe, wie es realisiere :(( Ich hätte da was einfaches in C für einen Mittelwert entsprechend einem RC-Glied/PT1-Glied: http://www.lothar-miller.de/s9y/categories/21-Filter Dieses Filter kann ohne jeden Aufwand nach VHDL übertragen werden...
ich kanns schrieb: > ich kanns Wenn du dich so egoistisch und arrogant verhälst, was du kannst, ist auch nicht wert. Danke Lothar. PT1 glied kenne ich, reagiert wie eine tiefpass Filter 1. Ordnung.
cetec Ftec schrieb: > Diese Signale werden zuerst mittels ADW umgewandelt und über serielle > Schnittstellen in die FPGA gebracht und in FPGA muss ich diese Signale > irgendwie vergleichen (bzw. Spitzenwert von dem merken.) Und wie schnell muß das ganze geschehen? Wie viele Eingangssignale hast Du? cetec Ftec schrieb: > habe aber > festgestellt, dass die Wurzel-Imlementierung viel kompliziert > ist. Kann man so sehen. Ich habe ein serielle Wurzelmodul hier, das pro Eingangsbit ca. 2 Takte braucht. Duke
...so nur mal so hingeschrieben um dir zu zeigen wie sowas aussehen koennte:
1 | library ieee; |
2 | use ieee.std_logic_1164.all; |
3 | use ieee.numeric_std.all; |
4 | |
5 | architecture behavioral of spitzenwert is |
6 | |
7 | signal max : std_logic_vector(15 downto 0) := (others => '0'_; |
8 | signal data : std_logic_vector(15 downto 0) := (others => '0'_; |
9 | |
10 | begin
|
11 | process (clk) |
12 | begin
|
13 | if rising_edge(clk) then |
14 | if (to_integer(unsigned(max)) < to_integer(unsigned(data))) then |
15 | max <= data; |
16 | end if; |
17 | end if; |
18 | end process; |
19 | |
20 | end behavioral; |
ich kanns
ich kanns schrieb: > ...so nur mal so hingeschrieben um dir zu zeigen > wie sowas aussehen koennte: Hallo "ich kanns", danke nett von dir. Gruß Ftec
@ich kann, muss es zuerst so aussehen, was du geschrieben hast? entity spitzenwert is port ( clk: in std_logic; x: in std_logic_vector (15 downto 0); y :out std_logic_vector (15 downto 0) ); architecture behavioral of spitzenwert is ....... max <= x; ....... y <= max; end behavioral;
> muss es zuerst so aussehen, was du geschrieben hast?
Ich verstehe deine Frage nicht.
Das war kein vollstaendiger Maximalwertspeicher. Das war
nur ein Beispiel wie es aussehen koennte.
Was natuerlich noch fehlt, ist das der Maximalwert
irgendwann mal zurueckgesetzt werden muss.
Zeig doch mal deinen vollstaendigen Code was du bis
jetzt schon hast, und dann kann man dir weiterhelfen.
ich kanns
ich bin leider Anfänger und habe nicht viel Ahnung vom VHDL. Ich versuche was du geschrieben hast zu erweitern. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity spitzenwert is generic ( laenge : integer:= 24); port ( clk : in std_logic; indata : in std_logic_vector (laenge-1 downto 0); outdata : out std_logic_vector (laenge-1 downto 0) ); architecture behavioral of spitzenwert is signal max : std_logic_vector(laenge-1 downto 0) := (others => '0'); signal data : std_logic_vector(laenge-1 downto 0) := (others => '0'); begin process (clk, reset) begin max <= indata; if rising_edge(clk) then if (to_integer(unsigned(max)) < to_integer(unsigned(data))) then max <= data; if max = laenge then max <= 0; else max <= max +1; end if; end if; end if; end process; outdata <= max; end behavioral;
> ich bin leider Anfänger und habe nicht viel Ahnung vom VHDL. das macht nichts, jeder hat mal angefangen > Ich versuche was du geschrieben hast zu erweitern. Ich weiss zwar nicht genau was du da machen willst, habe aber mal dein Code genommen ihn erweitert...
1 | library ieee; |
2 | use ieee.std_logic_1164.all; |
3 | use ieee.numeric_std.all; |
4 | |
5 | entity spitzenwert is |
6 | generic ( |
7 | laenge : integer:= 24 |
8 | );
|
9 | port ( |
10 | clk : in std_logic; |
11 | rst_max : in std_logic; |
12 | indata : in std_logic_vector(laenge - 1 downto 0); |
13 | outdata : out std_logic_vector(laenge - 1 downto 0) |
14 | );
|
15 | |
16 | architecture behavioral of spitzenwert is |
17 | |
18 | signal max : std_logic_vector(laenge - 1 downto 0) := (others => '0'); |
19 | |
20 | begin
|
21 | process (clk) |
22 | begin
|
23 | if rising_edge(clk) then |
24 | if (rst_max = '1') then |
25 | max <= (others => '0'); |
26 | elsif (to_integer(unsigned(max)) < to_integer(unsigned(indata))) then |
27 | max <= indata; |
28 | end if; |
29 | end if; |
30 | end process; |
31 | |
32 | outdata <= max; |
33 | |
34 | end behavioral; |
...so den Rest schaffst du nun sicher auch alleine. Gruss ich kanns
vielen Dank,
> ...so den Rest schaffst du nun sicher auch alleine.
ich hoffe, dass ich es schaffe :)
gruß ftec
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.