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).