Forum: FPGA, VHDL & Co. log2 in ISE/XST


von Daniel R. (dan066)


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?

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

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

: Bearbeitet durch User
von Daniel R. (dan066)


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?

von Christian R. (supachris)


Lesenswert?

Hm, ist dann sicherlich einer der unzählbaren Bugs in Schecmatic Entry 
der ISE. Einfach nicht verwenden. Ich verstehe nicht, wieso sich das so 
hartnäckig hält, obwohl das so ein K(r)ampf ist und schon seit Jahren 
nicht mehr supported wird.

von Daniel R. (dan066)


Lesenswert?

Darf man wohl eben nur für die ganz primitive Verdrahtung nehmen...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

: Bearbeitet durch Moderator
von Daniel R. (dan066)


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).

von Heinrich H. (Firma: Ich.AG) (hhanff)


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;

von Duke Scarring (Gast)


Lesenswert?

Daniel R. schrieb:
> dass die ISE-Symbolerstellung
Ab in die Tonne mit ISE-Schaltplan.

Lern VHDL. Und wer hier respektvolle Fragen stellt, bekommt auch 
respektvolle Antworten.

Duke

von Daniel R. (dan066)


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).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.