log2 in ISE/XST

#3916967
Lesenswert?

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?
#3917068
Lesenswert?

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 #3917086
Lesenswert?

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
#3917931
Lesenswert?

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) #3917964
Lesenswert?

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;
#3918253
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren