Pacotes para aritmética em VHDL: numeric_std vs std_logic_arith

Quem já tentou realizar operações matemáticas em VHDL já percebeu que é necessário acrescentar um pacote específico para isto. O pacote padrão ieee.std_logic_1164 contempla somente operações lógicas.

As opções mais comuns são a numeric_std e as std_logic_arith, std_logic_unsigned e std_logic_signed.

 

Você deve utilizar a numeric_std.

 

Para utilizar a numeric_std fazemos assim:

 

Já para as outras

 

Os pacotes std_logic aritméticos foram escritos pela Synopsys, na época não existia um pacote para operações matemáticas padronizado pela IEEE. Logo os desenvolvedores começaram a usá-los. Mas por não ser padronizado, diferentes fabricantes implementaram este pacote de diferentes formas. Isto levou ao fato de que o VHDL desenvolvido, que utilizava estes pacotes, não pudesse garantir a compatibilidade entre os diversos fabricantes, ou ainda, um mesmo design feito para um determinado fabricante pode ter um comportamento diferente em outro fabricante.

 

Depois apareceram os pacotes numeric_std e numeric_bit, ambos escritos e padronizados pela IEEE. Ambos têm garantia de funcionamento e implementação idêntica entre diferentes fabricantes e ferramentas. Outra vantagem é que a numeric_std não permite realizar operações matemáticas em cima de std_logic_vectors, você tem que declarar explicitamente no arquivo que seu signal é do tipo com sinal (signed) ou sem sinal (unsigned). Ou então realizar o cast, vamos ver o exemplo de somar um:

 

Se os sinais estão declarados como std_logic_vector

Se todos estão declarados como unsigned (ou signed)

Se soma_um é std_logic_vector e a é unsigned/signed

 

Este tipo de cast não gasta lógica alguma, é tão somente para o VHDL saber qual tipo de operação utilizar.

 

Isto evita confusões. Nas bibliotecas da Synopsys você só pode trabalhar com um tipo de dado em um arquivo, você não pode adicionar mutuamente os pacotes std_logic_signed e unsigned em um só arquivo, pois isto gerará conflitos entre os operadores e não será possível determinar se os seus std_logic_vector são do tipo com sinal ou sem sinal. Além de não fazer muito sentido tratar sinais do tipo lógico com operações aritméticas.

 

Para saber mais

 

nandland - http://www.nandland.com/articles/std_logic_arith_vs_numeric_std.html

vhdlguru - http://vhdlguru.blogspot.com.br/2010/03/why-library-numericstd-is-preferred.html

wikipedia - http://en.wikipedia.org/wiki/Numeric_std

Deixe um comentário

1 Comentário em "Pacotes para aritmética em VHDL: numeric_std vs std_logic_arith"

Notificar
avatar
Ordenar por:   recentes | antigos | mais votados
trackback
numeric_std vs std_logic_arith - André Castelan

[...] Post publicado no Embarcados [...]

wpDiscuz