Pacotes para aritmética em VHDL: numeric_std vs std_logic_arith

aritmética em VHDL

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

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Hardware » Sistemas Digitais » Pacotes para aritmética em VHDL: numeric_std vs std_logic_arith
Comentários:
Notificações
Notificar
guest
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
trackback
28/05/2014 20:43

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

Talvez você goste:

Séries

Menu

WEBINAR
 
Redes Mesh para Monitoramento
e Controle de Sensores

Data: 15/07 às 14:00h Apoio: Artimar| Microchip| Tecsus
 
INSCREVA-SE AGORA »



 
close-link