mikrocontroller.net

Forum: FPGA, VHDL & Co. zwei std_logic_vector dividieren


Autor: snoopy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi leute,

schreib grad unter xilinx 9.2 für nen sparta 3.
ich hab zwei takte die ich über den clock abzählen lasse, daher hab ich 
dann
zwei std_vectoren.
jetzt will ich das taktverhältnis ausrechnen lassen, also die zwei 
std_logic_vec dividieren. jedoch klappt das nicht so recht. auch mit 
conv_integer klappts nicht.

hat jemand ne idee diesbezüglich. oder vielleicht kehrwertbildung?
aber wie stell ich das an, bring mir auch bei constantenteilung den 
error:

ERROR:HDLParsers:808 / can not have such operands in this context.

danke schon mal

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also zwei std_logic_vector zu dividieren geht ja schon mal gar nicht.
Ein std_logic_vector ist nur ein Anordnung von Bits. Die müßte zum 
Rechnen z.B. in unsigned gewandelt werden. Siehe auch 
Rechnen in VHDL: Besser: Rechnen mit numeric std.

Aber: Deine Division geht nur mit Divisoren die Potenz von 2 sind 
(2,4,8,16,...), weil die Synthesetools noch nicht so schlau sind.

Also, entweder für die Divisorfrequenz was "krummes" nehmen z.B. 2^22 = 
4194304 (siehe auch Baudratenquarz), oder die Division durch das 
Verfahren aus der Grundschule (Zählen, wie oft man subtrahieren kann) 
realisieren.

Dabei leistet eine state-Maschine gute Dienste.

Rick

Autor: snoopy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dank dir für den tipp

werd mich nochmal drübersetzen

ciao

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest den Wizzard nutzen, um einen Divider zu instanziieren. Der 
kriegt 2 std_logics rein und gibt i.d.R. 2 ab: Das Ergebnis und den 
Rest. Du musst natürlich VOR Anlegen des Vektors die Skalierung 
einbauen. Beispiel 20 Bit / 20 Bit Teiler bei dem maximal 1 Bit 
Ergebniss rauskommen würde (da Wert < Teiler) :

Wert    (19 downto 0) <= "10110 ...... 001";
Teiler  (19 downto 0) <= "010020.....11010";
Preci   ( 9 downto 0) <= "0000000000";

(port map vom Divider=
A <= Wert & Preci,
B <= Teiler,
R <= Rest,
E <= Ergebnis;

Der Ergebnisvektor belegt maximal die 10 Bit der mit "Preci" vorgegbenen 
Präzision und stellt die 100%-Zahl mit Faktor 1024 dar. Kannst auch 
vorher noch mit 200 multiplizieren, dann Teilen, 1 Addieren und dann 
wieder durch 2, dann hat Dein Ergebnisvektor exakt die Prozentzahl 
intus. Dann reichen 7 bit.

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.