Sehr grosse Zahl initialisieren

Gast #2742409
Lesenswert?

Ich habe folgende Zeile:

constant fxp_one : signed := to_signed(2 ** (width - width_int), width);

Da der Exponent sehr gross wird (ca. 40-60), motzt XST, die 2 ** (width 
- width_int) sei ausserhalb des Integer-Bereichs. Das stimmt ja auch. 
Doch wie kann ich diese sehr grosse Konstante trotzdem initialisieren?
(Firma: abaxor engineering) #2742944
Lesenswert?

Bei

2 ** (width - width_int)

ist nur ein Bit gesetzt

Du verwendest anstelle einer Konstanten ein Signal, als concurrent 
Statement setzt du dein Bit


fxp_one <= (ohters => '0');
fxp_one (width - width_int) <= '1';

Man kann auch beides in eine Zeile bringen. Bei Xilinx kannst du die 
erste Zeile bei der Signaldeklaration als Initialisierung angeben.

Aber was willst du mit so einem langen Vektor machen? Solche langen 
Vektoren lassen sich nur mit einem kleinen Takt am Stück verarbeiten.

Tom
Gast #2743803
Lesenswert?

64 schrieb:
> Da der Exponent sehr gross wird (ca. 40-60), motzt XST, die 2 ** (width
> - width_int) sei ausserhalb des Integer-Bereichs. Das stimmt ja auch.
> Doch wie kann ich diese sehr grosse Konstante trotzdem initialisieren?

In VHDL ist man an dieser Stelle wirklich gekniffen, Integers geben eben
nur 32 Bit her.

Wenn's nicht unbedingt bitgenau sein muss, kann man die Grenze mit
reals noch etwas hinausschieben, aber für die erwähnten 150 Bit
ist das wohl auch nicht mehr sinnvoll.

In meinem sinus/cosinus-Modul auf www.opencores.org sind Konversionen 
für
(signed, unsigned) <==> real im Testbett.

http://opencores.org/project,sincos

dann svn browse, trunk, vhdl, tb, un_signed_sprt

Damit würde ich nicht gerade Vektoren-Grenzen ausrechnen, aber für
FIR-Koeffizienten, DDS-outputs, ADC-Werte etc ist das ganz brauchbar.

Gruß, Gerhard



experimenteller direkter Link:

<http://opencores.org/websvn,filedetails?repname=sincos&path=%2Fsincos%2Ftrunk%2Fvhdl%2Ftb%2Fun_signed_sprt%2Fun_signed_sprt.vhd>;

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