Spartan-3A a AN -signed/unsigned matematika
David Belohrad
david na belohrad.ch
Pondělí Prosinec 30 20:54:36 CET 2013
mezi signed a unsigned - pokud zajistite pocet bitu - neni rozdil. Pokud
pouzijete use ieee.numeric_std.all. Oba typy maji zadeklarovane stejne
operace. Navic pokud mate chytry kompilator (imho vsechny jsou), dejte
tomu ten bit navic ciste pro jistotu. Pokud jej kompilator shleda
redundantnim, tak jej 'zoptimalizuje' - vetsinou. Pokud totiz jsou data
ctena napr z generickeho 32bitoveho registru, tak ho tam necha. Pokud se
jedna o citac, kde pricitate/odecitate jednicku a mate ten citac ciselne
omezeny, tak se prebytecnych bitu zbavi. V FPGA na tom s prominutim prd
sejde. jestli mate k dispozici 50kLE, tak vas tech par bitu nezabije. V
CPLD je potreba dat si pozor, jak byl vysledny kod optimalizovany
napr nahledem do RTL. Mozna, ze je stejne dobry ... s CPLD jsem delal
naposledy pred deseti lety.
.d.
hw na itherm.cz writes:
> Dekuji to je celkem vtipny postup. A asi jej budu pouzivat. Napriklad u
> citacu mam stejne prednastavne do kolika pocita takze z teto hodnoty se mi
> muzou rovnou generovat deklarace.
>
> Jinak s tim signed, asi se na to vykaslu a udelam vse unsigned, jedna se o
> dve mista kde se musi pocitat smer pri integraci a bude mozna rychlejsi si
> udelat bit pro smer a pak to pricitat/odecitat
> Nebutu tak muset premyslet nad tim co je signed a co ne.
>
> Presto ale dekuju za rady a tipy.
>
> Pavel
>
>
> -----Original Message-----
> From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of David
> Belohrad
> Sent: 30. prosince 2013 19:03
> To: HW-news
> Subject: Re: Spartan-3A a AN -signed/unsigned matematika
>
>
> Jenom tak na okraj. Pouzivam tuhle funkci:
>
> function bits_to_fit (N : natural) return natural is
> variable vIntermediatexD : natural;
> variable vBitCountxD : natural;
> begin
> vIntermediatexD := N;
> vBitCountxD := 0;
> loop
> exit when vIntermediatexD = 0;
> vIntermediatexD := vIntermediatexD / 2;
> vBitCountxD := vBitCountxD + 1;
> end loop;
>
> if vBitCountxD = 0 then
> return 1;
> end if;
>
> return vBitCountxD;
> end;
>
>
> Date tomu cislo, a ono vam to vypocita, kolik potrebujete bitu. Priklad napr
> deklarace entity (za predpokladu, ze funkce je nekde v package a je
> zadeklarovana use blabla.blablabl.all;)
>
>
> entity calcme is
>
> generic (MAX_NUMBER : natural := 293);
>
> port (ClkxC : in std_logic;
> ResetxRNA : in std_logic;
> DxD : in unsigned(bits_to_fit(MAX_NUMBER)-1 downto 0)
> QxD : out unsigned(bits_to_fit (MAX_NUMBER) - 1 downto 0));
>
> end entity calcme;
>
>
> Pak se nemusite starat o to, kolik bitu na co potrebujete. Funkce funguje
> jenom pro unsigned, ale nebyl by problem ji modifikovat napr tak, aby pri
> zapornem cisle davala pocet bitu pro signed
>
> .d.
>
>
>
>
>
>
> "balu na home" <balu na k-net.fr> writes:
>
>> s 8 bitmi pokryjete 0..255, nie 256 :-) Pokial tato hodnota vstupuje
>> do matematickej operacie a predpokladate overflow (napriklad
>> pripocitavate konstantu, alebo nasobite koeficientom
>> >1) tak treba zvysit pocet bitov.
>> Ak pouzijete ieee.numeric_std ten podporuje aj signed aj unsigned
>> operacie. Ako bude k vektoru pristupovat kompilator zavisi od toho ake
>> kniznice pouzite a ako signal zadefinujete.
>>
>> Vytlacte si tento obrazok
>> http://www.doulos.com/knowhow/vhdl_designers_guide/numeric_std/numeric
>> _std_conversions.gif
>>
>> a mozete veselo tycastovat :-)
>>
>> FPGAcku je jedno co ten signal prenasa a aky ma format, pren su to len
>> bity. Ja zvyknem vsetko dratovat ako std_logic_vector
>>
>> PocetPulzov : in std_logic_vector (11 downto 0)
>>
>> lokalny signal (nikdy nepouzivat premenne!!)
>>
>> signal Loc_CelkovyPocetPulzov: unsigned (11 downto 0);
>>
>> a potom si zadefinujem typ az pri konkretnej operacii, napriklad
>>
>> Loc_CelkovyPocetPulzov <= Loc_CelkovyPocetPulzov +
>> Unsigned(PocetPulzov);
>>
>> a na konci vnutorny signal vytiahnete von a skonvertujete znova na
>> genericku zbernicu
>>
>> CelkovyPocetPulzov <= std_logic_vector(Loc_CelkovyPocetPulzov);
>>
>>
>> Ak pracujete so signalom stale ako s cislom tak ho mozete samozrejme
>> deklarovat len raz a prenasat stale ako cislo.
>>
>> Pokial prechadzate z unsigned na signed tak treba urobit riadnu
>> konverziu a pridat znamienkovy bit. Sign extension sa robi v 2's
>> complement tak ze okopirujete znamienko do vsetkych volnych MSB bitov.
>>
>> b.
>>
>>
>>
>> On 30/12/2013 09:29, hw na itherm.cz wrote:
>>> Pokud tedy dobre chapu, pokud mam citac zadefinovane jako vector(9
>>> downto 0
>>> ) a potrebuju citat do 627 tak musim pridat bit.
>>> Tyka se to tedy vseho nad cim se delaji matematicke operace.
>>>
>>> Co kdyz mam 8bit branu ze ktere jde unsigned hodnota (0-256) a tato
>>> vstupuje do nejake matematicke operace. Bude k ni pristupovano jako k
>>> signed, tzn nebude vypocet sedet, nebo se pletu?
>>> Jak se resi takove situace? Musim to presunout do interni promenne a
>>> pridat tam 0 na zacatek?
>>>
>>> Pavel
>>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
> "balu na home" <balu na k-net.fr> writes:
>
>> s 8 bitmi pokryjete 0..255, nie 256 :-)
>> Pokial tato hodnota vstupuje do matematickej operacie a predpokladate
>> overflow (napriklad pripocitavate konstantu, alebo nasobite koeficientom
>> >1) tak treba zvysit pocet bitov.
>> Ak pouzijete ieee.numeric_std ten podporuje aj signed aj unsigned
>> operacie. Ako bude k vektoru pristupovat kompilator zavisi od toho ake
>> kniznice pouzite a ako signal zadefinujete.
>>
>> Vytlacte si tento obrazok
>>
> http://www.doulos.com/knowhow/vhdl_designers_guide/numeric_std/numeric_std_c
> onversions.gif
>>
>> a mozete veselo tycastovat :-)
>>
>> FPGAcku je jedno co ten signal prenasa a aky ma format, pren su to len
>> bity. Ja zvyknem vsetko dratovat ako std_logic_vector
>>
>> PocetPulzov : in std_logic_vector (11 downto 0)
>>
>> lokalny signal (nikdy nepouzivat premenne!!)
>>
>> signal Loc_CelkovyPocetPulzov: unsigned (11 downto 0);
>>
>> a potom si zadefinujem typ az pri konkretnej operacii, napriklad
>>
>> Loc_CelkovyPocetPulzov <= Loc_CelkovyPocetPulzov +
>> Unsigned(PocetPulzov);
>>
>> a na konci vnutorny signal vytiahnete von a skonvertujete znova na
>> genericku zbernicu
>>
>> CelkovyPocetPulzov <= std_logic_vector(Loc_CelkovyPocetPulzov);
>>
>>
>> Ak pracujete so signalom stale ako s cislom tak ho mozete samozrejme
>> deklarovat len raz a prenasat stale ako cislo.
>>
>> Pokial prechadzate z unsigned na signed tak treba urobit riadnu
>> konverziu a pridat znamienkovy bit. Sign extension sa robi v 2's
>> complement tak ze okopirujete znamienko do vsetkych volnych MSB bitov.
>>
>> b.
>>
>>
>>
>> On 30/12/2013 09:29, hw na itherm.cz wrote:
>>> Pokud tedy dobre chapu, pokud mam citac zadefinovane jako vector(9 downto
> 0
>>> ) a potrebuju citat do 627 tak musim pridat bit.
>>> Tyka se to tedy vseho nad cim se delaji matematicke operace.
>>>
>>> Co kdyz mam 8bit branu ze ktere jde unsigned hodnota (0-256) a tato
>>> vstupuje do nejake matematicke operace. Bude k ni pristupovano jako k
>>> signed, tzn nebude vypocet sedet, nebo se pletu?
>>> Jak se resi takove situace? Musim to presunout do interni promenne a
> pridat
>>> tam 0 na zacatek?
>>>
>>> Pavel
>>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list