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