Mit unterschiedlich langen Unsigned rechnen

OP #3783342
Hallo,

ich habe einen ADC und will sobald der Wert davon über ein Schwellwert 
geht alle Werte aufsummieren bis der Wert wieder kleiner wie der 
Schwellwert wird. Also quasi die Fläche unter einem Peak bestimmen.

Ich bin mir sehr unsicher wie man das richtig rechnet in VHDL.

Der ADC ist 9-Bit Unsigned, der einstellbare Schwellwert ist auch 9-Bit 
Unsigned, und die Summe ist 16Bit Unsigned. Da ich keinen Überlauf haben 
will habe ich folgendes gemacht:
1
if ADC > Schwellwert and Summe /= "1111111111111111" then
2
   Summe <= Summe + ADC - Schwellwert;
3
end if;

- Schwellwert, weil ich nur die Fläche über dem Untergrund/Schwellwert 
haben will.

Ich habe auch schon ausprobiert:
1
if ADC > Schwellwert and Summe /= "1111111111111111" then
2
   Summe <= to_unsigned(to_integer(Summe) + to_integer(ADC) - to_integer(Schwellwert),16);
3
end if;

Den Fehler den ich sehe ist, dass die Summe die ich zum PC schicke, 
nicht größer wird wenn ich den analogen Peak größer einstelle, sondern 
trotz der Summe /= "1111111111111111" Bedingung weiterhin überläuft. 
Sprich wenn ich das analoge Signal groß mache bekomme ich irgendwann 
wieder kleine Summen.

Ist da ein Fehler in dem Code oder muss ich wo anders suchen?

Vielen Dank!
Gast #3783486
Das du bei einem Überlauf wieder unten ankommst ist das 
Standardverhalten in solchen Fällen. Das was du suchst nennt sich 
Sättigungsarithmetik und muss normalerweise speziell aktiviert werden. 
Du kannst ja mal schauen ob dein FPGA-Hersteller so etwas unterstützt. 
Hier für Altera:

http://www.altera.com/literature/ug/ug_lpm_alt_mfug.pdf

Damit dein Code funktioniert muss die Summe zufällig einmal den Wert 
"1111111111111111" annehmen. Wenn du nicht nur 1 aufaddierst wird es 
aber meistens nicht der Fall sein und es gibt dann den Überlauf. Am 
einfachsten wäre es die Berechnung auf 17 Bit zu erweitern und das 
höchste Bit auswerten.
OP #3783493
Ah, danke, da war der Denkfehler von mir! Ja, ich baue in einem anderen 
Teil auch noch ein Spektrum, da wird immer nur 1 aufaddiert und da 
verwende ich das auch.

Edit:
Ich mach das jetzt mal so:
1
if ADC > Schwellwert then
2
   if "1111111111111111" - Summe >= ADC - Schwellwert then
3
      Summe <= to_unsigned(to_integer(Summe) + to_integer(ADC) - to_integer(Schwellwert),16);
4
   else
5
      Summe <= (others => '1');
6
   end if;
7
end if;

Vielen Dank!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.