• Nenhum resultado encontrado

2.3 LÓGICA RECONFIGURÁVEL

2.3.2 VHDL

2.3.2.1 Aritmética de ponto fixo e ponto flutuante no VHDL-2008

O VHDL carecia de suporte à síntese para números fracionários, contando no máximo com suporte limitado ao tipo real. Por isso, no VHDL-2008 foram introduzidos pacotes de aritmética de ponto fixo e ponto flutuante com suporte à síntese (PEDRONI, 2010). Apesar de preliminares e ainda não incorporados ao VHDL, os pacotes já são utilizáveis. Também foram criadas versões dos pacotes compatíveis com o VHDL-1993. Ambos os pacotes foram desenvolvidos e disponibilizados por Bishop (2008a, 2008b).

Ponto fixo (FI):

O ponto fixo é um passo intermediário entre a aritmética de inteiros e o ponto flutuante, método comumente utilizado em software. Uma variável ponto fixo pode ser descrita como um inteiro com um ponto decimal em determinada posição. Segundo Bishop (2008a), a aritmética de ponto fixo pode utilizar até três vezes menos hardware que o ponto flutuante. Como é base- ado em aritmética de inteiros, o ponto fixo é altamente eficiente, desde que não haja variações grandes de magnitude. Caso o intervalo seja definido de forma a ter a precisão necessária, o ponto fixo é suficiente para a maioria das aplicações de DSP. Assim sendo, foi definido como o tipo de variáveis sintetizáveis utilizado neste trabalho.

O pacote ponto fixo de Bishop (2008a) define dois tipos: ufixed (ponto fixo não sinali- zado) e sfixed (ponto fixo sinalizado). Eles são definidos como:

type ufixed is array (INTEGER range <>) of STD_LOGIC; -- não sinalizado

type sfixed is array (INTEGER range <>) of STD_LOGIC; -- sinalizado

Neste trabalho foi utilizado o sfixed, pois alguns coeficientes beta e também a função exponencial podem assumir valores negativos. Na Seção 3.3 será descrito como foi determinado a faixa de valores das variáveis ponto fixo utilizadas na implementação proposta. A faixa é importante pois define a precisão em que as variáveis poderão operar. Por exemplo, seja um sinal ponto fixo definido como

SIGNAL x: UFIXED (4 DOWNTO -5); -- equivalente a xxxxx.xxxxx

significa que x é um sinal ponto fixo não sinalizado com largura de 10 bits, sendo 5 bits de parte inteira (valor máximo: 25= 32) e 5 bits de parte fracionária (25= 32 valores possíveis, com

passos de 1/(25) = 0, 03125).

O pacote de ponto fixo também inclui algumas funções auxiliares que foram úteis neste trabalho:

1. resize: devido ao fato de as regras de manipulação de bits, ao realizar cálculos, serem de complicada manipulação manual (ver Tabela 3), Bishop (2008a) elaborou esta função a fim de facilitar o cálculo entre valores de diferentes faixas de bits. Por exemplo:

SIGNAL a: SFIXED (5 DOWNTO -4); SIGNAL b: SFIXED (2 DOWNTO -6); SIGNAL c: SFIXED (4 DOWNTO -3); ...

c <= resize(a*b, c’HIGH, c’LOW); -- idem a resize(a*b, c);

Neste caso, c receberá o valor de a ∗ b e adequará o resultado à sua faixa, truncando os valores se necessário. Existe também a opção de definir como parâmetros o tipo de arredondamento e o procedimento no caso de um overflow.

Tabela 3: Ranges resultantes para operações de ponto fixo.

Operação Range do resultado

A+B MAX(A’left, B’left)+1 DOWNTO MIN(A’right, B’right) A-B MAX(A’left, B’left)+1 DOWNTO MIN(A’right, B’right)

A*B A’left + B’left+1 DOWNTO A’right + B’right

A REM B MIN(A’left, B’left) DOWNTO MIN(A’right, B’right) Divisão sinalizada A’left - B’right+1 DOWNTO A’right - B’left A MOD B sinalizado MIN(A’left, B’left) DOWNTO MIN(A’right, B’right) reciprocal(A) sinalizado -A’right DOWNTO -A’left-1

ABS(A) A’left +1 DOWNTO A’right

-A A’left +1 DOWNTO A’right

Divisão não sinalizada A’left - B’right DOWNTO A’right - B’left -1 A MOD B não sinalizado B’left DOWNTO MIN(A’right, B’right) reciprocal(A) não sinalizado -A’right +1 DOWNTO -A’left

2. to_sfixed e to_ufixed: convertem números ou sinais de outros tipos para sfixed ou ufixed. Assim como na função resize, deve ser definida a faixa do sinal resultante. Pode ser usado, por exemplo, nas expressões a seguir:

SIGNAL a: INTEGER;

SIGNAL b: SFIXED (5 DOWNTO -4); ...

b <= to_sfixed(a, b’HIGH, b’LOW) b <= to_sfixed(5.397, b);

3. reciprocal: realiza a operação 1/x em um dado valor. É interessante para, por exemplo, se obter o inverso de uma constante para então realizar uma multiplicação, ao invés de uma divisão, poupando recursos de hardware.

O pacote também define operações lógicas, aritméticas, de comparação, deslocamento e leitura/escrita de texto. As operações aritméticas são construídas com vetores suficientemente grandes de forma a sempre evitar overflow.

Ponto flutuante (FP):

O ponto flutuante é uma representação de números largamente utilizada em computa- ção. Diversas representações já foram implementadas, mas desde a década de 90 as representa- ções definidas pelo padrão IEE 754 (IEEE Computer Society, 2008) são largamente adotadas. Um número em ponto flutuante pode ser representado por

±M × B±e, (20)

em que M é a mantissa (parte fracionária); B é a base; e e o expoente. O termo ponto flutuante refere-se ao fato do ponto decimal poder "flutuar", i.e., pode ser posicionado em qualquer lugar em relação aos algarismos significativos. O ponto flutuante é um sistema cujo sinal é processado à parte da magnitude. A Figura 6 ilustra a distribuição dos bits em uma representação ponto flutuante de 32 bits.

Sinal Expoente (E) Fração (F)

1 bit 8 bits 23 bits

27 26 25 ... 22 21 20 2-1 2-2 2-3 ... 2-21 2-22 2-23

Figura 6: Representação de um número ponto flutuante de 32 bits. Fonte: Adaptado de Pedroni (2010).

O pacote desenvolvido por Bishop (2008b) define quatro tipos:

TYPE FLOAT IS ARRAY (INTEGER range <>) of STD_LOGIC; -- tamanho genérico

TYPE FLOAT32 IS FLOAT(8 DOWNTO -23); -- IEEE 754 32 bits TYPE FLOAT64 IS FLOAT(11 DOWNTO -52); -- IEEE 754 64 bits TYPE FLOAT128 IS FLOAT(15 DOWNTO -112); -- IEEE 754 128 bits

O pacote ponto flutuante também define operações básicas e funções de conversão, tal como no pacote ponto fixo.

2.4 CONSIDERAÇÕES FINAIS DO CAPÍTULO

Nesse capítulo foram apresentados conceitos teóricos que embasam o desenvolvimento deste trabalho. Primeiramente, foram descritos conceitos de vídeo e televisão digital, e em se- guida descrita a avaliação de qualidade de vídeo digital, com destaque para o método NRVQA- LM (Equação 19). Por fim, foram descritos os aspectos teóricos acerca de lógica reconfigurável, em especial detalhes sobre a linguagem VHDL, bem como questões relativas às aritméticas de ponto fixo e ponto flutuante, que serão utilizadas para a implementação do método NRVQA-LM em hardware. O próximo capítulo descreverá o processo de desenvolvimento e implementação.

3 IMPLEMENTAÇÃO DO MÉTODO NRVQA EM LR

Este capítulo discorre sobre o planejamento e a efetiva implementação do método NRVQA-LM em lógica reconfigurável. Algumas regras gerais para a implementação foram definidas antes de se iniciar o processo:

• Implementar o método da forma mais genérica possível. Isso implica em deixar flexíveis parâmetros que podem mudar de acordo com a aplicação, tal como a resolução do vídeo e número de quadros analisados, de forma a serem configurados para se adequar a qualquer cenário;

• Elaborar pacotes (packages) para facilitar o entendimento e reaproveitamento do código. Isso se aplica especialmente às funções matemáticas, mas também ao código principal;

• Planejar e implementar o método de forma otimizada, quando possível, de maneira a visar poupar elementos lógicos e recursos de memória.

As próximas Seções deste capítulo versam sobre o pré-planejamento da implementa- ção, o projeto em RTL e, por fim, sobre a codificação em VHDL.

Documentos relacionados