Você está na página 1de 4

AritmticaemVHDL

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;

Observarqueparasntesemuitoimportantequesedefinaointervalo,poiscasoesteno sejadefinidoosignalter,pordefault,32bits. Doisintervalosjsoprdefinidos: natural de0a2321 positive de1a2321

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; ...

Primeiro,contadorconvertidoparaumsinaldotipounsigned(apenasreinterpretaodos bitspoisnonecessrionenhumcircuito),feitaaoperaodeincrementoeoresultado convertidoentodenovoparastd_logic_vector.

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);

signal signal signal signal

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

std_logic_vector(arg) std_logic_vector(arg) to_unsigned(arg,size) to_signed(arg,size) to_integer(arg) to_integer(arg)

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

Você também pode gostar