projeto de circuitos aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · a...

12
Projeto de Circuitos Aritméticos (2012) 1 RESUMO Nesta experiência será desenvolvido um circuito aritmético usando a metodologia estruturada apresentada nas experiências anteriores. É introduzido também o projeto usando linguagens de descrição de hardware. A parte experimental consiste do projeto de um circuito de divisão inteira desenvolvido usando componentes digitais básicos e também com a linguagem de descrição de hardware VHDL. 1. PARTE TEÓRICA 1 1.1. Multiplicação Binária Uma das operações mais custosas em um computador digital é a multiplicação binária. Ela pode ser implementada usando-se o algoritmo tradicional de multiplicação decimal que é ensinada nas aulas de Ensino Fundamental, também conhecido como algoritmo de lápis e papel. Apresentamos aqui os princípios fundamentais de operação do algoritmo tradicional e de um algoritmo melhorado. Algoritmo Tradicional Quando aprendemos a realizar a multiplicação de dois números inteiros no Ensino Fundamental, o processo para efetuar a operação é normalmente composto por uma série de somas. Transpondo este procedimento para a aritmética binária, temos sucessivas somas de valores binários. Como os dígitos na aritmética binária são 0 ou 1, o processo de multiplicação envolve sucessivas somas do multiplicando ou de zero em função de cada bit do multiplicador. O algoritmo tradicional de multiplicação binária de dois números binários sem sinal é feita com sucessivos deslocamentos do multiplicando à esquerda (que constituem as parcelas do cálculo dos produtos parciais) e uma soma. Para exemplificar, vamos executar este algoritmo com os números binários 1101 2 e 1011 2 , como ilustrado abaixo (fig.1.1). 13. 1101. multiplicando x 11. x 1011. multiplicador 1101. . 1101 . 0000 . . 1101 . produtos parciais 143. 10001111. produto Figura 1.1. Exemplo de multiplicação com algoritmo tradicional. A execução do algoritmo leva em consideração um bit do multiplicador de cada vez, com o bit menos significativo em primeiro lugar. Se o bit do multiplicador for 1, o multiplicando é copiado para ser somado posteriormente. Em caso contrário, se o bit do multiplicador for 0, um valor nulo é copiado em seu lugar. Os números copiados em linhas sucessivas são deslocados à esquerda de uma posição em relação à linha anterior. Finalmente, os números são somados gerando o produto final. Um circuito digital que implementa este algoritmo deve executar esta soma em etapas. Assim, quando um novo número for copiado, duas parcelas devem ser somadas gerando uma soma parcial. Ilustramos abaixo (fig.1.2) esta modificação no mesmo exemplo acima. Este algoritmo tradicional tem um requisito muito forte em relação à soma dos produtos parciais. Como são somadas n produtos parciais de n bits cada uma, é necessário um circuito somador com 2n bits. Isto representa uma questão que deve ser levado em conta durante o projeto de um circuito de multiplicação binária. 1 Para complementar os conceitos básicos, recomenda-se a leitura dos apêndices disponíveis na página web do Laboratório Digital. Projeto de Circuitos Aritméticos E.T.M./2011 (adaptação) E.T.M./2012 (revisão)

Upload: lenhan

Post on 18-Dec-2018

235 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Projeto de Circuitos Aritméticos (2012) 1

RESUMO

Nesta experiência será desenvolvido um circuito aritmético usando a metodologia estruturada apresentada nas experiências anteriores. É introduzido também o projeto usando linguagens de descrição de hardware. A parte experimental consiste do projeto de um circuito de divisão inteira desenvolvido usando componentes digitais básicos e também com a linguagem de descrição de hardware VHDL.

1. PARTE TEÓRICA1

1.1. Multiplicação Binária

Uma das operações mais custosas em um computador digital é a multiplicação binária. Ela pode ser implementada usando-se o algoritmo tradicional de multiplicação decimal que é ensinada nas aulas de Ensino Fundamental, também conhecido como algoritmo de lápis e papel. Apresentamos aqui os princípios fundamentais de operação do algoritmo tradicional e de um algoritmo melhorado.

Algoritmo Tradicional

Quando aprendemos a realizar a multiplicação de dois números inteiros no Ensino Fundamental, o processo para efetuar a operação é normalmente composto por uma série de somas. Transpondo este procedimento para a aritmética binária, temos sucessivas somas de valores binários. Como os dígitos na aritmética binária são 0 ou 1, o processo de multiplicação envolve sucessivas somas do multiplicando ou de zero em função de cada bit do multiplicador.

O algoritmo tradicional de multiplicação binária de dois números binários sem sinal é feita com sucessivos deslocamentos do multiplicando à esquerda (que constituem as parcelas do cálculo dos produtos parciais) e uma soma. Para exemplificar, vamos executar este algoritmo com os números binários 11012 e 10112, como ilustrado abaixo (fig.1.1).

13. 1101. multiplicando x 11. x 1011. multiplicador

1101.

. 1101 .

0000 .

. 1101 .

produtos parciais

143. 10001111. produto

Figura 1.1. Exemplo de multiplicação com algoritmo tradicional.

A execução do algoritmo leva em consideração um bit do multiplicador de cada vez, com o bit menos significativo em primeiro lugar. Se o bit do multiplicador for 1, o multiplicando é copiado para ser somado posteriormente. Em caso contrário, se o bit do multiplicador for 0, um valor nulo é copiado em seu lugar. Os números copiados em linhas sucessivas são deslocados à esquerda de uma posição em relação à linha anterior. Finalmente, os números são somados gerando o produto final.

Um circuito digital que implementa este algoritmo deve executar esta soma em etapas. Assim, quando um novo número for copiado, duas parcelas devem ser somadas gerando uma soma parcial. Ilustramos abaixo (fig.1.2) esta modificação no mesmo exemplo acima.

Este algoritmo tradicional tem um requisito muito forte em relação à soma dos produtos parciais. Como são somadas n produtos parciais de n bits cada uma, é necessário um circuito somador com 2n bits. Isto representa uma questão que deve ser levado em conta durante o projeto de um circuito de multiplicação binária.

1 Para complementar os conceitos básicos, recomenda-se a leitura dos apêndices disponíveis na página web do Laboratório Digital.

Projeto de Circuitos Aritméticos E.T.M./2011 (adaptação)

E.T.M./2012 (revisão)

Page 2: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Projeto de Circuitos Aritméticos (2012) 2

13. 1101. multiplicando x 11. x 1011. multiplicador

1101.

. 1101 .

100111.

0000 .

100111.

. 1101 .

somas dos produtos parciais

2 a 2

143. 10001111. produto

Figura 1.2. Realização das somas parciais.

Algoritmo Melhorado

A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode ser amenizada com um algoritmo levemente diferente. O algoritmo melhorado, que apresentamos aqui, necessita apenas de um somador de n bits e de operações de deslocamento para a direita do produto parcial.

O algoritmo segue os seguintes passos:

1. Inicialmente o produto parcial é ajustado para 0 (zero);

2. Um bit do multiplicador é processado de cada vez, começando pelo bit menos significativo;

a. Se o bit sendo processado for 1 (um), o multiplicando é somado ao produto parcial e depois é realizado um deslocamento pela direita do produto parcial;

b. Se o bit sendo processado for 0 (zero), o produto parcial é apenas deslocado para a direita;

3. O bit de vai-um ("carry") do somador é armazenado em um flip-flop que deve estar conectado ao registrador deslocador contendo o produto parcial;

4. A soma deve ser realizada apenas nos 4 bits mais significativos de produto parcial.

Um exemplo de aplicação deste algoritmo é ilustrado abaixo (fig.1.3).

13. . 1101 multiplicando x 11. .x 1011 multiplicador 13. . 0000 valor inicial do produto parcial

. 13 . . 1101 soma multiplicando, bit do multiplicador é 1 . 1101 . 0110 1 desloca para a direita . 1101 soma multiplicando, bit do multiplicador é 1 .1 0011 1 . 1001 11 desloca para a direita . 0100 111 só desloca para a direita, bit do multiplicador é 0 . 1101 soma multiplicando, bit do multiplicador é 1 .1 0001 111 . 1000 1111 desloca para a direita .

143. . 10001111 produto

Figura 1.3. Exemplo do algoritmo melhorado para multiplicação binária.

Implementação de um Circuito Multiplicador

Seja um circuito Multiplicador Binário (MB) responsável pela realização da multiplicação de dois números binários sem sinal de 4 bits, introduzidos separadamente no circuito através de uma única via de dados (sinal IN). A operação é iniciada com o acionamento do sinal INICIAR e o resultado da operação com 8 bits é apresentado na saída (sinal OUT). Os operandos da multiplicação são especificados para o MB pelos sinais ENTRA_MULTIPLICANDO e ENTRA_MULTIPLICADOR.

Os sinais de entrada e saída do Multiplicador Binário são os seguintes (fig.1.4):

• IN – via de dados de entrada, com quatro bits;

• OUT – via de dados de saída, com oito bits;

• INICIAR – sinal de controle utilizado iniciar a multiplicação;

• ENTRA_MULTIPLICANDO – sinal de controle utilizado para especificar o multiplicando da operação;

Page 3: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Projeto de Circuitos Aritméticos (2012) 3

• ENTRA_MULTIPLICADOR – sinal de controle utilizado para especificar o multiplicador da operação;

• PRONTO – sinal de saída que indica final da multiplicação.

A figura 1.4 abaixo mostra o MB com os sinais descritos anteriormente.

Figura 1.4 – Sinais de entrada e saída do circuito Multiplicador Binário.

A operação do circuito deve seguir os seguintes passos:

1. Acertar um valor binário na vida de dados de entrada (IN);

2. Ativar o sinal ENTRA_MULTIPLICANDO;

3. Colocar outro valor na via de dados de entrada;

4. Ativar o sinal ENTRA_MULTIPLICADOR;

5. Acionar o botão INICIAR para a execução da multiplicação binária;

6. Verificar resultado na via de dados de saída (OUT), depois de o sinal PRONTO ficar ativado.

Apresentamos aqui uma possível implementação do circuito, usando a metodologia estruturada [Midorikawa, 2011]. Para mais detalhes da implementação, consulte a referência [Ranzini, 2004].

O diagrama de blocos do fluxo de dados de um circuito digital que implementa o algoritmo melhorado é apresentado na figura 1.5. O multiplicador é armazenado no registrador M e depois transferido para o registrador deslocador Q. A cada passo do algoritmo, o bit do multiplicador em consideração está na posição menos significativa de Q (bit Q0), que é analisado pela unidade de controle. O multiplicando é armazenado no registrador B que é somado a cada passo com o produto parcial, presente no registrador deslocador A. O bit de vai-um do somador é armazenado no flip-flop C. O conjunto composto pelos componentes flip-flop C, deslocador A e deslocador Q compõem um grande deslocador para as operações de deslocamento para a esquerda. Um contador de passos P completa o fluxo de dados para indicar o final da operação de multiplicação, gerando o sinal ZERO. As saídas dos deslocadores A e Q formam o produto na saída do multiplicador.

Figura 1.5 – Fluxo de dados do circuito multiplicador binário.

MultiplicadorBinário

RESET

CLOCK

ENTRA_MULTIPLICADOR

ENTRA_MULTIPLICANDO

INICIAR

IN

PRONTO

OUT

Registrador B Registrador M

Somador Binário

Deslocador A Deslocador QFlip-flop

C

IN

Q0

OUT

Contador P

Detector de Zero

ZERO

N-1

Page 4: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Projeto de Circuitos Aritméticos (2012) 4

A implementação da unidade de controle pode ser modelada pelo diagrama ASM da figura 1.6. O circuito permanece no estado inicial (PARADO) até que o sinal INICIAR seja ativado. Ao ser ativado este sinal, o flip-flop C, o deslocador A e o contador P são inicializados, e o deslocador Q recebe o valor do multiplicador. O processo de multiplicação envolve os estados MUL0 e MUL1, executados até que o sinal ZERO indique que todos os bits do multiplicador foram considerados. Ao final, o sinal PRONTO é ativado no estado FIM. O circuito permanece neste estado até que o sinal INICIAR seja desativado

2.

Figura 1.6 – Diagrama ASM da unidade de controle do multiplicador binário.

Repare que o diagrama ASM não inclui o processamento dos sinais ENTRA_MULTIPLICANDO e ENTRA_MULTIPLICADOR. Isto é devido ao fato destes sinais ativarem diretamente o controle de carga dos registradores B e M, respectivamente.

A implementação da unidade de controle pode ser desenvolvida usando o método tradicional de projeto de circuitos sequenciais, o método de mapeamento direto do diagrama ASM para circuito ou o método registrador de estado – decodificador, conforme descrito com detalhes em [Ranzini, 2004]. Uma alternativa é usar uma linguagem de descrição de hardware: por exemplo, a apostila [Midorikawa, 2011] mostra como converter o diagrama ASM em código AHDL. É também possível usar outras linguagens de descrição de hardware, como VHDL ou Verilog, como mostrado em [Midorikawa, 2007].

2 Por que é necessário aguardar o sinal INICIAR ficar desativado? Se não houvesse esta espera, quando o circuito terminar a multiplicação, voltar ao estado inicial e encontrar o sinal INICIAR ativado, ele iria reiniciar o processo de multiplicação. Isto continuaria até que INICIAR fosse desativado. Na apostila [Ranzini, 2004] isto não é considerado.

INICIAR

C <= 0A <= 0Q <= MP <= N-1

Q0

A <= A+BC <= Cout

C <= 0C & A & Q <= shift rigth (C&A&Q)

P <= P-1

ZERO

PRONTO

INICIAR

PARADO

MUL0

MUL1

FIM

0 1

0 1

0 1

01

Page 5: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Projeto de Circuitos Aritméticos (2012) 5

1.2. Divisão Binária

Da mesma forma que a multiplicação binária pode ser implementada como um processo com somas e deslocamentos para a direita, a operação de divisão binária também pode ser implementada de forma similar. O algoritmo de divisão binária é composto de uma série de subtrações e deslocamentos para a esquerda. O algoritmo segue os seguintes passos (para N=4):

1. Inicialmente o valor do dividendo é carregado no registrador deslocador D e do divisor no registrador A;

2. Execute 4 vezes:

a. Subtrair os 5 bits mais significativos do registrador D pelo registrador A;

b. Se o resultado da subtração for positivo (divisor menor) então armazene o valor da subtração nos 5 bits mais significativos de D e atribua 1 ao bit de resultado;

c. Se o resultado da subtração for negativo (divisor maior) então não armazene o valor da subtração e acerte o bit de resultado em 0;

d. Desloque o registrador D uma posição para a esquerda com a entrada serial dada pelo bit de resultado citado acima.

3. Ao final, o quociente estará presente nos 4 bits menos significativos de D e o resto, nos 4 bits mais significativos de D.

A figura 1.7 apresenta um fluxograma que ilustra o algoritmo de divisão binária (considerando dividendo com 8 bits e divisor com 4 bits).

Figura 1.7 – Fluxograma do algoritmo de divisão binária.

Subtrair os 5 bits mais significativos do registrador D do

registrador A

resultado da subtração ?

Ajuste bit de resultado para 1;Armazene resultado da

subtração nos 5 bits mais significativos de D

Ajuste bit de resultado para 0

4a repetição?

Deslocar conjunto “D + bit de resultado”

uma posição para a esquerda

FIM

INÍCIO

positivo negativo

Page 6: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Projeto de Circuitos Aritméticos (2012) 6

A figura 1.8 ilustra um exemplo do algoritmo. Neste exemplo, temos o dividendo igual a 135 (100001112) com 8 bits e o divisor igual a 12 (11002) com 4 bits.

D bit passo

10000 111 x

1

dividendo carregado em D

-1100 divisor é menor subtrai e bit=1

00100 111 1

01001 111 x desloca para a esquerda

01001 111 0 2

divisor é maior bit=0

10011 110 x desloca para a esquerda

-1100

3 divisor é menor subtrai e bit=1

00111 110 1

01111 101 x desloca para a esquerda

-1100

4

divisor é menor subtrai e bit=1 00011 101 1

00111 011 x desloca para a esquerda

0011|1011 resto | quociente

Figura 1.8 – Exemplo do algoritmo de divisão binária (135÷12).

A operação de subtração envolve os 5 bits mais significativos do registrador D e os 4 bits do registrador A alinhados pelo bit menos significativo. Por exemplo, no passo 1 apresentado na figura 1.8, temos a subtração 10000 – 1100 = 00100. O circuito que implementaria esta operação deve considerar um quinto bit igual a zero para o subtraendo, ou seja, teríamos a subtração 10000 – 01100.

Outra operação que deve ser implementada é o teste se o divisor é ou não maior que a porção mais significativa do dividendo. Uma possível solução seria o uso dos resultados do próprio circuito de subtração binária, em particular, o sinal de empresta-um (figura 1.9).

Figura 1.9 – Exemplo de circuito de subtração binária.

Outro aspecto do algoritmo é a atualização dos bits mais significativos do registrador D após a realização da subtração. Como esta operação envolve os 5 bits mais significativos, a implementação deve ser realizada usando o sinal de carga paralela do registrador e mais uma lógica de seleção de sinais para os bits de entrada.

Este algoritmo de divisão binária tem um problema, pois considerando as condições do exemplo da figura 1.8 (dividendo de 8 bits e divisor de 4 bits), o quociente e o resto tem 4 bits de tamanho. Caso o quociente precisar ter mais bits, o resultado final do algoritmo não estará correto. Um exemplo disto é a divisão 135÷1, onde o quociente precisaria ter 8 bits de tamanho. Uma alternativa que soluciona este problema pode ser vista em [Patterson & Hennessy, 2009].

SubtratorBinário

Minuendo

Diferença

Subtraendo

Emprestou-um(borrow-in)

Empresta-um(borrow-out)

Page 7: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Projeto de Circuitos Aritméticos (2012) 7

1.3. Linguagens de Descrição de Hardware

Uma alternativa à entrada esquemática de um circuito digital em um sistema de projeto auxiliado por computador, ou EDA (electronic design automation) como é mais conhecido atualmente, é utilizar a técnica de projeto de PLDs (programmable logic devices – dispositivos lógicos programáveis) baseado em uma ferramenta de projeto baseado em texto ou linguagem de descrição de hardware (HDL). Exemplos de HDLs são o AHDL (Altera Hardware Description Language) e os padrões VHDL e Verilog.

O projetista cria um arquivo de texto, seguindo certo conjunto de regras, conhecido como sintaxe da linguagem, e usa um compilador para criar dados de programação do dispositivo lógico programável (PLD). Esta descrição de hardware pode ser usada para gerar projetos hierárquicos, ou seja, um componente definido em uma descrição pode ser usado para gerar um hardware específico ou ser usado como parte de outro projeto

3.

As HDLs têm uma grande semelhança às linguagens de programação, mas são especificamente orientadas à descrição das estruturas e do comportamento do hardware. Por exemplo, a linguagem Verilog apresenta uma semelhança muito grande com a linguagem C. Uma grande vantagem das HDLs em relação à entrada esquemática é que elas podem representar diretamente equações booleanas, tabelas verdade e operações complexas (p.ex. operações aritméticas).

Uma HDL pode ser usada na descrição em vários níveis do circuito em desenvolvimento. Partindo de uma descrição de alto nível, pode ser usada para refinar e particionar esta descrição em outras de nível mais baixo durante o processo de desenvolvimento. A descrição final deve conter componentes primitivos e blocos funcionais.

Uma descrição estrutural descreve a interconexão entre os componentes que fazem parte do circuito. Esta descrição é usada como entrada para uma simulação lógica da mesma forma que uma entrada esquemática. Definem-se os componentes principais do projeto e a arquitetura do módulo principal contém a descrição da forma como estes se interconectam.

Uma descrição comportamental descreve o funcionamento de cada um dos componentes do circuito de uma forma algorítmica, ou seja, com a apresentação da forma como o processamento é realizado sem se preocupar com a futura implementação em hardware. Desta forma, normalmente uma descrição comportamental não pode ser diretamente traduzida em uma estrutura de hardware, ou seja, não é sintetizável.

Uma grande razão para o uso de HDLs é a síntese lógica. Uma descrição em HDL em conjunto com uma biblioteca de componentes é usada por uma ferramenta de síntese para a geração automática de um circuito digital. Além disto, estas ferramentas incluem uma etapa de otimização da lógica interna do circuito gerado, antes da geração das estruturas internas de armazenamento, da lógica combinatória e da estrutura de conexão dos componentes (netlist). A figura 1.10 abaixo mostra um diagrama mostrando as etapas principais de síntese lógica.

Figura 1.10 – Estruturação interna de um sistema digital.

As linguagens de descrição de hardware foram desenvolvidas a partir da década de 1970. As primeiras linguagens foram o ISP (Instruction Set Processor) desenvolvido pela Carnegie Mellon University e o KARL da University of Kaiserslautern, Alemanha. Seu uso inicial foi na simulação de circuitos digitais.

Atualmente, as HDLs mais utilizadas são o VHDL e o Verilog. Ambas as linguagens são hoje padrões aprovados e publicados pelo IEEE (Instituto dos Engenheiros Elétricos e Eletrônicos), tendo portanto várias ferramentas comerciais disponíveis. Esta padronização leva a uma grande vantagem no desenvolvimento de circuitos usando HDLs: a portabilidade. Visto que as ferramentas devem implementar as características padronizadas, fica muito fácil usar sistemas de desenvolvimento de fabricantes diferentes.

Apresentamos a seguir as duas linguagens de descrição de hardware mais usadas atualmente, VHDL e Verilog. Após um breve histórico, apresentamos as principais características de cada uma das HDLs.

3 No projeto de circuitos integrados é comum o uso de licenciamento de módulos desenvolvidos por empresas especializadas, chamadas IP ( intellectual property). Os exemplos mais comuns de IPs são núcleos (cores) de processadores e controladores de periféricos (p.ex. SDRAM, Ethernet e USB).

Descrição HDLdo circuito

TraduçãoRepresentaçãointermediária

OtimizaçãoGeração de

netlist

Page 8: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Projeto de Circuitos Aritméticos (2012) 8

1.3.1. Linguagem VHDL

O nome VHDL é um acrônimo de “VHSIC Hardware Description Language”. Já o termo VHSIC é o acrônimo de “Very High Speed Integrated Circuit” (Circuito integrado com velocidade muito alta). Assim podemos traduzir o nome VHDL como algo do tipo "linguagem de descrição de hardware para circuitos integrados com velocidade muito alta".

A linguagem VHDL foi originalmente desenvolvida por empresas contratadas pelo governo americano e agora é um padrão requerido pro todos os ASICs (Application Specific Integrated Circuits – circuitos integrados de aplicação específica) projetados para o exército americano. Ele foi padronizado pelo IEEE em 1987 (Padrão IEEE 1076-1987 ou VHDL 87) e foi atualizado em 1993, em 2000 e em 2002. Os trabalhos do IEEE continuaram e uma nova revisão foi publicada recentemente (VHDL 2008 – Padrão IEEE 1076-2008).

Todo arquivo VHDL requer ao menos duas estruturas: uma declaração de entidade e uma arquitetura. A declaração de entidade define os aspectos externos da função VHDL, isto é, os nomes das entradas e saídas e o nome da função. A arquitetura define os aspectos internos, isto é, como as entradas e saídas influem no funcionamento e como se relacionam com outros sinais internos.

Um exemplo de uma descrição VHDL é mostrado a seguir (figura 1.11).

-- somador de 4 bits: descrição comportamental VHDL

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity somador_4bits is

port(B, A : in std_logic_vector(3 downto 0);

C0 : in std_logic;

S : out std_logic_vector(3 downto 0);

C4 : out std_logic);

end somador_4bits;

architecture comportamental of somador_4bits is

signal soma : std_logic_vector(4 downto 0);

begin

soma <= ('0' & A) + ('0' & B) + ("0000" & C0);

C4 <= soma(4);

S <= soma(3 downto 0);

end comportamental;

Figura 1.11 – Exemplo de descrição em VHDL.

Os sinais de entrada e saída são do tipo std_logic e std_logic_vector. O tipo std_logic é definido no pacote ieee.std_logic_1164 e pode assumir os valores 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H' ou '-'. O tipo std_logic_vector representa um vetor de bits. O somador possui 3 sinais de entrada: A, B e C0, e 2 sinais de saída: S e C4.

São usados dois operadores: + representa uma adição e & representa uma concatenação de bits. Assim, '0' & A representa um vetor de 5 bits contendo '0', A(3), A(2), A(1) e A(0).

Após a realização de uma operação de adição com os sinais de entrada, a descrição atribui o bit mais significativo de soma a C4 e os outros bits em S.

Implementação do Circuito de Multiplicação Binária em VHDL

O Multiplicador Binário apresentado na seção 1.1 pode ser representado durante o processo de projeto como uma descrição comportamental VHDL, apresentada na figura 1.12 (veja [Midorikawa, 2007] para mais detalhes). Tal descrição apresentada abaixo representa o diagrama de blocos do fluxo de dados MB apresentado na figura 1.5 e o diagrama ASM da figura 1.6. O código VHDL está contido na entidade multiplicador_binario e na arquitetura comportamento_mult4. A arquitetura contém duas atribuições e três processos. Cada um dos processos tem uma função distinta, mas podem interagir para a realização da operação de multiplicação.

No início da entidade, são definidas as entradas e as saídas do multiplicador. A seguir, no início da arquitetura são definidos os três estados de funcionamento do circuito pela declaração de tipo. Em seguida, sinais internos que gerarão registradores são definidos. Entre os sinais estão estado e prox_estado para o controle, os registradores A, B, M, P e Q e o flip-flop C. Um sinal intermediário Z é declarado por conveniência.

Page 9: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Figura 1.12 – Código VHDL do circuito Multiplicador Binário.

Page 10: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Projeto de Circuitos Aritméticos (2012) 10

1.3.2. Linguagem Verilog

A linguagem Verilog foi introduzida em 1985 pela Gateway Design Automation. Em 1989, a Gateway foi comprada pela empresa Cadence Design Systems, que tornou a linguagem de domínio público em maio de 1990 com a formação da Open Verilog International (OVI). Hoje o Verilog é um padrão IEEE 1364-1995, mas novos trabalhos continuaram em andamento. Atualmente, a última versão da linguagem foi definida em 2005 com o padrão IEEE 1364-2005 (Verilog 2005). O Verilog tem uma grande semelhança com a linguagem de programação C.

Uma característica interessante do Verilog é que, ao contrário do VHDL, há a diferenciação entre o uso de maiúsculas e minúsculas. Os identificadores podem conter qualquer sequência de letras, dígitos, do símbolo '$' e do símbolo '_', onde o primeiro caractere deve ser uma letra ou o símbolo '_'.

O Verilog oferece ao projetista os meios para descrever um sistema digital em vários níveis de abstração, e também suporta ferramentas de projeto para síntese lógica. Projetistas de hardware podem expressar suas idéias com construções comportamentais, deixando os detalhes para fases posteriores do projeto. Uma representação abstrata pode ser usada para explorar alternativas arquiteturais através de simulações e para detectar restrições de projeto antes do projeto detalhado. Com o detalhamento do projeto, são criadas descrições com construções estruturais.

A construção Verilog básica é o module. Os sinais de entrada e saída de um módulo (a sua interface) são designados usando ports. Cada sinal de um port pode ser declarado como input, output ou inout.

Um procedimento Verilog é sempre um comando always ou initial, uma tarefa (task) ou função (function). Os comandos dentro de um bloco sequencial (comandos que aparecem entre um begin e um end) que é parte de um procedimento (procedure) são executados sequencialmente na ordem em que aparecem. Mas os procedimentos são executados concorrentemente com outros procedimentos.

Um bloco sequencial pode aparecer em um comando always, no caso em que o bloco deve ser executado repetidamente. Por outro lado, um comando initial especifica um bloco sequencial que é executado apenas uma vez, no início de uma simulação.

Uma task é um tipo de procedimento, chamado por outro procedimento, que tem entradas e saídas, mas não tem um valor de retorno. Uma tarefa pode chamar outras tarefas e funções. Uma function é um procedimento usado em qualquer expressão, tem ao menos uma entrada, não tem saída e retorna um único valor. Uma função não pode chamar uma tarefa.

Verilog possui um tipo de controle de temporização que atrasa uma atribuição até que um evento específico ocorra. Um controle de evento é especificado por um @. Por exemplo, @(posedge clk) indica um evento referente a uma borda de subida do sinal clk.

Um exemplo de uma descrição Verilog é mostrada a seguir (figura 1.13).

// somador de 4 bits: descrição comportamental Verilog

module somador_4bits(A, B, C0, S, C4)

input[3:0] A, B;

input C0;

output[3:0];

output C4;

assign {C4, S} = A + B + C0;

endmodule

Figura 1.13 – Exemplo de descrição em Verilog.

No módulo Verilog acima, a lógica de adição é descrita por um único comando usando os operadores + e {}. O operador + representa a adição e {} representa uma operação chamada concatenação. A operação de adição deve ser efetuada sobre tipos de dados sem sinal. A concatenação combina dois sinais em um único sinal com um número de bits igual à soma do número de bits de cada sinal original. Por exemplo, {C4, S} representa o vetor de bits contendo C4, S[3], S[2], S[1] e S[0] com 1 + 4 = 5 bits. Note que C4 é o quinto bit ou bit mais significativo da concatenação.

Uma implementação do circuito de multiplicação binária similar ao descrito no item 1.1 em Verilog é apresentada em [Midorikawa, 2007].

Page 11: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Projeto de Circuitos Aritméticos (2012) 11

2. PARTE EXPERIMENTAL Nesta experiência sobre Dispositivos Programáveis será desenvolvido o projeto de um sistema digital utilizando-se o dispositivo Altera Cyclone II EP2C35F672C6. As atividades desta experiência incluem a familiarização com a metodologia de projeto estruturado e com a placa de desenvolvimento DE2 da Altera.

2.1. Atividade Pré-Laboratório Considere abaixo a especificação do circuito de divisão binária (fig.2.1):

Figura 2.1 – Circuito de Divisão Binária.

A operação do circuito deve seguir os seguintes passos:

1. Acertar um valor binário de 8 bits do dividendo na entrada IN; 2. Ativar o sinal ENTRA_DIVIDENDO; 3. Colocar um valor binário de 4 bits do divisor nos bits menos significativos da entrada IN; 4. Ativar o sinal ENTRA_DIVISOR; 5. Acionar o botão INICIAR para a execução da multiplicação binária; 6. Verificar resultado nas saídas (Q e R).

Caso se deseje repetir um valor anteriormente ajustado no circuito do Divisor Binário, os passos 1 e 2 ou os passos 3 e 4 podem ser ignorados, visto que um registrador interno deve manter os valores do dividendo e do divisor da operação anterior.

Para a preparação para as atividades em laboratório da experiência, execute o seguinte:

a) Realize o desenvolvimento de dois projetos do circuito do divisor binário no software Altera Quartus II, especificando o uso do dispositivo Altera Cyclone II EP2C35F672C6. 1. Projeto usando a metodologia estruturada (blocos fluxo de dados, unidade de controle e sistema digital); 2. Projeto usando a linguagem de descrição de hardware VHDL.

b) Realize simulações dos dois projetos para verificar o funcionamento de cada um. c) Leve os arquivos dos projetos para o Laboratório Digital. d) Foi dito que o algoritmo de divisão binária apresenta um problema quando o número de bits do quociente for

maior que 4 bits. Como esta condição pode ser detectada no início do processamento?

OBS.: o planejamento deve conter os resultados obtidos com a execução das atividades referentes ao item 2.1 acima.

2.2. Implementação do Projeto Exemplo e) Usando o software Quartus II, implemente projeto do divisor binário em VHDL na placa de desenvolvimento DE2

da Altera com a seguinte designação de sinais do projeto:

• IN[0..7] : chaves SW0 a SW7 • ENTRA_DIVIDENDO : botão KEY1 • ENTRA_DIVISOR : botão KEY2 • INICIAR : botão KEY3 • CLOCK : clock interno de 50 MHz (CLK_50) • RESET : chave SW17 • Q[0..6] : display de 7 segmentos HEX0 • R[0..6] : display de 7 segmentos HEX1 • PRONTO : led verde LEDG0

DivisorBinário

RESET

CLOCK

ENTRA_DIVISOR

ENTRA_DIVIDENDO

INICIAR

IN

PRONTO

R

Q

DICA: lembrem-se que os botões na placa DE2 são ativos em baixo. Os projetos devem levar isto em consideração. Use a tabela de designação de pinos da placa DE2.

Page 12: Projeto de Circuitos Aritméticos - pcs.usp.brlabdig/pdffiles_2012/circuitos-aritmeticos.pdf · A exigência do algoritmo tradicional de necessitar de um somador com 2n bits pode

Projeto de Circuitos Aritméticos (2012) 12

f) Programe os projetos na placa DE2 seguindo os passos descritos nas instruções de uso. Com cada um dos circuitos em funcionamento na placa DE2, execute vários testes para verificar o comportamento deles. Use vários valores de entrada. Comente os resultados.

g) Considere também nos testes entradas incomuns, como por exemplo, a divisão por 1. Comente o comportamento do circuito.

h) (Opcional) Implemente o circuito de detecção dos casos em que o algoritmo de divisão apresentado não efetua a operação de forma correta. Caso este detector verificar estes casos, o circuito deve abortar a execução.

2.3. Melhoramentos no Projeto em VHDL Neste item vamos modificar o circuito do projeto do divisor binário, conforme apresentado pelo professor:

i) Solicite a especificação das modificações a serem desenvolvidas ao professor da turma.

j) Modifique o circuito do projeto solicitado.

k) Documente as modificações (p.ex. diagrama de blocos, diagrama ASM, código da descrição, simulações).

l) Implemente estas modificações na placa DE2.

m) Teste o circuito modificado. Comente seu funcionamento.

Perguntas

1. Quais são as diferenças entre o uso de linguagens de descrição de hardware para o projeto de circuitos digitais em relação ao uso de componentes lógicos? Cite vantagens e desvantagens.

2. “Apesar do projeto em VHDL produzir uma descrição em formato de texto, é importante o uso de diagramas de blocos e diagramas ASM nas etapas preliminares do projeto”. Comente esta afirmação.

3. Em um projeto moderno de sistemas digitais usando programas de auxílio para o projeto de circuitos (como o Altera Quartus II), é possível um mesmo projeto conter módulos em VHDL, módulos em AHDL e módulos desenvolvidos com captura esquemática? Comente e exemplifique.

3. BIBLIOGRAFIA 1. ALTERA. Cyclone II Device Handbook, Volume I. 2008.

2. ALTERA. DE2 Development and Education Board - User Manual. Version 1.42. 2008.

3. ALTERA. Quartus II Handbook Version 9.1. Volume 1: Design and Synthesis. 2009.

4. GIVONE, D.D. Digital Principles and Design. McGraw-Hill, 2003.

5. MANO, M. M.; KIME, C. R. Logic and computer design fundamentals. 2nd

ed., Prentice-Hall, 2000.

6. MIDORIKAWA, E.T. Introdução às Linguagens de Descrição de Hardware. Apostila de PCS2304, 2007.

7. MIDORIKAWA, E.T. Projeto de Sistemas Digitais. Apostila de Laboratório Digital, 2011.

8. PATTERSON, D.A.; HENNESSY, J.L. Computer Organization and Design: the hardware/software interface. 4

th ed. (Revised Printing), Morgan Kaufmann, 2012.

9. RANZINI, E. Exemplo 1 de Projeto de Circuito Síncrono: Multiplicador Binário. Apostila de PCS2304, 2004.

10. RANZINI, E.; HORTA, E. L. Introdução aos Dispositivos Lógicos Programáveis. Apostila de Laboratório Digital. Escola Politécnica da USP, 2000 (revisão em 2011).

11. TOCCI, R. J., WIDMER, N. S., MOSS, G.L. Digital Systems: principles and applications. 11th

ed., Prentice-Hall, 2011.

12. WAKERLY, J. F. Digital design: principles and practice. 4th

ed., Prentice- Hall, 2006.

4. EQUIPAMENTOS NECESSÁRIOS 1 placa de desenvolvimento FPGA DE2 da Altera com o dispositivo Altera Cyclone II EP2C35F672C6.

1 computador PC com programa Altera Quartus II e interface USB.