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