Forum: FPGA, VHDL & Co. Spitzenwert_Brechnung


von Cetec F. (ftec)


Lesenswert?

Hallo,

möchte gerne in FPGA einen Algorithmus für die Sptizenwert-Berechnung 
implementiren.
hat jemand schon mal so was gemacht?

Gruß
ftec

von Duke Scarring (Gast)


Lesenswert?

cetec Ftec schrieb:
> hat jemand schon mal so was gemacht?
Ja.

Duke

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


Lesenswert?

cetec Ftec schrieb:
> hat jemand schon mal so was gemacht?
Ja. Und damit ist deine Frage beantwortet.

Oder, war da noch was?

von Micha (Gast)


Lesenswert?

cetec Ftec schrieb:
> hat jemand schon mal so was gemacht?

me too...

von Cetec F. (ftec)


Lesenswert?

danke, aber ich habe es nicht :)

wie habt ihr gemacht?

von Duke Scarring (Gast)


Lesenswert?

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

von Berater (Gast)


Lesenswert?

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

von Cetec F. (ftec)


Lesenswert?

wie ist es, wenn ich dafür ein Digital-Filter (aus Integrator und 
differentiator) implementiere?

von Dose (Gast)


Lesenswert?

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.

von Cetec F. (ftec)


Lesenswert?

Danke,

habt ihr schon als Beispiel eine fertige Vhdl Code? Das hilft mir 
bestimmt sehr.

Gruß
Ftec

von Duke Scarring (Gast)


Lesenswert?

cetec Ftec schrieb:
> Das hilft mir
> bestimmt sehr.
Nein. Bestimmt nicht.
Weil Du uns Deine Anforderungen noch nicht mitgeteilt hast.

Duke

von Cetec F. (ftec)


Lesenswert?

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.

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


Lesenswert?

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

von Cetec F. (ftec)


Lesenswert?

> 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 :((

von ich kanns (Gast)


Lesenswert?

> 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

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


Lesenswert?

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

von Cetec F. (ftec)


Lesenswert?

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.

von Duke Scarring (Gast)


Lesenswert?

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

von ich kanns (Gast)


Lesenswert?

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

von Cetec F. (ftec)


Lesenswert?

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

von Cetec F. (ftec)


Lesenswert?

@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;

von ich kanns (Gast)


Lesenswert?

> 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

von Cetec F. (ftec)


Lesenswert?

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;

von ich kanns (Gast)


Lesenswert?

> 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

von Cetec F. (ftec)


Lesenswert?

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
Noch kein Account? Hier anmelden.