log2 in ISE/XST

OP #3916967
Ich möchte eine Eingangs-Vektor-Länge berechnen bzw. von XST vor der 
Synthese berechnen lassen, und zwar über eine Logarithmusfunktion:
1
constant max : integer := 19;
Um eine 19 darzustellen benötigt man 5 Bit ->
1
entity Komp1 is
2
  port(
3
    input : in std_logic_vector(log2(max) downto 0);
4
  );
5
end Komp1;
Dies ist mit der Funktion LOG2 auf math_real möglich. Alternativ eine 
Selbstbaulösung:
1
function log_2 (x : integer) return integer is
2
  variable x_v, cnt_v : integer;
3
  begin
4
    x_v := x;
5
    cnt_v := 0;
6
    while x_v > 0 loop
7
      x_v := x_v / 2;
8
      cnt_v := cnt_v + 1;
9
    end loop;
10
    return cnt_v;
11
end log_2;

Beides funktioniert im Simulator, in beiden Fällen erzeugt XST aber eine 
Komponente Komp1 mit einem Eingangsvektor von der Größe 9999 downto 0.
Wie kann ich XST bei der Berechnung helfen?
(Firma: Ich.AG)
Hallo!

Zuerst die Libs einbinden:
1
use ieee.math_real.log2;
2
use ieee.math_real.ceil;

Und so anwenden:
1
entity Komp1 is
2
  port(
3
    input : in std_logic_vector(integer(ceil(log2(real(MAX)))))-1 downto 0);
4
  );
5
end Komp1;

H
OP
Wenn ich das in ModelSim simuliere kommt der richtige Wert raus.
Aber wenn ich aus der Komponenten ein ISE-Schematic-Symbol erstelle wird 
der Port mit einer Breite von 64158175:0 angezeigt. Und wenn ich das 
Schematic-File über "View HDL Functional Model" in VHDL umwandeln lasse, 
hat die Komponente auf einmal einen Port mit zu geringer Breite.
Was ist denn da los?
Moderator (Firma: Titel) Persönliche Seite
Heinrich H. schrieb:
> input : in std_logic_vector(integer(ceil(log2(real(MAX)))))-1 downto 0);
Da fehlt beim "MAX" ein "+1" und es geht somit immer an den 
Zweierpotenz-Renzen (z.B. bei 64, 128, 256...) schief:
Daniel R. schrieb:
>> Um eine 19 darzustellen benötigt man 5 Bit ->
Und um eine 256 darzustellen braucht man 9 Bit.
Aber ohne die "+1" kommen bei der Zahl 256 nur 8 Bits heraus. Klar, denn 
mit 8 Bits kann man 256 unterschiedliche Zustände darstellen. Die Zahl 
256 ist aber der 257. Zustand (von 0...256).

Mein Vorschlag:
http://www.lothar-miller.de/s9y/archives/72-Breite-eines-Vektors-berechnen-log2.html
OP
Lothar Miller schrieb:
> Mein Vorschlag:
> 
http://www.lothar-miller.de/s9y/archives/72-Breite-eines-Vektors-berechnen-log2.html

Danke für den Hinweis; auf der Seite hatte ich auch schon 
vorbeigeschaut;)
Mein Problem ist ja hauptsächlich, dass die ISE-Symbolerstellung mit der 
Vorberechnung einer Signalbreite so gar nicht zurecht kommt. Ich würde 
sogar behaupten die Funktion sei nichtmal implementiert. Denn was die 
ausspuckt sind ja irgendwelche Zahlenbereichsgrenzen (62650943:0).
(Firma: Ich.AG)
Bei mir (PlanAhead 14.7, Ubuntu 14.04) funktioniert das Super. Die 
Kollegen die unter Windows arbeiten haben auch noch keine Probleme 
gemeldet.
Das ist bei uns seit Jahren im Einsatz. Bist Du sicher dass Du es so 
gemacht hast wie Lothar es beschrieben hat? Also
1
use ieee.math_real.log2;
2
use ieee.math_real.ceil;
3

4
entity Komp1 is
5
  port(
6
    input : in std_logic_vector(integer(ceil(log2(real(MAX+1)))))-1 downto 0);
7
  );
8
end Komp1;
OP
Heinrich H. schrieb:
> Bist Du sicher dass Du es so gemacht hast wie Lothar es beschrieben hat? Also
1
use ieee.math_real.log2;
2
use ieee.math_real.ceil;
3

4
entity Komp1 is
5
  port(
6
    input : in std_logic_vector(integer(ceil(log2(real(19))))-1 downto 0);
7
  );
8
end Komp1;
 Genau von dieser Komponente hab ich ein Symbol erstellt und es hat den 
Port Input(62781631:0).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 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.