Relatório Científico Parcial – PIBIC/CNPq

Propaganda
Relatório Científico Final
Resumo:
Este relatório trata do desenvolvimento de um circuito digital capaz de multiplicar
números binários em ponto flutuante compostos por 32 bits e representados no formato básico
de precisão simples segundo o padrão do IEEE 754. Este circuito foi desenvolvido e simulado
com o ambiente de projeto Max+Plus II da Altera, disponível no Laboratório Cientifico do
Departamento de Ciências da Computação e Estatística (DCCE) do Instituto de Biociências
Letras e Ciências Exatas (Ibilce), câmpus da Unesp de São José do Rio Preto. O circuito
resultante ocupa o equivalente a (XXX) portas lógicas e funciona a uma freqüência de
(YYY)MHz.
Índice:
Capítulo 1 – Introdução:
pg 04
Capítulo 2 – Descrição das atividades desenvolvidas:
pg 05
2.1 – Projeto do Circuito Multiplicador:
pg 05
2.2 – Módulos do circuito multiplicador:
pg 09
2.2.1 – Módulo “BIAS_C2” :
pg 09
2.2.2 – Módulo “EXP_ACRES” :
pg 10
2.2.3 – Módulo “BIT1” :
pg 10
2.2.4 – Módulo “DESLOC” :
pg 10
2.2.5 – Porta Lógica Ou – Exclusivo (“XOR2”) :
pg 10
2.2.6 – Porta Lógica Inversora (“NOT1”) :
pg 11
2.2.7 – Porta Lógica Ou (“OR2”) :
pg 11
2.2.8 - Multiplexador de 2 entradas de 8 bits cada:
pg 11
1
2.2.9 - Multiplexador de 4 entradas de 8 bits cada:
pg 13
2.2.10 - Look Ahead Carry Generator de 8 bits:
pg 13
2.2.11 - Somador completo de ponto fixo de 8 bits:
pg 16
2.2.12 - Flip Flop tipo RS:
pg 17
2.2.13 - Flip Flop tipo JK:
pg 17
2.2.14 - Flip-Flop tipo T:
pg 18
2.2.15 - Flip-Flop tipo D:
pg 19
2.2.16 - Registrador:
pg 20
2.2.17 - Registrador de Deslocamento de 4 bits:
pg 20
2.2.18 - Contador:
pg 21
2.2.19 – Módulo “Verif” :
pg XX
2.2.20 – Módulo “Multiplicando” :
pg XX
2.2.21 – Módulo “Mult_24” :
pg XX
Capítulo 3 – Análise de Resultados:
pg XX
3.1 - Resultados Obtidos:
pg XX
3.2 – Resultados Esperados:
pg XX
Conclusões:
pg XX
Referências Bibliográficas:
pg XX
Apêndice - Descrições em VHDL dos módulos
pg XX
1 - Módulo “BIAS_C2”:
pg XX
2 - Módulo “EXP_ACRES”:
pg XX
3 - Módulo “BIT1”:
pg XX
4 - Módulo “DESLOC”:
pg XX
5 - Porta Lógica Ou – Exclusivo (“XOR2”):
pg XX
6 - Porta Lógica Inversora (“NOT1”):
pg XX
7 - Porta Lógica Ou (“OR2”):
pg XX
8 - Módulo “Verif”:
pg XX
9 - Módulo “Multiplicando”:
pg XX
Lista de Figuras:
Figura 2.1.1 – Módulo “EXP”: soma dos expoentes e ajustes:
pg 05
2
Figura 2.1.2 – Determinação de overflow no cálculo dos expoentes:
pg 07
Figura 2.1.3 – Cálculo do significante resultante:
pg 08
Figura 2.1.4 - Determinação do sinal resultante:
pg 08
Figura 2.1.5 – Multiplicador de ponto flutuante:
pg 09
Figura 2.2.8 – Um multiplexador de 2 entradas:
pg 12
Figura 2.2.9 – Um multiplexador de 4 entradas:
pg 13
Figura 2.2.10.1 – Um look-ahead carry generator de 8 bits – parte 1:
pg 14
Figura 2.2.10.2 – Um look-ahead carry generator de 8 bits – parte 2:
pg 15
Figura 2.2.11 – Um somador completo de ponto fixo de 8 bits:
pg 16
Figura 2.2.12 – Um flip-flop tipo RS:
pg 17
Figura 2.2.13 – Um flip-flop tipo JK:
pg 18
Figura 2.2.14 – Um flip-flop tipo T:
pg 18
Figura 2.2.15.1 – Flip-flop tipo D a partir de um flip-flop JK:
pg 19
Figura 2.2.15.2 – Flip-flop D sensível à borda de subida:
pg 19
Figura 2.2.16 – Um registrador de 8 bits:
pg 20
Figura 2.2.17 – Um registrador de deslocamento de 4 bits:
pg 21
Figura 2.2.18 – Contador síncrono de 0 a 3:
pg 22
Figura 2.2.21.1 – Multiplicador de 24 bits:
pg XX
Figura 2.2.21.2 – Fluxograma da multiplicação binária de 24 bits:
pg XX
Figura A: Simulação do circuito multiplicador de ponto flutuante:
pg XX
Lista de Tabelas:
Tabela 2.2.5 – Comportamento da porta lógica XOR2:
pg 11
Tabela 2.2.6 – Comportamento de uma porta inversora:
pg 11
Tabela 2.2.7 – Comportamento de uma porta ou:
pg 11
Tabela 2.2.8 – Comportamento de um multiplexador de 2 entradas:
pg 12
Tabela 2.2.9 – Comportamento de um multiplexador de 4 entradas:
pg 13
Tabela 2.2.12 – Um flip-flop tipo RS:
pg 17
Tabela 2.2.13 – Um flip-flop tipo JK:
pg 18
Tabela 2.2.14 – Comportamento de um flip-flop tipo T:
pg 19
Tabela 2.2.15 – Comportamento de um flip-flop D:
pg 20
3
1 – Introdução
O objetivo deste trabalho é o desenvolvimento de um circuito digital capaz de
multiplicar números de ponto flutuante compostos por 32 bits e representados no formato
básico de precisão simples segundo o padrão do IEEE 754. O circuito multiplicador,
devidamente projetado e simulado poderá ser utilizado em um sistema digital reconfigurável.
Para tanto foi estipulado o seguinte cronograma de execução deste plano de trabalho:
•
Agosto a Outubro de 2002 - Estudo da literatura sobre projeto de circuitos aritméticos.
•
Novembro de 2002 a Janeiro de 2003 - Projeto do circuito multiplicador.
•
Fevereiro e Março de 2003 - Descrição dos módulos do multiplicador em VHDL.
•
Fevereiro de 2003 – Elaboração do relatório parcial.
•
Abril a Junho de 2003 - Simulação do circuito projetado.
•
Julho de 2003 - Elaboração do relatório final.
Este cronograma foi desenvolvido por Tiago de Oliveira até Dezembro de 2002,
quando foi substituído pelo autor deste relatório, que vem desenvolvendo o trabalho segundo
o mesmo cronograma.
Desde Novembro de 2002, o atual bolsista acompanhou as atividades do bolsista
anterior e, respeitando o seu cronograma, estudou a Linguagem de Descrição de Hardware
VHDL e aprendeu a utilizar o software Altera Max+Plus® II, para a compilação e simulação
dos circuitos.
Com isso, foram realizados a descrição dos módulos e o projeto do circuito
multiplicador, para o qual foi de extrema importância o aprendizado da caracterização de
números de ponto flutuante e o entendimento do algoritmo de multiplicação de ponto
flutuante, resumidos nos próximos 2 parágrafos.
A caracterização de números de ponto flutuante no formato básico de precisão simples
segundo o padrão do IEEE 754 se resume em um bit de sinal, um campo de 23 bits para
indicar a mantissa (significando) e outro campo de 8 bits para armazenar o expoente. Essas
informações são interpretadas da seguinte forma:
•
(-1) sinal * (significando) * 2 expoente real + bias
4
Assim, o algoritmo de multiplicação de ponto flutuante se resume em multiplicar os
significandos, somar os expoentes e verificar a ocorrência de overflow no expoente resultante.
Caso o produto dos significandos seja maior ou igual a 2, deslocá-lo uma posição para direita
e incrementar o expoente por 1. Deve ser lembrado que da soma dos expoentes, deve-se
subtrair o valor 127 referente ao bias, utilizado para normalizar o expoente.
2 – Descrição das atividades desenvolvidas:
2.1 – Projeto do Circuito Multiplicador
A figura 2.1.1 mostra como é feito o cálculo do expoente do número resultante da
multiplicação de dois números de ponto flutuante no módulo “EXP”.
Figura 2.1.1 – Módulo “EXP”: soma dos expoentes e ajustes
Para que se pudesse utilizar o mesmo somador, “ADD_8”, três vezes de forma a
economizar circuitos nesse projeto, foi de extrema importância o uso de multiplexadores, os
quais selecionam as entradas convenientes a serem somadas em ordem. Um contador síncrono
(0 a 3) externo ao módulo “EXP” controla esses multiplexadores. Quando o contador estiver
5
em 0, o multiplexador “MUX_4x8” vai selecionar “exp_A[7..0]” e o “MUX_2x8”,
“exp_B[7..0]” de forma a ser realizada a soma dos expoentes iniciais. A seguir, eles
selecionam respectivamente “BIAS[7..0]” e “EXP[7..0]” (resultado da primeira soma) de
forma que o resultado obtido sofre uma subtração de (127)10 no próprio módulo “ADD_8”
para que o expoente não receba o valor referente ao bias duas vezes. Finalmente, os
multiplexadores vão selecionar “EXP[7..0]” e “EXP_AC[7..0]”, cujo bit mais significativo é
“result_m[24]”, o bit mais significativo de “result_m[24..0]” (resultado da multiplicação dos
significandos “fracao_A[22..0]” e “fracao_B[22..0]”), e cujos outros bits têm nível lógico “0”.
Desta forma, se a multiplicação dos significantes resultar em um número maior do que 2(10), o
significante resultante, “fracao[22..0]’, é deslocado para a direita (seu valor é dividido por 2) e
o expoente é incrementado por 1 no módulo “EXP_ACRES”. Com isso, o resultado está
sempre respeitando a caracterização de números em ponto flutuante.
Para determinar a ocorrência de overflow no circuito temos de verificar dois casos:
overflow na subtração do bias e overflow na última soma que incrementa o expoente segundo
o resultado da multiplicação das mantissas.
O overflow na subtração apenas ocorre quando os valores do bit mais significativo do
resultado da subtração e do carry de saída (sinal de vai um) tiverem nível lógico distintos.
Assim, uma porta ou-exclusivo (“XOR2”) com as entradas citadas acima tem como saída, na
ocorrência de overflow, nível lógico “1”. Já o overflow na última soma é verificado quando
seu carry de saída, tiver nível lógico “1”. Assim, para determinar a ocorrência de overflow no
circuito, basta usar como entradas numa porta ou (“OR2”) os sinais de overflow citados
acima.
Como no módulo “EXP” foi utilizado o mesmo somador várias vezes, são
armazenados em registradores os valores a serem verificados para determinação de overflow.
A figura 2.1.2 destaca a determinação de overflow no módulo “EXP”, segundo o uso de tais
registradores.
6
Figura 2.1.2 – Determinação de overflow no cálculo dos expoentes
O cálculo do significante resultante da multiplicação de dois números de ponto
flutuante é ilustrado na figura 2.1.3.
Figura 2.1.3 – Cálculo do significante resultante
Os dois significantes, “fracao_A[22..0]” e “fracao_B[22..0]”, recebem em “BIT1” o
bit escondido necessário para se calcular a mantissa (significante) resultante. Após esta etapa,
ambos valores são multiplicados em “MULT_24” e o resultado é armazenado no vetor
“result_m[24..0]”. Se por acaso o bit mais significativo de “resul_m[24..0]”, o “resul_m[24]”,
tiver nível lógico “1”, o valor de “resul_m[24..0]” sofre um deslocamento para a direita (o seu
7
valor é dividido por dois) e o expoente é incrementado por 1 em “EXP_ACRES”, como já
visto anteriormente. O módulo que faz esse deslocamento é o “DESLOC” e este tem como
saída “fracao[22..0]”, o significante resultante do multiplicador de ponto flutuante. Se
“resul_m[24]” tiver nível lógico “0”, o valor de result_m[24..0] não sofrerá nenhuma
alteração em “DESLOC” e será atribuído a “fracao[23..0]”.
O módulo “EXP_ACRES”
também esconde novamente o bit escondido considerado inicialmente para a multiplicação
das mantissas.
A determinação do sinal resultante do multiplicador de ponto flutuante é muito
simples e é ilustrado na figura 2.1.4.
Figura 2.1.4 - Determinação do sinal resultante
Se ambos os sinais de entrada, “sinal_A” e “sinal_B”, tiverem o mesmo valor, o sinal
resultante, “sinal”, será positivo, o que é representado pelo nível lógico “0”. Caso contrário,
“sinal” é negativo e é representado pelo nível lógico “1”. Essa determinação é feita através de
uma porta ou-exclusivo, “XOR2”, cujas entradas são “sinal_A” e “sinal_B” e cuja saída é
“sinal”.
Finalmente, a figura 2.1.5 mostra o multiplicador de ponto flutuante com todos os
seus principais módulos reunidos.
8
Figura 2.1.5 – Multiplicador de ponto flutuante
2.2 - Descrição dos módulos do circuito multiplicador em VHDL
Os módulos de soma e subtração de ponto fixo, o módulo de multiplicação de ponto
fixo, assim como registradores e contadores foram desenvolvidos para a conclusão do projeto
em questão. Os módulos utilizados no projeto são descritos e explicados a seguir:
2.2.1 – Módulo “BIAS_C2”:
Este módulo não tem porta de entrada e a sua porta de saída é atribuído o valor
(110000001)16, o qual é o complemento de dois do valor do bias excedente, (127)10. Foi
utilizado o valor em complemento de dois para que a subtração pudesse ser feita através de
um somador, que será visto adiante.
9
2.2.2 – Módulo “EXP_ACRES”:
Este módulo é responsável em informar o valor a que somar o resultado da soma dos
expoentes, “result[7..0]”. Dependendo desse valor, o expoente poderá ser incrementado por 1.
Se “result_m[24]” tiver nível lógico “1” (resultado da multiplicação dos significantes é
maior do que 2), o módulo “EXP_ACRES retornará o valor “10000000”, o que será
somado a “result[7..0]”, resultado da soma dos expoentes, de forma a incrementar o expoente.
Caso contrário, “result[7..0]” será somado com “00000000” e não sofrerá, portanto,
nenhuma alteração, ou seja, o expoente não será incrementado.
2.2.3 – Módulo “BIT1”:
Esse módulo acrescenta o bit escondido com nível lógico “1” ao valor de
“fracao_A[22..0]” e de “fracao_B[22..0]” para que ambos sejam significantes válidos e,
assim, possam ser multiplicados. O módulo recebe um vetor de 23 bits e tem como saída um
outro vetor de 24 bits, cujo bit mais significativo apresenta nível lógico 1.
2.2.4 – Módulo “DESLOC”:
Este módulo desloca para a direita o valor de “result_m[24..0]”, resultado da
multiplicação dos significandos, caso este valor seja maior ou igual a 2. O módulo ainda
retorna o significante resultante, “fração[22..0]”, sem o bit escondido, antes acrescentado pelo
módulo “BIT1” no início do cálculo.
2.2.5 – Porta Lógica Ou – Exclusivo (“XOR2”):
Este modulo é a função lógica ‘ou exclusivo’ para duas entradas. Dadas duas entradas
binárias, a saída terá nível lógico “1” apenas se exclusivamente uma das entradas tiver nível
lógico “1”. A tabela-verdade 2.2.5 apresenta o seu comportamento.
10
Entrada A
Entrada B
Saída
0
0
0
0
1
1
1
0
1
1
1
0
Tabela 2.2.5 – Comportamento da porta lógica XOR2
2.2.6 – Porta Lógica Inversora (“NOT1”):
Este módulo é a função lógica inversora. Para toda entrada, a saída terá um nível
lógico inverso ao da entrada. A tabela-verdade 2.2.6 apresenta o seu comportamento.
Entrada
Saída
0
1
1
0
Tabela 2.2.6 – Comportamento de uma porta inversora
2.2.7 – Porta Lógica Ou (“OR2”):
Dadas duas entradas, a saída terá nível lógico “1” se pelo menos uma das entradas
também tiver o valor lógico “1”. A tabela-verdade 2.2.7 apresenta o seu comportamento.
Entrada A
Entrada B
Saída
0
0
0
0
1
1
1
0
1
1
1
1
Tabela 2.2.7 – Comportamento de uma porta ou
2.2.8 - Multiplexador de 2 entradas de 8 bits cada
A figura 2.2.8 mostra um MUX de duas entradas e uma saída, cada qual de 8 bits.
11
Figura 2.2.8 – Um multiplexador de 2 entradas
O circuito escolhe, por meio se sua variável seletora, qual dos dois vetores de bits de
entrada será atribuído à saída. A tabela-verdade 2.2.6 apresenta o seu comportamento.
Seleção
Saída (Y[7..0]
0
A[7..0]
1
B[7..0]
Tabela 2.2.8 – Comportamento de um multiplexador de 2 entradas
Caso a entrada SEL=0, a multiplexador atribuirá para a saída a entrada A[7..0]. Caso
contrário, B[7..0.]
12
2.2.9 - Multiplexador de 4 entradas de 8 bits cada
A figura 2.2.9 mostra um MUX de quatro entradas e uma saída, cada qual de 8 bits.
Figura 2.2.9 – Um multiplexador de 4 entradas
O circuito escolhe, por meio de suas duas variáveis seletoras, qual dos quatro vetores
de entrada será atribuído à saída. A tabela-verdade 2.2.9 apresenta o seu comportamento.
Seletor A
Seletor B
Saída[7..0]
0
0
E0[7..0]
0
1
E1[7..0]
1
0
E2[7..0]
1
1
E3[7..0]
Tabela 2.2.9 – Comportamento de um multiplexador de 4 entradas
O vetor E0[7..0] apenas está habilitado para a saída se A=0 e B=0. Do mesmo modo
os vetores E1[7..0], E2[7..0] e E3[7..0] se A=0 e B=1, A=1 e B=0 e A=B=1, respectivamente.
2.2.10 - Look Ahead Carry Generator de 8 bits
As figuras 2.2.10.1 e 2.2.10.2 mostram o diagrama de um look-ahead carry generator,
o qual é utilizado em um somador paralelo, que será explicado adiante.
13
Figura 2.2.10.1 – Diagrama de um look-ahead carry generator de 8 bits – parte 1
14
Figura 2.2.10.2 – Diagrama de um look-ahead carry generator de 8 bits – parte 2
Esse circuito tem a capacidade otimizar a velocidade da obtenção do resultado em um
somador, por exemplo. A expressão [1] que define o carry é dada por c(i+1)=g(i)+p(i)c(i),
onde
p(i) e g(i) são os tipos de carry propagate e generate, respectivamente, com
p(i)=x(i)⊕y(i), g(i)=x(i)y(i) (x(i) e y(i) são as parcelas da soma)
15
Para somadores com quantidades diferentes de bits, o procedimento para a construção
dos respectivos look-ahead carry generators é semelhante.
2.2.11 - Somador completo de ponto fixo de 8 bits
Este somador [1] empregou a técnica look-ahead carry generator descrita acima e faz
a soma completa de dois números de 8 bits cada. A figura 2.2.11 mostra o circuito em
questão.
Figura 2.2.11 – Um somador completo de ponto fixo de 8 bits
Os carries são propagados através do look-ahead carry generator e aplicados a
entradas de portas ou-exclusivo. Isso produz uma soma sem o atraso provocado pelo
cascateamento do sinal de carry como num somador mais simples.
16
2.2.12 - Flip Flop tipo RS
A figura 2.2.12 ilustra um flip-flop tipo RS [2], um circuito capaz de reter informações
quando a entrada do clock assumir valor 1. A tabela 2.2.12 mostra o comportamento do
circuito quando CK=1.
Figura 2.2.12 – Um flip-flop tipo RS
Entrada R Entrada S Saída
0
0
Qant
0
1
1
1
0
0
1
1
Não permitido
Tabela 2.2.12 – Comportamento de um flip-flop tipo RS
O circuito não atribui nenhuma modificação na saída se ambas entradas, S e R, forem
0. Se R=1, o flip-flop é setado e à saída Q é atribuído o valor lógico 1 e se S=1, o flip-flop é
resetado e Q=0. Para o perfeito funcionamento do circuito, deve-se evitar adotar S = R = 1,
pois tal procedimento tentaria ajustar (set) e reajustar (reset) o flip-flop ao mesmo tempo, e o
resultado seria ambíguo. Como solução a esse problema, pode-se prover terminais adicionais
nas portas de entrada e fazer ligações entre as saídas e as entradas, transformando o simples
flip-flop RS em um flip-flop tipo JK, explicado a seguir.
2.2.13 - Flip Flop tipo JK
O flip-flop JK [2] nada mais é que um flip-flop RS realimentado da maneira mostrada
na figura 2.2.13. Seu comportamento é ilustrado na tabela 2.2.13.
17
Figura 2.2.13 – Um flip-flop tipo JK
Entrada J
Entrada K Saída
0
0
Qant
0
1
1
1
0
0
1
1
(Qant)`
Tabela 2.2.13 – Comportamento de um flip-flop tipo JK
2.2.14 - Flip-Flop tipo T
Este flip-flop [2] é obtido a partir de um JK com as entradas J e K curto-circuitadas.
Logo, quando J assumir valor 1, K também assumirá valor 1, e o mesmo acontece para J=0. A
sigla T vem de “Toggle” (comutado). A figura 2.2.14 mostra a ligação citada acima e a tabela
2.2.14 ilustra seu comportamento.
Figura 2.2.14 – Um flip-flop tipo T
T
Saída
0
0
1
1
Tabela 2.2.14 – Comportamento de um flip-flop tipo T
18
2.2.15 - Flip-Flop tipo D
O Flip-Flop tipo D [2] é obtido a partir de um flip-flop JK com a entrada K invertida
(por inversor) em relação a J. Neste flip-flop, existem as seguintes entradas possíveis: J = 0 e
K = 1 ou J = 1 e K = 0. Pela capacidade de passar para a saída (Q) e armazenar o dado
aplicado na entrada D, este flip-flop foi empregado como célula de registradores do
deslocamento e outros sistemas de memória que serão vistos adiante. A sigla D vem de
“Data” (dado), termo original em inglês. A figura 2.2.15 .1 mostra como o circuito é obtido a
partir de um flip-flop tipo JK e a figura 2.2.15.2 mostra sua implementação. A tabela 2.2.15
ilustra o comportamento do circuito.
Figura 2.2.15.1 – Flip-flop tipo D a partir de um flip-flop JK
Figura 2.2.15.2 – Flip-flop D sensível à borda de subida
T
Saída
0
1
1
0
Tabela 2.2.15 – Comportamento de um flip-flop D
19
2.2.16 - Registrador
Os registradores [2] são dispositivos nos quais
se pode escrever uma "palavra"
(conjunto de números binários ou bits) e dos quais se pode ler uma palavra armazenada
quando se desejar. Os registradores são, portanto, memórias nas quais se pode escrever dados
para referência futura. Um registrador é formado por um conjunto de flip-flops conectados
entre si. Para que o registrador armazene um número binário, deverá haver para cada bit da
palavra armazenada um flip-flop que seja conectado aos demais de forma que o número
binário possa ser inserido (deslocado) no registrador e possivelmente deslocado para fora. A
figura 2.2.16 mostra como o um registrador de 8 bits é obtido.
Figura 2.2.16 – Um registrador de 8 bits
Para desenvolver um registrador de n bits, basta usar n flip-flops em vez dos quatro
usados na figura acima.
2.2.17 - Registrador de Deslocamento de 4 bits
Uma característica útil que pode ser incorporada a um registrador é a habilidade de
executar a operação de deslocamento [2]. A figura 2.2.17 ilustra um tipo de registrador de
deslocamento de quatro bits que usa flip-flops tipo D.
20
Figura 2.2.17 – Um registrador de deslocamento de 4 bits
A ligação de cada flip-flop ao anterior à esquerda é feita para que a cada transição do
relógio o estado do flip-flop anterior seja transferido ao flip-flop seguinte. O bit armazenado
no último flip-flop do registrador de deslocamento é perdido, isto é, é deslocado para o
circuito externo. É atribuída à entrada de dados uma seqüência de bits em sincronismo com o
relógio, o que implica que todos os flip-flops sejam acionados pelo mesmo sinal de relógio e
que os dados de entrada sejam alterados uma e somente uma vez por ciclo de relógio.
Para o desenvolvimento de registradores de deslocamento de n bits, basta usar n flipflops em vez dos 4 usados na figura acima.
2.2.18 - Contador
Contadores [2] são circuitos digitais que variam os seus estados, sob o comando de um
clock, de acordo com uma seqüência predeterminada. Os contadores são basicamente
constituídos de um arranjo de n flip-flops, que avança de um estado para outro em resposta a
um evento (um ciclo de um sinal de relógio, por exemplo). Em qualquer hipótese o contador
conta o número de eventos. Existem dois tipos básicos de circuitos contadores: contadores
síncronos e contadores assíncronos.
O contador síncrono, utilizado no projeto, é um contador cujos todos flip-flops
recebem o sinal do clock simultaneamente. Este circuito possui entradas clock curtocircuitadas, as quais entram em todos os flip-flops ao mesmo tempo e fazem com que todos
estes atuem de forma sincronizada. Alem disso, o contador em questão conta de 0 a 3 e
reinicia a contagem. A figura 2.2.18 mostra como o circuito é obtido.
21
Figura 2.2.18 – Contador síncrono de 0 a 3
Uma das principais características dos contadores síncronos refere-se à velocidade
pois, uma vez que todos os flip-flops são disparados ao mesmo tempo, o tempo de atraso não
é aditivo, como ocorre no contador assíncrono.
2.2.19 – Módulo “Verif”
Esse módulo faz a verificação se o contador de seqüência do módulo multiplicador já
se tornou 0. Esse procedimento é importante para determinar a conclusão do cálculo do
produto de dois números num multiplicador binário, como vai ser visto adiante.
Módulo 2.2.20 – Módulo “Multiplicando”
Este módulo determina se o multiplicando vai ser somado ou não ao produto parcial
do multiplicador. A soma apenas acontece quando o bit menos significativo do multiplicador
tem valor 1.
2.2.21 – Módulo “Mult_24”
O multiplicando está no registrador “B” (24 bits) e multiplicador no registrador “Q”
(24 bits). Os registradores A (24 bits) e E (1 bit) são utilizados, respectivamente, para
armazenar a parcela mais significativa do resultado da multiplicação e para armazenar o carry
de saída. Para armazenar a parcela menos significativa do produto será utilizado mais uma vez
22
o registrador “Q” e para determinar a quantidade de somas parciais do multiplicador será
usado o contador de seqüência “SC”. A figura 2.2.21.1 a seguir ilustra essa configuração.
Figura 2.2.21.1 – Multiplicador de 24 bits
Inicialmente, “A” e “E” são resetados e ao contador de seqüência “SC” atribui-se o
valor 24(10)=11000(2) (quantidade de bits do multiplicador). Assume-se que os operandos são
transferidos através de uma unidade de memória de 24 bits.
Após essa inicialização, o bit menos significativo do multiplicador “Q” é testado. Se
seu valor for 1, o multiplicando em “B” é adicionado ao atual produto em “A”. Mas se o seu
valor for 0, nada é feito. O registrador “EAQ” é, então, deslocado uma vez para direita para
formar o novo produto parcial. O contador de seqüência é decrementado de 1 e seu novo valor
é checado. Se este valor não for 0, o processo é repetido e um novo produto parcial é formado.
O processo pára quando “SC” = 0. Nota-se que o produto parcial formado em “A” é
deslocado para “Q” um bit por vez .
O produto final fica disponível nos registradores “A” e “Q”, sendo que “A” detém os
bits mais significativos e “Q”, os menos significativos. Além disso, em “E” fica disponível o
carry de saída. Como cada operando tem 24 bits, o resultado final da multiplicação terá 48
bits.
A figura 2.2.21.2 apresenta um fluxograma que ilustra esse comportamento.
23
Figura 2.2.21.2 – Fluxograma da multiplicação binária de 24 bits
3 – Análise de Resultados:
O projeto descrito acima foi compilado no Altera Max+Plus® II sem notificação de
erros. O compilador do software primeiro extrai informações que definem as conexões
hierárquicas entres os arquivos de design do projeto, para que então seja feita uma checagem
por erros. Depois de criar um mapa organizacional para o projeto, ele combina todos os
arquivos de design em um banco de dados para realizar processamentos, como simulação, por
exemplo.
3.1 - Resultados Obtidos:
Desde Julho desse ano, o atual bolsista realizou, além de estudos a respeito de
circuitos aritméticos, várias modificações ao projeto de forma que o mesmo foi quase que
totalmente alterado. Foram desenvolvidos vários circuitos de extrema importância para o
24
projeto, como registradores de armazenamento, registradores de deslocamento, registradores
de armazenamento e deslocamento, contadores síncronos e multiplexadores.
Com intuito de economizar o número de circuitos utilizados no projeto, foi
desenvolvido, através da técnica look ahead carry generator, um somador de ponto fixo de 8
bits, o qual tem saída realimentada, o que permite a economia de circuitos durante o cálculo
do expoente. Multiplexadores, controlados por um contador síncrono, são encarregados de
determinar as entradas convenientes ao somador de ponto fixo em cada momento diferente do
processo do cálculo do expoente final e registradores são empregados com o intuito de
armazenar valores importantes para a verificação de ocorrência de overflow nesse mesmo
cálculo.
Por fim, foi criado um multiplicador de ponto fixo de 24 bits para o cálculo do
significante resultante, o qual utiliza um somador de ponto fixo de 24 bits e também foi
desenvolvido de forma a utilizar a menor quantidade possível de circuitos.
Após algumas simulações, pode-se concluir da análise dos resultados que os
procedimentos de verificação do sinal resultante e o cálculo do expoente resultante estão
corretos. A figura A, ilustra esta análise.
Figura A: Simulação do circuito multiplicador de ponto flutuante.
Neste exemplo, os sinais dos números multiplicando (“sinal_A”) e multiplicador
(“sinal_b”) são positivos, o que resulta num outro sinal positivo após a multiplicação. Além
disso, “exp_A[7..0]” assume o valor (01111111)2 e “exp_B[7..0]”, (00000000)2. Como ambos
25
expoentes recebem o valor do bias, o resultado da soma dos expoentes, “exp[7..0]”, é
calculado da seguinte forma:
[(01111111)2 - (127)10] + [(00000000)2 - (127)10] = [(01111111)2 - (127)10].
“exp[7..0]” é ilustrado com o valor (00000000)2 pois também recebe o valor do bias.
O cálculo do significante ainda não está perfeito, pois o multiplicador de ponto fixo
ainda apresenta algumas falhas e necessita de correções, o que compromete a verificação da
ocorrência de overflow.
3.2 – Resultados Esperados:
Espera-se que o circuito multiplicador apresentado nesse relatório esteja otimizado o
suficiente para que o mesmo possa ser inserido em um sistema digital reconfigurável, como
foi dito na introdução deste relatório.
Conclusões:
Não obstante um menor tempo atribuído ao atual bolsista para realizar tanto o estudo
da literatura sobre projeto de circuitos aritméticos, quanto o projeto do circuito multiplicador,
a descrição dos módulos do multiplicador em VHDL, a simulação do circuito projetado e a
elaboração de relatórios, e, embora o mesmo ainda não tivesse realizado a disciplina
“Arquitetura e Organização de Computadores” quando assumiu o projeto, pode-se concluir
que o projeto procedeu satisfatoriamente: o atual bolsista fixou conceitos já antes estudados a
cerca de circuitos eletrônicos, aprendeu novas técnicas para o desenvolvimento de circuitos
aritméticos, familiarizou-se com a linguagem de descrição de hardware VHDL e aprendeu a
lidar com um novo ambiente de projeto, o Max+Plus II da Altera.
O aluno de graduação fica muito satisfeito com a conclusão do projeto e ansioso para
o desenvolvimento de novos projetos semelhantes. Como sugestão para trabalhos futuros,
recomenda-se incluir métodos de tratamento de overflow e correções ao cálculo do
significando resultantes. Além disso, seria muito interessante modificar o projeto do
multiplicador de ponto flutuante de modo a operar por processamento pipeline, buscando com
isso, significativo aumento na velocidade de processamento.
26
Referências Bibliográficas:
[1] – M. M. Mano Digital Design, second edition, Prentice Hall, 516 páginas, 1991
[2] – H. Taub Circuitos Digitais e Microprocessadores, McGraw-Hill
Apêndice - Códigos em VHDL dos módulos usados no projeto:
1 - Módulo “BIAS_C2”:
entity bias_C2 is
port( data_out: out bit_vector(8 downto 0));
end bias_C2;
architecture structural of bias_C2 is
begin
data_out <= "110000001";
end structural;
2 - Módulo “EXP_ACRES”:
entity exp_acres is
port(
data_in: in bit;
data_out: out bit_vector(7 downto 0));
end exp_acres;
architecture structural of exp_acres is
begin
data_out(6 downto 0) <= "0000000";
27
data_out(7) <= data_in; -- valor de result_m[24]
end structural;
3 - Módulo “BIT1”:
entity bit1 is
port(
data_in: in bit_vector(22 downto 0);
data_out: out bit_vector(23 downto 0));
end bit1;
architecture structural of bit1 is
begin
data_out(22 downto 0) <= data_in;
data_out(23) <= '1'; -- bit escondido
end structural;
4 - Módulo “DESLOC”:
entity desloc is
port( data_in: in bit_vector(24 downto 0);
data_out: out bit_vector(22 downto 0));
end desloc;
architecture behavior of desloc is
begin
process(data_in)
28
begin
if( data_in(24) = '1') then
for i in 0 to 22 loop
data_out(i)<= data_in(i + 1); -- desloca-- mento
end loop;
else
data_out <= data_in(22 downto 0);
end if;
end process;
end behavior;
5 - Porta Lógica Ou – Exclusivo (“XOR2”):
entity xor2 is PORT(
a,b: in bit;
c: out bit
);
29
end xor2;
architecture dataflow of xor2 is
begin
c <= a xor b;
end dataflow;
6 - Porta Lógica Inversora (“NOT1”):
entity not1 is port(
a: in bit;
b: out bit
);
end not1;
architecture dataflow of not1 is
begin
b <= not a;
end dataflow;
7 - Porta Lógica Ou (“OR2”):
entity or2 is port(
30
a, b: in bit;
c: out bit
);
end or2;
architecture dataflow of or2 is
begin
c <= a or b;
end dataflow;
8 - Módulo “Verif”
entity verif is
port( data_in: in bit_vector(4 downto 0);
data_out: out bit);
end verif;
architecture behavior of verif is
begin
process(data_in)
begin
31
if( data_in(4) = '0' AND data_in(3) = '0' AND
data_in(2) = '0' AND
data_in(1) = '0' AND data_in(0) = '0') then
data_out<= '1';
else
data_out<= '0';
end if;
end process;
end behavior;
9 - Módulo “Multiplicando”
entity multiplicando is
port( data_in1: in bit_vector(23 downto 0);
data_in2: in bit;
data_out: out bit_vector(23 downto 0));
end multiplicando;
architecture behavior of multiplicando is
begin
process(data_in1)
begin
32
if( data_in2 = '0') then
data_out(23 downto 0) <=
"000000000000000000000000";
else
data_out(23 downto 0) <= data_in1(23
downto 0) ;
end if;
end process;
end behavior;
33
Download