• Nenhum resultado encontrado

2 FUNDAMENTAÇÃO TEÓRICA

2.3 FIELD-PROGRAMMABLE GATE ARRAY

Field-Programmable Gate Arrayou FPGA são Circuitos Integrados

(CI) formados por vetores de portas lógicas interconectadas que podem ser configuradas pelo usuário final, daí o nome field-programmable (MAXFI-

ELD,2004).

Os circuitos FPGAs são constituídos de unidades de lógica combi- nacional, que são compostas por blocos de lógica e blocos de conexão pro- gramáveis. Os blocos de lógica permitem a implementação de vários tipos de portas lógicas, como “AND”, “OR” ou “XOR”. Os blocos de conexão per- mitem conectar os blocos de lógica, criando circuitos mais complexos. As FPGAs possuem fios conectando todos os blocos, denominados canais de co- municação, que podem ter diversos tamanhos, dependendo da distância entre os elementos conectados. Os blocos de conexão permitem selecionar quais canais serão utilizados para a lógica programada. As interconexões criadas entre os elementos da FPGA geram uma rede lógica de sinais, onde cada conexão é denominada netlist. As FPGAs também possuem os blocos de en- trada e saída (Input/Output Blocks - IOBs) para comunicação externa (WOLF,

2004). Na Figura2é apresentada a arquitetura genérica de uma FPGA.

FPGAs são reconfiguráveis devido a tecnologia de fabricação. Algu- mas FPGAs são programadas uma única vez. Esse tipo de FPGA é constituída por links de fusíveis ou anti-fusíveis microscópicos. Todos os blocos de ló- gica vem conectados de fábrica por esses links. A “programação” da FPGA se

34 Capítulo 2. FUNDAMENTAÇÃO TEÓRICA

Figura 2 – Arquitetura genérica de uma FPGA.

Blocos de lógica programavel Blocos de conexão programáveis

Fonte:Produção do próprio autor. Adaptado de (MAXFIELD,2004).

baseia em remover fusíveis ou acionar os anti-fusíveis para gerar a lógica de- sejada. Tal processo não pode ser revertido. Já as FPGAs reprogramáveis, que são o objeto de estudo deste trabalho, são constituídas por memórias SRAM (Static RAM) composta de transistores e flip-flops (FF). Contudo as memó- rias SRAM perdem a informação ao desligar a fonte de energia, necessitando a sua reprogramação sempre que são religadas. Para resolver esse problema, são utilizadas memórias externas, que mantém os dados de configuração para serem carregados no momento em que a FPGA é ligada. O dados de con- figuração da FPGA são armazenados em um arquivo denominado bitstream

(MAXFIELD,2004).

O desenvolvimento de projetos implementados em FPGAs segue um processo hierárquico, em diferentes níveis de abstração. Desde o modelo es- quemático, onde a definição é em nível de portas lógicas, até o nível de descri-

ção de hardware por meio de uma linguagem HDL (ver Seção2.4) (WOLF,

2004). Após a especificação do projeto é efetuada a síntese do código, por uma ferramenta dedicada a plataforma FPGA utilizada como, por exemplo, a

ISE Web Packda empresa Xilinx1. Na etapa de síntese são efetuados a loca-

lização e roteamento dos componentes do projeto no circuito FPGA, além de otimizações que permitem melhorar o desempenho e consumo de energia do projeto e, então, é gerado o arquivo bitstream com os bits de configuração da FPGA.

2.4 VHDL

Devido à complexidade no desenvolvimento de projetos eletrônicos e do aumento do número de componentes em um único CI, a atividade de definição do hardware em nível de portas lógicas e FFs tornou-se difícil e su- jeita a erros. Assim, linguagens de descrição de hardware ganharam espaço

devido à facilidade e agilidade que trazem para esta tarefa (ROTH,1998). A

liguagem VHDL foi proposta em 1980 pelo departamento de defesa dos Esta- dos Unidos da América com o objetivo de padronizar a descrição de circuitos integrados, facilitando seu entendimento e desenvolvimento. Atualmente a linguagem VHDL é padronizada pela Institute of Electrical and Electronics

Engineers (IEEE) nas normas internacionais 1076 e 1164, cuja última atu-

alização é de 2009 (IEEE,2009). Esta linguagem permite descrever tanto a

estrutura de circuitos eletrônicos, como também o seu comportamento (PE-

DRONI,2004).

Outra linguagem muito popular para descrição de hardware é o Ve- rilog. Verilog segue uma metodologia “bottom-up”. O Verilog é utilizado em geral para a simulação do comportamento de circuitos. Uma de suas limita- ções é não permitir a definição de diferentes comportamentos em um único

módulo (ROTH,1998). Já a linguagem VHDL segue uma metodologia “top-

down”e permite utilizar múltiplos níveis de modelos com diferentes arquite-

turas, além de também permitir a simulação de circuitos (ROTH,1998).

VHDL permite descrever as portas lógicas e as conexões que serão configuradas no hardware por meio de expressões booleanas. Outra caracte- rística importante é que os comandos VHDL executam em paralelo, i.e., cada linha ou elemento do código corresponde a um circuito que processará sinais paralelamente com outros circuitos ou componentes. Entretanto VHDL tam- bém possui estruturas que permitem implementar máquinas de estado para processamentos sequenciais. A seguir são apresentados alguns conceitos bá-

sicos da linguagem VHDL com base em (PEDRONI,2004;IEEE,2009).

1. Entity: Define a estrutura física do circuito. Uma entity pode definir as seguintes estruturas:

• Port: esse comando define as entradas e saídas do circuito com

tipo e direção.

• Generics: esse comando é utilizado para definir parâmetros para

o circuito.

• Constants: permite definir constantes para o circuito.

Na Listagem2.1é apresentado um exemplo de definição de uma entity.

Listagem 2.1 – Exemplo de Entity

36 Capítulo 2. FUNDAMENTAÇÃO TEÓRICA

2 entity exemplo is 3

4 Port ( sw : in STD_LOGIC_VECTOR (2 downto 0);

5 led : out STD_LOGIC_VECTOR (7 downto 0) );

6

7 generic ( gain : integer := 4;

8 timeDelay: time := 10 ns );

9

10 constant : rpu : real := 100.0;

11

12 end exemplo;

2. Variables e Signals: São duas formas de armazenar e transmitir va- lores no circuito na linguagem VHDL. Variables armazenam valores como em um software, porém esses valores são acessíveis somente no escopo em que a variável foi definida. Variáveis podem ser declaradas somente dentro de códigos sequenciais. Signals permitem a troca de valores por meio de sinais e estão acessíveis fora do escopo de onde foram definidos. Os sinais podem ser definidos em entity, architecture ou dentro de blocos de código sequencial. A principal diferença entre

signalse variables é que, ao atualizar um valor em um signal, a atua-

lização estará disponível somente no próximo ciclo de clock, enquanto que a atualização em variables é automática.

3. Architecture: Define o comportamento do circuito que pode ser do tipo Behavioral, Data Flow ou Structural. Nesta seção do código será definido efetivamente a estrutura lógica do circuito, i.e., como o cir- cuito se comportará com base nas entradas e conexões. Variáveis locais e sinais podem ser declarados dentro do escopo da architecture, antes

do comando begin, conforme o exemplo da Listagem2.2. Esse local

é chamado de “seção de declarações da arquitetura”. Essas variáveis poderão ser utilizadas somente dentro do escopo da arquitetura que as definiu.

Listagem 2.2 – Exemplo de Architecture

1 architecture behaviour exemplo is

2 -- declaracao de variaveis locais

3 signal sig1, sig2 : bit;

4 begin

5 -- ’<=’ e um comendo de atribuicao para sinais

6 saida <= sig1 and sig2;

7 end exemplo;

4. Process, Function e Procedure: São comandos que permitem definir máquinas de estados para execução sequencial. É importante observar

que esses blocos de código executam em paralelo com outros coman- dos do código. Process são utilizados dentro de um architecture para criar um bloco de lógica sequencial. Esses blocos são locais do módulo implementado e não podem ser acessados por outras rotinas. Na Lista-

gem2.3é apresentado um exemplo de utilização do comando Process.

Listagem 2.3 – Exemplo de Architecture

1 architecture behaviour exemplo is

2 -- declaracao de variaveis de toda a aquitetura

3 signal port1, port2 : bit;

4 begin 5

6 nome:Process (port2) -- lista de variaveis sensitivas

7 -- declaracao de variaveis locais do processo

8 signal sig1, sig2 : bit;

9 begin

10 -- aqui vai o codigo sequencial

11 port2 <= sig1 or sig2;

12 end nome;

13

14 -- esse comando executa em paralelo com o processo

15 port <= port2;

16

17 end exemplo;

Procedures e functions são utilizados em sub-programas para im-

plementar um bloco de lógica sequencial que pode ser chamado por outras rotinas, permitindo o seu reaproveitamento em várias rotinas. Procedures não retornam nenhum valor após o processamento, já functions retornam algum valor. Não é permitido a declaração de componentes em procedures e functi- ons. Sinais somente podem ser declarados em procedures e function quando

esses forem declarados dentro de um process (PEDRONI,2004). As ferra-

mentas de síntese podem sintetizar as estruturas de procedures e function de forma inline onde as chamadas dos procedures e function são substituídas pelo corpo destas estruturas, replicando o hardware gerado, ou com a criação de uma componente independente para execução das procedures e function para o qual será necessário a definição de um protocolo de comunicação e

regras de escalonamento (RAMACHANDRAN et al.,1993).