• Nenhum resultado encontrado

FPGA COM A PLACA EXSTO EP2C8Q208C8

N/A
N/A
Protected

Academic year: 2021

Share "FPGA COM A PLACA EXSTO EP2C8Q208C8"

Copied!
79
0
0

Texto

(1)

1 UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO – UFES

CENTRO UNIVERSITÁRIO DO NORTE DO ESPÍRITO SANTO – CEUNES DEPARTAMENTO DE ENGENHARIA E COMPUTAÇÃO – DECOM

LABORATÓRIO DE CIRCUITOS ELÉTRICOS

FPGA COM A PLACA EXSTO

EP2C8Q208C8

Apostila desenvolvida por Arthur Carlos Calvi de Bone

e Mariniel Souza Galvão

São Mateus Março 2013

(2)

2

Sumário

1. INTRODUÇÃO ... 4 1.1. ARQUITETURA... 6 1.2. DESIGN DIGITAL ... 6 1.3. APLICAÇÕES ... 8

1.4. INTRODUÇÃO AO KIT DE DESENVOLVIMENTO ... 9

1.4.1. A PLATAFORMA FPGA ... 9

1.4.2. SWITCHES ... 10

1.4.3. CHAVES ... 11

1.4.4. DISPLAY DE SETE SEGMENTOS ... 12

1.4.5. LEDs ... 13 1.4.6. DISPLAY LCD ... 14 1.4.7. COMUNICAÇÃO SERIAL RS-232 ... 15 1.4.8. MEMÓRIA FLASH ... 16 1.4.9. PORTAS DE EXPANSÃO ... 17 1.4.10. OSCILADOR ... 19 1.4.11. RESET ... 19 2. DESING DIGITAL ... 20

2.1. LINGUAGEM DE DESCRIÇÃO DE HARDWARE ... 20

2.1.1. Componentes de um projeto VHDL ... 21

2.2. SINAIS ... 26

2.3. Semântica da linguagem VHDL ... 27

2.3.1. Elementos Léxicos ... 27

2.3.2. Estruturas para descrição de comportamento ... 30

2.3.3. Expressões e operadores ... 32

2.4. Descrição de Comportamento (Process) ... 38

2.5. Controle da Sequência ... 41

2.5.1. Comando if then... 42

2.5.2. Comando if then else... 42

2.5.3. Comando Case ... 43

2.5.4. COMANDO WHILE LOOP... 44

2.5.5. COMANDO FOR LOOP ... 45

(3)

3 3. TUTORIAL QUARTUS II ... 47 3.1. INTRODUÇÃO ... 47 3.2. INSTALAÇÃO DE HARDWARE ... 47 3.3. INSTALAÇÃO DE SOFTWARE ... 47 3.4. PROGRAMA TESTE ... 47

3.5. COMPILANDO E “QUEIMANDO” O PROJETO. ... 50

3.6. PROJETOS ... 51

3.6.1. CRIAÇÃO DO PROJETO DE UM CIRCUITO LÓGICO ... 51

3.6.2. CRIAÇÃO DE BLOCOS LÓGICOS A PARTIR DE CÓDIGO VHDL ... 54

3.6.3. SIMULAÇÃO ... 56

3.7. DECLRAÇÃO DE COMPONENTES ... 62

3.8. ARQUITETURAS MULTI-PROCESSO ... 63

3.8.1. PROCESS SIMPLIFICADO ... 64

3.8.2. DRIVERS E ATRIBUIÇÃO DE SINAL ... 66

3.8.3. SINAIS COM MAIS DE UM DRIVER ... 68

3.9. ESPECIFICAÇÃO DA ESTRUTURA DO SISTEMA ... 70

3.9.1. INSTANCIAÇÃO DIRETA... 72

3.9.2. COMPONENTES E CONFIGURAÇÕES ... 74

4. APLICAÇÕES E PRÁTICAS ... 77

4.1. PRÁTICA 1 ... 77

(4)

4

1. INTRODUÇÃO

A grande maioria dos chips que encontramos em nosso dia-a-dia, circuitos que acompanham as televisões, celulares, etc., já vem todos pré-programados, isto é, com as suas funcionalidades todas definidas no ato de fabricação. Surgiu então uma categoria nova de hardware reconfigurável, o qual tem as suas funcionalidades definidas exclusivamente pelos usuários e não pelos fabricantes. Dentre uma grande gama de hardware reconfigurável podemos destacar o Arranjo de Portas Programável em Campo FPGA (Field Programmable Gate Array).

Um FPGA é um dispositivo semicondutor que é largamente utilizado para o processamento de informações digitais. Foi criado pela Xilinx Inc., e teve o seu lançamento no ano de 1985 como um dispositivo que poderia ser programado de acordo com as aplicações do usuário (programador). O FPGA é composto basicamente por três tipos de componentes: blocos de entrada e saída (IOB), blocos lógicos configuráveis (CLB) e chaves de interconexão (Switch Matrix). Os blocos de entrada e saída (I/O) formam uma borda ao redor do dispositivo. Cada um desses blocos pode servir como entrada, saída ou acesso bi-direcional a outros pinos de I/O. Os blocos lógicos são dispostos de forma bidimensional, as chaves de interconexão são dispostas em formas de trilhas verticais e horizontais entre as linhas e as colunas dos blocos lógicos como é mostrado na figura.

(5)

5 • CLB (Configuration Logical Blocks): Circuitos idênticos, construídos pela

reunião de flip-flops (entre 2 e 4) e a utilização de lógica combinacional. Utilizando os CLBs, um usuário pode construir elementos funcionais lógicos.

IOB (Input/Output Block): São circuitos responsáveis pelo interfaceamento das

saídas provenientes das saídas das combinações de CLBs. São basicamente buffers, que funcionarão como um pino bidirecional entrada e saída do FPGA.

Switch Matrix (chaves de interconexões): Trilhas utilizadas para conectar os

CLBS e IOBS. O terceiro grupo é composto pelas interconexões. Os recursos de interconexões possuem trilhas para conectar as entradas e saídas dos CLBs e IOBs para as redes apropriadas. Geralmente, a configuração é estabelecida por programação interna das células de memória estática, que determinam funções lógicas e conexões internas implementadas no FPGA entre os CLBs e os IOBs. O processo de escolha das interconexões é chamado de roteamento.

Programação de FPGAs: Tipicamente, a etapa inicial do projeto é seguida de

uma simulação funcional. Este é o período onde um simulador é utilizado para a execução do projeto para confirmar as saídas com as diversas entradas de teste. A compilação somente se inicia quando já existe uma representação funcional correta do hardware. Esta compilação se divide em duas etapas. A primeira, chamada de síntese (synthesys), é onde o compilador tem uma idéia de como implementar o projeto e falta apenas posicionar e rotear as estruturas lógicas em macrocélulas, interconexões e pinos de entrada e saída, que é a segunda etapa. Feita a compilação, um bitstream é criado, ou seja, já sabemos quais são os dados binários que deverão ser carregados no FPGA para fazer com que o chip execute um projeto em particular. Geralmente, as empresas que desenvolvem dispositivos programáveis, fornecem também softwares capazes de carregar o bitstream no hardware utilizando linguagens de descrição de hardware (Hardware Description Language – HDL).

(6)

6

1.1. ARQUITETURA

A arquitetura de um FPGA é predominantemente lógica, na forma de elementos lógicos, dispostos em malhas ao longo do dispositivo. Os elementos lógicos possuem duas partes: Look-Up Tables (LUT), que podem implementar funções comuns de lógica, tais como portas E ou OU; e registros que podem implementar lógica síncrona, como flip-flop.

Além dos elementos lógicos, outras estruturas de hardware dedicadas estão presentes para auxiliar na implementação de funções definidas pelo usuário e aumentar o desempenho. Estes recursos estão geralmente dispostos em colunas ao longo da FPGA. Um dos tipos de recursos dedicados são as memórias embutidas. Este recurso pode variar tanto na capacidade quanto na disposição (série ou paralelo), com a finalidade de obter memórias mais robustas. Multiplicadores embutidos eles podem ser cascateados de tal sorte a facilitar o processamento digital de sinais (PDS), auxiliando na implementação de funções avançadas de PDS. A maioria dos dispositivos contém Loops de Fase Fixa para implementar instruções de clock mais refinadas.

As FPGAs contam com elementos de entrada e saída, cuja disposição e uso são definidos pela escolha do usuário. Estes elementos podem ser posicionados e configurados para comunicar o FPGA com outros dispositivos externos presentes no circuito impresso.

Todos estes elementos estão conectados através de uma planta contendo rotas reconfiguráveis e registros de configuração. Estas rotas são extremamente flexíveis, assegurando que os requerimentos de hardware para um design em particular serão conectados corretamente e de tal forma que atinjam todas as metas de desenvolvimento.

1.2. DESIGN DIGITAL

Design digital é o processo de criação de uma nova estrutura lógica utilizando dispositivos lógicos programáveis.

O processo de design digital começa com a ideia. Seja ela em nível de sistema ou em nível de design específico para uma FPGA. Esta ideia é geralmente

(7)

7 documentada em um formulário para especificar as características do que a FPGA deveria fazer e a forma como ela deveria trabalhar.

O próximo passo seria descrever esta ideia utilizando um formulário digital que possa ser entendido pelo programa de design de FPGAs e que possa ser traduzido para as estruturas físicas encontradas no dispositivo alvo. Esta descrição é normalmente feita em uma linguagem de alto nível para descrição de hardware.

Verilog HDL e VHDL são as linguagens mais popularmente utilizadas na criação de designs para FPGAs.

Agora utilizamos um programa de design de FPGAs para pegar este código e realizar um processo conhecido como compilação. A compilação, em design digital, é composta de dois passos principais Síntese e Place and Route (P&R):

• Síntese: Traduz o código de descrição nas estruturas de hardware disponíveis dentro do dispositivo.

• P&R: Escolhe a posição atual das estruturas físicas e as conecta usando a planta de rotas configuráveis.

No processo de compilação ainda está inserida a checagem de erros no design, esta etapa assegura que o design se encaixa corretamente no FPGA alvo e garante que o design opera no desempenho especificado pelo usuário. O software gera um programa binário que contém todas as informações necessárias para programar uma FPGA com o design. Por último o usuário faz um download do programa no dispositivo. Dois itens são necessários para que esta etapa ocorra, o programa binário e as funcionalidades do depurador de design (este último faz parte do software de design). Este download é feito diretamente no hardware. A programação ocorre através de uma memória FLASH ou através de uma conexão direta entre um computador e uma FPGA. Se houver qualquer problema ou alteração no design basta voltar ao código de descrição ou às configurações do software de design realizar as mudanças, recompilar o design e reprogramar o novo binário na FPGA. Como podemos notar este processo torna fácil a correção de problemas e mudanças de design num curto período de tempo.

(8)

8

1.3. APLICAÇÕES

Os FPGAs são aplicáveis em qualquer circuito que empregue lógica digital. As aplicações de FPGA podem ser descritas nas seguintes grandes áreas:

Protótipos: Pela sua habilidade de reconfiguração, FPGAs são utilizados em

prototipagens de sistemas. Aliado ao design digital é possível obter protótipos de circuitos lógicos simples ou até de processadores mais avançados.

Design Digital: Criação de qualquer circuito lógico a partir de design digital.

Várias áreas da engenharia são afins à utilização de circuitos lógicos.

Ensino de Tecnologias e Conceitos: A FPGA pode ter um importante papel

em várias disciplinas da engenharia. Este papel pode ser tanto didático, quanto no auxílio de implementações nestes tópicos. Dentre as disciplinas podemos citar: Eletrônica Digital, Robótica, Controle Digital, Eletrônica de Potência, Inteligência Artificial, Arquitetura e Organização de Computadores, Processamento Digital de Sinais.

Núcleos Embutidos: Núcleos de processamento especializados em uma tarefa,

capazes de realizar as operações em tempo real visto que as mesmas são efetuadas em hardware. Núcleos Embutidos utilizando FPGA são inclusive reconfiguráveis, tornando-os versáteis.

Chips Híbridos: Combinam partes de lógica fixa e partes de lógica programável.

(9)

9 rotinas comuns. Por sua vez a parte programável possuirá a flexibilidade já conhecida da FPGA.

1.4. INTRODUÇÃO AO KIT DE DESENVOLVIMENTO

O kit de FPGA é formado por periféricos que possibilitam sua interação com sinais de áudio, display gráfico e alfanumérico, comunicação serial e USB, codec de áudio, chaves para simulação e reset, leds para uso geral bem como barramento de acesso a quarenta pinos de entrada e saída do componente.

1.4.1. A PLATAFORMA FPGA

O chip empregado no kit é o EP2C8Q208C8 fabricado pela Altera, sistema da família Cyclone II, com 8256 elementos lógicos, dois PLLs (Phase-Locked Loop), 36 blocos de 4Kbit de memória e com 18 elementos lógicos de multiplicação embarcados.

Figura 1.1 – Visão Geral da Placa

Abaixo serão mostrados os componentes presentes na placa, contendo uma breve descrição dos mesmos, modelo esquemático e tabela de referência contendo as ligações equivalentes dos pinos de cada componente no FPGA.

(10)

10

1.4.2. SWITCHES

Foram implementadas no Kit de FPGA um conjunto de Switches, totalizando 16, para simular acionamentos diversos. Os Switches forçam os níveis lógicos alto e baixo diretamente no pino onde estão conectadas, garantindo níveis estáveis para uma simulação eficaz durante o desenvolvimento e estudos realizados com o kit.

Figura 1.2 – Esquemático dos circuitos dos Switches

Pino Componente Pino FPGA Descrição

CH1 PIN_68 Switch SW [0] CH2 PIN_69 Switch SW [1] CH3 PIN_70 Switch SW [2] CH4 PIN_72 Switch SW [3] CH5 PIN_74 Switch SW [4] CH6 PIN_75 Switch SW [5] CH7 PIN_76 Switch SW [6] CH8 PIN_77 Switch SW [7] CH9 PIN_80 Switch SW [8] CH10 PIN_81 Switch SW [9] CH11 PIN_82 Switch SW [10] CH12 PIN_84 Switch SW [11] CH13 PIN_86 Switch SW [12] CH14 PIN_87 Switch SW [13] CH15 PIN_88 Switch SW [14] CH16 PIN_89 Switch SW [15]

(11)

11

1.4.3. CHAVES

Para a simulação de experiências que exijam teclas ou ações provenientes de transientes de nível, fora especificado um módulo de chaves que estão diretamente ligadas ao FPGA já com os devidos filtros anti-bouncing em cada dispositivo.

Figura 1.3 – Esquemático dos circuitos das Chaves

Pino Componente Pino FPGA Descrição

P0 PIN_90 Chave CH1 P1 PIN_92 Chave CH2 P2 PIN_94 Chave CH3 P3 PIN_95 Chave CH4 P4 PIN_96 Chave CH5 P5 PIN_97 Chave CH6 P6 PIN_99 Chave CH7 P7 PIN_101 Chave CH8

(12)

12

1.4.4. DISPLAY DE SETE SEGMENTOS

Para este kit foram previstas operações lógicas básicas, dentre elas operações com Displays de Sete Segmentos. O módulo de display foi implementado para operar em modo multiplexado, nesse modo cada display é acessado pelo mesmo barramento, sendo necessário o acionamento do display no qual se deseja controlar.

Para que se obtenha o acionamento de todos os displays, se faz necessária à escrita constante em cada um deles a uma taxa de atualização de 100 Hz, nessa frequência a multiplexação se torna transparente ao usuário. Cada segmento dos displays é aceso com nível lógico ‘0’.

Figura 1.4 – Esquemático do circuito do Display de sete segmentos

(13)

13

Pino Componente Pino FPGA Descrição

D0 PIN_102 Segmento ‘a’

D1 PIN_103 Segmento ‘b’

D2 PIN_104 Segmento ‘c’

D3 PIN_105 Segmento ‘d’

D4 PIN_106 Segmento ‘e’

D5 PIN_107 Segmento ‘f’

D6 PIN_110 Segmento ‘g’

D7 PIN_112 Ponto

DISPLAY_1 PIN_113 Ativa o Display DP1

DISPLAY_2 PIN_114 Ativa o Display DP2

DISPLAY_3 PIN_115 Ativa o Display DP3

DISPLAY_4 PIN_116 Ativa o Display DP4

Tabela 1.3 – Pinagem correspondente ao Display de sete segmentos do FPGA

1.4.5. LEDs

Estão disponíveis 16 LEDs diretamente ligados aos pinos do FPGA para que possa servir de interface para usuário durante o desenvolvimento de projetos diversos, esses LEDs são acionados com nível lógico alto.

(14)

14

Pino Componente Pino FPGA Descrição

LD1 PIN_127 LED LD1 LD2 PIN_128 LED LD5 LD3 PIN_133 LED LD7 LD4 PIN_134 LED LD9 LD5 PIN_135 LED LD11 LD6 PIN_137 LED LD13 LD7 PIN_138 LED LD15 LD8 PIN_139 LED LD3 LD9 PIN_141 LED LD2 LD10 PIN_142 LED LD4 LD11 PIN_143 LED LD6 LD12 PIN_144 LED LD8 LD13 PIN_145 LED LD10 LD14 PIN_146 LED LD12 LD15 PIN_147 LED LD14 LD16 PIN_149 LED LD16

Tabela 1.4 – Pinagem correspondente aos LEDs do FPGA

1.4.6. DISPLAY LCD

O Kit possui os conectores para controle e operação com displays alfanuméricos e gráficos, estabelecendo uma interface visual com o usuário.

Para se ajustar o contraste do display, basta utilizar o trimpot “contraste”, que está identificado no kit, do lado direito. Este contraste é compartilhado tanto pelo display alfanumérico quando o gráfico por isso altera-se o nível de contraste de ambos os displays de cristal líquido.

(15)

15

Figura 1.6 – Esquemático dos conectores para Display LCD

Pino Componente Pino FPGA Descrição

RD0 PIN_164 Palavra para o LCD [0]

RD1 PIN_163 Palavra para o LCD [1]

RD2 PIN_162 Palavra para o LCD [2]

RD3 PIN_161 Palavra para o LCD [3]

RD4 PIN_160 Palavra para o LCD [4]

RD5 PIN_152 Palavra para o LCD [5]

RD6 PIN_151 Palavra para o LCD [6]

RD7 PIN_150 Palavra para o LCD [7]

EN PIN_165 Habilita o LCD

RS PIN_168 Seleciona Dado ou Comando, 0 = Comando, 1 = Dado RW PIN_169 Seleciona Leitura ou Escrita, 0 = Escrita, 1 = Leitura

CS1 PIN_118 -

CS2 PIN_117 -

VOUT - Não possui ligação no FPGA

RESET - Chave RESET presente na placa

Tabela 1.5 – Pinagem correspondente aos LEDs do FPGA

1.4.7. COMUNICAÇÃO SERIAL RS-232

O kit possui um adaptador para comunicação serial padrão RS232, efetuando a comunicação direta do kit com qualquer dispositivo serial utilizando o mesmo padrão, incluindo computadores, usando o circuito MAX3232. A comunicação serial pode ser configurada para operar nas taxas de comunicação padrão para este tipo de dispositivo.

(16)

16

Figura 1.7 – Esquemático do circuito MAX3232

Pino Componente Pino FPGA Descrição

RTS PIN_207 -

CTS PIN_208 -

RX PIN_206 -

TX PIN_205 -

Tabela 1.6 – Pinagem correspondente ao MAX3232

1.4.8. MEMÓRIA FLASH

A memória flash para expansão de memória de dados do FPGA tem o intuito de possibilitar gravações e leituras de dados com velocidade elevada, sendo utilizada para expansão da memória interna do FPGA e também possibilitando a gravação dos dados já processados.

O dispositivo especificado foi o AT45DB081D, fabricado pela ATMEL, com capacidade de 8Mb, taxa de comunicação SPI de até 66MHz e modo programação de página inteligente.

(17)

17

Pino Componente Pino FPGA Descrição

CS_FLASH PIN_203 -

SCK_FLASH PIN_200 -

DATAIN_FLASH PIN_199 Entrada de dados da memória flash DATAOUT_FLASH PIN_198 Saída de dados da memória flash

RESET - Chave RESET presente na placa

Tabela 1.7 – Pinagem correspondente à Memória Flash

1.4.9. PORTAS DE EXPANSÃO

O kit possui 50 pinos de expansão divididos em: 41 pinos de Entrada/Saída de uso geral, 6 pinos para sinais de Clock externos, 1 pino que fornece 3.3V e 2 pinos de aterramento.

(18)

18

Pino Componente Pino FPGA Descrição

IO0 PIN_170 Pino de Expansão IO0

IO1 PIN_171 Pino de Expansão IO1

IO2 PIN_173 Pino de Expansão IO2

IO3 PIN_175 Pino de Expansão IO3

IO4 PIN_176 Pino de Expansão IO4

IO5 PIN_179 Pino de Expansão IO5

IO6 PIN_180 Pino de Expansão IO6

IO7 PIN_181 Pino de Expansão IO7

IO8 PIN_182 Pino de Expansão IO8

IO9 PIN_185 Pino de Expansão IO9

IO10 PIN_187 Pino de Expansão IO10

IO11 PIN_188 Pino de Expansão IO11

IO12 PIN_189 Pino de Expansão IO12

IO13 PIN_191 Pino de Expansão IO13

IO14 PIN_193 Pino de Expansão IO14

IO15 PIN_3 Pino de Expansão IO15

IO16 PIN_4 Pino de Expansão IO16

IO17 PIN_5 Pino de Expansão IO17

IO18 PIN_6 Pino de Expansão IO18

IO19 PIN_8 Pino de Expansão IO19

IO20 PIN_10 Pino de Expansão IO20

IO21 PIN_11 Pino de Expansão IO21

IO22 PIN_12 Pino de Expansão IO22

IO23 PIN_13 Pino de Expansão IO23

IO24 PIN_14 Pino de Expansão IO24

IO25 PIN_15 Pino de Expansão IO25

IO26 PIN_30 Pino de Expansão IO26

IO27 PIN_31 Pino de Expansão IO27

IO28 PIN_33 Pino de Expansão IO28

IO29 PIN_34 Pino de Expansão IO29

IO30 PIN_35 Pino de Expansão IO30

IO31 PIN_37 Pino de Expansão IO31

IO32 PIN_39 Pino de Expansão IO32

IO33 PIN_40 Pino de Expansão IO33

IO34 PIN_41 Pino de Expansão IO34

IO35 PIN_43 Pino de Expansão IO35

IO36 PIN_44 Pino de Expansão IO36

IO37 PIN_45 Pino de Expansão IO37

IO38 PIN_46 Pino de Expansão IO38

IO39 PIN_47 Pino de Expansão IO39

IO40 PIN_48 Pino de Expansão IO40

CLK2 PIN_27 Pino para sinal de clock externo CLK2 CLK3 PIN_28 Pino para sinal de clock externo CLK3 CLK4 PIN_132 Pino para sinal de clock externo CLK4 CLK5 PIN_131 Pino para sinal de clock externo CLK5 CLK6 PIN_130 Pino para sinal de clock externo CLK6 CLK7 PIN_129 Pino para sinal de clock externo CLK7

(19)

19

1.4.10. OSCILADOR

O kit possui um oscilador que produz um sinal de clock com frequência de 24 MHz já integrada a placa.

Pino Componente Pino FPGA Descrição

OSCILADOR PIN_23 Sinal de clock de 25 MHz

Tabela 1.9 – Pinagem correspondente ao sinal de Clock

1.4.11. RESET

A chave RESET presente na placa já está ligada ao módulo de Memória Flash e ao conector de Display Gráfico exercendo a função de suas respectivas entradas de RESET, mas ela também está disponível para ser usada em qualquer sistema implementado no FPGA.

Pino Componente Pino FPGA Descrição

RESET PIN_201 Chave RESET

(20)

20

2. DESING DIGITAL

2.1. LINGUAGEM DE DESCRIÇÃO DE HARDWARE

Este tópico tem como objetivo introduzir conceitos básicos de VHDL (Linguagem de Descrição de Hardware com ênfase em Circuitos Integrados de Altíssima Velocidade). VHDL é uma forma de se descrever, através de um programa, o comportamento de um circuito ou componente digital.

Uma linguagem de descrição de hardware descreve o que um sistema faz e como ele o faz. Esta descrição é um modelo do sistema hardware, que será executado em um software chamado simulador. Um sistema descrito em linguagem de hardware pode ser implementado em um dispositivo programável (FPGA - Field Program Gate Array), permitindo assim o uso em campo do seu sistema, tendo a grande vantagem da alteração do código a qualquer momento.

Vantagens e Desvantagens de se utilizar VHDL

A descrição de um sistema em VHDL apresenta inúmeras vantagens, tais como:

• Intercâmbio de projetos entre grupos de pesquisa sem a necessidade de alteração;

• Permite ao projetista considerar no seu projeto os delay's comuns aos circuitos digitais;

• A linguagem independe da tecnologia atual, ou seja, você pode desenvolver um sistema hoje e implementá-lo depois;

• Os projetos são fáceis de serem modificados;

• O custo de produção de um circuito dedicado é elevado, enquanto que usando VHDL e Dispositivos Programáveis, isto passa a ser muito menor;

• Reduz consideravelmente o tempo de projeto e implementação.

Quanto as desvantagens, apenas uma é relevante: • VHDL não gera um hardware otimizado.

(21)

21

2.1.1. Componentes de um projeto VHDL

A estrutura de um programa VHDL, baseia-se em 4 blocos.

• PACKAGE (Pacote): são declaradas as constantes, tipos de dados, subprogramas;

• ENTITY (Entidade): declaração dos pinos de entrada e saída;

• ARCHITECTURE (Arquitetura): define as implementações do projeto;

• CONFIGURATION (Configuração): define as arquiteturas que serão utilizadas. Todo sistema necessita de uma interface com o mundo externo. Em VHDL esta interface é a entity, e é fundamental para todo e qualquer sistema.

Para se atingir a funcionalidade desejada, os dados devem sofrer transformações dentro do sistema. Esta parte interna do sistema responsável pelas transformações dos dados é chamada de corpo ou architecture. Qualquer que seja o

sistema, independente de sua complexidade, necessita de uma interface (entity) e de um corpo (architecture).

Algumas vezes, alguns sistemas necessitam de funcionalidades adicionais, que são conhecidas como package.

(22)

22

Figura 2.1: Representação de uma descrição feita utilizando VHDL

PACKAGE (Pacotes)

Quando for necessário utilizar algo não definido nas bibliotecas do VHDL padrão, faz-se uso do package (similar aos includes da Linguagem C). A única

restrição é que o package deve ser previamente definido, antes do inicio da entity. O uso do package é feito por meio de duas declarações: library e use.

Dos vários packages existentes, o mais conhecido e usado é o STD_LOGIC_1164 da IEEE que contém a maioria dos comandos adicionais mais usados em VHDL. O uso deste package é dado por:

library IEEE;

use IEEE.std_logic_1164.all;

Observação: .all significa que todos os elementos da bibliotecas devem ser utilizados,

(23)

23 Pacotes normalmente usados podem ser vistos na figura 2.2.

Figura 2.2: Pacotes mais usuais

ENTITY (Entidade)

A entity é a parte principal de qualquer projeto, pois descreve a interface do

sistema. Tudo que é descrito na entity fica automaticamente visível a outras unidades associadas com a entity. O nome do sistema é o próprio nome da entity. Assim, deve-se deve-sempre iniciar um projeto em VHDL pela entity.

Como exemplo, considere a Figura 2.3, onde há 8 linhas de transmissão associadas ao sistema A, que é formado por três sub-sistemas; B, C e D. Somente as linhas TL1, TL2, TL3, TL7e TL8 serão descritas na entity do sistema A. As demais linhas não são necessárias, pois são internas ao sistema.

Figura 2.3 - Sistema Genérico.

(24)

24

Parameters refere-se aos parâmetros vistos do mundo externo, tais como

largura de barramento e frequência de operação, e que são declarados como generics.

Connections refere-se a onde e como ocorre a transferência de informações

para dentro e fora do sistema, e são declarados por ports.

Tipo de Portas:

IN: Porta de Entrada; (Não pode receber atribuição de valor dentro do programa). OUT: Porta de Saída; (Não pode ser utilizada como entrada para o outro circuito). INOUT: Porta de entrada e saída;

BUFFER: Porta de saída que pode ser atualizada por mais de uma fonte; LINKAGE: O valor da porta pode ser lido e atualizado.

Um exemplo pode ser visto na figura 2.4:

Figura 2.4: Entidade

A variável <tipo> pode ser: bit, bit_vetor, std_logic, std_logic_vector, boolean, real; Como mostra a figura 2.5

(25)

25

ARCHITECTURE (Arquitetura)

A entity de um sistema é tão importante que a architecture é especificada na

forma de architecture of entity. Um sistema pode ser descrito em termos de

funcionalidade, isto é, o que o sistema faz, ou em termos de estrutura, isto é, como o sistema é composto.

A descrição funcional especifica as respostas nas saídas em termos das excitações aplicadas nas entradas. Neste caso não há nenhuma informação de como o sistema deverá ser implementado. A descrição estrutural, por sua vez, especifica quais componentes devem ser usados e como devem ser ligados. Esta descrição é mais facilmente sintetizada, porém exige mais experiência do projetista.

Desta forma, pode-se ter várias architectures capazes de implementar um mesmo circuito.

Uma entity pode ser formada por mais de uma architecture!

Arquitetura Simples: A arquitetura simples contém apenas um processo, ou seja,

apenas um bloco (figura. 2.6).

Figura 2.6: Arquitetura Simples

Arquitetura Concorrente: A arquitetura concorrente é uma forma mais complexa de

descrever um sistema, geralmente apresenta vários processos dentro de uma arquitetura.

(26)

26

CONFIGURATION (Configuração)

Uma mesma entidade pode ter varias arquiteturas. Veja figura 2.7

Figura 2.7: Configuração

2.2. SINAIS

Os sinais são de vital importância em virtualmente todos os sistemas eletrônicos, podendo transmitir dados internamente ou externamente ao sistema, assumindo assim um papel muito importante em VHDL. Os sinais externos são apresentados na entity e os sinais internos são apresentados na architecture.

Os sinais podem ser uma linha (transmissão de um sinal por vez) ou um barramento, também chamado de vetor (transmissão de várias informações simultaneamente). Em VHDL estes sinais são chamados de bit e bit_vector,

respectivamente. No caso de bit_vector, a ordem dos bits é de vital importância. Como

exemplo, se o bit7 for o mais significativo e o bit0 o menos significativo, em VHDL isto seria representado por bit_vector(7downto0).

Os sinais externos são apresentados na entity pelo comando port. Os ports

funcionam como canais dinâmicos de comunicação entre a entity e o ambiente. Cada sinal deve ter nome e tipo únicos. A direção do sinal, que é de vital importância, também deve estar presente e pode ser de entrada (input), saída (output) ou bidirecional (in-out). A forma de uso do comando port é dada por:

(27)

27 Tem-se o nome do port, seguido por dois pontos, o modo ou direção do sinal, o tipo do port, seguido opcionalmente por um valor inicial (precedido pelo símbolo “:=”) e também opcionalmente por algum comentário. A listagem a seguir ilustra um exemplo do comando port. Observe que neste caso há mais de um port, e estão separados por ponto-e-vírgula.

port ( RESULT : inout bit_vector (0 to 7); z : in bit;

EXTBUS : out bit_vector (4 downto 0));

Por outro lado, os sinais internos são apresentados na architecture, pelo comando signal. A listagem a seguir ilustra um exemplo do comando signal.

signal x, y : bit

Observe que não há a necessidade de se especificar o modo de um signal (in, out ou inout), pois é interno ao sistema.

A “visibilidade” ou disponibilidade dos sinais depende do local onde foi declarado. Um sinal declarado em um package é visível em todos os projetos que usam este package. Um sinal declarado como port de uma entity é visível em todas architectures desta entity. Já um sinal declarado como parte de uma architecture só é visível internamente a esta architecture. Finalmente, se um sinal for declarado dentro de um bloco em uma architecture, só será visível dentro deste bloco.

2.3. Semântica da linguagem VHDL

2.3.1. Elementos Léxicos

O nome de uma entity, que é o seu identificador serve basicamente para documentação, e assim, deve-se preferencialmente usar nomes associados com a descrição do sistema. O nome pode ser composto por letras e números, sendo que deve iniciar por uma letra.

Toda entity deve terminar com o comando end. Para se evitar erros, o comando end deve ser seguido do nome da entity.

(28)

28 Quando se escreve um programa em VHDL, devem-se tomar certos cuidados, com os identificadores, na figura 2.8 são apresentados alguns identificadores válidos e inválidos.

Figura 2.8: Identificadores

COMENTÁRIOS

Todo projeto em VHDL deve apresentar uma boa documentação. Isto pode ser feito pela inclusão de comentários ao longo da descrição. Os comentários em VHDL são iniciados por dois traços “--“ e terminam ao final da linha. Uma boa prática também é a inclusão no início da listagem VHDL da descrição do projeto, indicação de bibliotecas, nomes dos autores e qualquer outra informação relevante. Os comentários são mais relevantes ao nível de sistema. A seguir é apresentada a descrição de uma ULA genérica, conforme ilustrada na Figura 2.9. Observe os comentários em cada linha.

(29)

29

Figura 2.9 - ULA Genérica.

entity ULA is port (

In1 : in bit_vector (3 downto 0); -- operando 1 In2 : in bit_vector (3 downto 0); -- operando

Sel : in bit_vector (3 downto 0); -- seleção de operação Ci : in bit; -- carry in

Modo : in bit; -- modo (aritmético/lógico)

Out : out bit_vector (3 downto 0); -- resultado da operação Co : out bit; -- carry out

Igual : out bit; -- igualdade de In1 e In2 );

end entity ULA;

COMANDO GENERIC

O comando generic serve para descrever o valor de uma constante, que por sua

vez, serve para estabelecer valores de temporizarão, largura de barramentos, número de bits em somadores e comparadores, etc. O comando generic é posicionado dentro da entity, normalmente antes dos ports. O comando generic consiste dos seguintes elementos:

• Nome da generic seguido por dois pontos, • Tipo da generic,

• Opcionalmente, o valor da generic precedida por :=. A listagem a seguir ilustra o uso de generic:

(30)

30 generic ( BusWidth : integer := 8;

MaxDelay : time :=20 us );

2.3.2. Estruturas para descrição de comportamento

TYPE

Um dos tipos de estruturas de dados em VHDL é o scalar type (tipo escalar) ou scalar.

O scalar type não tem elemento ou estrutura interna, e todos seus valores são ordenados e estão em uma certa faixa, ou são explicitamente listados. O VHDL já tem previamente definido alguns scalar type, que são apresentados na Tabela 1.

Tipo Exemplo Observação

Boolean True, False Diferente de Bit

Character ‘0’, ‘+’, ‘A’, ‘\’ Letras, Números e Caracteres. Integer -12, 0, 347557 Números inteiros (de -2147483647 a

2147483647)

Real 0.0, 1.0001, -1.0E-5 Números em ponto flutuante (de –1.0E308 a 1.0E308)

Bit ‘0’, ‘1’ Valores lógicos ‘0’ e ‘1’

Tabela 2.1 - Tipos Escalares em VHDL.

O usuário também pode definir algum outro tipo escalar, chamado user defined type. Considere como exemplo a condição em que se deseja projetar uma máquina de

estados, com 4 estados distintos; esperar, buscar, decodificar e executar. A declaração deste tipo seria:

type MEstado is (Esperar, Buscar, Decodificar, Executar); Outros exemplos de definidos pelo usuário seriam:

Type dedos is range1to10

Type dedinho is range10downto1 Type pos_neg is range-1to1

Outro tipo é o physical type que serve para especificar valores físicos. Entretanto, este tipo é previamente definido em VHDL somente para tempo. A listagem a seguir ilustra a descrição do tipo time.

(31)

31 type time is range –2147483647 to 2147483647

units fs; ps = 1000 fs; ns = 1000 ps; us = 1000 ns; ms = 1000 us; sec = 1000 ms; min = 60 sec; hour = 60 min; end units; PREDEFINED ARRAYS

Estruturas regulares consistindo de elementos do mesmo tipo são chamadas de Arrays. Há dois tipos de arrays pré-definidos em VHDL: bit-vector (elementos do tipo

bit) e string (elementos do tipo character). Um único elemento, em ambos os tipos de

arrays é especificado por ‘ (apóstrofe), e dois ou mais elementos são especificados por “ (aspas). A listagem a seguir ilustra a declaração de um array e as duas maneiras de se especificar seus elementos.

Signal BusDados : bit_vector (7 downto 0); BusDados = ‘00110101 BusDados(7) = ‘0’ BusDados(6) = ‘0’ BusDados(5) = ‘1’ BusDados(4) = ‘1’ BusDados(3) = ‘0’ BusDados(2) = ‘1’ BusDados(1) = ‘0’ BusDados(0) = ‘1’

(32)

32

USER-DEFINED ARRAY

Os arrays predefinidos são unidimensionais (também chamados de vetoriais), entretanto, às vezes se torna necessário definir um array de dimensões maiores. Considere como exemplo de aplicação uma memória. São necessárias duas dimensões para se especificar uma memória, isto é, número de posições e número de bits em cada posição. A descrição de uma memória de 2Kbytes de 8 bits seria:

signal memoria2K8 : array (0 to 2047) of bit_vector (7 downto 0);

2.3.3. Expressões e operadores

Tipos de dados não lógicos

Abaixo são listados alguns tipos de dados não lógicos: • BIT: Assume valores ‘0’ e ‘1’

Boolean: Assume valores true ou false.

Real: Representam valores reais. Exemplo: -3.2, 4.56, 6.0, -2.3E+2;

Integer: Representam valores inteiros. Exemplo: 3, 546, -349;

Physical: Representam uma medida física: voltagem, capacitância, tempo.

Tipos pré-definidos: ps, ns, um, ms, séc, min, hr.

Intervalos: Permite determinar um intervalo de utilização dentro de um

determinado tipo.

range <valor_menor> to <valor_maior> range <valor_maior> downto <valor_menor>

Array: em VHDL um array é definido como uma coleção de elementos do

mesmo tipo.

type word is array (31 downto 0) of bit; type memory is array (address) of word; type transform is array (1 to 4, 1 to 4) of real; type vector is array (integer range < > ) of real; type string is array (positive range < >) of character type b is array (1 to 5) of character ;

(‘t’, ‘e’, ‘s’, ‘t’, ‘e’)

(33)

33 (3 => ‘s’, 2 => ‘e’, 5 => ‘e’, others => ‘t’)

Record: semelhante a “struct” da Linguagem C, ou seja, é uma coleção de

elementos de tipos diferentes.

Figura 2.10: Record

EXPRESSÕES E OPERADORES

Operadores Lógicos

Como os sinais em VHDL são tipicamente lógicos, os operadores lógicos são os mais usados. Os operadores and, or, nand, nor, xor e xnor exigem dois operandos e

o operador not necessita de apenas um. Essas operações lógicas são definidas para

os tipos bit, boolean e bit_vector, e exige-se que os operandos sejam do mesmo tipo. No caso de vetores, estas operações são efetuadas bit a bit.

Operadores de Deslocamento

As operações de deslocamento são restritas a arrays, cujos elementos devem ser bit ou boolean. Estas operações exigem dois operandos. Um sendo o array e o outro, do tipo integer, que determina o numero de posições a serem deslocadas. Se o valor do segundo operando for negativo, o sentido do deslocamento fica invertido. As operações de deslocamento, conforme indicadas na Figura 2.11 são:

sll: shift left logical(deslocamento lógico a esquerda), srl: shift right logical(deslocamento lógico a direita),

(34)

34 sla: shift left arithmetic (deslocamento aritmético a esquerda),

rla: shift right arithmetic (deslocamento aritmético a direita), rol: rotate left logical (rotacionamento lógico a esquerda), ror: rotate right logical (rotacionamento lógico a direita).

Figura 2.11 - Operações de Deslocamento.

Operadores Numéricos

As operações de adição (+), subtração (-), multiplicação (*), divisão (/), modulo (mod), valor absoluto (abs), resto (rem) e potência (**) são aplicados aos

tipos integer e real. Os operandos devem ser do mesmo tipo. O tipo time exige que os operandos sejam iguais nas operações de adição e subtração, mas um operando time pode ser multiplicado ou dividido por um operando integer ou real.

(35)

35

Comparações

As comparações entre dois objetos podem ser igual (=), diferente (/=), menor

(<), menor ou igual (<=), maior (>), e maior ou igual (>=). Os objetos comparados

devem ser do mesmo tipo e podem ser boolean, bit, character, integer, real, time, string ou bit_vector, entretanto o resultado é sempre boolean (true ou false). Ao se comparar dois vetores de tamanhos diferentes, eles são primeiramente justificados no tamanho do menor.

Concatenação

Concatenação é uma forma conveniente de se unir dois ou mais vetores, criando um novo vetor, cujo tamanho é a soma dos vetores dos operandos. Os vetores devem ser do mesmo tipo e pode-se unir também um bit a um vetor. A listagem a seguir ilustra a situação em que se une parte de dois vetores e um bit para formar um novo vetor. NovoVetor <= ( Vetor1(0 to 3)

& Vetor2(3 to 5) & Bit1);

Atribuição de Sinais

Eventualmente os resultados das operações em VHDL devem ser atribuídas às saídas. Isto é feito pelo símbolo <= em que o valor da expressão a direita é atribuído à

expressão à esquerda. Para auxiliar na memorização desta operação, basta observar que a seta formada indica o fluxo da informação. A listagem a seguir ilustra alguns exemplos de atribuição. x <= y <= z; a <= b or c; k <= ‘1’; m <= “0101”; n <= m & k;

Tendo em vista que nada é instantâneo no mundo real, em VHDL também é possível modelar estes atrasos naturais por meio da expressão after. A expressão after determina o tempo após o qual uma expressão se torna efetiva. A declaração a

(36)

36 luz <= chave after 3 s;

Atraso Inercial

Atraso inercial é tempo mínimo que um pulso deve durar para que seja aceito por um dado circuito. Esta característica de circuitos reais faz parte do modelo de atrasos em VHDL. Assim, para o caso anterior, observe na Figura 2.12.a o comportamento do circuito para um pulso de 2s, e na Figura 2.12.b a mesma análise para um pulso de 4s.

(a)

(b)

Figura 2.12 - Efeito de Atraso Inercial para (a) um Pulso de 2s, e (b) um Pulso de 4s.

Como na Figura 2.12.a o pulso de entrada tem uma duração de apenas 2s, não é o suficiente para vencer o atraso inercial e efetivamente acionar a saída luz. Já na Figura 2.12.b o pulso de entrada tem uma duração de 4s, o que é maior que o atraso inercial e consegue acionar a saída luz.

(37)

37 Outro problema do mundo real é o atraso que ocorre em linhas de transmissão. Neste caso não há uma duração mínima do pulso, mas sempre há um atraso no transporte do sinal. Isto é modelado em VHDL pela inclusão do termo transport antes

da especificação de valor e atraso, conforme ilustrado a seguir. luz <= transport chave after 3 s;

Para melhor ilustrar este conceito, considere o exemplo anterior, agora usando este conceito de atraso de transporte, conforme ilustrado na Figura 2.13.

Figura 2.13 - Comando Transport Aplicado em um Pulso de 2s.

Constantes

As constantes desempenham o mesmo papel que as generics. Ao contrário da generic que é declarada na entity, a constant é declarada na architecture. A

declaração de uma constant consiste do comando constant seguido do nome da constante, dois pontos, tipo da constante e o símbolo “:=”, conforme ilustrado a seguir.

constant N : integer := 123

A constant serve para atribuir valores locais, tornando o projeto mais simples,

mais fácil de se ler e de efetuar manutenções/alterações. Como a constant é declarada na architecture, não pode ser usada para definir dimensões de vetores. Da mesma forma, a constant só pode ser usada dentro da architecture na qual foi declarada. Por outro lado, a generic que é declarada na entity é usada por todas as architectures.

(38)

38

2.4. Descrição de Comportamento (Process)

O comportamento, ou funcionalidade, de um sistema corresponde a uma lista de operações a serem executadas para se obter um determinado resultado. Process é o

modo formal de se fazer uma lista sequencial dessas operações, e tem um formato estruturado. Existem algumas regras para se fazer uma descrição process.

Inicialmente, deve-se especificar que a listagem corresponde a um process, e isto é feito pelo comando process, que fica posicionado após o nome e os dois pontos.

Da mesma forma este nome deve ser colocado após a declaração end of process.

Para separar as operações sequenciais de comandos tais como variable ou constant,

a declaração begin é usada para marcar o inicio da listagem das operações

sequenciais.

Ao contrário de linguagens de programação convencionais, processos descritos em VHDL não terminam. Após a execução do último comando, process é executado novamente desde o primeiro comando.

Circuitos eletrônicos em geral operam em modo contínuo, aguardando ocorrência de certas condições de entrada, executando tarefas, suspendendo as atividades quando se completa o serviço, e novamente retomando o serviço na ocorrência de certas condições de entrada.

Em VHDL suspende-se um processo pelo comando wait. Este comando pode

suspender o processo incondicionalmente, ou apresentar uma lista de condições a serem satisfeitas para ser e tomar a operação normal. O comando wait pode aparecer

em três formas distintas.

Na primeira forma, ou wait for o processo é suspenso por um certo intervalo de

tempo.

Na segunda, ou wait until o processo é suspenso até que uma certa condição

seja verdadeira devido a mudança dos sinais envolvidos nesta condição. Observe que se não houver mudança nos sinais, o processo continua suspenso.

(39)

39 Na terceira forma, ou wait on o processo é suspenso até que um evento da lista

de sinais ocorra. Isto é, o processo continua quando ocorrer qualquer uma das condições de sua lista. Eventualmente pode ocorrer uma mistura destas formas.

As duas listagens a seguir ilustram exemplos destes casos. wait for 10 ns;

wait for periodoCLK / 2; wait until CLK = ‘1’;

wait until CE and (not RST); wait until dado > 16;

wait on CLK; wait on dado;

wait on dado until CLK = ‘1’; wait until CLK=’1’ for 10 ns;

Como já mencionado, os comandos de um process são executados constantemente e ciclicamente. Pode parecer, portanto, que não faz diferença de onde se coloca um wait. Na verdade, é de vital importância o seu posicionamento adequado. Se uma instrução wait for colocada no início de um process, nada ocorre até que as

condições do wait sejam satisfeitas.

Se este mesmo wait for colocado no final de um process, todos os comandos anteriores ao wait serão executados.

A forma wait on é usado com mais frequência que as demais. Ao invés de se

utilizar o wait on no final de um process, pode-se usar o conceito de sensitivity list, ou

lista de sensitividade, que consiste simplesmente em colocar as condições do wait on

ao lado do comando process (entre parênteses), e se obtém os mesmos resultados. Neste caso, o process não pode conter nenhum wait. A listagem a seguir ilustra o uso de process para se implementar um multiplexador 2x1. Observe que os sinais A, B e Sel foram colocados na sensitivity list.

MUX2x1: process (A, B, Sel) constant High : Bit := ‘1’; begin

y <=A;

if (Sel = ‘1’) then Y <= B; end if;

end process MUX2x1;

Deve-se ressaltar que neste caso, os comandos do process são executados uma vez, e o processo fica suspenso. Ao haver mudança em qualquer uma das

(40)

40 variáveis do wait on (listados no final do process) ou variáveis listadas ao lado do comando process (sensitivity list), o process é executado mais uma vez.

A descrição de comportamento em VHDL é empregada para descrever a reação das saídas às entradas. Entretanto, qualquer novo valor atribuído a uma variável só passa a valer efetivamente quando o processo é suspenso. Adicionalmente, somente a última atribuição a uma variável é válida. Como entradas e saídas são sinais, qualquer variação de saída é tido como variação de sinal e novamente o processo é executado. Para entender melhor este conceito, considere o exemplo listado a seguir.

process (sinal1, sinal2) begin

sinal2 <= sinal1 + 5; end process;

Uma vez iniciado o processo, pode-se ver que o Sinal2 recebe o valor de Sinal1 acrescido de 5. Como houve uma variação em Sinal2, o processo é executado novamente. Desta vez, como não há variação em nenhuma variável (Sinal2 continua com o valor de Sinal1 acrescido de 5), o process é suspenso. Neste momento Sinal2 efetivamente recebe o novo valor.

Infelizmente há sérias limitações no process. Não se pode declarar sinais dentro do process. Outra grave limitação é que somente o último valor atribuído à um sinal se torna efetivo, e ainda assim, somente quando o processo é suspenso.

Considere, como exemplo, a descrição apresentada a seguir. Considere o valor inicial de todos os sinais como sendo “1”. Quando D mudar para 2, o processo é iniciado. Quais seriam os valores quando o processo for suspenso?

process (C, D) begin A <= 2; B <= A + C; A <= D + 1; E <= A * 2; end process;

Os valores finais das variáveis são: A = 3; B = 2; C = 1; D = 2; E = 2;

(41)

41 Esta limitação do process é eliminada com o uso de variables, que podem ser

declaradas dentro do process. O valor atribuído a uma variable é válido imediatamente após a sua atribuição, e pode receber várias atribuições no mesmo process. A listagem a seguir ilustra como se declara e utiliza as variables.

process (C, D)

variable At, Bt, Et: integer := 0; begin At := 2; Bt := At + C; At := D + 1; Et <= A * 2; A <= At; B <= Bt; E <= Et; end process;

Considere os mesmos valores iniciais do exemplo anterior. Observe que a atribuição de valores de uma variável é feita utilizando-se “:=”. Compare os resultados

deste exemplo, apresentados a seguir os do exemplo anterior. Os valores finais das variáveis são:

A = 3; B = 3; C = 1; D = 2; E = 6;

Para um melhor entendimento, a Tabela 2 apresenta uma comparação entre

signal e variable, observe a tabela a seguir que ilustra suas semelhanças e

diferenças.

Signal Variable

Declaração Em architecture ou como port na entity. Dentro de process.

Atribuição Recebe valor atribuído na suspensão do process. Somente a última atribuição é

válida. Ex: A<= B + C

Recebe valor atribuído imediatamente. Toda

atribuição é válida. Ex: A:= B + C

Atraso Inercial e Transporte Não há

Tabela 2.2 - Comparação entre Variables e Signals.

2.5. Controle da Sequência

Como os processes representam sistemas reais estão sujeitos a constantes mudanças externas e assim, normalmente não executam todas as instruções. Estas mudanças externas podem ser modeladas em VHDL pelos comandos condicionais.

(42)

42

2.5.1. Comando if then

Algumas operações são executadas somente se certas condições forem satisfeitas, e são chamadas de operações condicionais.

Se a condição for verdadeira, então a lista de operações é executada. As operações desta lista devem estar separadas por ponto-e-vírgula. Ao término destas operações deve ser colocado o end if. Considere como exemplo o process de um

flip-flop D ativo por rampa de subida mostrado na figura 2.14.

Figura 2.14: Comando if-else

2.5.2. Comando if then else

O comando if then po de ser modificado para se obter maior flexibilidade através do comando if then else.

Se a condição for verdadeira, a primeira operação é executada, caso contrario, a segunda operação é executada. Na verdade, cada condição podem ser varias operações separadas por ponto-e-vírgula.

Para uma maior flexibilidade ainda, este comando pode incluir novos testes através do elsif. A listagem da figura 2.15 ilustra como exemplo o process de um flip-flop tipo D ativo por rampa de subida, com linha de reset ativa por “1”.

(43)

43

Figura 2.15: Comando If-Then-Else

2.5.3. Comando Case

O uso do comando if then else com outros “if” aninhados serve para selecionar uma ramificação, mas pode ficar complicado se o número de opções se tornar maior que três. Para esta situação utiliza-se o comando case.

Ao invés de se avaliar uma expressão booleana, o comando case verifica as

condições de uma expressão discreta ou um array. Cada alternativa é composta por: when alternativa => operação

Considere como exemplo a listagem a seguir. O circuito apresenta três entradas de seleção (Modo), duas entradas de dados (In1e In2) e uma saída Out. Dependendo dos valores presentes nas entradas de seleção, diferentes operações são executadas nos dados. Pode-se observar o recurso de se utilizar a opção when others para

(44)

44

Figura 2.16: Comando Case

2.5.4. COMANDO WHILE LOOP

O comando while loop condicional funciona deforma similar ao comando if then.

Ele inicia com uma condição lógica, porém tem na última linha um jump para o início

do loop.

O loop é executado enquanto a condição presente no seu inicio for válida. A condição é verificada e ser for satisfeita, os comandos presentes no loop são executados, caso contrário, o loop é considerado completo e o comando passa para a instrução seguinte ao loop.

Na listagem seguinte faz-se a contagem das transições positivas do sinal de clock desde que o sinal Nivel esteja em 1. Observe que como não há sensitivity list, o process continua sendo executado continuamente.

process

variable conta : integer := 0; begin

wait until Clk = ‘1’; while Nivel = ‘1’ loop conta := conta + 1; wait until Clk = ‘0’; end loop;

(45)

45

2.5.5. COMANDO FOR LOOP

O comando for loop se repete por um número especifico de vezes. Este comando usa um contador, e desde que o valor do contador esteja em uma certa faixa, o loop é executado. Ao término de cada execução do loop, o contador é atualizado.

O contador não precisa ser declarado e é tratado como uma constante, e só existe dentro do loop.

A listagem da figura 2.17 ilustra um exemplo de uso deste comando.

Figura 2.17: Comando For-Loop

2.5.6. COMANDO NEXT E EXIT

Algumas vezes se torna necessário pular alguns comandos do loop e ir diretamente para a próxima interação. Esta situação pode ser obtida pelo comando

next. As formas deste comando são apresentadas a seguir:

next;

next nome_loop ; next when expressão ;

next nome_loop when expressão ;

(46)

46 other : process (flag)

variable a, b : integer := 0 ; begin

a := 0 ; b := 3 ;

alfa : for i in 0 to 7 loop b := b + 1 ;

if i = 5 then next alfa ; end if ;

a := a + b ; end loop alfa ; end process other

Dependendo da situação pode ser necessário terminar o loop, que pode ser conseguido pelo comando exit. Este comando pode ter um dos seguintes formatos:

exit ;

exit nome_loop ; exit when expressão ;

exit nome_loop when expressão ;

A Tabela 3 apresenta dois exemplos equivalentes, usando este comando. show1: process (flag)

variable sun, cnt : integer := 0 ; begin

sum := 0; cnt := 0; um : loop

cnt := cnt +1 ; sum := sum + cnt ; exit when sum > 100 ; end loop um ;

end process ;

show2: process (flag)

variable sun, cnt : integer := 0 ; begin sum := 0; cnt := 0; dois : loop cnt := cnt +1 ; sum := sum + cnt ; if cnt > 100 then exit ; end if ;

end loop dois ; end process ;

(47)

47

3. TUTORIAL QUARTUS II

O software Quartus II é uma ferramenta importante no design digital. Esta seção serve como guia para princípios básicos necessários ao design digital.

3.1. INTRODUÇÃO

Esse pequeno tutorial mostra como colocar o Kit em funcionamento e testá-lo com um exemplo de um programa real.

3.2. INSTALAÇÃO DE HARDWARE

1º - Ligar o cabo paralelo;

• O cabo paralelo é conectado ao JTAG;

• O JTAG se conecta ao FPGA por um cabo flat de 10 vias onde é ligado nos pinos marcados como JTAG (CN8).

2º - Ligar os cabos de alimentação.

3.3. INSTALAÇÃO DE SOFTWARE

Acesse o site da Altera (www.altera.com), obtenha um Login e uma Senha (cada instalação requer uma licença diferente) e solicite uma licença para instalação do Quartus II Web Edition que será enviada por email. Baixe a licença e deixe o arquivo em um diretório criado em “.../Meus Documentos/Altera/lic”.

Com a licença em mãos execute o instalador do Quartus II, depois de instalado, execute o Quartus II e quando requerido, indicar o caminho para o arquivo “.dat” da licença.

3.4. PROGRAMA TESTE

Com o Quartus II funcionando, siga os passos a seguir: • Clique no menu File -> New ;

• Selecione a opção VHDL File;

(48)

48 Library IEEE;

use IEEE.STD_LOGIC_1164.all; entity CONTADOR is

port(CLOCK: in STD_LOGIC;

LEDS : out BIT_VECTOR(7 downto 0); select_display: out bit_vector(3 downto 0)); end CONTADOR;

architecture PRINCIPAL of CONTADOR is

signal AUX1: BIT_VECTOR(7 downto 0):="00000001"; signal CLOCKD: STD_LOGIC;

PROCEDURE decoder (contador: integer) is begin case contador is when 0 => LEDS <="00111111"; -- 0 when 1 => LEDS <="00000110"; -- 1 when 2 => LEDS <="01011011"; -- 2 when 3 => LEDS <="01001111"; -- 3 when 4 => LEDS <="01100110"; -- 4 when 5 => LEDS <="01101101"; -- 5 when 6 => LEDS <="01111101"; -- 6 when 7 => LEDS <="00000111"; -- 7 when 8 => LEDS <="01111111"; -- 8 when 9 => LEDS <="01101111"; -- 9 when others => LEDS <="01101111"; -- 9 end case;

end decoder; begin

MAIN:process(CLOCKD)

variable contador: integer range 0 to 3:=0;-- range 0 to 9:=0;

variable CONT, CONT1, CONT2, CONT3: integer range 0 to 10:=0; begin if RISING_EDGE(CLOCKD) then CONT:=CONT+1; case contador is when 0 => select_display <="1000"; -- 3 decoder(CONT); contador:=1; when 1 => select_display <="0100"; -- 3 decoder(CONT1); contador:=2; when 2 => select_display <="0010"; -- 3

(49)

49 decoder(CONT2); contador:=3; when 3 => select_display <="0001"; -- 3 decoder(CONT3); contador:=0;

when others => contador:=0; end case; if CONT = 10 then CONT:=0; CONT1:=CONT1+1; if CONT1 = 10 then CONT1:=0; CONT2:=CONT2+1; if CONT2 = 10 then CONT2:=0; CONT3:=CONT3+1; if CONT3 = 10 then CONT3:=0; end if; end if; end if; end if; end if; end process MAIN;

clockdiv:process(CLOCK)

variable AUX2: INTEGER range 0 to 500:=0; variable AUX3: INTEGER range 0 to 200:=0; begin if RISING_EDGE(CLOCK) then AUX2:=AUX2+1; if AUX2=500 then CLOCKD<='0'; AUX2:=0; AUX3:=AUX3+1; if AUX3=200 then AUX3:=0; CLOCKD<='1'; end if; end if; end if; end process; end PRINCIPAL;

• Salve o arquivo como CONTADOR;

• Selecione Next até a janela “New Project Wizard: Family & Device Settings [ Page 3 of 5 ]”;

(50)

50 • Nessa janela, escolher:

Family: Cyclone II

Available devices: EP2C8Q208C8 • Clicar em Finish.

3.5. COMPILANDO E “QUEIMANDO” O PROJETO.

Para que o código funcione na placa FPGA siga os demais passos:

• Clique em (Start Compilation) corrija os eventuais erros e clique novamente no ícone até que o programa compile com sucesso;

• Clique no menu “Assigments” e depois em “Pin Planer”, ou clique no ícone ; • Faça a seguinte associação dos pinos:

• Compile novamente;

• Clique em ;

• Clique em ;

(51)

51 o Caso não haja a opção “ByteBlaster” selecione a opção

“ByteBlasterII”; • Retorne;

• Marcar as áreas: “Program/Configure”; “Verify”; “Blank-Check” (caso alguma opção não esteja habilitada para marcar prossiga sem marcar);

• Clique em para fazer o download do programa para o FPGA e verifique o seu funcionamento.

3.6. PROJETOS

3.6.1. CRIAÇÃO DO PROJETO DE UM CIRCUITO LÓGICO

Neste tópico iremos criar um arquivo Diagrama de Blocos (.gdf), o qual servirá de base para a criação do circuito lógico. Para tanto siga os passos a seguir: - Clique em New e escolha a opção “Block Diagram/Schematic File”, e clique em OK.

• Será aberta uma tela semelhante a da Figura 3.1.

(52)

52 - Salve o projeto.

ULTILIZAÇÃO DE BLOCOS LÓGICOS EXISTENTES

Para utilizar Blocos Lógicos Existentes clique no botão “Symbol Tool” como mostrado na Figura 3.2.

Figura 3.2 – Botão Symbol Tool

Com a abertura da tela, temos que expandir o diretório “primitives”. Dentro deste expandiremos o diretório “logic”, escolhendo então a porta lógica a ser inserida.

Neste caso exemplo usaremos a porta AND2, como mostrado na Figura 3.3.

(53)

53 A porta lógica utilizada é uma porta AND com 2 entradas. No diagrama de blocos, ao posicionar a quanti-dade de componentes desejados, basta apertar a tecla ESC do teclado para cancelar este modo.

Como exemplo posicionaremos apenas uma porta AND.

Clicando mais uma vez no botão Symbol Tool e agora no diretório PIN em PRIMITIVES você pode selecionar input para adicionar ao seu projeto duas entradas lógicas e depois output para configurar uma saída, ficando o circuito como mostrado na Figura 3.4.

Figura 3.4 – Pinos Input e Output

Para fazer ligações utilize a ferramenta “Orthogonal Node Tool” (Figura 3.5). Com a ferramenta selecionada, basta clicar no nó de origem e depois no nó de destino.

Figura 3.5 – Orthogonal Node Tool

Para nomear um pino tanto de entrada quanto de saída, clique duas vezes sobre ele. Uma janela como a da Figura 3.6 aparecerá.

(54)

54 No campo “Instance Name” dê seu novo nome. Geralmente utiliza-se letras do alfabeto maiúsculas em projetos simples.

Figura 3.6 – Propriedades dos pinos

Após criar o circuito salve o seu projeto.

3.6.2. CRIAÇÃO DE BLOCOS LÓGICOS A PARTIR DE CÓDIGO VHDL

Para criar blocos lógicos próprios utilizando códigos em VHDL, você deve realizar os passos que se seguem. Esta ferramenta é muito importante, pois aqui o usuário ficará livre para criar o componente específico necessário à sua aplicação.

- Clique em New e escolha a opção “VHDL File”, e clique em OK. Na janela aberta, o código referente à uma porta lógica OR deve ser incluído. Library IEEE;

use IEEE.STD_LOGIC_1164.all; ENTITY vhdl_or IS

PORT ( A,B: IN BIT; S : OUT BIT); END vhdl_or;

ARCHITECTURE arch_or OF vhdl_or IS BEGIN

PROCESS(A,B) BEGIN

S<= A OR B; END PROCESS or_process; END ARCHITECTURE arch_or;

(55)

55 Salve o arquivo, escolhendo o mesmo nome da entidade. Agora vá ao menu “FILE”, selecione “CREATE/UPDATE” e “CREATE SYMBOL FILES FOR CURRENTE FILE”.

Um processo de compilação se iniciará. Aguarde a conclusão e depois feche a aba COMPILATION REPORT que aparecerá.

A aba do código fonte em VHDL não será mais necessária, feche-a também. Na aba do arquivo de diagrama de blocos clique mais uma vez no botão “Symbol Tools”. Clique no botão mostrado na Figura 2.7, para procurar o diretório onde o símbolo da porta OR feita em VHDL foi salvo.

Figura 3.7 – Diretório Symbol Tools

Uma janela de procura de diretórios se abrirá. Escolha o diretório e o arquivo e clique em abrir.

O símbolo referente ao código que o usuário criou aparecerá imediatamente do lado direito da janela Symbol. Clique em OK e posicione o bloco vhdl_or no arquivo de diagrama de blocos como indicado na Figura 3.8.

(56)

56

Figura 3.8 – vhdl_or no diagrama de blocos

3.6.3. SIMULAÇÃO

Precisamos saber se o circuito está funcionando antes de gravá-lo na FPGA. Para isso precisamos simular o circuito criado.

No Quartus II é preciso criar um arquivo do tipo VECTOR WAVEFORM FILE (.vwf) para realizar simulações.

Antes de prosseguir criando o VECTOR WAVEFORM FILE precisamos realizar uma etapa de compilação parcial do diagrama de blocos. Para tal vá ao menu PROCESSING e escolha a opção START COMPILATION ou Clique em .

Agora acesse o menu FILE, opção NEW. Na janela que se abrir, clique na aba OTHER FILES e selecione VECTOR WAVEFORM FILE.

A tela da Figura 3.9 aparecerá. Antes de prosseguir salve este arquivo com o mesmo nome do projeto (o nome sugerido serve apenas para facilitar a identificação).

(57)

57

Figura 3.9 – Vector Waveform File

Agora precisamos configurar o tempo máximo de simulação para indicarmos ao Quartus II como ele deve proceder. Para isso vá ao menu EDIT e acesse a opção END TIME.

A janela da Figura 3.10 aparecerá. Como exemplo configuraremos o tempo final de simulação como 10ms. Há um campo para digitar o valor e uma caixa de seleção para escolher a unidade (segundos, milisegundo, microsegundos, nanosegundos e picosegundos). Clique em OK e retorne à janela de simulação.

(58)

58

Figura 3.10 – Janela END TIME

Clicando com o botão direito na campo NAME, um menu de contexto aparecerá. Acesse a opção INSERT e no submenu a opção INSERT NODE OR BUS. Uma janela aparecerá, clique no botão NODE FINDER.

A janela da Figura 3.11 aparecerá. No campo NAMED coloque um asterisco caso esteja preenchido de outra forma ou vazio, isso fará com que o NODE FINDER não se restrinja ao nome do nó. Na opção FILTERS selecione a opção PINS: ALL.

(59)

59

Figura 3.11 – Node Finder

Clique em LIST e a janela da Figura 3.12 aparecerá. Você pode utilizar o botão circulado em vermelho para incluir os nós um a um ou o botão circulado em verde para incluir todos os nós. Para a nossa simulação incluiremos todos os nós.

Referências

Documentos relacionados

A seção intitulada “Sugestões de Atividades Para os Encontros em Grupos”, que abre todos os Cadernos de Formação, indica que as formações sejam iniciadas com uma leitura

determina  a  oportunidade  de  substituição  dos  refratários,  visando  à  melhor  proteção  dos  revestimentos  das  instalações.  Mas  isto  nada  tem 

Conforme Gamson e Modigliani (1989), o pacote interpretativo pode ser resumido em uma matriz de assinatura que estabelece o enquadramento. Essa matriz tem oito diferentes tipos

As reações adversas relacionadas ao Zyvox® com incidência ≥ 1% (comum) e &lt; 1% (incomum) foram: Infecções não complicadas de pele e

Para tanto, não basta apenas ter um discurso de que é importante fazer melhor a cada dia, mas efetivamente incentivar novas práticas na rotina?. Uma empresa pode, por exemplo,

Desde já declara que tem conhecimento que, uma vez aberto o Leilão, todas e quaisquer alterações nos bens solicitadas (tais como desdobramento dos lotes e/ou reunião de bens em

Na qualidade de presidente da Comissão de Gra- duação desta Faculdade e em nome de seus mem- bros, representantes dos onze Departamentos que a compõem (Letras Clássicas e

De posse das médias aritméticas associadas a cada uma das grandes áreas, e com base na previsão de alunos titulados em programas de mestrado e doutorado em 2010 (caracterizados