mikrocontroller.net

Forum: FPGA, VHDL & Co. Signal teilen


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo möchte eigentlich "nur" ein Signal wie folgt teilen:
signal v_adc2_i_limit, v_dac1_data : integer := 0;
.
.
.
v_dac1_data <= v_adc2_i_limit/24;

Die Simulation funktioniert, doch die Synthese will einfach nicht gehen 
und bring (Xilinx ISE) diese Fehlermeldung:
Operator <DIVIDE> must have constant operands or first operand must be 
power of 2

Vielleicht kann mir jemand weiterhelfen?

P.S. wenn ich durch 4 teile geht es ?:-)?

Autor: joep (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für welches Bauteil führst du die Synthese aus? Kann es sein, dass der 
anstatt einer echten Division nur einen Shift macht? Das würde das "must 
be
power of 2" erklären und auch dass es, wenn du mit 4 teilst, 
funktioniert.

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine synthetisierbare Division mit beliebigen Divisor gibts nicht,
Ausnahmen sind Teiler wie 2,4,8,16,..; eben power of 2 Teiler.

Abhelfen kannst Du Dir aber durch Approximationen wie z.B.
1/24 = a/256 mit a ~= 256/24 = 10.66.. =~ 10. Mit 10 = 8 + 2
ergibt sich dann (value*8 + value*2)/256, d.h. nur einfache
Shift-Operationen und eine Addition. Statt 256 als Basis lässt
sich auch 512,1024,..(power of 2) einsetzen, je grösser die
Basis ist, desto weniger hast Du dann allerdings von Deinem
Wertebereich ohne Überläufe zu bekommen.


Gruss

Jörg

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er könnte auch einfach mit 1/24 (*Faktor) multiplizieren... Wenn der 
Faktor dann noch durch 2 teilbar ist, dann muss man beim Produkt einfach 
nur ein paar Bits entsorgen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Mike (Gast)

>Er könnte auch einfach mit 1/24 (*Faktor) multiplizieren... Wenn der
>Faktor dann noch durch 2 teilbar ist, dann muss man beim Produkt einfach
>nur ein paar Bits entsorgen.

Richtig, siehe Festkommaartihmetik

Einfach 1/14 * 2^16 = 2730,66 ~ 2731 rechen und geschickt 
"zurückschieben"
signal tmp: std_logic_vector(39 downto 0);

tmp<=v_adc2_i_limit*2731; 
v_dac1_data <= tmp(39 downto 16);

MfG
Fal

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.