Escolar Documentos
Profissional Documentos
Cultura Documentos
HansSchneebeli DeptodeEngenhariaEltricaUFES
Introduo
Ostiposstd_logic_vector(definidoemieee.std_logic_1164)ebit_vector(prdefinido) nopermitemoperaesnumricas.Assiminvalidaaoperao q <= q + 1; seqfordefinidocomoumvetordebitsouumstd_logic_vector. Poroutrolado,VHDLtemumtipointeiroprdefinido(integer)quepodeservirdebasepara novostiposinteirosusandoseintervalos.
signal q : integer range 0 to 255;
Implementaesnopadro
Parasepoderfazeroperaesartimticascomstd_logic_vectorforamdesenvolvidasalgumas pacotes.Umdelesopacotestd_logic_arith,desenvolvidopelaSynopsys(Existemtambm umpacotedisponibilizadopelaMentorGraphics)[1].Noentanto,mesmoquesejadefinidana maiorpartedasimplementaescomopartedabibliotecasieee(useieee.std_std_logic_arith), elanopadroenofazpartedabibliotecaieee.Estepacotedefinetipossignedeunsigned alm das operaes aritmticas necessrias e as rotinas de converso conv_signed, conv_unsignedeconv_integer.Masaindaassim,nopossvelsesomardoissinaisdotipo std_logic_vectorsemconversesexplicitas.Parasepoderfazeristo,foramdesenvolvidosdois pacotes, tambm no padro, std_logic_unsigned e std_logic_signed, que interpretam os sinaisdotipostd_logic_vectorcomointeirossemsinaloucomsinalrespectivamente.Como nopodehaverestaambiguidade,somenteumdestespacotespodeserusado.
Implementaopadro
Amaneirapadrodesefazeroperaesaritmticascombit_vectoroustd_logic_vectorcom o uso dos pacotes padro para sntese (Padro IEEE 1076.3). Embora haja um pacote numeric_bit,opacotenumeric_stdmaisusado. Ambos pacotes definem os tipos unsigned e signed como vetores do tipo base (bit ou std_logic).Naverdade,asdefiniesdestd_logic_vectoredeunsigned(emnumeric_std)so identicas,ouseja,
type unsigned is array(natural range <>) of std_logic
A diferena reside na definio de operadores aritmticos e de converso que existem no pacote numeric_std. Por esse motivo, a converso entre unsigned e std_logic_vector simples,usandoseapenasonomedotipodedados.
Slv <= std_logic_vector(u); u <= unsigned(slv);
Assim possvel se definir um sinal (ou uma varivel) como abaixo e se poder fazer atribuiesecomparaes.
signal contador : unsigned(11 downto 0); -- 12 bits ... if contador = 202 then contador <= 0; else contador <= contador + 1; end if; ...
Noentanto,nopossvelsefazeroperaesaritmticasdotipocontador<=contador+1se contadorfordefinidocomostd_logic_vector.Nestecasoaconversodeveserexplicita.
signal contador: std_logic_vector(11 downto 0); -- 12 bits ... if contador = 202 then contador <= 0; else contador <= std_logic_vector(unsigned(contador) + 1); end if; ...
Operaes
Asoperaesabaixosodefinidasnopacotenumeric_std. Operaesaritmticas
Arg1 unsigned unsigned integer signed signed integer unsigned integer unsigned signed integer signed Arg2 unsigned unsigned unsigned signed signed signed Resultado
Converses
Considerandoossinaisabaixo
signal slv: std_logic_vector(10 downto 0);
u: unsigned(10 downto 0); s: signed(10 downto 0); ui: integer range 0 to 2047; si: integer range -1024 to 1023;
asseguintesconversespodemserfeitasusandoopacotenumeric_std.Asconversesso igualmentevlidasparavariveis.
Destd_logic_vectorparaunsignedousigned u <= unsigned(slv); s <= signed(slv); Deunsignedousignedparastd_logic_vector slv <= std_logic_vector(u); slv <= std_logic_vector(s); Deunsignedousignedparainteger ui <= to_integer(u); si <= to_integer(s); Deintegerparaunsignedousigned
Nestecasodeveseespecificarotamanhodovetorresultado u <= to_unsigned(ui,11); s <= to_signed(si,11); oumelhorusandoseoatributodecomprimento u <= to_unsigned(ui,u'length); s <= to_signed(si,s'length);
Deintegerparastd_logic_vector
Primeirodeveseconverterparaunsigned(ousigned)eentoparastd_logic_vector.
slv <= std_logic_vector(to_unsigned(ui,slv'length)); slv <= std_logic_vector(to_signed(si,slv'length)); Destd_logic_vectorparainteger
Primeirodeveseespecificarcomoovetordebitsdeveserinterpretado(unsignedousigned)e entoconverteloparainteger.
us <= to_integer(unsigned(slv)); is <= to_integer(signed(slv)); Resumo
TypeConversion
std_logic_vector -> unsigned std_logic_vector -> signed unsigned -> std_logic_vector signed -> std_logic_vector integer -> unsigned integer -> signed unsigned -> integer signed -> integer unsigned(arg) signed(arg)
numeric_std
integer -> std_logic_vector std_logic_vector -> integer unsigned + unsigned -> std_logic_vector signed + signed -> std_logic_vector
integer -> unsigned/signed ->std_logic_vector std_logic_vector -> unsigned/signed ->integer std_logic_vector(arg1 + arg2) std_logic_vector(arg1 + arg2)
Redimensionamento
Existeafunoresizequepermiteseredimensionar(paramaisouparamenos)umsinaldo tiposignedouunsigned.Elaparticularmenteimportanteparamanipulaodenmeros comsinal,poiselaosredimensionapreservandoseuvalor.
Referencias
[1] , IEEE library pitfalls in GHDL guide (acessado atravs de http://ghdl.free.fr/ghdl/IEEElibrarypitfalls.html#IEEElibrarypitfalls). [2] Jim Lewis , VHDL Math Tricks of the Trade (acessado atravs de http://www.synthworks.com/papers/vhdl_math_tricks_mapld_2003.pdf). [3] Hendry, DC. Arithmetic using numeric_std (acessado atravs de http://wwwcad.eng.abdn.ac.uk/~eng186/eg3560/lecture14.pdf). [4] IEEE. Cdigo fonte do pacote numeric_std http://www.cs.umbc.edu/help/VHDL/numeric_std.vhdl). [5] Microelectronics Design Center. VHDL http://dz.ee.ethz.ch/support/ic/hdl/vhdlsources.en.html). Sources. (acessado em
(acessado
em