Spartan-3A a AN -signed/unsigned matematika
David Belohrad
david na belohrad.ch
Pondělí Prosinec 30 19:02:35 CET 2013
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_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
Další informace o konferenci Hw-list