Tutorial de Verilog – Ponto Fixo e Ponto Flutuante em Verilog – Parte I

Operadores Lógicos e Aritméticos

Prezado leitor, no presente tópico iremos discutir como podemos representar números reais, de ponto fixo e ponto flutuante, em binário e listar alguns métodos utilizados pelo projetista moderno para trabalhar com essas representações. O assunto é extenso e de suma importância, por isso convido o leitor a explorar mais o assunto em livros como [1] e a própria especificação do padrão Verilog IEEE 754-1985.

Sendo assim seguem algumas considerações interessantes:

  • Números podem ser representados em decimal, hexadecimal, octal e em formato binário;
  • Devemos sempre considerar que números negativos são representados internamente na forma de complemento de dois;
  • O caractere “?” é utilizado em um número como alternativa para alta-impedância;
  • O caractere “_” (underscore) pode ser utilizado como separador e qualquer em posição do número, exceto na primeira, o qual é ignorado. 

Representação de números inteiros

Em um primeiro momento devemos considerar que números inteiros em Verilog seguem o seguinte formato:

<sinal><tamanho – conforme a base> ‘ valor

Com o sinal podemos representar números negativos pelo prefixo “” (menos) e pela ausência de qualquer prefixo número positivos. Vale ratificar que Verilog representa internamente números negativos no formato de complemento de dois. Ex.: -14’h1234; // número negativo com sinal    

O tamanho será sempre definido como um número decimal e define a quantidade em bits. Caso não tenha sido definido, será considerado 32 bits ou conforme as configurações do sistema. As bases utilizadas em Verilog são as seguintes:

  • ‘b ou ‘B – binário. Ex.: 2’b11; // número 3 decimal representado com dois bit
  • ‘h ou ‘H – hexadecimal. Ex.: 8’hAF; // número 175 decimal representado em hexadecimal com 8 bits
  • ‘d ou ‘D – decimal, esta base é considerada default em Verilog. Ex.: 3; // número 3 decimal – será armazenado com 32 bits
  • ‘o ou ‘O – octal. Ex.: 10’o222; // número 146 decimal representado em octal com 10 bits 

O valor consiste nos dígitos entre: 0-9, A-F, a-f, x ou X e z ou Z. Sendo x ou X correspondente a valores desconhecidos e z ou Z a valores em alta-impedância. Exemplos:

  • 3’bz; // corresponde a 3 bits em Z;
  • 8’bx; // corresponde a 8 bits em X.

Representação de números reais 

Algumas considerações:

  • Verilog suporta constantes reais e variáveis;
  • Converte número real em inteiro por arredondamento;
  • Números reais não podem assumir valores com “Z” e “X”;
  • Números reais quando atribuídos a variáveis inteiras arredondam para o inteiro mais próximo do seu valor.

Segundo [2], como manipulamos número decimais a toda hora, podemos estender o mesmo conceito à parte fracionária. Vamos tomar como exemplo o número “923.501” da página 526 do mesmo livro. Os dígitos “923.501” podem ser representados da seguinte forma:

9*10² + 2*101+3*100+5*10-1+0*10-2+1*10-3

Com esse exemplo conseguimos observar que a representação de números reais segue o seguinte formato:

<valor a esquerda>.<valor a direita>

Nesse sentido os valor a esquerda recebe o tratamento convencional em binário, entretanto o valor a direita recebem valores binários negativos. O exemplo a seguir ilustra essa afirmação, tomemos o valor 2,8125, ele é igual a: 1*21 + 0*20 + 1*2-1 + 1*2-2 + 0*2-3 + 1*2-4

A tabela 1 ilustra melhor a sequência de potências em binário.

Tabela 1 – Potências de dois
Potência  Valor
22 4
21 2
20 1
2-1 0,5
2-2 0,25
2-3 0,125
2-4 0,0625
2-5 0,03125
Potência Valor2242122012-10,52-20,252-30,1252-40,06252-50,03125
Potência Valor
224
212
201
2-10,5
2-20,25
2-30,125
2-40,0625
2-50,03125

A aritmética de ponto fixo

A soma e a subtração de ponto fixo não difere da soma e da subtração quando fixamos a vírgula em uma dada posição. Um bom exemplo é dado por [2], se quisermos somar 9,125 com 3,9375 basta somarmos como se os dois números fossem inteiros. Em binário a soma seria da seguinte forma (figura 1):

Ponto Fixo e Ponto Flutuante: Soma com ponto fixo
Figura 1 – Soma de dois números com ponto fixo

Em Verilog são declarados das seguintes formas valores inteiros e reais:

Representação em ponto flutuante

O padrão 754 – 1985 da IEEE é o padrão da indústria que regulamenta a representação de números com ponto flutuante. O assunto é vasto e diversas são as abordagens utilizadas na manipulação desses valores (soma/subtração/divisão/multiplicação). Sugiro ao leitor uma leitura cuidadosa quando for executar qualquer operação com esses valores.

Algumas considerações

Primeiramente , a combinação da mantissa (ou significando) multiplicado pela base na potência de 10 representa um número com ponto flutuante (figura 2). Dessa forma, um número está escrito em notação científica se a parte inteira da mantissa estiver normalizada, ou seja, se a parte inteira for maior que zero e menor que a base.

Ponto Fixo e Ponto Flutuante: Ponto flutuante
Figura 2 – Número em notação científica

O padrão adotado pela IEEE para representar um número de 32 bits (também chamada de representação de PRECISÃO SIMPLES) é descrito na figura 3 abaixo.

Ponto Fixo e Ponto Flutuante: Padrão IEEE 754-1985 para ponto flutuante
Figura 3 – Padrão IEEE 754-1985 de um número com ponto flutuante com 32 bits

Na figura 1 podemos observar que o bit 31 representa o sinal do número, seguido de mais 8 bits para o expoente da base (número inteiro) e por fim 23 bits que são reservados para a mantissa.

As operações em pontos flutuantes possuem diversos algoritmos e estudos, cada um delineado para uma aplicação específica. Em [1] na página 163 existem algoritmos e exemplos de diagramas que podem ser utilizados como um início para uma implementação. Convido novamente o leitor a uma leitura mais aprofundada do assunto. Na segunda parte deste artigo iremos tratar algumas implementações utilizando Verilog e ponto flutuante.

Referências

[1] Organização e Projeto de Computadores – 4 ª Ed. 2014. Hennessy, John L.; Patterson, David A.

[2] Sistemas Digitais – Projeto, Otimização e Hdls. Vahid, Frank.

Outros artigos da série

Tutorial de Verilog – O primeiro Projeto com Quartus >>
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.

[wpseo_breadcrumb]
Comentários:
Notificações
Notificar
guest
4 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Vitor Augusto Santa Rita
Vitor
06/09/2018 20:19

O assunto de operações com ponto flutuante é interessante porque boa parte dos códigos e discussões tratam apenas de operações com números inteiros. Parabéns pela escolha. Pretendo ler a segunda parte quando vc publicar!

Marcosetha
24/05/2018 07:52

me ajudou muito , obrigado

Marcosetha
Marcos Antônio
21/05/2018 06:44

Estou com um problema no pic 18f4550. Tenho que medir uma corrente alternada e já configurei a biblioteca math.h e a minha variável é float e configurei o ad do pic certo. Porém quando quando vai até 0 ele não mostra – 1em diante. Alguém pode me ajudar? Será que o mplabx xc8 não faz isso. Já baixei o documento da microchip AN 575 MAS NÃO ME AJUDOU MUITO

Euripedes Filho
Euripedes Rocha Filho
04/06/2015 06:14

Rodrigo, importante destacar que os tipos em ponto flutuante não são sintetizáveis.

Talvez você goste:

Séries



Outros da Série

Menu
Privacy Settings saved!
Configurações de Privacidade

Entenda quais dados e informações usamos para ter melhor entrega de conteúdo personalizado para você.

These cookies are necessary for the website to function and cannot be switched off in our systems.

Para usar este site, usamos os seguintes cookies tecnicamente exigidos

  • wordpress_test_cookie
  • wordpress_logged_in_
  • wordpress_sec

Decline all Services
Accept all Services