Mudanças entre as edições de "Predefinição:DiegoMedeiros-SST20707"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(209 revisões intermediárias por 4 usuários não estão sendo mostradas)
Linha 1: Linha 1:
 +
{{TOC limit|3}}
 +
 
== [[Síntese de Sistemas de Telecomunicações | Ementa e referências bibliográficas]]==
 
== [[Síntese de Sistemas de Telecomunicações | Ementa e referências bibliográficas]]==
  
Linha 4: Linha 6:
  
 
*Professor: [[Diego da Silva de Medeiros]]
 
*Professor: [[Diego da Silva de Medeiros]]
*[[Media: SST20707_Plano_Ensino_2015-1.pdf | Plano de Ensino 2015-1]]
+
*E-mail: diegomedeiros@ifsc.edu.br
  
== Diário de aula ==
 
  
{{collapse top | '''2015-1''' - Clicar no "+" para expandir }}
+
*Kit utilizado: '''EP4CE115F29C7'''
{{Cronograma-top}}
 
{{Cl|1 |06/02 | 2 | [[SST20707-2015-1#Apresentação da disciplina|Apresentação da disciplina]] | }}
 
{{Cl|2 |10/02 | 2 | [[SST20707-2015-1#Dispositivos lógicos programáveis - PLD|Dispositivos lógicos programáveis - PLD]] | }}
 
{{Cl|3 |13/02 | 2 | [[SST20707-2015-1#Tecnologia de FPGA|Tecnologia de FPGA]] | }}
 
{{Cl|4 |20/02 | 2 | [[SST20707-2015-1#Projetos em FPGA|Projetos em FPGA]] | }}
 
{{Cl|5 |24/02 | 2 | Sem aula devido a reunião com a reitoria. Resolver [[SST20707-2015-1#Exercício 1 - Esquemático|exercício]] | }}
 
{{Cl|6 |27/02 | 2 | [[SST20707-2015-1#Utilizando_o_FPGA|Correção do exercício e utilização do Kit DE2-115]] e [[SST20707-2015-1#Introdução ao VHDL|Introdução ao VHDL]] | }}
 
{{Cl|7 |03/03 | 2 | [[SST20707-2015-1#Introdução ao VHDL|Introdução ao VHDL]] e  [[SST20707-2015-1#Objetos e atribuições|Objetos e atribuições]]| }}
 
{{Cl|8 |06/03 | 2 | Aula livre para a execução dos [[SST20707-2015-1#Exercícios - Objetos e atribuições|exercícios de VHDL]] | }}
 
{{Cl|9 |10/02 | 2 | [[SST20707-2015-1#Abordagens|Abordagens]] e [[SST20707-2015-1#Atribuições de variáveis em simulações|Atribuições de variáveis em simulações]] | }}
 
{{Cl|10 |13/03 | 2 | [[SST20707-2015-1#Outros tópicos em VHDL|Tópicos em VHDL]] | }}
 
{{Cl|11 |17/03 | 2 | Uso do Modelsim - Aula prejudicada devido à problemas no laboratório | }}
 
{{Cl|12 |20/03 | 2 | [[SST20707-2015-1#Abordagem estrutural|Abordagem estrutural]] | }}
 
{{Cl|13 |24/03 | 2 | Aula livre para realização da [[SST20707-2015-1#Avaliação 1 - Sistemas combinacionais|Avaliação 1]] | }}
 
{{Cl|14 |27/03 | 2 | Aula livre para realização da [[SST20707-2015-1#Avaliação 1 - Sistemas combinacionais|Avaliação 1]] | }}
 
{{Cl|15 |31/03 | 2 | Continuação da Avaliação 1: [[SST20707-2015-1#Adendo - Uso do FPGA|Implementação em FPGA]] | }}
 
{{Cl|16 |07/04 | 2 | [[SST20707-2015-1#Circuitos sequenciais em VHDL|Circuitos sequenciais em VHDL]] | }}
 
{{cronograma-botton |}}
 
{{collapse bottom}}
 
  
== Aulas ==
 
  
=== Apresentação da disciplina ===
+
* Plano de Ensino 2018-1 - Ver SIGAA
  
:; Roteiro:
+
:{{collapse top | Atividades previstas - Clicar no "+" para expandir }}
:* Apresentação do professor;
 
:* Apresentação da disciplina ([[Media: SST20707_Plano_Ensino_2015-1.pdf |Plano de Ensino]]);
 
::* Avaliações: Trabalhos e Projeto Final
 
:* Grupo da disciplina: IFSCTeleSST
 
  
:; Atividade:
+
Em 2018-1, combinamos com os alunos o esquema de aulas como abaixo:
:: Ler capítulo 18 do [http://vhdl2.weebly.com/eletrocircnica-digital-moderna-e-vhdl.html Livro do Pedroni]
 
  
=== Dispositivos lógicos programáveis - PLD ===
+
* Aula quinzenal de 4 horas, nas terças-feiras, das 7:30 as 11:30.
 +
* Aula semanal de 1 hora, nas sextas-feiras, das 9:40 as 10:35. A aula de sexta ficará sempre como aula livre para exercícios e dúvidas.
  
==== PLDs em sistemas digitais ====
+
{{Cronograma-top}}
 +
{{Cl|01|21/02 - qua|3|Apresentação da disciplina e Dispositivos lógicos programáveis – PLD; Tecnologia de FPGA; Projetos em FPGA|}}
 +
{{Cl|02|27/02 - ter|4|Exercicios; Introdução ao VHDL; Objetos e atribuições|}}
 +
{{Cl|03|13/03 - ter|4|Correção dos exercícios; Abordagens; Atribuições de variaveis em simulações; Outros tópicos em VHDL|}}
 +
{{Cl|04|27/03 - ter|4|Abordagem estrutural; Exercícios|}}
 +
{{Cl|05|10/04 - ter|4|Avaliação – Sistemas combinacionais|}}
 +
{{Cl|06|24/04 - ter|4|Circuitos sequenciais em VHDL; Atributos; Pacotes; Conversão de tipos; Exemplos de sistemas sequenciais em VHDL|}}
 +
{{Cl|07|08/05 - ter|4|Maquina de estados finitos em VHDL|}}
 +
{{Cl|08|22/05 - ter|4|Simulação de circuitos usando VHDL|}}
 +
{{Cl|09|05/06 - ter|4|Oficina NCO e Filtros digitais|}}
 +
{{Cl|10|19/06 - ter|4|Trabalho final|}}
 +
{{Cl|11|03/07 - ter|4|Trabalho final|}}
 +
{{cronograma-botton |60}}
 +
{{collapse bottom}}
  
Sistema digital: Saída digital definida em função de processamento realizado em entrada digital.
+
{{collapse top | Planos de ensino anteriores - Clicar no "+" para expandir }}
  
[[Imagem:SST_Sistema_digital_1.png|thumb|Sistema digital. Fonte: [1]|500px|center]]
+
*[[Media: SST20707_Plano_Ensino_2017-2.pdf | Plano de Ensino 2017-2]]
<br style="clear:both;">
 
  
Os sistemas digitais foram por muito tempo projetados usando a chamada '''lógica fixa''', composta por CIs (circuitos integrados) TTL que implementavam portas lógicas. Em meados de 1970, foram introduzidos os '''PLDs''' (''Programmable Logic Devices''), chips de uso geral cujo ''hardware'' pode ser configurado para atender especificações. Com os PLDs, sistemas digitais poderiam ser projetados a partir de CIs genéricos, com funções definidas a partir de configurações armazenadas em memórias. Desta forma, os PLDs possuem as seguintes vantagens sobre sistemas de lógica fixa [2]:
+
:{{collapse top | Atividades previstas - Clicar no "+" para expandir }}
:* Redução de custos de projeto, chamados de '''custos NRE''' (nonrecurring engineering cost - custo de engenharia não recorrente), com a abolição de desenvolvimentos complexos de placas
+
{{Cronograma-top}}
:* Rapidez de desenvolvimento
+
{{Cl|01|01/08 - ter|2|Apresentação da disciplina e Dispositivos lógicos programáveis - PLD|}}
:* Flexibilidade no desenvolvimento: a adição de funcionalidades é feita por simples mudanças no arquivo de configuração
+
{{Cl|02|04/08 - sex|2|Tecnologia de FPGA e Projetos em FPGA|}}
:* Rapidez de produção do CI: por serem padronizados, os PLDs possuem entrega imediata
+
{{Cl|03|08/08 - ter|2|Desenvolvimento via esquemático e Exercício 1|}}
:* Atualização de hardware em tempo real
+
{{Cl|04|11/08 - sex|2|Introdução ao VHDL|}}
 +
{{Cl|05|15/08 - ter|2|Objetos e atribuições|}}
 +
{{Cl|06|18/08 - sex|2|Correção dos exercícios propostos|}}
 +
{{Cl|07|22/08 - ter|2|Abordagens|}}
 +
{{Cl|08|25/08 - sex|2|Atribuições de variáveis em simulações e Outros tópicos em VHDL|}}
 +
{{Cl|09|29/08 - ter|2|Abordagem estrutural|}}
 +
{{Cl|10|01/09 - sex|2|Exercícios sistemas combinacionais|}}
 +
{{Cl|11|05/09 - ter|2|Exercícios sistemas combinacionais|}}
 +
{{Cl|12|08/09 - sex|0|Feriado – Independência do Brasil|}}
 +
{{Cl|13|12/09 - ter|2|Avaliação - Sistemas combinacionais|}}
 +
{{Cl|14|15/09 - sex|2|Circuitos sequenciais em VHDL, Atributos e Pacotes|}}
 +
{{Cl|15|19/09 - ter|2|Exemplos de sistemas sequenciais em VHDL|}}
 +
{{Cl|16|22/09 - sex|2|Introdução às máquinas de estados finitos|}}
 +
{{Cl|17|26/09 - ter|2|Implementação em VHDL de máquinas de estados|}}
 +
{{Cl|18|29/09 - sex|2|Máquinas de estados em VHDL - Tópicos adicionais|}}
 +
{{Cl|19|03/10 - ter|2|Simulação de circuitos usando VHDL|}}
 +
{{Cl|20|06/10 - sex|2|Simulação de circuitos usando VHDL|}}
 +
{{Cl|21|10/10 - ter|2|Signal Tap|}}
 +
{{Cl|22|13/10 - sex|0|Feriado – Nossa Senhora Aparecida|}}
 +
{{Cl|23|17/10 - ter|2|Nios II|}}
 +
{{Cl|24|20/10 - sex|2|Tópicos adicionais|}}
 +
{{Cl|25|24/10 - ter|2|Trabalho final|}}
 +
{{Cl|26|27/10 - sex|2|Trabalho final|}}
 +
{{Cl|27|31/10 - ter|2|Trabalho final|}}
 +
{{Cl|28|03/11 - sex|0|Feriado – Finados|}}
 +
{{Cl|29|07/11 - ter|2|Trabalho final|}}
 +
{{Cl|30|10/11 - sex|2|Trabalho final|}}
 +
{{Cl|31|14/11 - ter|2|Trabalho final|}}
 +
{{Cl|32|17/11 - sex|2|Trabalho final|}}
 +
{{Cl|33|21/11 - ter|2|Apresentação do trabalho final|}}
 +
{{Cl|34|24/11 - sex||Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|35|28/11 - ter||Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|36|01/12 - sex||Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|37|05/12 - ter||Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|38|08/12 - sex||Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|39|12/12 - ter||Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|40|15/12 - sex||Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|41|19/12 - ter||Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{cronograma-botton |60}}
 +
{{collapse bottom}}
  
Uma alternativa de projeto é o uso de ''microcontroladores'', dispositivos programáveis a nível de ''software''. Porém, mesmo nesses casos, os PLDs possuem vantagens [3]:
+
*[[Media: SST20707_Plano_Ensino_2017-1.pdf | Plano de Ensino 2017-1]]
:* PLDs são mais simples de desenvolver, pois alterações no projeto são feitas instantaneamente
 
:* Sistemas com processadores customizados possuem desenvolvimento lento e oneroso
 
:* Sistemas mais genéricos tendem a ter custos menores pela possibilidade de uso em diversas aplicações, facilitando o estoque de itens
 
  
[[Imagem:SST_Sistema_digital_2.png|thumb|Tempo de desenvolvimento entre sistema com microprocessador (ASIC) ou PLD (FPGA). Fonte: [3]|500px|center]]
+
:{{collapse top | Atividades previstas - Clicar no "+" para expandir }}
<br style="clear:both;">
+
{{Cronograma-top}}
 +
{{Cl|01|09/02 - qui|2|Apresentação da disciplina e Dispositivos lógicos programáveis - PLD|}}
 +
{{Cl|02|10/02 - sex|2|Tecnologia de FPGA|}}
 +
{{Cl|03|16/02 - qui|0|Sem aula – Assembleia sobre regimento do campus|}}
 +
{{Cl|04|17/02 - sex|2|Projetos em FPGA|}}
 +
{{Cl|05|21/02 - ter|2|Exercício 1 - Esquemático e outros exercícios|}}
 +
{{Cl|06|23/02 - qui|2|Avaliação esquemático|}}
 +
{{Cl|07|28/02 - ter|2|Introdução ao VHDL|}}
 +
{{Cl|08|02/03 - qui|2|Objetos e atribuições|}}
 +
{{Cl|09|07/03 - ter|2|Correção dos exercícios propostos|}}
 +
{{Cl|10|09/03 - qui|2|Abordagens|}}
 +
{{Cl|11|14/03 - ter|2|Atribuições de variáveis em simulações e Outros tópicos em VHDL|}}
 +
{{Cl|12|16/03 - qui|2|Abordagem estrutural|}}
 +
{{Cl|13|21/03 - ter|2|Exercícios sistemas combinacionais|}}
 +
{{Cl|14|23/03 - qui|2|Avaliação - Sistemas combinacionais|}}
 +
{{Cl|15|28/03 - ter|2|Circuitos sequenciais em VHDL, Atributos e Pacotes|}}
 +
{{Cl|16|30/03 - qui|2|Exemplos de sistemas sequenciais em VHDL|}}
 +
{{Cl|17|04/04 - ter|2|Introdução às máquinas de estados finitos|}}
 +
{{Cl|18|06/04 - qui|2|Implementação em VHDL de máquinas de estados|}}
 +
{{Cl|19|11/04 - ter|2|Máquinas de estados em VHDL - Tópicos adicionais|}}
 +
{{Cl|20|13/04 - qui|2|Simulação de circuitos usando VHDL|}}
 +
{{Cl|21|18/04 - ter|2|Simulação de circuitos usando VHDL|}}
 +
{{Cl|22|20/04 - qui|2|Signal Tap|}}
 +
{{Cl|23|25/04 - ter|2|Nios II|}}
 +
{{Cl|24|27/04 - qui|2|Tópicos adicionais|}}
 +
{{Cl|25|02/05 - ter|2|Trabalho final|}}
 +
{{Cl|26|04/05 - qui|2|Trabalho final|}}
 +
{{Cl|27|09/05 - ter|2|Trabalho final|}}
 +
{{Cl|28|11/05 - qui|2|Trabalho final|}}
 +
{{Cl|29|16/05 - ter|2|Trabalho final|}}
 +
{{Cl|30|18/05 - qui|2|Trabalho final|}}
 +
{{Cl|31|23/05 - ter|2|Apresentação do trabalho final|}}
 +
{{Cl|32|25/05 - qui|0|Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|33|30/05 - ter|0|Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|34|01/06 - qui|0|Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|35|06/06 - ter|0|Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|36|08/06 - qui|0|Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|37|13/06 - ter|0|Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|38|15/06 - qui|0|Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|39|20/06 - ter|0|Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{Cl|40|22/06 - qui|0|Sem aula – Limite de CH da disciplina de 60h|}}
 +
{{cronograma-botton |60}}
 +
{{collapse bottom}}
  
Em função da arquitetura e tecnologia empregada, os PLDs foram classificados em SPLDs (''simple'' PLDs) ou CPLDs (''complex'' PLDs).
+
*[[Media: SST20707_Plano_Ensino_2016-2.pdf | Plano de Ensino 2016-2]]
  
==== SPLDs ====
+
:{{collapse top | Atividades previstas - Clicar no "+" para expandir }}
 +
{{Cronograma-top}}
 +
{{Cl|01|15/08 - seg|2|[[SST20707-2016-2#Apresentação da disciplina|Apresentação da disciplina]] e [[SST20707-2016-2#Dispositivos lógicos programáveis - PLD|Dispositivos lógicos programáveis - PLD]]|}}
 +
{{Cl|02|16/08 - ter|2|[[SST20707-2016-2#Tecnologia de FPGA|Tecnologia de FPGA]]|}}
 +
{{Cl|03|22/08 - seg|2|[[SST20707-2016-2#Projetos em FPGA|Projetos em FPGA]]|}}
 +
{{Cl|04|23/08 - ter|2|[[SST20707-2016-2#Exercício 1 - Esquemático|Exercício 1 - Esquemático]] e outros exercícios|}}
 +
{{Cl|05|29/08 - seg|2|'''Avaliação esquemático'''|}}
 +
{{Cl|06|30/08 - ter|2|[[SST20707-2016-2#Introdução ao VHDL|Introdução ao VHDL]]|}}
 +
{{Cl|07|05/09 - seg|2|[[SST20707-2016-2#Objetos e atribuições|Objetos e atribuições]]|}}
 +
{{Cl|08|06/09 - ter|2|Correção dos exercícios propostos|}}
 +
{{Cl|09|12/09 - seg|2|[[SST20707-2016-2#Abordagens|Abordagens]]|}}
 +
{{Cl|10|13/09 - ter|2|[[SST20707-2016-2#Atribuições de variáveis em simulações|Atribuições de variáveis em simulações]] e [[SST20707-2016-2#Outros tópicos em VHDL|Outros tópicos em VHDL]]|}}
 +
{{Cl|11|19/09 - seg|2|[[SST20707-2016-2#Abordagem estrutural|Abordagem estrutural]]|}}
 +
{{Cl|12|20/09 - ter|2|Exercícios sistemas combinacionais|}}
 +
{{Cl|13|26/09 - seg|2|[[SST20707-2016-2#Avaliação 1 - Sistemas combinacionais|'''Avaliação - Sistemas combinacionais''']]|}}
 +
{{Cl|14|27/09 - ter|2|[[SST20707-2016-2#Circuitos sequenciais em VHDL|Circuitos sequenciais em VHDL]], [[SST20707-2016-2#Atributos|Atributos]] e [[SST20707-2016-2#Pacotes|Pacotes]]|}}
 +
{{Cl|15|03/10 - seg|2|Exemplos de sistemas sequenciais em VHDL|}}
 +
{{Cl|16|04/10 - ter|2|[[SST20707-2016-2#Introdução às máquinas de estados finitos|Introdução às máquinas de estados finitos]]|}}
 +
{{Cl|17|10/10 - seg|2|[[SST20707-2016-2#Implementação em VHDL|Implementação em VHDL de máquinas de estados]]|}}
 +
{{Cl|18|11/10 - ter|2|Máquinas de estados em VHDL - Tópicos adicionais|}}
 +
{{Cl|19|17/10 - seg|2|[[SST20707-2016-2#Simulação de circuitos usando VHDL|Simulação de circuitos usando VHDL]]|}}
 +
{{Cl|20|18/10 - ter|2|[[SST20707-2016-2#Simulação de circuitos usando VHDL|Simulação de circuitos usando VHDL]]|}}
 +
{{Cl|21|24/10 - seg|2|[[SST20707-2016-2#Signal Tap|Signal Tap]]|}}
 +
{{Cl|22|25/10 - ter|2|[[SST20707-2016-2#Nios II|Nios II]]|}}
 +
{{Cl|23|31/10 - seg|2|Tópicos adicionais|}}
 +
{{Cl|24|01/11 - ter|2|'''Trabalho final'''|}}
 +
{{Cl|25|07/11 - seg|2|'''Trabalho final'''|}}
 +
{{Cl|26|08/11 - ter|2|'''Trabalho final'''|}}
 +
{{Cl|27|14/11 - seg|0|Feriado – Ponto facultativo|}}
 +
{{Cl|28|15/11 - ter|0|Feriado – Proclamação da república|}}
 +
{{Cl|29|21/11 - seg|2|'''Trabalho final'''|}}
 +
{{Cl|30|22/11 - ter|2|'''Trabalho final'''|}}
 +
{{Cl|31|28/11 - seg|2|'''Trabalho final'''|}}
 +
{{Cl|32|29/11 - ter|2|Apresentação do trabalho final|}}
 +
{{cronograma-botton |60}}
 +
{{collapse bottom}}
  
São denominados SPLDs os seguintes dispositivos:
+
*[[Media: SST20707_Plano_Ensino_2016-1.pdf | Plano de Ensino 2016-1]]
  
; PAL - Programmable Array Logic
+
{{collapse top | Atividades previstas - Clicar no "+" para expandir }}
 +
{{Cronograma-top}}
 +
{{Cl|01|22/03 - ter| 2 |[[SST20707-2016-1#Apresentação da disciplina|Apresentação da disciplina]] e [[SST20707-2016-1#Dispositivos lógicos programáveis - PLD|Dispositivos lógicos programáveis - PLD]] | }}
 +
{{Cl|02|23/03 - qua| 2 |[[SST20707-2016-1#Tecnologia de FPGA|Tecnologia de FPGA]] | }}
 +
{{Cl|03|29/03 - ter| 2 |[[SST20707-2016-1#Projetos em FPGA|Projetos em FPGA]] | }}
 +
{{Cl|04|30/03 - qua| 2 |[[SST20707-2016-1#Exercício 1 - Esquemático|Exercício 1 - Esquemático]] e outros exercícios | }}
 +
{{Cl|05|05/04 - ter| 2 |Avaliação esquemático | }}
 +
{{Cl|06|06/04 - qua| 2 |[[SST20707-2016-1#Introdução ao VHDL|Introdução ao VHDL]] | }}
 +
{{Cl|07|12/04 - ter| 2 |[[SST20707-2016-1#Objetos e atribuições|Objetos e atribuições]] | }}
 +
{{Cl|08|13/04 - qua| 2 |Correção dos exercícios propostos | }}
 +
{{Cl|09|19/04 - ter| 2 |[[SST20707-2016-1#Abordagens|Abordagens]] | }}
 +
{{Cl|10|20/04 - qua| 2 |[[SST20707-2016-1#Atribuições de variáveis em simulações|Atribuições de variáveis em simulações]] e [[SST20707-2016-1#Outros tópicos em VHDL|Outros tópicos em VHDL]] | }}
 +
{{Cl|11|26/04 - ter| 2 |[[SST20707-2016-1#Abordagem estrutural|Abordagem estrutural]] | }}
 +
{{Cl|12|27/04 - qua| 2 |Exercícios sistemas combinacionais | }}
 +
{{Cl|13|03/05 - ter| 2 |[[SST20707-2016-1#Avaliação 1 - Sistemas combinacionais|Avaliação - Sistemas combinacionais]] | }}
 +
{{Cl|14|04/05 - qua| 2 |[[SST20707-2016-1#Circuitos sequenciais em VHDL|Circuitos sequenciais em VHDL]], [[SST20707-2016-1#Atributos|Atributos]] e [[SST20707-2016-1#Pacotes|Pacotes]] | }}
 +
{{Cl|15|10/05 - ter| 2 |Exemplos de sistemas sequenciais em VHDL | }}
 +
{{Cl|16|11/05 - qua| 2 |[[SST20707-2016-1#Introdução às máquinas de estados finitos|Introdução às máquinas de estados finitos]] | }}
 +
{{Cl|17|17/05 - ter| 2 |[[SST20707-2016-1#Implementação em VHDL|Implementação em VHDL de máquinas de estados]] | }}
 +
{{Cl|18|18/05 - qua| 2 |Máquinas de estados em VHDL - Tópicos adicionais | }}
 +
{{Cl|19|24/05 - ter| 2 |[[SST20707-2016-1#Simulação de circuitos usando VHDL|Simulação de circuitos usando VHDL]] | }}
 +
{{Cl|20|25/05 - qua| 2 |Tópicos adicionais | }}
 +
{{Cl|21|31/05 - ter| 2 |Tópicos adicionais | }}
 +
{{Cl|22|01/06 - qua| 2 |Tópicos adicionais | }}
 +
{{Cl|23|04/06 - sáb| 2 |Tópicos adicionais | }}
 +
{{Cl|24|07/06 - ter| 2 |Trabalho final | }}
 +
{{Cl|25|08/06 - qua| 2 |Trabalho final | }}
 +
{{Cl|26|14/06 - ter| 2 |Trabalho final | }}
 +
{{Cl|27|15/06 - qua| 2 |Trabalho final | }}
 +
{{Cl|28|21/06 - ter| 2 |Trabalho final | }}
 +
{{Cl|29|22/06 - qua| 2 |Trabalho final | }}
 +
{{Cl|30|28/06 - ter| 2 |Apresentação do trabalho final | }}
 +
{{cronograma-botton |}}
 +
{{collapse bottom}}
  
Um arranjo ''programável'' de portas AND seguido por um arranjo ''fixo'' de portas OR.
+
*[[Media: SST20707_Plano_Ensino_2015-2.pdf | Plano de Ensino 2015-2]]
 +
*[[Media: SST20707_Plano_Ensino_2015-1.pdf | Plano de Ensino 2015-1]]
  
[[Imagem:SST_Sistema_digital_PAL.png|thumb|Arquitetura PAL. Fonte: [4]|500px|center]]
+
{{collapse bottom}}
<br style="clear:both;">
 
  
Essa foi a primeira implementação de PLDs, e se baseia no fato de que qualquer função lógica pode ser reescrita como uma soma de produtos (SOP - sum of products) [4]. Por exemplo, sendo abaixo a tabela verdade da soma aritmética de um bit ''u'' de uma posição de um circuito somador, como função de ''x'' e ''y'' e do ''carry'' ''ci''
+
== Diário de aula ==
  
{| class="wikitable" style="margin: 1em auto 1em auto"
+
:{{collapse top | 2018-1 - Clicar no "+" para expandir }}
!width="50"|ci
+
{{Cronograma-top}}
!width="50"|x
+
{{Cl|01|21/02 - qua|3|Apresentação da disciplina; Dispositivos lógico-programáveis - PLD; Tecnologia de FPGA; Projetos em FPGA |}}
!width="50"|y
+
{{Cl|02|27/02 - ter|4|Exercicios; Introdução ao VHDL; Objetos e atribuições |}}
!width="50"|u(ci,x,y)
+
{{Cl|03|13/03 - ter|4|Correção dos exercícios; Abordagens; Atribuições de variáveis em simulações; Outros tópicos em VHDL |}}
|-
+
{{Cl|04|27/03 - ter|4|Abordagem estrutural; Exercícios |}}
|0||0||0||0
+
{{Cl|05|10/04 - ter|4|Avaliação – Sistemas combinacionais|}}
|-
+
{{Cl|06|24/04 - ter|4| |}}
|0||0||1||1
+
{{Cl|07|08/05 - ter|4| |}}
|-
+
{{Cl|08|22/05 - ter|4| |}}
|0||1||0||1
+
{{Cl|09|05/06 - ter|4| |}}
|-
+
{{Cl|10|19/06 - ter|4| |}}
|0||1||1||0
+
{{Cl|11|03/07 - ter|4| |}}
|-
+
{{cronograma-botton  |60}}
|1||0||0||1
+
{{collapse bottom}}
|-
 
|1||0||1||0
 
|-
 
|1||1||0||0
 
|-
 
|1||1||1||1
 
|}
 
  
Sendo as linhas 2, 3, 5 e 8, as que possuem saída 1, podemos escrever ''u'' como [5]:
+
:{{collapse top | 2017-2 - Clicar no "+" para expandir }}
 +
{{Cronograma-top}}
 +
{{Cl|01|01/08 - ter|2|[[SST20707-2016-2#Apresentação da disciplina|Apresentação da disciplina]] e [[SST20707-2016-2#Dispositivos lógicos programáveis - PLD|Dispositivos lógicos programáveis - PLD]]|}}
 +
{{Cl|02|04/08 - sex|2|[[SST20707-2016-2#Tecnologia de FPGA|Tecnologia de FPGA]] e [[SST20707-2016-2#Projetos em FPGA|Projetos em FPGA]]|}}
 +
{{Cl|03|08/08 - ter|2|[[SST20707-2016-2#Desenvolvimento via esquemático|Desenvolvimento via esquemático]] e [[SST20707-2016-2#Exercício 1 - Esquemático|Exercício 1 - Esquemático]]|}}
 +
{{Cl|04|11/08 - sex|2|[[SST20707-2016-2#Introdução ao VHDL|Introdução ao VHDL]]|}}
 +
{{Cl|05|15/08 - ter|2|[[SST20707-2016-2#Objetos e atribuições|Objetos e atribuições]]|}}
 +
{{Cl|06|18/08 - sex|2|Aula livre para dúvidas dos exercícios|}}
 +
{{Cl|07|22/08 - ter|2|[[SST20707-2016-2#Abordagens|Abordagens]]|}}
 +
{{Cl|08|25/08 - sex|2|Sem aula - alunos não compareceram |}}
 +
{{Cl|09|29/08 - ter|2|[[SST20707-2016-2#Atribuições de variáveis em simulações|Atribuições de variáveis em simulações]] e [[SST20707-2016-2#Outros tópicos em VHDL|Outros tópicos em VHDL]] |}}
 +
{{Cl|10|01/09 - sex|2|[[SST20707-2016-2#Abordagem estrutural|Abordagem estrutural]] |}}
 +
{{Cl|11|05/09 - ter|2|Aula livre para exercícios |}}
 +
{{Cl|12|08/09 - sex|0|Alfredo desistiu da disciplina, decidimos mudar a abordagem da disciplina para encerrar o projeto final do semestre passado|}}
 +
{{Cl|13|12/09 - ter|2|Projeto final – Ramon encerrou o projeto, está liberado das aulas. Valmir também está avançado, e continuará realizando o trabalho. Os demais alunos não possuem praticamente nada, e faremos o projeto desde o início juntos. Iniciaremos pela construção de um temporizador, como o disponível na Wiki.|}}
 +
{{Cl|14|15/09 - sex|2|Projeto final – Implementação do temporizador da Wiki|}}
 +
{{Cl|15|19/09 - ter|2|Projeto final – Implementação de dois temporizadores em cascata|}}
 +
{{Cl|16|22/09 - sex|2|Projeto final – Implementação de dois temporizadores em cascata|}}
 +
{{Cl|17|26/09 - ter|2|Projeto final – Implementação de dois temporizadores em cascata|}}
 +
{{Cl|18|29/09 - sex|2|Projeto final – Implementação de dois temporizadores em cascata|}}
 +
{{Cl|19|03/10 - ter|2|Projeto final – Implementação de dois temporizadores em cascata|}}
 +
{{Cl|20|06/10 - sex|2|Projeto final – Implementação de dois temporizadores em cascata|}}
 +
{{Cl|21|10/10 - ter|2|Projeto final – Implementação de dois temporizadores em cascata|}}
 +
{{Cl|22|13/10 - sex|0|Feriado nacional – Nossa Senhora Aparecida|}}
 +
{{Cl|23|17/10 - ter|2|Projeto final – Implementação de todos os temporizadores em cascata|}}
 +
{{Cl|24|20/10 - sex|2|Projeto final – Implementação de todos os temporizadores em cascata|}}
 +
{{Cl|25|24/10 - ter|2|Aula liberada para participação da SNCT – Palestra sobre empreendedorismo|}}
 +
{{Cl|26|27/10 - sex|2|Projeto final – Implementação de todos os temporizadores em cascata|}}
 +
{{Cl|27|31/10 - ter|2|Projeto final – Implementação de todos os temporizadores em cascata|}}
 +
{{Cl|28|03/11 - sex|0|Feriado nacional – Finados|}}
 +
{{Cl|29|07/11 - ter|2|Projeto final – Implementação do cronômetro|}}
 +
{{Cl|30|10/11 - sex|2|Projeto final – Implementação do cronômetro|}}
 +
{{Cl|31|14/11 - ter|2|Projeto final – Implementação do cronômetro|}}
 +
{{Cl|32|17/11 - sex|2|Projeto final – Implementação do cronômetro|}}
 +
{{Cl|33|21/11 - ter|2|Projeto final – Implementação do cronômetro|}}
 +
{{Cl|34|24/11 - sex| | |}}
 +
{{Cl|35|28/11 - ter| | |}}
 +
{{Cl|36|01/12 - sex| | |}}
 +
{{Cl|37|05/12 - ter| | |}}
 +
{{Cl|38|08/12 - sex| | |}}
 +
{{Cl|39|12/12 - ter| | |}}
 +
{{Cl|40|15/12 - sex| | |}}
 +
{{Cl|41|19/12 - ter| | |}}
 +
{{cronograma-botton  |60}}
 +
{{collapse bottom}}
  
::<math> u(ci,x,y) = (ci',x',y)+(ci',x,y') + (ci,x',y')+(ci,x,y)</math>
+
{{collapse top | 2017-1 - Clicar no "+" para expandir }}
 +
{{Cronograma-top}}
 +
{{Cl|01|09/02 - qui|2| |}}
 +
{{Cl|02|10/02 - sex|2| |}}
 +
{{Cl|03|16/02 - qui|0| |}}
 +
{{Cl|04|17/02 - sex|2| |}}
 +
{{Cl|05|23/02 - qui|2| |}}
 +
{{Cl|06|24/02 - sex|2| |}}
 +
{{Cl|07|02/03 - qui|2| |}}
 +
{{Cl|08|03/03 - sex|2| |}}
 +
{{Cl|09|09/03 - qui|2| |}}
 +
{{Cl|10|10/03 - sex|2| |}}
 +
{{Cl|11|16/03 - qui|2| |}}
 +
{{Cl|12|17/03 - sex|2| |}}
 +
{{Cl|13|23/03 - qui|2| |}}
 +
{{Cl|14|24/03 - sex|2| |}}
 +
{{Cl|15|30/03 - qui|2| |}}
 +
{{Cl|16|31/03 - sex|2| |}}
 +
{{Cl|17|06/04 - qui|2| |}}
 +
{{Cl|18|07/04 - sex|2| |}}
 +
{{Cl|19|13/04 - qui|2| |}}
 +
{{Cl|20|14/04 - sex|0| |}}
 +
{{Cl|21|20/04 - qui|2| |}}
 +
{{Cl|22|21/04 - sex|0| |}}
 +
{{Cl|23|27/04 - qui|2| |}}
 +
{{Cl|24|28/04 - sex|2| |}}
 +
{{Cl|25|04/05 - qui|2| |}}
 +
{{Cl|26|05/05 - sex|2| |}}
 +
{{Cl|27|11/05 - qui|2| |}}
 +
{{Cl|28|12/05 - sex|2| |}}
 +
{{Cl|29|18/05 - qui|2| |}}
 +
{{Cl|30|19/05 - sex|2| |}}
 +
{{Cl|31|25/05 - qui|2| |}}
 +
{{Cl|32|26/05 - sex|2| |}}
 +
{{Cl|33|01/06 - qui|2| |}}
 +
{{Cl|34|02/06 - sex| | |}}
 +
{{Cl|35|08/06 - qui| | |}}
 +
{{Cl|36|09/06 - sex| | |}}
 +
{{Cl|37|15/06 - qui|0| |}}
 +
{{Cl|38|16/06 - sex|0| |}}
 +
{{Cl|39|22/06 - qui| | |}}
 +
{{Cl|40|23/06 - sex| | |}}
 +
{{cronograma-botton |60}}
 +
{{collapse bottom}}
  
 +
{{collapse top | 2016-2 - Clicar no "+" para expandir }}
 +
{{Cronograma-top}}
 +
{{Cl|01|15/08 - seg|2|[[SST20707-2016-2#Apresentação da disciplina|Apresentação da disciplina]] e [[SST20707-2016-2#Dispositivos lógicos programáveis - PLD|Dispositivos lógicos programáveis - PLD]]|}}
 +
{{Cl|02|16/08 - ter|2|[[SST20707-2016-2#Tecnologia de FPGA|Tecnologia de FPGA]]|}}
 +
{{Cl|03|22/08 - seg|2|[[SST20707-2016-2#Projetos em FPGA|Projetos em FPGA]]|}}
 +
{{Cl|04|23/08 - ter|2|[[SST20707-2016-2#Exercício 1 - Esquemático|Exercício 1 - Esquemático]] e outros exercícios|}}
 +
{{Cl|05|29/08 - seg|2|Aula livre para execução dos exercícios - Professor fora, no congresso SBrT|}}
 +
{{Cl|06|30/08 - ter|2|Aula livre para execução dos exercícios - Professor fora, no congresso SBrT|}}
 +
{{Cl|07|05/09 - seg|2|[[SST20707-2016-2#Introdução ao VHDL|Introdução ao VHDL]]|}}
 +
{{Cl|08|06/09 - ter|2|[[SST20707-2016-2#Objetos e atribuições|Objetos e atribuições]]|}}
 +
{{Cl|09|12/09 - seg|2|Aula livre para execução dos exercícios:  [[SST20707-2016-2#Tarefa - Introdução ao VHDL|Introdução]] e [[SST20707-2016-2#Exercícios - Objetos e atribuições|Objetos e atribuições]]|}}
 +
{{Cl|10|13/09 - ter|2|[[SST20707-2016-2#Abordagens|Abordagens]] e [[SST20707-2016-2#Atribuições de variáveis em simulações|Atribuições de variáveis em simulações]]|}}
 +
{{Cl|11|19/09 - seg|2|[[SST20707-2016-2#Atribuições de variáveis em simulações|Atribuições de variáveis em simulações]] e [[SST20707-2016-2#Outros tópicos em VHDL|Outros tópicos em VHDL]]|}}
 +
{{Cl|12|20/09 - ter|2|[[SST20707-2016-2#Abordagem estrutural|Abordagem estrutural]]|}}
 +
{{Cl|13|26/09 - seg|2|Aula livre para execução dos exercícios|}}
 +
{{Cl|14|27/09 - ter|2|Aula de dúvida antes da avaliação|}}
 +
{{Cl|15|03/10 - seg|2|[[SST20707-2016-2#Avaliação 1 - Sistemas combinacionais|Avaliação 1 - Sistemas combinacionais]]|}}
 +
{{Cl|16|04/10 - ter|2|Aula livre para execução da [[SST20707-2016-2#Avaliação 1 - Sistemas combinacionais|Avaliação 1]]|}}
 +
{{Cl|17|10/10 - seg|2|Aula livre para execução da [[SST20707-2016-2#Avaliação 1 - Sistemas combinacionais|Avaliação 1]]|}}
 +
{{Cl|18|11/10 - ter|2|[[SST20707-2016-2#Circuitos sequenciais em VHDL| Circuitos sequenciais em VHDL]]|}}
 +
{{Cl|19|17/10 - seg|2|[[SST20707-2016-2#Atributos| Atributos]] e discussão sobre os sistemas feitos na [[SST20707-2016-2#Avaliação 2 - Sistemas sequenciais|Avaliação 2]] no semestre de 2015-1|}}
 +
{{Cl|20|18/10 - ter|2|Apresentação da [[SST20707-2016-2#Avaliação 2 - Sistemas sequenciais|Avaliação 2]] e [[SST20707-2016-2#Máquina de estados finitos em VHDL|Introdução às Máquinas de estados finitos em VHDL]]|}}
 +
{{Cl|21|24/10 - seg|2|[[SST20707-2016-2#Implementação em VHDL|Implementação em VHDL]] de FSM|}}
 +
{{Cl|22|25/10 - ter|2|Aula livre para execução da [[SST20707-2016-2#Avaliação 2 - Sistemas sequenciais|Avaliação 2]] - Construção do diagrama do sistema|}}
 +
{{Cl|23|31/10 - seg|2|Aula livre para execução da [[SST20707-2016-2#Avaliação 2 - Sistemas sequenciais|Avaliação 2]]|}}
 +
{{Cl|24|01/11 - ter|2|Aula livre para execução da [[SST20707-2016-2#Avaliação 2 - Sistemas sequenciais|Avaliação 2]]|}}
 +
{{Cl|25|07/11 - seg|2||}}
 +
{{Cl|26|08/11 - ter|2||}}
 +
{{Cl|27|14/11 - seg|0||}}
 +
{{Cl|28|15/11 - ter|0||}}
 +
{{Cl|29|21/11 - seg|2||}}
 +
{{Cl|30|22/11 - ter|2||}}
 +
{{Cl|31|28/11 - seg|2||}}
 +
{{Cl|32|29/11 - ter|2||}}
 +
{{cronograma-botton |60}}
 +
{{collapse bottom}}
  
Os PAL tem, porém, como limitação, a implementação apenas em circuitos combinacionais.
+
{{collapse top | '''2016-1''' - Clicar no "+" para expandir }}
 +
{{Cronograma-top}}
 +
{{Cl|01|22/03 - ter| 2 | [[SST20707-2016-1#Apresentação da disciplina|Apresentação da disciplina]] e [[SST20707-2016-1#Dispositivos lógicos programáveis - PLD|Dispositivos lógicos programáveis - PLD]] | }}
 +
{{Cl|02|23/03 - qua| 0 | Aula cancelada devido à realização de defesa de TCC do curso de licenciatura| }}
 +
{{Cl|03|29/03 - ter| 2 | [[SST20707-2016-1#Tecnologia de FPGA|Tecnologia de FPGA]] e [[SST20707-2016-1#Projetos em FPGA|Projetos em FPGA]]| }}
 +
{{Cl|04|30/03 - qua| 2 | [[SST20707-2016-1#Utilizando o FPGA|Utilizando o FPGA]] e [[SST20707-2016-1#Exercício 1 - Esquemático|Exercício 1 - Esquemático]]| }}
 +
{{Cl|05|05/04 - ter| 2 | [[SST20707-2016-1#Introdução ao VHDL|Introdução ao VHDL]] | }}
 +
{{Cl|06|06/04 - qua| 2 | [[SST20707-2016-1#Objetos e atribuições|Objetos e atribuições]] | }}
 +
{{Cl|07|12/04 - ter| 2 | Alunos não fizeram os exercícios propostos, esta aula foi livre para estudo | }}
 +
{{Cl|08|13/04 - qua| 2 | [[SST20707-2016-1#Abordagens|Abordagens]] e [[SST20707-2016-1#Atribuições de variáveis em simulações|Atribuições de variáveis em simulações]]| }}
 +
{{Cl|09|19/04 - ter| 2 | [[SST20707-2016-1#Outros tópicos em VHDL|Outros tópicos em VHDL]] | }}
 +
{{Cl|10|20/04 - qua| 2 | [[SST20707-2016-1#Abordagem estrutural|Abordagem estrutural]]| }}
 +
{{Cl|11|26/04 - ter| 2 | Aula livre para dúvidas| }}
 +
{{Cl|12|27/04 - qua| 0 | Aula dispensada devido à reunião da direção sobre ingresso nos cursos do campus| }}
 +
{{Cl|13|03/05 - ter| 2 | [[SST20707-2016-1#Avaliação 1 - Sistemas combinacionais|Avaliação 1 - Sistemas combinacionais]] - Execução da parte 1| }}
 +
{{Cl|14|04/05 - qua| 2 | Aula livre para a execução da segunda parte da avaliação 1| }}
 +
{{Cl|15|10/05 - ter| 2 | [[SST20707-2016-1#Circuitos sequenciais em VHDL|Circuitos sequenciais em VHDL]] , [[SST20707-2016-1#Atributos|Atributos]] e [[SST20707-2016-1#Pacotes|Pacotes]]| }}
 +
{{Cl|16|11/05 - qua| 2 | Exemplos de sistemas sequenciais, baseados na [[SST20707-2016-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2]] do semestre 2015-1| }}
 +
{{Cl|17|17/05 - ter| 2 | Apresentação da [[SST20707-2016-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2]]| }}
 +
{{Cl|18|18/05 - qua| 2 | Aula livre para desenvolvimento da [[SST20707-2016-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2]]| }}
 +
{{Cl|19|24/05 - ter| 2 | Aula livre para desenvolvimento da [[SST20707-2016-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2]]| }}
 +
{{Cl|20|25/05 - qua| 2 | Aula livre para desenvolvimento da [[SST20707-2016-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2]]| }}
 +
{{Cl|21|31/05 - ter| 2 | [[SST20707-2016-1#Máquina de estados finitos em VHDL|Máquina de estados finitos em VHDL]]| }}
 +
{{Cl|22|01/06 - qua| 2 | Aula livre para desenvolvimento da [[SST20707-2016-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2]]| }}
 +
{{Cl|23|04/06 - sáb| 2 | Aula livre para desenvolvimento da [[SST20707-2016-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2]]| }}
 +
{{Cl|24|07/06 - ter| 2 | Aula liberada para assistir à palestra "Empreendedorismo e Inovação"| }}
 +
{{Cl|25|08/06 - qua| 2 | Máquina de estados: [[SST20707-2016-1#Implementação em VHDL|Implementação em VHDL]]| }}
 +
{{Cl|26|14/06 - ter| 2 | [[SST20707-2016-1#Simulação de circuitos usando VHDL|Simulação de circuitos usando VHDL e Modelsim]]| }}
 +
{{Cl|27|15/06 - qua| 2 | Outras funcionalidades do Quartus II: desenvolvimento via esquemático, Megawizard e [[SST20707-2016-1#Signal Tap|Signal Tap]]| }}
 +
{{Cl|28|21/06 - ter| 2 | Aula livre para execução do trabalho final da disciplina, a [[SST20707-2016-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2]] | }}
 +
{{Cl|29|22/06 - qua| 2 | [[SST20707-2016-1#Nios II|Processador embarcado em FPGA usando o NIOS II]]| }}
 +
{{Cl|30|28/06 - ter| 2 | Aula livre para execução do trabalho final da disciplina, a [[SST20707-2016-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2]]| }}
 +
{{Cl|31|29/06 - qua| 2 | Ajuda na solução da [[SST20707-2016-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2]] da equipe 2| }}
 +
{{Cl|32|05/07 - ter| 2 | Ajuda na solução da [[SST20707-2016-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2]] da equipe 2| }}
 +
{{cronograma-botton | 60}}
 +
{{collapse bottom}}
  
 +
{{collapse top | '''2015-2''' - Clicar no "+" para expandir }}
 +
{{Cronograma-top}}
 +
{{Cl|1 |06/10 | 2 | [[SST20707-2015-1#Apresentação da disciplina|Apresentação da disciplina]] | }}
 +
{{Cl|2 |08/10 | 2 | [[SST20707-2015-1#Dispositivos lógicos programáveis - PLD|Dispositivos lógicos programáveis - PLD]] | }}
 +
{{Cl|3 |13/10 | 2 | [[SST20707-2015-1#Tecnologia de FPGA|Tecnologia de FPGA]] | }}
 +
{{Cl|4 |15/10 | 2 | [[SST20707-2015-1#Projetos em FPGA|Projetos em FPGA]] | }}
 +
{{Cl|5 |20/10 | 2 | [[SST20707-2015-1#Exercício 1 - Esquemático|Exercício 1 - Esquemático]] | }}
 +
{{Cl|6 |22/10 | 2 | [[SST20707-2015-1#Introdução ao VHDL|Introdução ao VHDL]] | }}
 +
{{Cl|7 |27/10 | 2 | [[SST20707-2015-1#Objetos e atribuições|Objetos e atribuições]] | }}
 +
{{Cl|8 |29/10 | 2 | [[SST20707-2015-1#Abordagens|Abordagens]] | }}
 +
{{Cl|9 |03/11 | 2 | [[SST20707-2015-1#Atribuições de variáveis em simulações|Atribuições de variáveis em simulações]] | }}
 +
{{Cl|10 |05/11 | 2 | [[SST20707-2015-1#Outros tópicos em VHDL|Outros tópicos em VHDL]] | }}
 +
{{Cl|11 |10/11 | 2 | [[SST20707-2015-1#Abordagem estrutural|Abordagem estrutural]] | }}
 +
{{Cl|12 |12/11 | 2 | Aula livre para dúvidas | }}
 +
{{Cl|13 |17/11 | 2 | [[SST20707-2015-1#Avaliação 1 - Sistemas combinacionais|Avaliação 1 - Sistemas combinacionais]] | }}
 +
{{Cl|14 |19/11 | 2 | [[SST20707-2015-1#Avaliação 1 - Sistemas combinacionais|Avaliação 1 - Sistemas combinacionais]] | }}
 +
{{Cl|15 |24/11 | 2 | [[SST20707-2015-1#Circuitos sequenciais em VHDL|Circuitos sequenciais em VHDL]] | }}
 +
{{Cl|16 |26/11 | 2 | [[SST20707-2015-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2 - Sistemas sequenciais]] - Discussão das avaliações do semestre anterior | }}
 +
{{Cl|17 |01/12 | 2 | [[SST20707-2015-1#Avaliação do semestre atual 2|Avaliação 2 - Sistemas sequenciais]] | }}
 +
{{Cl|18 |03/12 | 2 | [[SST20707-2015-1#Avaliação do semestre atual 2|Avaliação 2 - Sistemas sequenciais]] | }}
 +
{{Cl|19 |08/12 | 2 | [[SST20707-2015-1#Avaliação do semestre atual 2|Avaliação 2 - Sistemas sequenciais]] | }}
 +
{{Cl|20 |10/12 | 2 | [[SST20707-2015-1#Avaliação do semestre atual 2|Avaliação 2 - Sistemas sequenciais]] | }}
 +
{{Cl|21 |15/12 | 2 | [[SST20707-2015-1#Avaliação do semestre atual 2|Avaliação 2 - Sistemas sequenciais]] | }}
 +
{{Cl|22 |17/12 | 2 | [[SST20707-2015-1#Avaliação do semestre atual 2|Avaliação 2 - Sistemas sequenciais]] | }}
 +
{{Cl|23 |22/12 | 2 | [[SST20707-2015-1#Avaliação do semestre atual 2|Avaliação 2 - Sistemas sequenciais]] | }}
 +
{{Cl|24 |02/02 | 2 | [[SST20707-2015-1#Máquina de estados finitos em VHDL|Máquina de estados finitos em VHDL]] - Apresentação codificação convolucional | }}
 +
{{Cl|25 |04/02 | 2 | [[SST20707-2015-1#Máquina de estados finitos em VHDL|Máquina de estados finitos em VHDL]] | }}
 +
{{Cl|26 |11/02 | 2 | [[SST20707-2015-1#Avaliação 3|Apresentação do projeto final da disciplina]] | }}
 +
{{Cl|27 |13/02 | 2 | Aula livre para desenvolvimento do projeto final | }}
 +
{{Cl|28 |16/02 | 2 | Aula livre para desenvolvimento do projeto final | }}
 +
{{Cl|29 | | 2 |  | }}
 +
{{Cl|30 | | 2 |  | }}
  
; PLA - Programmable Logic Array
+
{{cronograma-botton |}}
 +
{{collapse bottom}}
  
Muito semelhante aos PALs, os PLA diferenciam-se no fato de que tanto as ligações AND quanto OR são programáveis.
+
{{collapse top | '''2015-1''' - Clicar no "+" para expandir }}
 +
{{Cronograma-top}}
 +
{{Cl|1 |06/02 | 2 | [[SST20707-2015-1#Apresentação da disciplina|Apresentação da disciplina]] | }}
 +
{{Cl|2 |10/02 | 2 | [[SST20707-2015-1#Dispositivos lógicos programáveis - PLD|Dispositivos lógicos programáveis - PLD]] | }}
 +
{{Cl|3 |13/02 | 2 | [[SST20707-2015-1#Tecnologia de FPGA|Tecnologia de FPGA]] | }}
 +
{{Cl|4 |20/02 | 2 | [[SST20707-2015-1#Projetos em FPGA|Projetos em FPGA]] | }}
 +
{{Cl|5 |24/02 | 2 | Sem aula devido a reunião com a reitoria. Resolver [[SST20707-2015-1#Exercício 1 - Esquemático|exercício]] | }}
 +
{{Cl|6 |27/02 | 2 | [[SST20707-2015-1#Utilizando_o_FPGA|Correção do exercício e utilização do Kit DE2-115]] e [[SST20707-2015-1#Introdução ao VHDL|Introdução ao VHDL]] | }}
 +
{{Cl|7 |03/03 | 2 | [[SST20707-2015-1#Introdução ao VHDL|Introdução ao VHDL]] e  [[SST20707-2015-1#Objetos e atribuições|Objetos e atribuições]]| }}
 +
{{Cl|8 |06/03 | 2 | Aula livre para a execução dos [[SST20707-2015-1#Exercícios - Objetos e atribuições|exercícios de VHDL]] | }}
 +
{{Cl|9 |10/02 | 2 | [[SST20707-2015-1#Abordagens|Abordagens]] e [[SST20707-2015-1#Atribuições de variáveis em simulações|Atribuições de variáveis em simulações]] | }}
 +
{{Cl|10 |13/03 | 2 | [[SST20707-2015-1#Outros tópicos em VHDL|Tópicos em VHDL]] | }}
 +
{{Cl|11 |17/03 | 2 | Uso do Modelsim - Aula prejudicada devido à problemas no laboratório | }}
 +
{{Cl|12 |20/03 | 2 | [[SST20707-2015-1#Abordagem estrutural|Abordagem estrutural]] | }}
 +
{{Cl|13 |24/03 | 2 | Aula livre para realização da [[SST20707-2015-1#Avaliação 1 - Sistemas combinacionais|Avaliação 1]] | }}
 +
{{Cl|14 |27/03 | 2 | Aula livre para realização da [[SST20707-2015-1#Avaliação 1 - Sistemas combinacionais|Avaliação 1]] | }}
 +
{{Cl|15 |31/03 | 2 | Continuação da Avaliação 1: [[SST20707-2015-1#Adendo - Uso do FPGA|Implementação em FPGA]] | }}
 +
{{Cl|16 |07/04 | 2 | [[SST20707-2015-1#Circuitos sequenciais em VHDL|Circuitos sequenciais em VHDL]] | }}
 +
{{Cl|17 |10/04 | 2 | [[SST20707-2015-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2 - Sistemas sequenciais]] | }}
 +
{{Cl|18 |14/04 | 2 | [[SST20707-2015-1#Avaliação 2 - Sistemas sequenciais|Avaliação 2 - Sistemas sequenciais]] | }}
 +
{{Cl|19 |17/04 | 2 | Apresentação do trabalho da Avaliação 2, [[SST20707-2015-1#Atributos|Atributos]] e [[SST20707-2015-1#Pacotes|Pacotes]] | }}
 +
{{Cl|20 |24/04 | 2 | [[Media: SST20707_Convolucional_apresentacao.pdf | Apresentação sobre Codificação Convolucional, como exemplo de máquina de estados finitos]]|}}
 +
{{Cl|21 |28/04 | 2 | [[SST20707-2015-1#Máquina de estados finitos em VHDL| Máquina de estados finitos em VHDL]] | }}
  
[[Imagem:SST_Sistema_digital_PLA.png|thumb|Arquitetura PLA. Fonte: [4]|500px|center]]
+
{{Cl|22 |05/05 | 2 | Aula livre para realização da [[SST20707-2015-1#Tarefas_5|tarefa sobre Máquina de Estados]] | }}
<br style="clear:both;">
+
{{Cl|23 |12/05 | 2 | [[SST20707-2015-1#Simulação de circuitos usando VHDL| Simulação de circuitos usando VHDL]] | }}
 +
{{Cl|24 |15/05 | 2 | Apresentação da [[SST20707-2015-1#Avaliação 3|avaliação final]] - Formação das equipes e início do desenvolvimento | }}
 +
{{Cl|25 |19/05 | 2 | Aula livre para realização da [[SST20707-2015-1#Avaliação 3|avaliação final]] | }}
 +
{{Cl|26 |22/05 | 2 | Aula livre para realização da [[SST20707-2015-1#Avaliação 3|avaliação final]] - Eu estava em reunião com a reitoria em Itajaí| }}
 +
{{Cl|27 |26/05 | 2 | Aula livre para realização da [[SST20707-2015-1#Avaliação 3|avaliação final]] | }}
 +
{{Cl|28 |29/05 | 2 | Aula livre para realização da [[SST20707-2015-1#Avaliação 3|avaliação final]] | }}
  
 +
{{cronograma-botton |}}
 +
{{collapse bottom}}
  
; GAL - Generic Array Logic
+
== Aulas ==
  
Características adicionais com relação aos PALs:
+
=== Apresentação da disciplina ===
  
:* Célula de saída (chamada de OLMC - output logic macrocell) com flip-flop, porta XOR, multiplexadores
+
:; Roteiro:
:* Inclusão de um sinal de retorno (''feedback'')
+
::* Apresentação do professor;
:* Utilização de memórias EEPROM na programação do circuito
+
::* Apresentação da disciplina ([[SST20707-2016-1#Informações da disciplina |Plano de Ensino]]);
 +
:::* Avaliações: Trabalhos e Projeto Final
 +
::* Grupo no Whatsapp
 +
::* Horário alternativo
  
Um exemplo dessa arquitetura pode ser visto na figura abaixo:
+
:; Atividades:
 +
::* Ler capítulo 1 do livro '''FPGAs for dummmies - Altera Special Edition'''
 +
::* Ler artigo [[Media:Artigo-DLP-Kamila.pdf|Introdução à Dispositivos Lógico Programáveis]]
 +
::* Fazer o curso online [http://wl.altera.com/education/training/courses/ORMF1000 Read Me First!], da Altera
  
[[Imagem:SST_Sistema_digital_GAL.png|thumb|Arquitetura GAL no chip GAL 16V8. Fonte: [4]|500px|center]]
+
=== Dispositivos lógicos programáveis - PLD ===
<br style="clear:both;">
 
  
==== CPLDs ====
+
==== PLDs em sistemas digitais ====
  
Como o próprio nome já adianta, os CPLDs possuem arquitetura muito mais complexa que os SPLDs. De fato, os primeiros CPLDs eram formados pela interconexão programável de vários SPLDs, além de outros avanços. Na figura abaixo, a arquitetura básica de um CPLD:
+
Sistema digital: Saída digital definida em função de processamento realizado em entrada digital.
  
[[Imagem:SST_Sistema_digital_CPLD.png|thumb|Arquitetura de CPLDs. Fonte: [4]|180px|center]]
+
[[Imagem:SST_Sistema_digital_1.png|thumb|Sistema digital. Fonte: [1]|500px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
 +
Os sistemas digitais foram por muito tempo projetados usando a chamada '''lógica fixa''', composta por CIs (circuitos integrados) TTL que implementavam portas lógicas. Em meados de 1970, foram introduzidos os '''PLDs''' (''Programmable Logic Devices''), chips de uso geral cujo ''hardware'' pode ser configurado para atender especificações. Com os PLDs, sistemas digitais poderiam ser projetados a partir de CIs genéricos, com funções definidas a partir de configurações armazenadas em memórias. Desta forma, os PLDs possuem as seguintes vantagens sobre sistemas de lógica fixa [2]:
 +
:* Redução de custos de projeto, chamados de '''custos NRE''' (nonrecurring engineering cost - custo de engenharia não recorrente), com a abolição de desenvolvimentos complexos de placas
 +
:* Rapidez de desenvolvimento
 +
:* Flexibilidade no desenvolvimento: a adição de funcionalidades é feita por simples mudanças no arquivo de configuração
 +
:* Rapidez de produção do CI: por serem padronizados, os PLDs possuem entrega imediata
 +
:* Atualização de hardware em tempo real
  
==== FPGAs - Field programmable gate arrays - Arranjo de portas programável em campo ====
+
Uma alternativa de projeto é o uso de ''microcontroladores'', dispositivos programáveis a nível de ''software''. Porém, mesmo nesses casos, os PLDs possuem vantagens [3]:
 +
:* PLDs são mais simples de desenvolver, pois alterações no projeto são feitas instantaneamente
 +
:* Sistemas com processadores customizados possuem desenvolvimento lento e oneroso
 +
:* Sistemas mais genéricos tendem a ter custos menores pela possibilidade de uso em diversas aplicações, facilitando o estoque de itens
  
Os FPGAs estendem as capacidades dos CPLDs, sendo diferentes em arquitetura, tecnologia, características embutidas e custo. Por serem '''voláteis''', precisam de uma memória de configuração não volátil para armazenar a programação do hardware. Uma simplificação da arquitetura de FPGAs pode ser vista na figura abaixo. No caso, CLBs (configurable logic blocks) e LABs (logic array blocks) são blocos semelhantes à SPLDs GAL.
+
[[Imagem:SST_Sistema_digital_2.png|thumb|Tempo de desenvolvimento entre sistema com microprocessador (ASIC) ou PLD (FPGA). Fonte: [3]|500px|center]]
 
 
[[Imagem:SST_Sistema_digital_FPGA_1.png|thumb|Arquitetura de FPGAs Xilinx (a) e Altera (b). Fonte: [4]|500px|center]]
 
 
<br style="clear:both;">
 
<br style="clear:both;">
  
Além desses blocos, FPGAs costumam possuir também:
+
Em função da arquitetura e tecnologia empregada, os PLDs foram classificados em SPLDs (''simple'' PLDs) ou CPLDs (''complex'' PLDs).
  
* '''Blocos RAM''': Possibilitam o uso direto de memória, sem a necessidade de projetá-las
+
==== SPLDs ====
* '''Blocos DSP''': Muito utilizados em aplicações de processamento de áudio e vídeo digitais, o bloco DSP implementa operações de soma, multiplicação e variáveis.
 
  
==== Comparação entre dispositivos ====
+
São denominados SPLDs os seguintes dispositivos:
 +
 
 +
; PAL - Programmable Array Logic
  
Uma comparação entre os dispositivos vistos nesta aula pode ser vista na figura abaixo:
+
Um arranjo ''programável'' de portas AND seguido por um arranjo ''fixo'' de portas OR.
  
[[Imagem:SST_Sistema_digital_comparacao_1.png|thumb|Comparação entre DLPs. Fonte: [6]|500px|center]]
+
[[Imagem:SST_Sistema_digital_PAL.png|thumb|Arquitetura PAL. Fonte: [4]|500px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
onde as características de armazenamento do programa são:
+
Essa foi a primeira implementação de PLDs, e se baseia no fato de que qualquer função lógica pode ser reescrita como uma soma de produtos (SOP - sum of products) [4]. Por exemplo, sendo abaixo a tabela verdade da soma aritmética de um bit ''u'' de uma posição de um circuito somador, como função de ''x'' e ''y'' e do ''carry'' ''ci''
  
* Fusível e antifusível - Configurado uma única vez
+
{| class="wikitable" style="margin: 1em auto 1em auto"
* (E)EPROM - Configurado um número limitado de vezes, mantida com o chip desconectado da alimentação (não volátil)
+
!width="50"|ci
* SRAM - Configuração realizada cada vez que o sistema é alimantado (volátil)
+
!width="50"|x
 
+
!width="50"|y
 
+
!width="50"|u(ci,x,y)
==== Referências ====
+
|-
 
+
|0||0||0||0
:: [1] Midorikawa, Edson. '''Projeto de sistemas digitais'''. Disponível em [http://www.pcs.usp.br/~labdig/material/projeto_sistemas_digitais.pdf Link]. Acesso em 09/02/2015.
+
|-
 
+
|0||0||1||1
:: [2] Xilinx. '''What is Programmable Logic?''' Disponível em [http://www.xilinx.com/company/about/programmable.html Link]. Acesso em 09/02/2015.
+
|-
 
+
|0||1||0||1
:: [3] Parnell, Karen & Bryner, Roger. '''Comparing and contrasting FPGA and microprocessor system design and development'''. Disponível em [http://www.xilinx.com/support/documentation/white_papers/wp213.pdf Link]. Acesso em 09/02/2015.
+
|-
 +
|0||1||1||0
 +
|-
 +
|1||0||0||1
 +
|-
 +
|1||0||1||0
 +
|-
 +
|1||1||0||0
 +
|-
 +
|1||1||1||1
 +
|}
  
:: [4] Pedroni, Volnei A. '''Eletrônica digital moderna e VHDL'''. Disponível em [http://vhdl2.weebly.com/uploads/2/7/7/3/27733415/eletrnicadigitalpedroni_figurascaps_16-18.pdf Link]. Acesso em 09/02/2015.
+
Sendo as linhas 2, 3, 5 e 8, as que possuem saída 1, podemos escrever ''u'' como [5]:
  
:: [5] Wikipedia. '''Canonical normal form'''. Disponível em [http://en.wikipedia.org/wiki/Canonical_normal_form Link]. Acesso em 09/02/2015.
+
::<math> u(ci,x,y) = (ci',x',y)+(ci',x,y') + (ci,x',y')+(ci,x,y)</math>
  
:: [6] Matos, Roberto de. '''Apresentação da disciplina de SST'''. Disponível em [http://wiki.sj.ifsc.edu.br/images/a/a5/Sst-intro.pdf Link].
 
  
=== Tecnologia de FPGA ===
+
Os PAL tem, porém, como limitação, a implementação apenas em circuitos combinacionais.
  
Os FPGAs são compostos por três tipos de componentes:
 
  
* '''Bloco de entrada e saída''' (Input/Output Block - IOB): Circuitos responsáveis pela interface de entrada e saída do FPGA. Compostos basicamente de ''buffers''.
+
; PLA - Programmable Logic Array
* '''Bloco de configuração lógica''' (Configurable Logic Block - CLB): Circuitos construídos usando flip-flops e lógica combinacional. Onde são construídas as funções lógicas do sistema.
 
* '''Chaves de interconexões''': Trilhas configuráveis usadas para conectar os blocos de funções com os blocos de saída. O processo de escolha das interconexões é chamado de ''roteamento''.
 
  
Os 3 blocos são interconectados em duas dimensões, otimizando as conexões entre os blocos
+
Muito semelhante aos PALs, os PLA diferenciam-se no fato de que tanto as ligações AND quanto OR são programáveis.
  
[[Imagem:SST_FPGA_arquitetura.png|thumb|Arquitetura simplificada de um FPGA. Fonte: [1]|500px|center]]
+
[[Imagem:SST_Sistema_digital_PLA.png|thumb|Arquitetura PLA. Fonte: [4]|500px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
==== IOB ====
 
  
São usados para fazer a interface de entrada e saída do FPGA. Consiste em um ''buffer'' de entrada e um de saída, ambos com flip-flops, permitindo que saídas com clocks sejam disponibilizadas sem encontrar atrasos significantes e reduzindo a necessidade de manter sinais de entrada por muito tempo.
+
; GAL - Generic Array Logic
  
[[Imagem:SST_FPGA_IOBlock.png|thumb|IOB. Fonte: [2]|500px|center]]
+
Características adicionais com relação aos PALs:
<br style="clear:both;">
 
  
* Entrada e saída são concentradas num único pino descrito como '''Pad'''.
+
:* Célula de saída (chamada de OLMC - output logic macrocell) com flip-flop, porta XOR, multiplexadores
* Flip-flops realizam a sincronização dos dados, mas caminhos diretos, sem atrasos, são configuráveis
+
:* Inclusão de um sinal de retorno (''feedback'')
* Entrada do dado pelo flip-flop inferior.
+
:* Utilização de memórias EEPROM na programação do circuito
* Saídas não utilizadas necessitam ser mantidas em ''tri-state''.
 
* '''Slew rate''' controla a velocidade de mudança de polaridade. Valores menores reduzem ruídos.
 
  
==== CLB [3] ====
+
Um exemplo dessa arquitetura pode ser visto na figura abaixo:
  
Contêm a lógica do FPGA, como mostra a simplificação abaixo:
+
[[Imagem:SST_Sistema_digital_GAL.png|thumb|Arquitetura GAL no chip GAL 16V8. Fonte: [4]|500px|center]]
 
 
[[Imagem:SST_FPGA_CLB1.png|thumb|CLB. Fonte: [2] e [3]|500px|center]]
 
 
<br style="clear:both;">
 
<br style="clear:both;">
  
Neste bloco:
+
==== CPLDs ====
  
* Disponíveis 3 elementos configuráveis, dois com 4 entradas (F e G) e um com 3 entradas (H). Estes elementos podem construir qualquer função lógica a partir de suas entradas.
+
Como o próprio nome já adianta, os CPLDs possuem arquitetura muito mais complexa que os SPLDs. De fato, os primeiros CPLDs eram formados pela interconexão programável de vários SPLDs, além de outros avanços. Na figura abaixo, a arquitetura básica de um CPLD:
* Com os multiplexadores M1 a M3, é possível combinar os elementos para criar funções de mais de 4 entradas.
 
* Com os multiplexadores M4 a M7, a saída das funções lógicas podem ser enviadas diretamente para as saídas X e Y ou podem ser capturadas pelos flip-flops F1 e F2.
 
* Saída dos flip-flops nas saídas XQ e YQ, podendo os pinos serem "desativados" para simplesmente copiar sinais de entrada.
 
* O clock dos flip-flops pode ser configurado para a borda de subida ou descida.
 
* Os flip-flops podem também usar sinal de ''Enable''.
 
* Os multiplexadores superiores permitem escolher a função dos sinais C1 a C4, para a entrada da função H ou outros sinais internos.
 
* Blocos ''S/R Control'' configuram o estado inicial dos flip-flops.
 
  
As funções lógicas são implementadas a partir de suas tabelas verdade nos elementos lógicos usando uma memória chamada de ''Lookup Table'' (LUT). Com isso, um bloco de configuração lógica também pode ser usado como uma memória, em diferentes configurações dependendo dos multiplexadores. Nesses casos, as entradas F1 a F4 e G1 a G4 fornecem endereços, e as entradas C1 a C4 fornecem os dados e sinais de ''enable''.
+
[[Imagem:SST_Sistema_digital_CPLD.png|thumb|Arquitetura de CPLDs. Fonte: [4]|180px|center]]
 +
<br style="clear:both;">
  
==== Chaves de interconexões ====
 
  
Os CLBs estão imersos numa rede de interconexões configuráveis. As conexões possíveis por cada bloco lógico podem ser vistas na figura abaixo.
+
==== FPGAs - Field programmable gate arrays - Arranjo de portas programável em campo ====
  
[[Imagem:SST_FPGA_conexao1.png|thumb|Esquema de conexão de cada CLB. Fonte: [3]|500px|center]]
+
Os FPGAs estendem as capacidades dos CPLDs, sendo diferentes em arquitetura, tecnologia, características embutidas e custo. Por serem '''voláteis''', precisam de uma memória de configuração não volátil para armazenar a programação do hardware. Uma simplificação da arquitetura de FPGAs pode ser vista na figura abaixo. No caso, CLBs (configurable logic blocks) e LABs (logic array blocks) são blocos semelhantes à SPLDs GAL.
 +
 
 +
[[Imagem:SST_Sistema_digital_FPGA_1.png|thumb|Arquitetura de FPGAs Xilinx (a) e Altera (b). Fonte: [4]|500px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
Um FPGA com 64 blocos de configuração lógica seriam a repetição dessa figura numa matriz de 8x8
+
Além desses blocos, FPGAs costumam possuir também:
 +
 
 +
* '''Blocos RAM''': Possibilitam o uso direto de memória, sem a necessidade de projetá-las
 +
* '''Blocos DSP''': Muito utilizados em aplicações de processamento de áudio e vídeo digitais, o bloco DSP implementa operações de soma, multiplicação e variáveis.
  
[[Imagem:SST_FPGA_conexao2.png|thumb|Um FPGA com 64 CLBs. Fonte: [3]|500px|center]]
+
==== Comparação entre dispositivos ====
<br style="clear:both;">
 
  
Para fazer a ligação entre CLBs vizinhos, o caminho unidirecional '''direct''' pode ser utilizado. Porém, para o roteamento de dados em maiores "distâncias", 3 outros caminhos são disponíveis, dispostos como a figura abaixo:
+
Uma comparação entre os dispositivos vistos nesta aula pode ser vista na figura abaixo:
  
[[Imagem:SST_FPGA_conexao3.png|thumb|Caminhos indiretos de interligação num FPGA. Fonte: [4]|500px|center]]
+
[[Imagem:SST_Sistema_digital_comparacao_1.png|thumb|Comparação entre DLPs. Fonte: [6]|500px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
Na figura, uma '''Matriz de Comutação Programável''' (Programmable Switch Matrix - PSM) pode ser vista, além dos 3 caminhos indiretos:
+
onde as características de armazenamento do programa são:
  
* '''Single''': ideal para conexão entre CLBs vizinhos, pois é conectado a todos os blocos PSM.
+
* Fusível e antifusível - Configurado uma única vez
* '''Double''': conectado intercaladamente nos blocos PSM
+
* (E)EPROM - Configurado um número limitado de vezes, mantida com o chip desconectado da alimentação (não volátil)
* '''Long''': não é conectado nos blocos PSM
+
* SRAM - Configuração realizada cada vez que o sistema é alimantado (volátil)
  
Os blocos PSM introduzem atraso na propagação do sinal no FPGA. Os 3 caminhos introduzem versatilidade ao balancear atrasos e propagação em longas distâncias.
 
  
O bloco PSM efetua a conexão entre pinos seguindo o esquema da figura abaixo. No esquema, os círculos vermelhos são chamados de '''Elementos de Comutação Programável''' (Programmable Switch Element - PSE).
+
==== Informações complementares ====
  
[[Imagem:SST_FPGA_PSM.png|thumb|Conexão numa PSM. Fonte: [5]|500px|center]]
+
* [https://www.altera.com/support/training/course/odsw1005.html Altera Online Courses] - Basics of Programmable Logic: History of Digital Logic Design (ODSW1005)
<br style="clear:both;">
+
* [https://www.altera.com/solutions/technology/system-design/articles/_2013/in-the-beginning.html Altera System Design Journal] - In the Beginning
 +
* [https://systemdesign.altera.com/from-glue-logic-to-subsystem-alteras-second-decade/ Altera System Design Journal] - From Glue Logic to Subsystem: Altera's Second Decade
 +
* [https://systemdesign.altera.com/the-third-decade-the-fpga-as-soc/ Altera System Design Journal] - The Third Decade: The FPGA as SoC
  
Com isso, várias formas de conexão são possíveis, como exemplifica a figura a seguir:
+
==== Referências ====
  
[[Imagem:SST_FPGA_PSM_exemplo.png|thumb|Exemplo de conexão. Fonte: [4]|500px|center]]
+
:: [1] Midorikawa, Edson. '''Projeto de sistemas digitais'''. Disponível em [http://www.pcs.usp.br/~labdig/material/projeto_sistemas_digitais.pdf Link]. Acesso em 09/02/2015.
<br style="clear:both;">
 
  
 +
:: [2] Xilinx. '''What is Programmable Logic?''' Disponível em [http://www.xilinx.com/company/about/programmable.html Link]. Acesso em 09/02/2015.
  
Várias tecnologias podem ser usadas para realizar a conexão num PSE:
+
:: [3] Parnell, Karen & Bryner, Roger. '''Comparing and contrasting FPGA and microprocessor system design and development'''. Disponível em [http://www.xilinx.com/support/documentation/white_papers/wp213.pdf Link]. Acesso em 09/02/2015.
 +
 
 +
:: [4] Pedroni, Volnei A. '''Eletrônica digital moderna e VHDL'''. Disponível em [http://vhdl2.weebly.com/uploads/2/7/7/3/27733415/eletrnicadigitalpedroni_figurascaps_16-18.pdf Link]. Acesso em 09/02/2015.
  
* '''Antifusível''': Realiza a função oposta de um fusível. Inicia com uma grande resistência, e cria um caminho condutivo ao ser aplicada uma voltagem maior do que um certo limite.
+
:: [5] Wikipedia. '''Canonical normal form'''. Disponível em [http://en.wikipedia.org/wiki/Canonical_normal_form Link]. Acesso em 09/02/2015.
:* Ocupam uma pequena área, permitindo um maior número de conexões em estruturas chamadas de '''Fully Populated'''
 
:* Aumentam a flexibilidade
 
:* Não podem ser reprogramados
 
  
[[Imagem:SST_FPGA_PSM_antifusivel1.png|thumb|PSM com PSE de antifusíveis. Fonte: [4]|500px|center]]
+
:: [6] Matos, Roberto de. '''Apresentação da disciplina de SST'''. Disponível em [http://wiki.sj.ifsc.edu.br/images/a/a5/Sst-intro.pdf Link].
<br style="clear:both;">
 
  
* '''Transistores de passagem''': Transistores controlados por posições de memória realizam a passagem do sinal entre os pinos.
+
=== Tecnologia de FPGA ===
:* Ocupam uma grande área no chip, resultando num menor número de conexões
 
:* Menor flexibilidade
 
:* Pode ser reprogramado
 
  
[[Imagem:SST_FPGA_PSM_transistor1.png|thumb| PSE com transistor de passagem. Fonte: [4]|500px|center]]
+
Os FPGAs são compostos por três tipos de componentes:
<br style="clear:both;">
 
  
 +
* '''Bloco de entrada e saída''' (Input/Output Block - IOB): Circuitos responsáveis pela interface de entrada e saída do FPGA. Compostos basicamente de ''buffers''.
 +
* '''Bloco de configuração lógica''' (Configurable Logic Block - CLB): Circuitos construídos usando flip-flops e lógica combinacional. Onde são construídas as funções lógicas do sistema.
 +
* '''Chaves de interconexões''': Trilhas configuráveis usadas para conectar os blocos de funções com os blocos de saída. O processo de escolha das interconexões é chamado de ''roteamento''.
  
O trabalho de roteamento de sinais dentro de um FPGA é realizado por ferramentas de '''Placement & Routing''', que buscam otimizar a propagação de sinais.
+
Os 3 blocos são interconectados em duas dimensões, otimizando as conexões entre os blocos
  
[[Imagem:SST_FPGA_PSM_place_route.png|thumb| Antes e depois de um processo de Placement e routing. Fonte: [6]|500px|center]]
+
[[Imagem:SST_FPGA_arquitetura.png|thumb|Arquitetura simplificada de um FPGA. Fonte: [1]|500px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
NOTA: Os nomes dos blocos disponíveis nesta aula seguem os termos utilizados pela Xilinx, e os blocos referem-se a
+
==== IOB ====
      uma família específica, a XC4000E. Para fabricantes diferentes, ou mesmo famílias diferentes, mudanças podem
 
      ser observadas. Para informações sobre a arquitetura dos FPGAs da Altera, consultar [7].
 
  
==== Tabela comparativa entre FPGAs ====
+
São usados para fazer a interface de entrada e saída do FPGA. Consiste em um ''buffer'' de entrada e um de saída, ambos com flip-flops, permitindo que saídas com clocks sejam disponibilizadas sem encontrar atrasos significantes e reduzindo a necessidade de manter sinais de entrada por muito tempo.
  
A tabela a seguir é um exemplo de dados de fabricantes, no caso, da Xilinx.
 
  
[[Imagem:SST_FPGA_comparacao.png|thumb| Comparação FPGAs. Fonte: [3]|650px|center]]
+
[[Imagem:SST_FPGA_IOBlock.png|thumb|IOB. Fonte: [2]|500px|center]]
 +
 
 +
* Entrada e saída são concentradas num único pino descrito como '''Pad'''.
 +
* Flip-flops realizam a sincronização dos dados, mas caminhos diretos, sem atrasos, são configuráveis
 +
* Entrada do dado pelo flip-flop inferior.
 +
* Saídas não utilizadas necessitam ser mantidas em ''tri-state''.
 +
* '''Slew rate''' controla a velocidade de mudança de polaridade. Valores menores reduzem ruídos.
 
<br style="clear:both;">
 
<br style="clear:both;">
  
* '''Max user I/O''': Número de entradas e saídas por FPGA. Devido aos diferentes encapsulamentos possíveis, nem todos os pinos de entrada e saída podem estar disponíveis
+
==== CLB [3] ====
* '''Flip-flops''': Número total de flip-flops disponíveis, sendo 2 por CLB e 2 por IOB
 
* '''Max RAM bits (no logic)''': Número de bits de RAM disponíveis no caso de todos os CLBs estarem configurados como RAM
 
* '''Max gates (no RAM)''': Número total de portas disponíveis quando nenhum CLB estiver configurado como RAM
 
  
==== Referências ====
+
Contêm a lógica do FPGA, como mostra a simplificação abaixo:
  
:: [1] Oskin, Mark. Apresentação sobre FPGAs da disciplina '''Advanced Digital Design'''. Disponível em [http://courses.cs.washington.edu/courses/cse467/03wi/FPGA.pdf Link]. Acesso em 12/02/2015.
+
[[Imagem:SST_FPGA_CLB1.png|thumb|CLB. Fonte: [2] e [3]|500px|center]]
 +
<br style="clear:both;">
  
:: [2] Zeidman, bob. '''All about FPGAs'''. Disponível em [http://www.eetimes.com/document.asp?doc_id=1274496 Link]. Acesso em 12/02/2015.
+
Neste bloco:
  
:: [3] Wakerly, John. '''Digital Design: Principles & practices'''. Disponível (versão para demonstração) em [http://www.ddpp.com/DDPP3samp.html Link]. Acesso em 12/02/2015.
+
* Disponíveis 3 elementos configuráveis, dois com 4 entradas (F e G) e um com 3 entradas (H). Estes elementos podem construir qualquer função lógica a partir de suas entradas.
 +
* Com os multiplexadores M1 a M3, é possível combinar os elementos para criar funções de mais de 4 entradas.
 +
* Com os multiplexadores M4 a M7, a saída das funções lógicas podem ser enviadas diretamente para as saídas X e Y ou podem ser capturadas pelos flip-flops F1 e F2.
 +
* Saída dos flip-flops nas saídas XQ e YQ, podendo os pinos serem "desativados" para simplesmente copiar sinais de entrada.
 +
* O clock dos flip-flops pode ser configurado para a borda de subida ou descida.
 +
* Os flip-flops podem também usar sinal de ''Enable''.
 +
* Os multiplexadores superiores permitem escolher a função dos sinais C1 a C4, para a entrada da função H ou outros sinais internos.
 +
* Blocos ''S/R Control'' configuram o estado inicial dos flip-flops.
  
:: [4] Wang, Haibo. '''FPGA Programmable Interconnect and I/O Cells'''. Disponível em [http://www.engr.siu.edu/~haibo/ece428/notes/ece428_intercon.pdf Link]. Acesso em 13/02/2015.
+
As funções lógicas são implementadas a partir de suas tabelas verdade nos elementos lógicos usando uma memória chamada de ''Lookup Table'' (LUT). Com isso, um bloco de configuração lógica também pode ser usado como uma memória, em diferentes configurações dependendo dos multiplexadores. Nesses casos, as entradas F1 a F4 e G1 a G4 fornecem endereços, e as entradas C1 a C4 fornecem os dados e sinais de ''enable''.
  
:: [5] Wikipedia. '''Field-programmable gate array'''. Disponível em [http://en.wikipedia.org/wiki/Field-programmable_gate_array Link]. Acesso em 13/02/2015.
+
==== Chaves de interconexões ====
  
:: [6] Wong, William. '''FPGA Design Suite Generates Global Minimum Layout'''. Disponível em [http://electronicdesign.com/fpgas/fpga-design-suite-generates-global-minimum-layout Link]. Acesso em 13/02/2015.
+
Os CLBs estão imersos numa rede de interconexões configuráveis. As conexões possíveis por cada bloco lógico podem ser vistas na figura abaixo.
  
:: [7] Altera. '''White Paper: FPGA architecture'''. Disponível em [http://www.altera.com/literature/wp/wp-01003.pdf Link]. Acesso em 13/02/2015.
+
[[Imagem:SST_FPGA_conexao1.png|thumb|Esquema de conexão de cada CLB. Fonte: [3]|500px|center]]
 +
<br style="clear:both;">
  
 +
Um FPGA com 64 blocos de configuração lógica seriam a repetição dessa figura numa matriz de 8x8
  
=== Projetos em FPGA ===
+
[[Imagem:SST_FPGA_conexao2.png|thumb|Um FPGA com 64 CLBs. Fonte: [3]|500px|center]]
 +
<br style="clear:both;">
  
==== Altera ====
+
Para fazer a ligação entre CLBs vizinhos, o caminho unidirecional '''direct''' pode ser utilizado. Porém, para o roteamento de dados em maiores "distâncias", 3 outros caminhos são disponíveis, dispostos como a figura abaixo:
  
A Altera é uma das maiores fabricantes de FPGAs e CPLDs. Há no seu portfólio PLDs dos mais baixo custo até dos mais avançados do mercado. O Quartus II é o software de desenvolvimento de PLDs da Altera.
+
[[Imagem:SST_FPGA_conexao3.png|thumb|Caminhos indiretos de interligação num FPGA. Fonte: [4]|500px|center]]
 
 
[[Imagem:SST_Altera1.png|thumb| Dispositivos da Altera. Fonte: [1]|650px|center]]
 
 
<br style="clear:both;">
 
<br style="clear:both;">
  
 +
Na figura, uma '''Matriz de Comutação Programável''' (Programmable Switch Matrix - PSM) pode ser vista, além dos 3 caminhos indiretos:
  
; Licença
+
* '''Single''': ideal para conexão entre CLBs vizinhos, pois é conectado a todos os blocos PSM.
 +
* '''Double''': conectado intercaladamente nos blocos PSM
 +
* '''Long''': não é conectado nos blocos PSM
  
A licença de uso é dada da seguinte forma:
+
Os blocos PSM introduzem atraso na propagação do sinal no FPGA. Os 3 caminhos introduzem versatilidade ao balancear atrasos e propagação em longas distâncias.
  
* ''Web Edition'': de uso livre, com limitações quanto ao número de DLPs disponíveis
+
O bloco PSM efetua a conexão entre pinos seguindo o esquema da figura abaixo. No esquema, os círculos vermelhos são chamados de '''Elementos de Comutação Programável''' (Programmable Switch Element - PSE).
* ''Full Edition - Fixed License'': pago, com licença nativa no computador
 
* ''Full Edition - Float License'': pago, com licença em rede
 
  
[[Imagem:SST_Altera2.png|thumb| Edições do Quartus II da Altera. Fonte: [1]|650px|center]]
+
[[Imagem:SST_FPGA_PSM.png|thumb|Conexão numa PSM. Fonte: [5]|500px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
Uma comparação entre as edições Web e Full está disponível em [http://www.altera.com/literature/po/ss_quartussevswe.pdf Link].
+
Com isso, várias formas de conexão são possíveis, como exemplifica a figura a seguir:
  
Para configurar uma licença, acessar [http://www.altera.com/download/licensing/lic-index.html Link]. A licença Web é gerada em [http://www.altera.com/download/licensing/lic-choose.html Link]. Alguns laboratórios do IFSC possuem computadores com licenças flutuantes, como pode ser visto no [[Uso do Quartus II nos Labs do IFSC|Link]]. Além disso, o IFSC possui licenças flutuantes para acesso remoto via Cloud. O tutorial para acesso pode ser acessado em [[Acesso ao IFSC-CLOUD#Quartus II - Modelsim - QSIM|Acesso ao IFSC-CLOUD - Quartus II - Modelsim - QSIM]].
+
[[Imagem:SST_FPGA_PSM_exemplo.png|thumb|Exemplo de conexão. Fonte: [4]|500px|center]]
 +
<br style="clear:both;">
  
  
; Como obter informações
+
Várias tecnologias podem ser usadas para realizar a conexão num PSE:
  
A Altera preparou uma série de materiais sobre o desenvolvimento usando o Quartus II. Existem cursos on-line e presenciais, pagos e gratuitos:
+
* '''Antifusível''': Realiza a função oposta de um fusível. Inicia com uma grande resistência, e cria um caminho condutivo ao ser aplicada uma voltagem maior do que um certo limite.
 +
:* Ocupam uma pequena área, permitindo um maior número de conexões em estruturas chamadas de '''Fully Populated'''
 +
:* Aumentam a flexibilidade
 +
:* Não podem ser reprogramados
  
* A página de cursos pode ser acessada em [http://www.altera.com/education/training/trn-index.jsp Link].
+
[[Imagem:SST_FPGA_PSM_antifusivel1.png|thumb|PSM com PSE de antifusíveis. Fonte: [4]|500px|center]]
* O treinamento completo (muito material!) está disponível em [http://www.altera.com/education/training/curriculum/fpga/trn-fpga.html?xy=gettingstartedtrain Link].
+
<br style="clear:both;">
* Um bom material escrito pode ser acessado em [http://www.altera.com/literature/lit-qts.jsp?xy=gettingstartedlit Link].
 
  
==== Quartus II ====
+
* '''Transistores de passagem''': Transistores controlados por posições de memória realizam a passagem do sinal entre os pinos.
 +
:* Ocupam uma grande área no chip, resultando num menor número de conexões
 +
:* Menor flexibilidade
 +
:* Pode ser reprogramado
  
Abaixo, um roteiro para o reconhecimento do software da Altera:
+
[[Imagem:SST_FPGA_PSM_transistor1.png|thumb| PSE com transistor de passagem. Fonte: [4]|500px|center]]
 +
<br style="clear:both;">
  
* Abrir o Quartus II
 
* Getting Started
 
* Janelas:
 
:* Project Navigator
 
:* Message Window
 
:* Tool View Window
 
:* Tasks Window
 
::* Custom Tasks Flow
 
  
==== Fluxo de desenvolvimento em PLDs ====
+
O trabalho de roteamento de sinais dentro de um FPGA é realizado por ferramentas de '''Placement & Routing''', que buscam otimizar a propagação de sinais.
  
[[Imagem:SST_Fluxo_PLD.png|thumb| Fluxo de desenvolvimento em PLDs. Fonte: [1]|650px|center]]
+
[[Imagem:SST_FPGA_PSM_place_route.png|thumb| Antes e depois de um processo de Placement e routing. Fonte: [6]|500px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
* '''RTL''': nível de abstração usado para descrever o circuito, dentre 3:
+
NOTA: Os nomes dos blocos disponíveis nesta aula seguem os termos utilizados pela Xilinx, e os blocos referem-se a
:* '''Behavioural''': mais alto nível de abstração, descreve o comportamento do circuito (entradas e saídas)
+
      uma família específica, a XC4000E. Para fabricantes diferentes, ou mesmo famílias diferentes, mudanças podem
:* '''RTL - Register Transfer Level''': descrição do Hardware a partir de lógica, indicando como dados são transferidos entre registradores
+
      ser observadas. Para informações sobre a arquitetura dos FPGAs da Altera, consultar [7].
:* '''Gate Level''': usa componentes como portas lógicas, flip-flops e multiplexadores
 
* '''Synthesis''': processo em que o comportamento de um circuito numa forma abstrata (por exemplo, em RTL) é convertido para uma implementação em termos de portas lógicas.
 
* '''Netlist''': descreve a conectividade dos terminais para o desenvolvimento do circuito.
 
* '''Place & Route - Fitting''': otimiza a localização dos elementos e o roteamento dos dados entre eles.
 
  
 +
==== Tabela comparativa entre FPGAs ====
  
==== Projeto no Quartus II ====
+
A tabela a seguir é um exemplo de dados de fabricantes, no caso, da Xilinx.
  
; Wizard:
+
[[Imagem:SST_FPGA_comparacao.png|thumb| Comparação FPGAs. Fonte: [3]|650px|center]]
 +
<br style="clear:both;">
  
* [http://www.altera.com/customertraining/webex/QII_Intro/presentation_content/WebObjects/58bcb05e-37d5-4a1d-8843-1cc9ab440079/index.html Tutorial]
+
* '''Max user I/O''': Número de entradas e saídas por FPGA. Devido aos diferentes encapsulamentos possíveis, nem todos os pinos de entrada e saída podem estar disponíveis
 +
* '''Flip-flops''': Número total de flip-flops disponíveis, sendo 2 por CLB e 2 por IOB
 +
* '''Max RAM bits (no logic)''': Número de bits de RAM disponíveis no caso de todos os CLBs estarem configurados como RAM
 +
* '''Max gates (no RAM)''': Número total de portas disponíveis quando nenhum CLB estiver configurado como RAM
  
:* Selecionar como dispositivo o '''Cyclone IV EP4CE30F23''', ou o mais próximo disponível. É esse o modelo que será utilizado nas nossas aulas.
+
==== Informações complementares (Altera) ====
  
 +
Toda a arquitetura apresentada aqui foi baseada nos dispositivos fabricados pela Xilinx. Como dito acima, mais informação sobre dispositivos Altera pode ser encontrada na referência [7], além do curso abaixo:
  
; Arquivos [2]:
+
* [https://www.altera.com/support/training/course/odsw1006.html Altera Online Courses] - Basics of Programmable Logic: FPGA Architecture (ODSW1006)
  
* '''.QPF - Quartus II Project File''': informação da versão do Quartus 2 e da data. Traz as revisões efetuadas no projeto.
+
==== Referências ====
* '''.QDF - Quartus II Defaults File''': configurações padrão de todo novo projeto criado
 
* '''.QSF - Quartus II Settings File''': configurações específicas do projeto, como arquivos, dispositivo escolhido, etc.
 
* Pasta '''dB''': informação do projeto compilado
 
* '''.SDC - Synopsys Design Constraint''': restrições temporais do projeto
 
  
: O Quartus também oferece ferramentas para '''controle de versão''' de projetos a partir de arquivos '''.QAR - Quartus II Compressed Archive File'''. Disponível no menu '''Project'''. Com '''revisões''', é possível fazer testes com outros parâmetros sem perder resultados anteriores.
+
:: [1] Oskin, Mark. Apresentação sobre FPGAs da disciplina '''Advanced Digital Design'''. Disponível em [http://courses.cs.washington.edu/courses/cse467/03wi/FPGA.pdf Link]. Acesso em 12/02/2015.
  
==== Formas de desenvolvimento ====
+
:: [2] Zeidman, bob. '''All about FPGAs'''. Disponível em [http://www.eetimes.com/document.asp?doc_id=1274496 Link]. Acesso em 12/02/2015.
  
Ir em ''File'' -> ''New'', e selecionar um dos '''Design Files''' disponíveis.
+
:: [3] Wakerly, John. '''Digital Design: Principles & practices'''. Disponível (versão para demonstração) em [http://www.ddpp.com/DDPP3samp.html Link]. Acesso em 12/02/2015.
  
[[Imagem:SST_Design_entry.png|thumb| Formas de desenvolvimento no Quartus II. Fonte: [1]|650px|center]]
+
:: [4] Wang, Haibo. '''FPGA Programmable Interconnect and I/O Cells'''. Disponível em [http://www.engr.siu.edu/~haibo/ece428/notes/ece428_intercon.pdf Link]. Acesso em 13/02/2015.
<br style="clear:both;">
 
  
Nesta aula, usaremos o desenvolvimento via '''Esquemático - Block File'''.
+
:: [5] Wikipedia. '''Field-programmable gate array'''. Disponível em [http://en.wikipedia.org/wiki/Field-programmable_gate_array Link]. Acesso em 13/02/2015.
  
 +
:: [6] Wong, William. '''FPGA Design Suite Generates Global Minimum Layout'''. Disponível em [http://electronicdesign.com/fpgas/fpga-design-suite-generates-global-minimum-layout Link]. Acesso em 13/02/2015.
  
==== Desenvolvimento via esquemático ====
+
:: [7] Altera. '''White Paper: FPGA architecture'''. Disponível em [http://www.altera.com/literature/wp/wp-01003.pdf Link]. Acesso em 13/02/2015.
  
Um exemplo de sistema será usado para apresentar a ferramenta. O sistema que será desenvolvido está disponível na figura abaixo:
 
  
[[Imagem:SST_Exemplo_esquematico.png|thumb| Sistema a ser desenvolvido. Fonte: [3]|650px|center]]
+
=== Projetos em FPGA ===
<br style="clear:both;">
 
  
O desenvolvimento é feito a partir dos seguintes passos:
+
==== Altera ====
  
* Criar novo arquivo do tipo ''Schematic''
+
A Altera é uma das maiores fabricantes de FPGAs e CPLDs. Há no seu portfólio PLDs dos mais baixo custo até dos mais avançados do mercado. O Quartus II é o software de desenvolvimento de PLDs da Altera.
* Importar portas lógicas
 
* Importar sinais de entrada e saída
 
:* Atribuir nomes aos pinos
 
* Conectar os componentes
 
* Compilar
 
* Atribuir pinos físicos do FPGA aos pinos do sistema (Pin planner)
 
:* Pinos atribuídos podem ser exportados para futuros desenvolvimentos
 
* Descrever sinais de entrada (criar arquivo VWF - Vector Waveform File)
 
* Simular (Tool -> Simulation)
 
  
==== Utilizando o FPGA ====
+
[[Imagem:SST_Altera1.png|thumb| Dispositivos da Altera. Fonte: [1]|650px|center]]
 +
<br style="clear:both;">
  
===== O kit DE2-115 =====
 
  
O Kit Altera DE2-115 pode ser visto na figura abaixo.
+
===== Licença =====
  
[[Imagem:SST_1-Kit_DE2.png|thumb|Kit Altera DE2-115. Fonte: [4]|650px|center]]
+
A licença de uso é dada da seguinte forma:
<br style="clear:both;">
 
  
Algumas características do kit:
+
* ''Web Edition'': de uso livre, com limitações quanto ao número de DLPs disponíveis
 +
* ''Full Edition - Fixed License'': pago, com licença nativa no computador
 +
* ''Full Edition - Float License'': pago, com licença em rede
  
* FPGA Altera Cyclone IV EP4CE115F29C7
+
[[Imagem:SST_Altera2.png|thumb| Edições do Quartus II da Altera. Fonte: [1]|650px|center]]
* 2 MB de SRAM
+
<br style="clear:both;">
* 64 MB de SDRAM
 
* 8 MB de Flash
 
* Interfaces:
 
:* Botões
 
:* Switch
 
:* Leds
 
:* Módulo LCD
 
  
 +
Uma comparação entre as edições Web e Full está disponível em [http://www.altera.com/literature/po/ss_quartussevswe.pdf Link].
  
Para ligar o kit, seguir os passos:
+
Para configurar uma licença, acessar [http://www.altera.com/download/licensing/lic-index.html Link]. A licença Web é gerada em [http://www.altera.com/download/licensing/lic-choose.html Link].
  
# Conectar o cabo USB no computador e no kit na porta '''USB Blaster'''. Talvez seja necessário instalar o driver específico para o USB da Altera. Para instalar, consultar [[Configuração da USB para programação do FPGA via JTAG|Link]] e [http://www.altera.com/download/drivers/dri-index.html Link].
+
===== Acesso ao Quartus II =====
# Desligar o kit soltando o botão ON/OFF vermelho.
 
# Conectar o adaptador 12V.
 
# Selecione a posição '''RUN''' no switch RUN/PROG (SW19).
 
# Ligue o kit pressionando o botão ON/OFF vermelho.
 
  
 +
Para acessar o Quartus II, ver página ([[Uso do Quartus II nos Labs do IFSC]]). Para acesso ao Quartus II via servidor Cloud, ver página ([[Acesso ao IFSC-CLOUD#Quartus II - Modelsim - QSIM|Acesso ao IFSC-CLOUD]])
  
Para mais informações, consultar a página [[Software e equipamentos recomendados para programação de FPGAs]], e a página [[Preparando para gravar o circuito lógico no FPGA]]
+
===== Como obter informações =====
  
==== Exercício 1 - Esquemático ====
+
A Altera preparou uma série de materiais sobre o desenvolvimento usando o Quartus II. Existem cursos on-line e presenciais, pagos e gratuitos:
  
Executar o roteiro disponível em [[Contador Assíncrono Crescente - Roteiro para implementação e simulação com QUARTUS II(v.13), QSIM e kit DE2-115|Link]]. São informações complementares ao roteiro:
+
* A página de cursos pode ser acessada em [http://www.altera.com/education/training/trn-index.jsp Link].
 +
* O treinamento completo (muito material!) está disponível em [http://www.altera.com/education/training/curriculum/fpga/trn-fpga.html?xy=gettingstartedtrain Link].
 +
* Um bom material escrito pode ser acessado em [http://www.altera.com/literature/lit-qts.jsp?xy=gettingstartedlit Link].
  
* Para atribuir os pinos usando o arquivo ''.qsf'' fornecido pela Altera, usar o menu '''Assignments → Import Assignments'''.
+
==== Quartus II ====
* Uma outra referência para o processo de programação do FPGA pode ser vista em [[Programando o FPGA através da USB-Blaster|Link]].
 
  
==== Referências ====
+
Abaixo, um roteiro para o reconhecimento do software da Altera:
  
:: [1] Altera Training Courses. '''Using the Quartus II Software: An Introduction'''. Disponível em [http://www.altera.com/education/training/courses/ODSW1100 Link]. Acesso em 19/02/2015.
+
* Abrir o Quartus II
 +
* Getting Started
 +
* Janelas:
 +
:* Project Navigator
 +
:* Message Window
 +
:* Tool View Window
 +
:* Tasks Window
 +
::* Custom Tasks Flow
  
:: [2] Altera. '''Quartus II Volume I: Design and Synthesis'''. Disponível em [http://www.altera.com/literature/hb/qts/quartusii_handbook.pdf Link]. Acesso em 19/02/2015.
+
==== Fluxo de desenvolvimento em PLDs ====
  
:: [3] Altera. '''Quartus II Introduction Using Schematic Designs'''. Disponível em [ftp://ftp.altera.com/up/pub/Altera_Material/13.0/Tutorials/Schematic/Quartus_II_Introduction.pdf Link]. Acesso em 27/02/2015.
+
[[Imagem:SST_Fluxo_PLD.png|thumb| Fluxo de desenvolvimento em PLDs. Fonte: [1]|650px|center]]
 +
<br style="clear:both;">
  
:: [4] Altera. '''DE2-115 User Manual'''. Disponível em [[Media:ManualDE2-115.pdf|Link]].
+
* '''RTL''': nível de abstração usado para descrever o circuito, dentre 3:
 +
:* '''Behavioural''': mais alto nível de abstração, descreve o comportamento do circuito (entradas e saídas)
 +
:* '''RTL - Register Transfer Level''': descrição do Hardware a partir de lógica, indicando como dados são transferidos entre registradores
 +
:* '''Gate Level''': usa componentes como portas lógicas, flip-flops e multiplexadores
 +
* '''Synthesis''': processo em que o comportamento de um circuito numa forma abstrata (por exemplo, em RTL) é convertido para uma implementação em termos de portas lógicas.
 +
* '''Netlist''': descreve a conectividade dos terminais para o desenvolvimento do circuito.
 +
* '''Place & Route - Fitting''': otimiza a localização dos elementos e o roteamento dos dados entre eles.
  
=== Introdução ao VHDL ===
 
  
'''VHDL''' vem de VHSIC (Very High Speed Integrated Circuito) Hardware Description Language. É a linguagem padrão IEEE para a descrição de ''hardware'' na indústria.
+
==== Projeto no Quartus II ====
  
* Características:
+
; Wizard:
:* Linguagem de '''descrição de hardware''', não de '''programação'''
 
:* Maior parte da linguagem não é '''Case Sensitive'''
 
:* Expressões são terminadas com ponto-e-vírgula
 
:* É Space Insensitive
 
:* Comentários feitos com um "--" no início da linha. Não há comentários em bloco
 
  
 +
* [[Media:SST20707-QuartusII-Intro.pdf|Apostila de apresentação]]
 +
* [http://wl.altera.com/education/training/courses/ODSW1100 Tutorial]
  
==== Unidades do código VHDL ====
+
:* Selecionar como dispositivo o '''Cyclone IV EP4CE115F29C7''', ou o mais próximo disponível. É esse o modelo que será utilizado nas nossas aulas.
  
O código VHDL é inicialmente dividido em 3 seções:
 
  
PACKAGE
+
; Arquivos [2]:
ENTITY
 
ARCHITECTURE
 
  
===== PACKAGE =====
+
* '''.QPF - Quartus II Project File''': informação da versão do Quartus 2 e da data. Traz as revisões efetuadas no projeto.
 +
* '''.QDF - Quartus II Defaults File''': configurações padrão de todo novo projeto criado
 +
* '''.QSF - Quartus II Settings File''': configurações específicas do projeto, como arquivos, dispositivo escolhido, etc.
 +
* Pasta '''dB''': informação do projeto compilado
 +
* '''.SDC - Synopsys Design Constraint''': restrições temporais do projeto
  
Declara as bibliotecas utilizadas no sistema. Usa o formato:
+
: O Quartus também oferece ferramentas para '''controle de versão''' de projetos a partir de arquivos '''.QAR - Quartus II Compressed Archive File'''. Disponível no menu '''Project'''. Com '''revisões''', é possível fazer testes com outros parâmetros sem perder resultados anteriores.
  
;:<syntaxhighlight lang=vhdl>
+
==== Formas de desenvolvimento ====
  
LIBRARY nome1, nome2;
+
Ir em ''File'' -> ''New'', e selecionar um dos '''Design Files''' disponíveis.
USE nome1.pack_name1.object;
 
USE nome2.pack_name2.ALL;
 
  
</syntaxhighlight>
+
[[Imagem:SST_Design_entry.png|thumb| Formas de desenvolvimento no Quartus II. Fonte: [1]|650px|center]]
 +
<br style="clear:both;">
  
Duas '''LIBRARYs''' disponibilizadas automaticamente:
+
Nesta aula, usaremos o desenvolvimento via '''Esquemático - Block File'''.
  
  
* '''STD''': tipos básicos de dados:
+
==== Desenvolvimento via esquemático ====
  
:* BIT: dois valores ('0' e '1')
+
Um exemplo de sistema será usado para apresentar a ferramenta. O sistema que será desenvolvido está disponível na figura abaixo:
:* BIT_VECTOR: deve indicar a ordem dos bits
 
  
;:<syntaxhighlight lang=vhdl>
+
[[Imagem:SST_Exemplo_esquematico.png|thumb| Sistema a ser desenvolvido. Fonte: [3]|650px|center]]
 +
<br style="clear:both;">
  
SIGNAL s1 : BIT_VECTOR (3 DOWNTO 0);
+
O desenvolvimento é feito a partir dos seguintes passos:
SIGNAL s2 : BIT_VECTOR (0 TO 3);
 
  
</syntaxhighlight>
+
* Criar novo arquivo do tipo ''Schematic''
 +
* Importar portas lógicas
 +
* Importar sinais de entrada e saída
 +
:* Atribuir nomes aos pinos
 +
* Conectar os componentes
 +
* Compilar
 +
* Atribuir pinos físicos do FPGA aos pinos do sistema (Pin planner)
 +
:* Pinos atribuídos podem ser exportados para futuros desenvolvimentos
 +
* Descrever sinais de entrada (criar arquivo VWF - Vector Waveform File)
 +
* Simular (Tool -> Simulation)
  
:* BOOLEAN: dois valores (False, true)
+
==== Utilizando o FPGA ====
:* INTEGER: Valores positivos e negativos em decimal
 
  
;:<syntaxhighlight lang=vhdl>
+
===== O kit DE2-115 =====
  
SIGNAL s3 : INTEGER;                  -- Número de 32 bits
+
O Kit Altera DE2-115 pode ser visto na figura abaixo.
SIGNAL s4 : INTEGER RANGE 0 TO 255    -- Número de 8 bits
 
  
</syntaxhighlight>
+
[[Imagem:SST_1-Kit_DE2.png|thumb|Kit Altera DE2-115. Fonte: [4]|650px|center]]
 +
<br style="clear:both;">
  
:* NATURAL: Inteiro sem sinal
+
Algumas características do kit:
:* CHARACTER: ASCII
 
:* STRING: Array de ASCII
 
:* TIME: Valores com unidades de tempo (ps, ms, min, hr)
 
:* REAL: Número de ponto flutuante de precisão dupla
 
 
 
 
 
* '''WORK''': indica onde estão armazenados os arquivos do projeto
 
  
 +
* FPGA Altera Cyclone IV EP4CE115F29C7
 +
* 2 MB de SRAM
 +
* 64 MB de SDRAM
 +
* 8 MB de Flash
 +
* Interfaces:
 +
:* Botões
 +
:* Switch
 +
:* Leds
 +
:* Módulo LCD
  
Um pacote frequentemente incluído é '''STD_LOGIC_1164''', da '''LIBRARY IEEE''', que define os tipos:
 
  
* STD_LOGIC: bit com 3-state (Z) e "não importa" (-)
+
Para ligar o kit, seguir os passos:
* STD_ULOGIC: tipo lógico com 9 valores [https://www.cs.sfu.ca/~ggbaker/reference/std_logic/1164/std_ulogic.html Link]
 
  
A declaração do pacote '''IEEE''' ficaria assim:
+
# Conectar o cabo USB no computador e no kit na porta '''USB Blaster'''. Talvez seja necessário instalar o driver específico para o USB da Altera. Para instalar, consultar [[Configuração da USB para programação do FPGA via JTAG|Link]] e [http://www.altera.com/download/drivers/dri-index.html Link].
 +
# Desligar o kit soltando o botão ON/OFF vermelho.
 +
# Conectar o adaptador 12V.
 +
# Selecione a posição '''RUN''' no switch RUN/PROG (SW19).
 +
# Ligue o kit pressionando o botão ON/OFF vermelho.
  
;:<syntaxhighlight lang=vhdl>
 
  
LIBRARY ieee;
+
Para mais informações, consultar a página [[Software e equipamentos recomendados para programação de FPGAs]], e a página [[Preparando para gravar o circuito lógico no FPGA]]
USE ieee.std_logic_1164.all;
 
  
</syntaxhighlight>
+
===== Informações sobre kits da Altera =====
  
===== ENTITY =====
+
Veja abaixo um resumo dos kits da Altera mais comumente utilizados. Informação importante e constantemente utilizada é a distribuição da pinagem do FPGA no kit.
  
define a visão externa do modelo (símbolo). Usa o formato:
+
{| class="wikitable"  border="1" cellpadding="3" cellspacing="0" style="text-align:left; font-size:100%" bgcolor="#efefef"
 +
! scope="col" width=15% align="center" | Kit
 +
! scope="col" width=7% align="center" | Fabricante do Kit
 +
! scope="col" width=15% align="center" | Família FPGA
 +
! scope="col" width=10% align="center" | Device
 +
! scope="col" width=25% align="center" | Documentos disponíveis
 +
! scope="col" width=5% align="center" | Arquivo qsf
 +
! scope="col" width=30% align="center" | Pinagem do kit
 +
! scope="col" width=5% align="center" | Disponíveis no IFSC
  
;:<syntaxhighlight lang=vhdl>
+
|-
 +
| align="center" | [http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=165&No=593&PartNo=1 DE0-Nano]
 +
| align="center" | TERASIC
 +
| align="center" | Cyclone® IV E - ALTERA
 +
| align="center" | EP4CE22F17C6
 +
| align="center" | [[Media:ManualDE0Nano.pdf | User Manual]]
 +
| align="center" | [[Media:qsfDE0Nano.txt | qsf]]
 +
| align="center" | [[Pinagem do kit DE0-Nano]]
 +
| align="center" | 4
 +
|-
 +
| align="center" | [http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&No=502 DE2-115]
 +
| align="center" | TERASIC
 +
| align="center" | Cyclone® IV E - ALTERA
 +
| align="center" | EP4CE115F29C7
 +
| align="center" | [[Media:ManualDE2-115.pdf | User Manual]]
 +
| align="center" | [[Media:qsfDE2-115.txt | qsf]]
 +
| align="center" | [[Interfaces de entrada e saída da DE2-115]]
 +
| align="center" | 10
 +
|-
 +
| align="center" | [http://www.macnicadhw.com.br/products/mercurion-4-devkit-board;jsessionid=D98DEAF9F3E3E352079DB96CED5C4096 MERCÚRIO IV]
 +
| align="center" | MACNICA
 +
| align="center" | Cyclone® IV E - ALTERA
 +
| align="center" | EP4CE30F23C7
 +
| align="center" | [[Media:ManualMercurio.pdf | Manual do Usuário]]
 +
| align="center" | [[Media:qsfM4.txt | qsf]]
 +
| align="center" | [[Pinagem dos dispositivos de entrada e saída do kit MERCURIO IV]]
 +
| align="center" | 20
 +
|}
  
ENTITY <entity_name> IS
+
==== Exercício 1 - Esquemático ====
  GENERIC
 
  PORT
 
END ENTITY <entity_name>
 
  
</syntaxhighlight>
+
Executar o roteiro disponível em [[Contador Assíncrono Crescente - Roteiro para implementação e simulação com QUARTUS II(v.13), QSIM e kit DE2-115|Link]]. São informações complementares ao roteiro:
  
onde:
+
* Para atribuir os pinos usando o arquivo ''.qsf'' fornecido pela Altera, usar o menu '''Assignments → Import Assignments'''.
 +
* Uma outra referência para o processo de programação do FPGA pode ser vista em [[Programando o FPGA através da USB-Blaster|Link]].
  
* '''PORT''': descreve entradas e saídas
+
==== Outros exercícios ====
  
;:<syntaxhighlight lang=vhdl>
+
# Acrescentar mais um dígito na contagem, de forma que quando o contador atinja o "xF" o próximo dígito seja incrementado.
 +
# Acrescentar ao sistema de contagem de dois dígitos um botão de ''reset''.
 +
# Mudar a contagem para que ela aconteça na base decimal. Assim, o primeiro dígito contará de "0" a "9", e o próximo dígito será incrementado.
 +
# Desenvolver um sistema de contagem de dois dígitos com uma chave de direção de contagem, onde, dependendo da seleção da chave, a contagem seja crescente ou decrescente.
  
PORT (
+
==== Referências ====
  nome1, nome2 : <mode> <type>;
 
  nome3, nome4 : <mode> <type>
 
);
 
  
</syntaxhighlight>
+
:: [1] Altera Training Courses. '''Using the Quartus II Software: An Introduction'''. Disponível em [http://www.altera.com/education/training/courses/ODSW1100 Link]. Acesso em 19/02/2015.
  
:* <mode>:
+
:: [2] Altera. '''Quartus II Volume I: Design and Synthesis'''. Disponível em [http://www.altera.com/literature/hb/qts/quartusii_handbook.pdf Link]. Acesso em 19/02/2015.
::* '''in''' (input): sinais de entrada - São apenas lidos
 
::* '''out''' (output): sinais de saída - São apenas escritos
 
::* '''inout''' (bidirecional): podem ser lidos e escritos
 
:* <type>: tipo do dado
 
  
* '''GENERIC''': passa informações globais (constantes) ao modelo
+
:: [3] Altera. '''Quartus II Introduction Using Schematic Designs'''. Disponível em [ftp://ftp.altera.com/up/pub/Altera_Material/13.0/Tutorials/Schematic/Quartus_II_Introduction.pdf Link]. Acesso em 27/02/2015.
  
;:<syntaxhighlight lang=vhdl>
+
:: [4] Altera. '''DE2-115 User Manual'''. Disponível em [[Media:ManualDE2-115.pdf|Link]].
  
GENERIC (
+
=== Introdução ao VHDL ===
  nome1, nome2 : <type> (:= <initial value>);
 
  nome2, nome4 : <type> (:= <initial value>)
 
);
 
  
</syntaxhighlight>
+
'''VHDL''' vem de VHSIC (Very High Speed Integrated Circuito) Hardware Description Language. É a linguagem padrão IEEE para a descrição de ''hardware'' na indústria.
  
:* <type>: tipo do dado
+
* Características:
:* <initial value>: opcional
+
:* Linguagem de '''descrição de hardware''', não de '''programação'''
 +
:* Maior parte da linguagem não é '''Case Sensitive'''
 +
:* Expressões são terminadas com ponto-e-vírgula
 +
:* É Space Insensitive
 +
:* Comentários feitos com um "--" no início da linha. Não há comentários em bloco
  
===== ARCHITECTURE =====
 
  
Define a função do modelo (esquemático). Segue o formato:
+
==== Unidades do código VHDL ====
 +
 
 +
O código VHDL é inicialmente dividido em 3 seções:
 +
 
 +
PACKAGE
 +
ENTITY
 +
ARCHITECTURE
 +
 
 +
===== PACKAGE =====
 +
 
 +
Declara as bibliotecas utilizadas no sistema. Usa o formato:
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
ARCHITECTURE <identifier> OF <entity_identifier> IS
+
LIBRARY nome1, nome2;
  <declaration>
+
USE nome1.pack_name1.object;
BEGIN
+
USE nome2.pack_name2.ALL;
  <body>
 
END ARCHITECTURE <identifier>
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
onde:
+
Duas '''LIBRARYs''' disponibilizadas automaticamente:
  
* <entity_identifier>: nome da ENTITY a qual pertence a ARCHITECTURE
 
* <identifier>: nome da ARCHITECTURE, que deve ser único dentre as ARCHITECTUREs da ENTITY
 
* <declaration>: identificadores locais usados na ARCHITECTURE que não são PORTs nem GENERICs. Devem ser declarados antes de usados.
 
* <body>: corpo da ARCHITECTURE
 
  
==== Nomes para identificadores ====
+
* '''STD''': tipos básicos de dados:
  
Os identificadores das entidades, arquiteturas e portas devem ser compactos e informativos. Abaixo, exemplos de nomes bons e ruins.
+
:* BIT: dois valores ('0' e '1')
 +
:* BIT_VECTOR: deve indicar a ordem dos bits
  
[[Imagem:SST_Nomes_variaveis.png|thumb|Exemplos de nomes de identificadores. Fonte: [4]|650px|center]]
+
;:<syntaxhighlight lang=vhdl>
<br style="clear:both;">
 
  
==== Desenvolvimento via VHDL ====
+
SIGNAL s1 : BIT_VECTOR (3 DOWNTO 0);
 +
SIGNAL s2 : BIT_VECTOR (0 TO 3);
  
Um exemplo de sistema será usado para apresentar o Quartus II e o VHDL. O sistema que será desenvolvido está disponível na figura abaixo:
+
</syntaxhighlight>
  
[[Imagem:SST_Exemplo_esquematico.png|thumb| Sistema a ser desenvolvido. Fonte: [2]|650px|center]]
+
:* BOOLEAN: dois valores (False, true)
<br style="clear:both;">
+
:* INTEGER: Valores positivos e negativos em decimal
  
O desenvolvimento é feito a partir dos seguintes passos:
+
;:<syntaxhighlight lang=vhdl>
  
* Criar novo arquivo do tipo ''VHDL File''
+
SIGNAL s3 : INTEGER;                  -- Número de 32 bits
* Escrever o código
+
SIGNAL s4 : INTEGER RANGE 0 TO 255    -- Número de 8 bits
:* Templates podem ser usados (Edit -> Insert Template)
 
  
[[Imagem:SST_VHDL_Exemplo_1_codigo.png|thumb| Código VHDL|650px|center]]
+
</syntaxhighlight>
<br style="clear:both;">
 
  
* Compilar
+
:* NATURAL: Inteiro sem sinal
* Atribuir pinos físicos do FPGA aos pinos do sistema (Pin planner)
+
:* CHARACTER: ASCII
:* Pinos atribuídos podem ser exportados para futuros desenvolvimentos
+
:* STRING: Array de ASCII
* Descrever sinais de entrada (criar arquivo VWF - Vector Waveform File)
+
:* TIME: Valores com unidades de tempo (ps, ms, min, hr)
* Simular (Tool -> Simulation)
+
:* REAL: Número de ponto flutuante de precisão dupla
  
  
===== Concorrência do código =====
+
* '''WORK''': indica onde estão armazenados os arquivos do projeto
  
Os código VHDL tem uma característica importante que é a '''concorrência'''. Assim, todas as instruções tem a mesma procedência, diferentemente das linguagens de programação. O exemplo abaixo demonstra isso:
 
  
[[Imagem:SST_VHDL_Exemplo_2_imagem.png|thumb| Multiplexador com buffer de 3 estados. Fonte: [3].|650px|center]]
+
Um pacote frequentemente incluído é '''STD_LOGIC_1164''', da '''LIBRARY IEEE''', que define os tipos:
<br style="clear:both;">
 
  
A solução do problema pode ser vista abaixo:
+
* STD_LOGIC: bit com 3-state (Z) e "não importa" (-)
 +
* STD_ULOGIC: tipo lógico com 9 valores [https://www.cs.sfu.ca/~ggbaker/reference/std_logic/1164/std_ulogic.html Link]
  
[[Imagem:SST_VHDL_Exemplo_2_codigo.png|thumb| Solução do exercício.|650px|center]]
+
A declaração do pacote '''IEEE''' ficaria assim:
<br style="clear:both;">
 
  
===== Erros clássicos =====
+
;:<syntaxhighlight lang=vhdl>
  
Em desenvolvimento com VHDL, são comuns os seguintes erros [3]:
+
LIBRARY ieee;
 +
USE ieee.std_logic_1164.all;
  
# Tipos de dados diferentes (um lado é '''BIT''' e outro é '''BOOLEAN''')
+
</syntaxhighlight>
# Tamanhos não são iguais
 
# Valor ou representação inválido ('''BIT''' não aceita valor 'Z', vetor de bits requer aspas duplas)
 
# Indexação incorreta (ordem)
 
# Operador de atribuição incorreto (para sinais é "<="; para variáveis e constantes é ":="
 
  
==== Tarefa - Introdução ao VHDL ====
+
===== ENTITY =====
  
Ler os capítulos 1, 2 e 3 do livro [4], resolvendo os exercícios do capítulo 3.
+
Define a visão externa do modelo (símbolo). Usa o formato:
  
==== Referências ====
+
;:<syntaxhighlight lang=vhdl>
  
:: [1] Altera Training Courses. '''VHDL Basics'''. Disponível em [http://www.altera.com/education/training/courses/OHDL1110 Link]. Acesso em 27/02/2015.
+
ENTITY <entity_name> IS
 +
  GENERIC
 +
  PORT
 +
END ENTITY <entity_name>;
  
:: [2] Altera. '''Quartus II Introduction Using VHDL Designs'''. Disponível em [ftp://ftp.altera.com/up/pub/Altera_Material/13.0/Tutorials/VHDL/Quartus_II_Introduction.pdf Link]. Acesso em 27/02/2015.
+
</syntaxhighlight>
  
:: [3] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
+
onde:
  
:: [4] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
+
* '''PORT''': descreve entradas e saídas
  
 +
;:<syntaxhighlight lang=vhdl>
  
=== Objetos e atribuições ===
+
PORT (
 +
  nome1, nome2 : <mode> <type>;
 +
  nome3, nome4 : <mode> <type>
 +
);
  
==== Objetos ====
+
</syntaxhighlight>
  
Há quatro tipos de objetos em VHDL: '''CONSTANT''', '''SIGNAL''', '''VARIABLE''' e '''FILE'''. Vamos ver agora os dois primeiros [1].
+
:* <mode>:
 +
::* '''in''' (input): sinais de entrada - São apenas lidos
 +
::* '''out''' (output): sinais de saída - São apenas escritos
 +
::* '''inout''' (bidirecional): podem ser lidos e escritos
 +
:* <type>: tipo do dado
  
===== CONSTANT =====
+
* '''GENERIC''': passa informações globais (constantes) ao modelo
  
É uma forma de atribuir um valor constante a um nome. Não pode então ser alterada durante a execução. É utilizada para melhorar:
+
;:<syntaxhighlight lang=vhdl>
  
* Legibilidade
+
GENERIC (
* Flexibilidade
+
  nome1, nome2 : <type> (:= <initial value>);
 +
  nome2, nome4 : <type> (:= <initial value>)
 +
);
  
A declaração segue o formato:
+
</syntaxhighlight>
 +
 
 +
:* <type>: tipo do dado
 +
:* <initial value>: opcional
 +
 
 +
===== ARCHITECTURE =====
 +
 
 +
Define a função do modelo (esquemático). Segue o formato:
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
CONSTANT <nome> : <tipo> := <valor>;
+
ARCHITECTURE <identifier> OF <entity_identifier> IS
 +
  <declaration>
 +
BEGIN
 +
  <body>
 +
END ARCHITECTURE <identifier>;
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
onde:
  
O escopo é definido pela localização da sua declaração:
+
* <entity_identifier>: nome da ENTITY a qual pertence a ARCHITECTURE
 +
* <identifier>: nome da ARCHITECTURE, que deve ser único dentre as ARCHITECTUREs da ENTITY
 +
* <declaration>: identificadores locais usados na ARCHITECTURE que não são PORTs nem GENERICs. Devem ser declarados antes de usados.
 +
* <body>: corpo da ARCHITECTURE
 +
 
 +
==== Nomes para identificadores ====
  
* GENERIC: Global
+
Os identificadores das entidades, arquiteturas e portas devem ser compactos e informativos. Abaixo, exemplos de nomes bons e ruins.
* ARCHITECTURE: Local
 
  
[[Imagem:SST_VHDL_CONSTANT_1.png|thumb| Código com CONSTANTs declaradas.|650px|center]]
+
[[Imagem:SST_Nomes_variaveis.png|thumb|Exemplos de nomes de identificadores. Fonte: [4]|650px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
 +
==== Desenvolvimento via VHDL ====
  
===== SIGNAL =====
+
Um exemplo de sistema será usado para apresentar o Quartus II e o VHDL. O sistema que será desenvolvido está disponível na figura abaixo:
  
Representa a interconexão entre blocos. É declarada da seguinte forma:
+
[[Imagem:SST_Exemplo_esquematico.png|thumb| Sistema a ser desenvolvido. Fonte: [2]|650px|center]]
 +
<br style="clear:both;">
  
;:<syntaxhighlight lang=vhdl>
+
O desenvolvimento é feito a partir dos seguintes passos:
  
SIGNAL <nome> : <tipo>;
+
* Criar novo arquivo do tipo ''VHDL File''
 +
* Escrever o código
 +
:* Templates podem ser usados (Edit -> Insert Template)
  
</syntaxhighlight>
+
[[Imagem:SST_VHDL_Exemplo_1_codigo.png|thumb| Código VHDL|650px|center]]
 +
<br style="clear:both;">
  
Um valor inicial é opcionalmente passado ao objeto, da seguinte forma:
+
* Compilar
 +
* Atribuir pinos físicos do FPGA aos pinos do sistema (Pin planner)
 +
:* Pinos atribuídos podem ser exportados para futuros desenvolvimentos
 +
* Descrever sinais de entrada (criar arquivo VWF - Vector Waveform File)
 +
* Simular (Tool -> Simulation)
  
;:<syntaxhighlight lang=vhdl>
 
  
SIGNAL <nome> : <tipo> := <valor_inicial>;
+
===== Concorrência do código =====
  
</syntaxhighlight>
+
Os código VHDL tem uma característica importante que é a '''concorrência'''. Assim, todas as instruções tem a mesma procedência, diferentemente das linguagens de programação. O exemplo abaixo demonstra isso:
  
[[Imagem:SST_VHDL_SIGNAL_1.png|thumb| Código com um SIGNAL declarado.|650px|center]]
+
[[Imagem:SST_VHDL_Exemplo_2_imagem.png|thumb| Multiplexador com buffer de 3 estados. Fonte: [3].|650px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
 +
A solução do problema pode ser vista abaixo:
  
===== Bit e múltiplos bits =====
+
[[Imagem:SST_VHDL_Exemplo_2_codigo.png|thumb| Solução do exercício.|650px|center]]
 +
<br style="clear:both;">
  
Na atribuição de valores binários, há diferenças de declaração entre um único bit ou múltiplos bits:
+
===== Erros clássicos =====
  
* Um único bit: aspas simples:
+
Em desenvolvimento com VHDL, são comuns os seguintes erros [3]:
  
;:<syntaxhighlight lang=vhdl>
+
# Tipos de dados diferentes (um lado é '''BIT''' e outro é '''BOOLEAN''')
 
+
# Tamanhos não são iguais
x <= '1';
+
# Valor ou representação inválido ('''BIT''' não aceita valor 'Z', vetor de bits requer aspas duplas)
 +
# Indexação incorreta (ordem)
 +
# Operador de atribuição incorreto (para sinais é "<="; para variáveis e constantes é ":="
  
</syntaxhighlight>
+
==== Tarefa - Introdução ao VHDL ====
  
* Múltiplos bits: aspas duplas:
+
Ler os capítulos 1, 2 e 3 do livro [4], resolvendo os exercícios do capítulo 3.
  
;:<syntaxhighlight lang=vhdl>
+
==== Referências ====
  
x <= "10101010";
+
:: [1] Altera Training Courses. '''VHDL Basics'''. Disponível em [http://www.altera.com/education/training/courses/OHDL1110 Link]. Acesso em 27/02/2015.
  
</syntaxhighlight>
+
:: [2] Altera. '''Quartus II Introduction Using VHDL Designs'''. Disponível em [ftp://ftp.altera.com/up/pub/Altera_Material/13.0/Tutorials/VHDL/Quartus_II_Introduction.pdf Link]. Acesso em 27/02/2015.
  
===== Indexação =====
+
:: [3] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
  
É possível atribuir valores à membros específicos de um barramento (vetor). Abaixo, alguns exemplos ilustrativos:
+
:: [4] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
  
;:<syntaxhighlight lang=vhdl>
 
  
x(3)          <= '0';
+
=== Objetos e atribuições ===
x(0)          <= '1';
 
x(7 DOWNTO 4) <= "1010";
 
  
</syntaxhighlight>
+
==== Objetos ====
  
É possível ainda usar vírgulas e os operadores '''OTHERS''' e => para fazer atribuições específicas [2]:
+
Há quatro tipos de objetos em VHDL: '''CONSTANT''', '''SIGNAL''', '''VARIABLE''' e '''FILE'''. Vamos ver agora os dois primeiros [1].
  
* Nominal:
+
===== CONSTANT =====
  
;:<syntaxhighlight lang=vhdl>
+
É uma forma de atribuir um valor constante a um nome. Não pode então ser alterada durante a execução. É utilizada para melhorar:
  
x <= (7 => '0', 5 => '0', OTHERS => '1');
+
* Legibilidade
 +
* Flexibilidade
  
</syntaxhighlight>
+
A declaração segue o formato:
 
 
* Posicional:
 
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
x <= ('0', '1', '0', OTHERS => '1');
+
CONSTANT <nome> : <tipo> := <valor>;
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===== Bases numéricas =====
 
  
É possível atribuir à barramentos valores em bases numéricas diferentes. Para isso, o seguinte formato pode ser usado:
+
O escopo é definido pela localização da sua declaração:
  
;:<syntaxhighlight lang=vhdl>
+
* GENERIC: Global
 +
* ARCHITECTURE: Local
  
y <= [<tamanho>][<preenchimento>]<base>"<valor>";
+
[[Imagem:SST_VHDL_CONSTANT_1.png|thumb| Código com CONSTANTs declaradas.|650px|center]]
 +
<br style="clear:both;">
  
</syntaxhighlight>
 
  
* <valor>: valor a ser atribuído
+
===== SIGNAL =====
* <base>: '''b''' (binário), '''x''' (hexadecimal) ou '''o''' (octal)
 
* <tamanho>: número de sinais atribuídos (opcional)
 
* <preenchimento>: caso o número de sinais atribuídos (<tamanho>) seja maior que o número de sinais gerados no <valor>, os demais sinais são preenchidos com 1's ('''s''') ou 0's ('''u''')
 
  
==== Atribuições simultâneas ====
+
Representa a interconexão entre blocos. É declarada da seguinte forma:
  
Uma das maiores diferenças de VHDL para linguagens de programação de software é que as atribuições do código VHDL são simultâneas. De fato, todas as atribuições dentro de uma arquitetura representam processos implícitos que executam em paralelo. Quando um sinal de entrada do processo é alterado, o novo valor é imediatamente atribuído à variável.
+
;:<syntaxhighlight lang=vhdl>
  
São três os tipos de atribuições simultâneas no VHDL:
+
SIGNAL <nome> : <tipo>;
  
===== Simples =====
+
</syntaxhighlight>
  
São da forma:
+
Um valor inicial é opcionalmente passado ao objeto, da seguinte forma:
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
<nome> <= <expressão>;
+
SIGNAL <nome> : <tipo> := <valor_inicial>;
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
No exemplo abaixo, há dois processos implícitos, cujas atribuições de sinais são feitas simultaneamente:
+
[[Imagem:SST_VHDL_SIGNAL_1.png|thumb| Código com um SIGNAL declarado.|650px|center]]
 +
<br style="clear:both;">
  
;:<syntaxhighlight lang=vhdl>
 
  
x1 <= a1 OR b1;
+
===== Bit e múltiplos bits =====
x2 <= a2 AND b2;
 
  
</syntaxhighlight>
+
Na atribuição de valores binários, há diferenças de declaração entre um único bit ou múltiplos bits:
  
===== Condicional =====
+
* Um único bit: aspas simples:
 
 
São da forma:
 
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
<nome> <= <valor> WHEN <condição_1> ELSE
+
x <= '1';
      <valor> WHEN <condição_2> ELSE
 
                      .
 
                      .
 
                      .
 
      <valor> WHEN <condição_3> ELSE
 
      <valor>;
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
O exemplo abaixo representa dois multiplexadores (A e B) em série, onde:
+
* Múltiplos bits: aspas duplas:
 
 
* Sinal ''sel_A'' seleciona a saída do multiplexador A, entre ''x'' e ''y'', que é conectada na entrada do multiplexador B
 
* Sinal ''sel_B'' seleciona a saída do multiplexador B ('saida'), entre a saída do A e ''z''
 
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
saida <= z WHEN sel_B = '1' ELSE
+
x <= "10101010";
        y WHEN sel_A = '1' ELSE
 
        x;
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
De certa forma, o operador condicional é semelhante ao operador '''if''' em linguagens de programação de software.
+
===== Indexação =====
  
===== De seleção =====
+
É possível atribuir valores à membros específicos de um barramento (vetor). Abaixo, alguns exemplos ilustrativos:
 
 
São da forma:
 
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
WITH <expressão> SELECT
+
x(3)          <= '0';
  <nome> <= <valor> WHEN <condição_1>,
+
x(0)          <= '1';
            <valor> WHEN <condição_2>,
+
x(7 DOWNTO 4) <= "1010";
                          .
 
                          .
 
                          .
 
            <valor> WHEN OTHERS;
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
No exemplo abaixo, um multiplexador de 4 entradas (''a'', ''b'', ''c'', ''d'') e uma seleção de 2 elementos ''sel'' é desenvolvido:
+
É possível ainda usar vírgulas e os operadores '''OTHERS''' e => para fazer atribuições específicas [2]:
 +
 
 +
* Nominal:
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
WITH sel SELECT
+
x <= (7 => '0', 5 => '0', OTHERS => '1');
  y <= a  WHEN "00",
 
        b  WHEN "01",
 
        c  WHEN "10",
 
        d  WHEN "11",
 
      '0' WHEN OTHERS;
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==== Operadores ====
+
* Posicional:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
  
Abaixo, um resumo dos operadores utilizados nas expressões:
+
x <= ('0', '1', '0', OTHERS => '1');
  
===== Lógicos =====
+
</syntaxhighlight>
  
* NOT
+
===== Bases numéricas =====
* AND
 
* NAND
 
* OR
 
* NOR
 
* XOR
 
* XNOR
 
  
===== Aritméticos =====
+
É possível atribuir à barramentos valores em bases numéricas diferentes. Para isso, o seguinte formato pode ser usado:
 
 
* Adição: +
 
* Subtração: -
 
* Multiplicação: *
 
* Divisão: /
 
* Exponenciação: **
 
* Valor absoluto: ABS
 
 
 
===== Comparação =====
 
 
 
* Igual: =
 
* Diferente: /=
 
* Maior: >
 
* Menor: <
 
* Maior igual: >=
 
* Menor igual: <=
 
 
 
===== Concatenação =====
 
 
 
Para concatenar valores, usa-se o operador '''&''':
 
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
x <= '1' & "0001";         -- x <= "10001"
+
y <= [<tamanho>][<preenchimento>]<base>"<valor>";
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
* <valor>: valor a ser atribuído
 +
* <base>: '''b''' (binário), '''x''' (hexadecimal) ou '''o''' (octal)
 +
* <tamanho>: número de sinais atribuídos (opcional)
 +
* <preenchimento>: caso o número de sinais atribuídos (<tamanho>) seja maior que o número de sinais gerados no <valor>, os demais sinais são preenchidos com 1's ('''s''') ou 0's ('''u''')
  
Desta forma, a '''ordem das atribuições dentro de uma arquitetura não importa!'''.
+
==== Atribuições simultâneas ====
  
==== Exercícios - Objetos e atribuições ====
+
Uma das maiores diferenças de VHDL para linguagens de programação de software é que as atribuições do código VHDL são simultâneas. De fato, todas as atribuições dentro de uma arquitetura representam processos implícitos que executam em paralelo. Quando um sinal de entrada do processo é alterado, o novo valor é imediatamente atribuído à variável.
  
Resolver os seguintes exemplos do livro [3]:
+
São três os tipos de atribuições simultâneas no VHDL:
  
* Exemplo 2: pg 36
+
===== Simples =====
  
[[Imagem:SST_VHDL_ex_2.png|thumb| Exemplo 2. Fonte: [3].|650px|center]]
+
São da forma:
<br style="clear:both;">
 
  
[[Imagem:SST_VHDL_ex_2_v2.png|thumb| Exemplo 2 usando sinais intermediários. Fonte: [3].|650px|center]]
+
;:<syntaxhighlight lang=vhdl>
<br style="clear:both;">
 
  
* Exemplo 3: pg 39
+
<nome> <= <expressão>;
  
[[Imagem:SST_VHDL_ex_3.png|thumb| Exemplo 3. Fonte: [3].|650px|center]]
+
</syntaxhighlight>
<br style="clear:both;">
 
  
* Exemplo 4: pg 40
+
No exemplo abaixo, há dois processos implícitos, cujas atribuições de sinais são feitas simultaneamente:
  
[[Imagem:SST_VHDL_ex_4.png|thumb| Exemplo 4. Fonte: [3].|650px|center]]
+
;:<syntaxhighlight lang=vhdl>
<br style="clear:both;">
 
  
[[Imagem:SST_VHDL_ex_4_v2.png|thumb| Exemplo 4 com elementos separados. Fonte: [3].|650px|center]]
+
x1 <= a1 OR b1;
<br style="clear:both;">
+
x2 <= a2 AND b2;
  
* Exemplo 5: pg 42
+
</syntaxhighlight>
  
[[Imagem:SST_VHDL_ex_5.png|thumb| Exemplo 5. Fonte: [3].|650px|center]]
+
===== Condicional =====
<br style="clear:both;">
 
  
* Exemplo 6: pg 43
+
São da forma:
  
[[Imagem:SST_VHDL_ex_6.png|thumb| Exemplo 6. Fonte: [3].|650px|center]]
+
;:<syntaxhighlight lang=vhdl>
<br style="clear:both;">
 
  
* Exemplo 7: pg 44
+
<nome> <= <valor> WHEN <condição_1> ELSE
 +
      <valor> WHEN <condição_2> ELSE
 +
                      .
 +
                      .
 +
                      .
 +
      <valor> WHEN <condição_3> ELSE
 +
      <valor>;
  
[[Imagem:SST_VHDL_ex_7.png|thumb| Exemplo 7. Fonte: [3].|650px|center]]
+
</syntaxhighlight>
<br style="clear:both;">
 
  
* Exemplo 8: pg 46
+
O exemplo abaixo representa dois multiplexadores (A e B) em série, onde:
  
[[Imagem:SST_VHDL_ex_8.png|thumb| Exemplo 8. Fonte: [3].|650px|center]]
+
* Sinal ''sel_A'' seleciona a saída do multiplexador A, entre ''x'' e ''y'', que é conectada na entrada do multiplexador B
<br style="clear:both;">
+
* Sinal ''sel_B'' seleciona a saída do multiplexador B ('saida'), entre a saída do A e ''z''
  
Resolver os exercícios do capítulo 4 do livro [3].
+
;:<syntaxhighlight lang=vhdl>
  
==== Referências ====
+
saida <= z WHEN sel_B = '1' ELSE
 +
        y WHEN sel_A = '1' ELSE
 +
        x;
  
:: [1] Altera Training Courses. '''VHDL Basics'''. Disponível em [http://www.altera.com/education/training/courses/OHDL1110 Link]. Acesso em 27/02/2015.
+
</syntaxhighlight>
  
:: [2] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
+
De certa forma, o operador condicional é semelhante ao operador '''if''' em linguagens de programação de software.
  
:: [3] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
+
===== De seleção =====
  
=== Abordagens ===
+
São da forma:
  
Há 3 tipos de abordagens para escrever arquiteturas em VHDL: '''Data-flow''', '''Behavioral''' e '''Structural'''.
+
;:<syntaxhighlight lang=vhdl>
  
==== Data-flow (fluxo de dados) ====
+
WITH <expressão> SELECT
 +
  <nome> <= <valor> WHEN <condição_1>,
 +
            <valor> WHEN <condição_2>,
 +
                          .
 +
                          .
 +
                          .
 +
            <valor> WHEN OTHERS;
  
Especifica o circuito como uma representação do fluxo de dados através do circuito. São informadas as relações entre as entradas que geram as saídas do modelo, ou como o dado de entrada "flui" até a saída, a partir das operações descritas. As atribuições '''simples''', '''condicional''' e '''de seleção''' fazem parte da abordagem Data-flow.
+
</syntaxhighlight>
  
Vantagens:
+
No exemplo abaixo, um multiplexador de 4 entradas (''a'', ''b'', ''c'', ''d'') e uma seleção de 2 elementos ''sel'' é desenvolvido:
  
* Dá uma visão do fluxo dos sinais no circuito diretamente do código
+
;:<syntaxhighlight lang=vhdl>
* Indica como o sistema será implementado no FPGA
 
  
Desvantagens:
+
WITH sel SELECT
 +
  y <= a  WHEN "00",
 +
        b  WHEN "01",
 +
        c  WHEN "10",
 +
        d  WHEN "11",
 +
      '0' WHEN OTHERS;
  
* Se torna difícil de ser utilizado à medida que os circuitos ficam mais complexos
+
</syntaxhighlight>
  
==== Behavioral (comportamental) ====
+
==== Operadores ====
  
Não traz detalhes de como o sistema será quando sintetizado. Modela como as saídas do sistema irão reagir às entradas do sistema, e os detalhes de implementação são deixados para a ferramenta de sintetização.
+
Abaixo, um resumo dos operadores utilizados nas expressões:
  
Enquanto a abordagem Data-flow descreve como o circuito deve ser, a abordagem behavioral descreve o seu comportamento. Assim, a abordagem comportamental é considerada de um nível de abstração maior.
+
===== Lógicos =====
  
===== Process =====
+
* NOT
 +
* AND
 +
* NAND
 +
* OR
 +
* NOR
 +
* XOR
 +
* XNOR
  
É o coração da abordagem behavioral, pois seu corpo possui '''instruções sequenciais'''. Possui a forma:
+
===== Aritméticos =====
  
;:<syntaxhighlight lang=vhdl>
+
* Adição: +
 +
* Subtração: -
 +
* Multiplicação: *
 +
* Divisão: /
 +
* Exponenciação: **
 +
* Valor absoluto: ABS
  
<label>: process (<sinal1>,<sinal2>) is
+
===== Comparação =====
  <declaração>
 
begin
 
  <instruções sequenciais>
 
end process <label>
 
  
</syntaxhighlight>
+
* Igual: =
 +
* Diferente: /=
 +
* Maior: >
 +
* Menor: <
 +
* Maior igual: >=
 +
* Menor igual: <=
  
onde:
+
===== Concatenação =====
  
* <label>: rótulo do processo. É opcional mas recomendado para melhorar a legibilidade do código
+
Para concatenar valores, usa-se o operador '''&''':
* <sinal1>,<sinal2>: lista de sinais que compõem a '''lista de sensibilidade''', parte fundamental da estrutura process (mais detalhes abaixo)
 
* <declaração>: declaração de variáveis com escopo local ao process
 
* <instruções sequenciais>: corpo da estrutura, onde a lógica é descrita
 
  
===== Lista de sensibilidade =====
+
;:<syntaxhighlight lang=vhdl>
  
Temos abaixo duas formas diferentes de descrever a mesma função, uma operação de XOR entre as portas de entrada ''A'' e ''B''.
+
x <= '1' & "0001";        -- x <= "10001"
  
[[Imagem:SST_VHDL_abordagens_dataflow.png|thumb| XOR com Data-flow. Fonte: [1].|650px|left]]
+
</syntaxhighlight>
[[Imagem:SST_VHDL_abordagens_behavioral.png|thumb| XOR com Behavioral. Fonte: [1].|650px|right]]
 
<br style="clear:both;">
 
  
Na abordagem Data-flow, a cada vez que um sinal (A ou B) é alterado, a expressão é avaliada e o sinal do lado esquerdo do operador de atribuição (F) é atualizado. Na abordagem Behavioral, para o corpo da função ser executado, é necessário que haja alteração num dos sinais presentes da lista de sensibilidade. É importante ter em mente no entanto que '''embora seja composta por instruções sequenciais, a estrutura process é executada simultaneamente com instruções Data-flow dentro da mesma arquitetura'''.
 
  
===== Execução sequencial =====
+
Desta forma, a '''ordem das atribuições dentro de uma arquitetura não importa!'''.
  
As instruções no corpo de um '''process''' são sintetizadas de forma a serem executadas sequencialmente, como numa programação de software comum. Abaixo, serão demonstrados os 3 tipos de instruções sequenciais do VHDL.
+
==== Exercícios - Objetos e atribuições ====
  
; Instrução de atribuição de sinal
+
Resolver os seguintes exemplos do '''capítulo 4''' do livro [3]:
  
São as instruções vistas nas aulas anteriores, com o operador de atribuição "<=".
+
* Exemplo 2: pg 36
  
; Instrução de teste
+
:{{collapse top | Solução - Clicar no "+" para expandir }}
 +
[[Imagem:SST_VHDL_ex_2.png|thumb| Exemplo 2. Fonte: [3].|650px|center]]
 +
<br style="clear:both;">
  
É a versão sequencial para a atribuição condicional vista anteriormente. Segue a forma:
+
[[Imagem:SST_VHDL_ex_2_v2.png|thumb| Exemplo 2 usando sinais intermediários. Fonte: [3].|650px|center]]
 +
<br style="clear:both;">
 +
{{collapse bottom}}
  
;:<syntaxhighlight lang=vhdl>
+
* Exemplo 3: pg 39
  
if (<condição>) then
+
:{{collapse top | Solução - Clicar no "+" para expandir }}
  <instruções>;
+
[[Imagem:SST_VHDL_ex_3.png|thumb| Exemplo 3. Fonte: [3].|650px|center]]
elsif (<condição>) then
+
<br style="clear:both;">
  <instruções>;
+
{{collapse bottom}}
else
+
 
  <instruções>;
+
* Exemplo 4: pg 40
end if;
 
  
</syntaxhighlight>
+
:{{collapse top | Solução - Clicar no "+" para expandir }}
 +
[[Imagem:SST_VHDL_ex_4.png|thumb| Exemplo 4. Fonte: [3].|650px|center]]
 +
<br style="clear:both;">
  
Considerações:
+
[[Imagem:SST_VHDL_ex_4_v2.png|thumb| Exemplo 4 com elementos separados. Fonte: [3].|650px|center]]
 +
<br style="clear:both;">
 +
{{collapse bottom}}
  
* Os parênteses são opcionais
+
* Exemplo 5: pg 42
* Instruções de teste podem ser aninhadas para obter testes mais complexos
 
* A instrução pode ser escrita em uma única linha se isso melhorar a legibilidade
 
  
[[Imagem:SST_VHDL_if.png|thumb| Uso do IF - Exemplo 9, pg 58. Fonte: [1].|650px|center]]
+
:{{collapse top | Solução - Clicar no "+" para expandir }}
 +
[[Imagem:SST_VHDL_ex_5.png|thumb| Exemplo 5. Fonte: [3].|650px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
 +
{{collapse bottom}}
  
 +
* Exemplo 6: pg 43
  
; Instrução de seleção
+
:{{collapse top | Solução - Clicar no "+" para expandir }}
 +
[[Imagem:SST_VHDL_ex_6.png|thumb| Exemplo 6. Fonte: [3].|650px|center]]
 +
<br style="clear:both;">
 +
{{collapse bottom}}
  
Versão sequencial para a atribuição de seleção vista anteriormente. Segue a forma:
+
* Exemplo 7: pg 44
  
;:<syntaxhighlight lang=vhdl>
+
:{{collapse top | Solução - Clicar no "+" para expandir }}
 
+
[[Imagem:SST_VHDL_ex_7.png|thumb| Exemplo 7. Fonte: [3].|650px|center]]
case (<expressão>) is
+
<br style="clear:both;">
  when <resultado> =>
+
{{collapse bottom}}
      <instruções>;
 
  when <resultado> =>
 
      <instruções>;
 
  when others =>
 
      <instruções>;
 
end case
 
  
</syntaxhighlight>
+
* Exemplo 8: pg 46
  
Considerações:
+
:{{collapse top | Solução - Clicar no "+" para expandir }}
 +
[[Imagem:SST_VHDL_ex_8.png|thumb| Exemplo 8. Fonte: [3].|650px|center]]
 +
<br style="clear:both;">
 +
{{collapse bottom}}
  
* Os parênteses são opcionais
+
Resolver os exercícios do capítulo 4 do livro [3] (Pg. 48).
* Somente um conjunto de instruções é executado
 
* A instrução pode ser escrita em uma única linha se isso melhorar a legibilidade
 
 
 
[[Imagem:SST_VHDL_case.png|thumb| Uso do CASE - Exemplo 12, pg 64. Fonte: [1].|650px|center]]
 
<br style="clear:both;">
 
  
 
==== Referências ====
 
==== Referências ====
  
:: [1] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
+
:: [1] Altera Training Courses. '''VHDL Basics'''. Disponível em [http://www.altera.com/education/training/courses/OHDL1110 Link]. Acesso em 27/02/2015.
  
 +
:: [2] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
  
=== Atribuições de variáveis em simulações ===
+
:: [3] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
  
As atribuições de sinais podem ser agendadas usando a instrução AFTER:
+
=== Abordagens ===
  
;:<syntaxhighlight lang=vhdl>
+
Há 3 tipos de abordagens para escrever arquiteturas em VHDL: '''Data-flow''', '''Behavioral''' e '''Structural'''.
  
x <= A or B AFTER 0.5 ns;
+
==== Data-flow (fluxo de dados) ====
 
y <= a AFTER 1 s WHEN z = 0 ELSE
 
    b;
 
  
</syntaxhighlight>
+
Especifica o circuito como uma representação do fluxo de dados através do circuito. São informadas as relações entre as entradas que geram as saídas do modelo, ou como o dado de entrada "flui" até a saída, a partir das operações descritas. As atribuições '''simples''', '''condicional''' e '''de seleção''' fazem parte da abordagem Data-flow.
  
Mesmo quando não há um agendamento explícito, as atribuições de sinais não são executadas imediatamente após a instrução. Tanto em processos implícitos (atribuições simples, condicionais e de seleção) quanto em processos explícitos (instrução PROCESS), as atribuições são realizadas após um tempo chamado de '''Delta Delay'''. O Delta Delay é definido como o tempo necessário para que todos os processos simultaneamente em execução sejam encerrados. Após esse tempo, todas as atribuições sem agendamento indicado são realizadas. Isso significa que '''as atribuições realizadas dentro de processos explícitos só serão efetuadas após a conclusão do processo'''.
+
Vantagens:
  
A necessidade deste fato pode ser confirmada no exemplo a seguir [1].
+
* Dá uma visão do fluxo dos sinais no circuito diretamente do código
 +
* Indica como o sistema será implementado no FPGA
  
[[Imagem:SST_Exemplo_delta_delay_1.png|thumb| Circuito combinacional. Fonte: [1].|650px|center]]
+
Desvantagens:
<br style="clear:both;">
 
  
Para o circuito apresentado, duas formas de avaliação podem ser utilizadas:
+
* Se torna difícil de ser utilizado à medida que os circuitos ficam mais complexos
  
[[Imagem:SST_Exemplo_delta_delay_2.png|thumb| Formas de avaliação do circuito. Fonte: [1].|650px|center]]
+
==== Behavioral (comportamental) ====
<br style="clear:both;">
 
  
Se esse comportamento não for bem definido, erros graves podem ser gerados na fase de compilação. Por isso, os Delta Delays são utilizados, e o problema é resolvido da seguinte forma:
+
Não traz detalhes de como o sistema será quando sintetizado. Modela como as saídas do sistema irão reagir às entradas do sistema, e os detalhes de implementação são deixados para a ferramenta de sintetização.
  
[[Imagem:SST_Exemplo_delta_delay_3.png|thumb| Circuito avaliado com o Delta Delay. Fonte: [1].|650px|center]]
+
Enquanto a abordagem Data-flow descreve como o circuito deve ser, a abordagem behavioral descreve o seu comportamento. Assim, a abordagem comportamental é considerada de um nível de abstração maior.
<br style="clear:both;">
 
  
Nos códigos abaixo, três formas aparentemente semelhantes são exibidas. Você consegue confirmar se os códigos são funcionalmente iguais?
+
===== PROCESS =====
  
[[Imagem:SST_Delta_cycle_questao.png|thumb| Códigos e Delta Time. Fonte: [2].|800px|center]]
+
É o coração da abordagem behavioral, pois seu corpo possui '''instruções sequenciais'''. Possui a forma:
<br style="clear:both;">
 
  
{{collapse top | '''PENSE A RESPEITO''' e depois clique no "+" para expandir }}
+
;:<syntaxhighlight lang=vhdl>
  
Repare que há diferenças no número de processos envolvidos. No caso, os códigos esquerdo e direito são funcionalmente iguais. O código central é diferente dos outros pois o ''c'' usado na segunda atribuição não terá o valor atualizado da operação ''a'' '''AND''' ''b''.
+
<label>: process (<sinal1>,<sinal2>) is
 
+
  <declaração>
{{collapse bottom}}
+
begin
 +
  <instruções sequenciais>
 +
end process <label>
 +
 
 +
</syntaxhighlight>
 +
 
 +
onde:
  
==== Simulação ====
+
* <label>: rótulo do processo. É opcional mas recomendado para melhorar a legibilidade do código
 +
* <sinal1>,<sinal2>: lista de sinais que compõem a '''lista de sensibilidade''', parte fundamental da estrutura process (mais detalhes abaixo)
 +
* <declaração>: declaração de variáveis com escopo local ao process
 +
* <instruções sequenciais>: corpo da estrutura, onde a lógica é descrita
  
A simulação do modelo VHDL segue duas fases: inicialização e ciclos de simulação.
+
===== Lista de sensibilidade =====
  
* Inicialização:
+
Temos abaixo duas formas diferentes de descrever a mesma função, uma operação de XOR entre as portas de entrada ''A'' e ''B''.
:* Valores iniciais são atribuídos aos sinais
 
:* Processos sensíveis aos sinais são executados
 
:* Atribuição de sinais são agendadas
 
* Ciclo de simulação:
 
:* Tempo de simulação é avançado ao próximo tempo em que há uma atribuição de sinal agendada
 
:* São realizadas as atribuições
 
:* Processos sensíveis aos sinais são executados
 
:* Atribuição de sinais são agendadas
 
:* Quando todos os processos terminam sua execução, o ciclo atual de simulação é encerrado, e um novo ciclo é executado
 
* Quando todos os processos forem executados e não houver mais alterações nos sinais, a simulação é encerrada
 
  
[[Imagem:SST_Simulation_cycle.png|thumb| Fluxo de simulação de um modelo VHDL. Fonte: [2].|650px|center]]
+
[[Imagem:SST_VHDL_abordagens_dataflow.png|thumb| XOR com Data-flow. Fonte: [1].|650px|left]]
 +
[[Imagem:SST_VHDL_abordagens_behavioral.png|thumb| XOR com Behavioral. Fonte: [1].|650px|right]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
===== O objeto VARIABLE =====
+
Na abordagem Data-flow, a cada vez que um sinal (A ou B) é alterado, a expressão é avaliada e o sinal do lado esquerdo do operador de atribuição (F) é atualizado. Na abordagem Behavioral, para o corpo da função ser executado, é necessário que haja alteração num dos sinais presentes da lista de sensibilidade. É importante ter em mente no entanto que '''embora seja composta por instruções sequenciais, a estrutura process é executada simultaneamente com instruções Data-flow dentro da mesma arquitetura'''.
  
Dentro de processos explícitos (instrução PROCESS) o objeto VARIABLE pode ser utilizado. Sua declaração é igual à declaração de objetos SIGNAL, mas há algumas diferenças:
+
===== Execução sequencial =====
  
* '''Atribuição de valores''': Enquanto objetos SIGNAL usam o operador "<=", objetos VARIABLE usam ":=".
+
As instruções no corpo de um '''process''' são sintetizadas de forma a serem executadas sequencialmente, como numa programação de software comum. Abaixo, serão demonstrados os 3 tipos de instruções sequenciais do VHDL.
* '''Atualização''': Enquanto objetos SIGNAL são atualizados ao final do ''Delta Time'', objetos VARIABLE são atualizados imediatamente.
+
 
 +
; Instrução de atribuição de sinal
 +
 
 +
São as instruções vistas nas aulas anteriores, com o operador de atribuição "<=".
 +
 
 +
; Instrução de teste
  
Além disso, como objetos VARIABLE só podem ser declarados dentro de instruções PROCESS, eles são de '''escopo local'''. Uma forma de alterar isso é utilizar um objeto SHARED VARIABLE, normalmente declarado na arquitetura. Uma SHARED VARIABLE possui escopo global, mas só pode ser modificada em códigos sequenciais (dentro de um PROCESS, por exemplo). A passagem do seu valor à um SIGNAL pode ser feita em qualquer lugar [4].
+
É a versão sequencial para a atribuição condicional vista anteriormente. Segue a forma:
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
SHARED VARIABLE x : BIT;
+
if (<condição>) then
 +
  <instruções>;
 +
elsif (<condição>) then
 +
  <instruções>;
 +
else
 +
  <instruções>;
 +
end if;
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Assim como variáveis globais em linguagens de programação de ''software'', é recomendado que objetos SHARED VARIABLE sejam usados apenas em casos muito específicos.
+
Considerações:
 +
 
 +
* Os parênteses são opcionais
 +
* Instruções de teste podem ser aninhadas para obter testes mais complexos
 +
* A instrução pode ser escrita em uma única linha se isso melhorar a legibilidade
 +
 
 +
[[Imagem:SST_VHDL_if.png|thumb| Uso do IF - Exemplo 9, pg 58. Fonte: [1].|650px|center]]
 +
<br style="clear:both;">
  
A tabela abaixo resume as diferenças entre objetos SIGNAL e VARIABLE [4]:
 
  
{| class="wikitable"
+
; Instrução de seleção
! style="font-weight: bold;" | Regra
 
! style="font-weight: bold;" | SIGNAL
 
! style="font-weight: bold;" | VARIABLE
 
|-
 
| style="font-style: italic;" | 1. Local de declaração
 
| style="font-style: italic;" | Proibido declarar em código sequencial
 
| style="font-style: italic;" | Somente em código sequencial (PROCESS ou subprograma)
 
|-
 
| style="font-style: italic;" | 2. Escopo
 
| style="font-style: italic;" | Pode ser global
 
| style="font-style: italic;" | Sempre local (visível somente no código sequencial correspondente)
 
|-
 
| style="font-style: italic;" | 3. Atualização
 
| style="font-style: italic;" | Ao final do DELTA TIME
 
| style="font-style: italic;" | Atualização imediata
 
|-
 
| style="font-style: italic;" | 4. Atribuição
 
| style="font-style: italic;" | sig <= 5
 
| style="font-style: italic;" | var := 5
 
|}
 
  
==== Tarefas ====
+
Versão sequencial para a atribuição de seleção vista anteriormente. Segue a forma:
  
* Resolver exercícios do Capítulo 5 (pg 68) do livro [3].
+
;:<syntaxhighlight lang=vhdl>
  
==== Referências ====
+
case (<expressão>) is
 +
  when <resultado> =>
 +
      <instruções>;
 +
  when <resultado> =>
 +
      <instruções>;
 +
  when others =>
 +
      <instruções>;
 +
end case;
  
:: [1] Perry, Douglas L. '''VHDL Programming by example'''. 4ª Edição. McGrw-Hill.
+
</syntaxhighlight>
  
:: [2] Altera Training Courses. '''VHDL Basics'''. Disponível em [http://www.altera.com/education/training/courses/OHDL1110 Link]. Acesso em 27/02/2015.
+
Considerações:
  
:: [3] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
+
* Os parênteses são opcionais
 +
* Somente um conjunto de instruções é executado
 +
* A instrução pode ser escrita em uma única linha se isso melhorar a legibilidade
  
:: [4] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
+
[[Imagem:SST_VHDL_case.png|thumb| Uso do CASE - Exemplo 12, pg 64. Fonte: [1].|650px|center]]
 +
<br style="clear:both;">
  
=== Outros tópicos em VHDL ===
+
==== Referências ====
  
==== Tipos de dados definidos pelo usuário ====
+
:: [1] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
  
O projetista pode também criar seus próprios tipos de dados. Eles podem ser declarados na entidade, arquitetura, entre outros. Tipos de dados devem ser definidos sempre que possível, pois melhora a legibilidade do código [1].
 
  
===== Tipos baseados em inteiros =====
+
=== Atribuições de variáveis em simulações ===
  
São declarados usando a forma:
+
As atribuições de sinais podem ser agendadas usando a instrução AFTER:
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
TYPE <nome do tipo> IS RANGE <faixa de valores>;
+
x <= A or B AFTER 0.5 ns;
 +
 +
y <= a AFTER 1 s WHEN z = 0 ELSE
 +
    b;
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
onde <faixa de valores> define a faixa de valores que o tipo de dado pode assumir. Usa as palavras chaves '''TO''' ou '''DOWNTO'''.
+
Mesmo quando não há um agendamento explícito, as atribuições de sinais não são executadas imediatamente após a instrução. Tanto em processos implícitos (atribuições simples, condicionais e de seleção) quanto em processos explícitos (instrução PROCESS), as atribuições são realizadas após um tempo chamado de '''Delta Delay'''. O Delta Delay é definido como o tempo necessário para que todos os processos simultaneamente em execução sejam encerrados. Após esse tempo, todas as atribuições sem agendamento indicado são realizadas. Isso significa que '''as atribuições realizadas dentro de processos explícitos só serão efetuadas após a conclusão do processo'''.
  
Exemplos:
+
A necessidade deste fato pode ser confirmada no exemplo a seguir [1].
  
type scores is range 0 to 100;
+
[[Imagem:SST_Exemplo_delta_delay_1.png|thumb| Circuito combinacional. Fonte: [1].|650px|center]]
type years is range -3000 to 3000;
+
<br style="clear:both;">
type apples is range 0 to 15;
 
type oranges is range 0 to 15;
 
  
===== Tipos enumerados =====
+
Para o circuito apresentado, duas formas de avaliação podem ser utilizadas:
  
Definem uma lista de valores. Seguem o formato:
+
[[Imagem:SST_Exemplo_delta_delay_2.png|thumb| Formas de avaliação do circuito. Fonte: [1].|650px|center]]
 +
<br style="clear:both;">
  
;:<syntaxhighlight lang=vhdl>
+
Se esse comportamento não for bem definido, erros graves podem ser gerados na fase de compilação. Por isso, os Delta Delays são utilizados, e o problema é resolvido da seguinte forma:
  
TYPE <nome do tipo> IS (<lista de nomes ou números>);
+
[[Imagem:SST_Exemplo_delta_delay_3.png|thumb| Circuito avaliado com o Delta Delay. Fonte: [1].|650px|center]]
 +
<br style="clear:both;">
  
</syntaxhighlight>
+
Nos códigos abaixo, três formas aparentemente semelhantes são exibidas. Você consegue confirmar se os códigos são funcionalmente iguais?
  
onde <lista de nomes ou números> define os valores possíveis, separados por vírgula.
+
[[Imagem:SST_Delta_cycle_questao.png|thumb| Códigos e Delta Time. Fonte: [2].|800px|center]]
 +
<br style="clear:both;">
  
Exemplos:
+
{{collapse top | '''PENSE A RESPEITO''' e depois clique no "+" para expandir }}
  
;:<syntaxhighlight lang=vhdl>
+
Repare que há diferenças no número de processos envolvidos. No caso, os códigos esquerdo e direito são funcionalmente iguais. O código central é diferente dos outros pois o ''c'' usado na segunda atribuição não terá o valor atualizado da operação ''a'' '''AND''' ''b''.
  
type machine_state is (idle, forward, backward);
+
{{collapse bottom}}
type counter is (zero, one, two, three);
 
  
</syntaxhighlight>
+
==== Simulação ====
  
===== Tipos baseados em arranjos =====
+
A simulação do modelo VHDL segue duas fases: inicialização e ciclos de simulação.
  
Seguem a forma:
+
* Inicialização:
 
+
:* Valores iniciais são atribuídos aos sinais
;:<syntaxhighlight lang=vhdl>
+
:* Processos sensíveis aos sinais são executados
 +
:* Atribuição de sinais são agendadas
 +
* Ciclo de simulação:
 +
:* Tempo de simulação é avançado ao próximo tempo em que há uma atribuição de sinal agendada
 +
:* São realizadas as atribuições
 +
:* Processos sensíveis aos sinais são executados
 +
:* Atribuição de sinais são agendadas
 +
:* Quando todos os processos terminam sua execução, o ciclo atual de simulação é encerrado, e um novo ciclo é executado
 +
* Quando todos os processos forem executados e não houver mais alterações nos sinais, a simulação é encerrada
  
TYPE <nome do tipo> IS ARRAY (<faixa de valores>) OF <tipo do dado>;
+
[[Imagem:SST_Simulation_cycle.png|thumb| Fluxo de simulação de um modelo VHDL. Fonte: [2].|650px|center]]
 +
<br style="clear:both;">
  
</syntaxhighlight>
+
===== O objeto VARIABLE =====
  
Exemplos [2]:
+
Dentro de processos explícitos (instrução PROCESS) o objeto VARIABLE pode ser utilizado. Sua declaração é igual à declaração de objetos SIGNAL, mas há algumas diferenças:
  
* Arranjos linha:
+
* '''Atribuição de valores''': Enquanto objetos SIGNAL usam o operador "<=", objetos VARIABLE usam ":=".
 +
* '''Atualização''': Enquanto objetos SIGNAL são atualizados ao final do ''Delta Time'', objetos VARIABLE são atualizados imediatamente.
  
;:<syntaxhighlight lang=vhdl>
+
Além disso, como objetos VARIABLE só podem ser declarados dentro de instruções PROCESS, eles são de '''escopo local'''. Uma forma de alterar isso é utilizar um objeto SHARED VARIABLE, normalmente declarado na arquitetura. Uma SHARED VARIABLE possui escopo global, mas só pode ser modificada em códigos sequenciais (dentro de um PROCESS, por exemplo). A passagem do seu valor à um SIGNAL pode ser feita em qualquer lugar [4].
 
 
type vector is array (7 downto 0) of std_logic;
 
 
 
</syntaxhighlight>
 
 
 
* Arranjos 1D x 1D (conjunto de linhas):
 
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
type array1D1D is array (1 to 4) of bit_vector (7 downto 0);
+
SHARED VARIABLE x : BIT;
type vector_array is array (1 to 4) of vector;
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
* Arranjos matriciais
+
Assim como variáveis globais em linguagens de programação de ''software'', é recomendado que objetos SHARED VARIABLE sejam usados apenas em casos muito específicos.
  
;:<syntaxhighlight lang=vhdl>
+
A tabela abaixo resume as diferenças entre objetos SIGNAL e VARIABLE [4]:
  
type array2D is array (1 to 8, 1 to 16) of std_logic;
+
{| class="wikitable"
 +
! style="font-weight: bold;" | Regra
 +
! style="font-weight: bold;" | SIGNAL
 +
! style="font-weight: bold;" | VARIABLE
 +
|-
 +
| style="font-style: italic;" | 1. Local de declaração
 +
| style="font-style: italic;" | Proibido declarar em código sequencial
 +
| style="font-style: italic;" | Somente em código sequencial (PROCESS ou subprograma)
 +
|-
 +
| style="font-style: italic;" | 2. Escopo
 +
| style="font-style: italic;" | Pode ser global
 +
| style="font-style: italic;" | Sempre local (visível somente no código sequencial correspondente)
 +
|-
 +
| style="font-style: italic;" | 3. Atualização
 +
| style="font-style: italic;" | Ao final do DELTA TIME
 +
| style="font-style: italic;" | Atualização imediata
 +
|-
 +
| style="font-style: italic;" | 4. Atribuição
 +
| style="font-style: italic;" | sig <= 5
 +
| style="font-style: italic;" | var := 5
 +
|}
  
</syntaxhighlight>
+
==== Tarefas ====
  
 +
* Resolver exercícios do Capítulo 5 (pg 68) do livro [3].
  
'''NOTA''': Todos os tipos de dados declarados acima poderiam ter sido criados com o uso da palavra '''SUBTYPE'''. A vantagem de definir subtipos é a possibilidade de fazer atribuições entre os tipos de origem e novo.
+
==== Referências ====
  
==== Laços de repetição ====
+
:: [1] Perry, Douglas L. '''VHDL Programming by example'''. 4ª Edição. McGrw-Hill.
  
No corpo de processos explícitos é possível criar laços de repetição. São normalmente utilizados para atribuição de valores à múltiplas portas, contagem, etc.
+
:: [2] Altera Training Courses. '''VHDL Basics'''. Disponível em [http://www.altera.com/education/training/courses/OHDL1110 Link]. Acesso em 27/02/2015.
  
===== FOR =====
+
:: [3] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
  
Usado quando o desenvolvedor sabe o número de iterações a serem realizadas. Segue a forma:
+
:: [4] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
  
;:<syntaxhighlight lang=vhdl>
+
=== Outros tópicos em VHDL ===
  
<rotulo>: FOR <indice> IN <faixa de valores> LOOP
+
==== Tipos de dados definidos pelo usuário ====
  <instruções sequenciais>;
 
END LOOP <rotulo>;
 
  
</syntaxhighlight>
+
O projetista pode também criar seus próprios tipos de dados. Eles podem ser declarados na entidade, arquitetura, entre outros. Tipos de dados devem ser definidos sempre que possível, pois melhora a legibilidade do código [1].
  
onde:
+
===== Tipos baseados em inteiros =====
  
* <indice>: Variável que receberá o valor incrementado a cada iteração. Possui as seguintes características:
+
São declarados usando a forma:
:* Não precisa ser declarada previamente.
 
:* Não pode receber valores dentro do laço.
 
:* Somente incrementos de 1 unidade são permitidos.
 
* <faixa de valores>: Pode ser declarada de duas formas:
 
:* Explicitamente, com as palavras-chave TO e DOWNTO
 
:* Implicitamente, a partir de tipos definidos pelo usuário
 
 
 
Exemplos:
 
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
for cnt_val in 0 to 24 loop
+
TYPE <nome do tipo> IS RANGE <faixa de valores>;
  -- sequential_statements
 
end loop;
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
;:<syntaxhighlight lang=vhdl>
+
onde <faixa de valores> define a faixa de valores que o tipo de dado pode assumir. Usa as palavras chaves '''TO''' ou '''DOWNTO'''.
  
for cnt_val in 24 downto 0 loop
+
Exemplos:
  -- sequential_statements
 
end loop;
 
  
</syntaxhighlight>
+
type scores is range 0 to 100;
 +
type years is range -3000 to 3000;
 +
type apples is range 0 to 15;
 +
type oranges is range 0 to 15;
 +
 
 +
===== Tipos enumerados =====
 +
 
 +
Definem uma lista de valores. Seguem o formato:
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
type my_range is range 0 to 24;
+
TYPE <nome do tipo> IS (<lista de nomes ou números>);
--
 
for cnt_val in my_range loop
 
  -- sequential_statements
 
end loop;
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
onde <lista de nomes ou números> define os valores possíveis, separados por vírgula.
 +
 +
Exemplos:
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
type my_range is range 24 downto 0;
+
type machine_state is (idle, forward, backward);
--
+
type counter is (zero, one, two, three);
for cnt_val in my_range loop
 
  -- sequential_statements
 
end loop;
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===== WHILE =====
+
===== Tipos baseados em arranjos =====
  
Usado quando o desenvolvedor não conhece o total de iterações necessárias, pois elas são realizadas até uma condição determinada ser atingida.
+
Seguem a forma:
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
<rotulo>: WHILE (<condição>) LOOP
+
TYPE <nome do tipo> IS ARRAY (<faixa de valores>) OF <tipo do dado>;
  <instruções sequenciais>;
 
END LOOP <rotulo>;
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===== Controle de iterações =====
+
Exemplos [2]:
 +
 
 +
* Arranjos linha:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
  
O VHDL fornece também instruções para controle de iterações
+
type vector is array (7 downto 0) of std_logic;
  
; NEXT
+
</syntaxhighlight>
  
Pula o restante da iteração atual do laço, passando para a próxima. Duas formas são disponíveis, como pode ser visto nos exemplos abaixo:
+
* Arranjos 1D x 1D (conjunto de linhas):
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
variable my_sum : integer := 0;
+
type array1D1D is array (1 to 4) of bit_vector (7 downto 0);
--
+
type vector_array is array (1 to 4) of vector;
for cnt_val in 0 to 50 loop
 
  if (my_sum = 20) then
 
      next;
 
  end if;
 
  my_sum := my_sum + 1;
 
end loop;
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
* Arranjos matriciais
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
variable my_sum : integer := 0;
+
type array2D is array (1 to 8, 1 to 16) of std_logic;
--
 
while (my_sum < 300) loop
 
  next when (my_sum = 20);
 
  my_sum := my_sum + 1;
 
end loop;
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
; EXIT
 
  
Encerra toda a estrutura de repetição. As duas formas disponíveis ao NEXT podem ser utilizadas.
+
'''NOTA''': Todos os tipos de dados declarados acima poderiam ter sido criados com o uso da palavra '''SUBTYPE'''. A vantagem de definir subtipos é a possibilidade de fazer atribuições entre os tipos de origem e novo.
  
==== Repetição de código ====
+
==== Laços de repetição ====
  
Assim como linguagens de programação de software, VHDL também traz ferramentas para evitar a repetição de códigos. No caso, são utilizadas as estruturas FUNCTION, PROCEDURE e COMPONENT. As duas primeiras serão vistas agora.
+
No corpo de processos explícitos é possível criar laços de repetição. São normalmente utilizados para atribuição de valores à múltiplas portas, contagem, etc.
  
===== FUNCTION =====
+
===== FOR =====
  
São blocos de código que podem ser chamados para realizar tarefas determinadas. Características:
+
Usado quando o desenvolvedor sabe o número de iterações a serem realizadas. Segue a forma:
* Assim como processos explícitos, FUNCTIONs são '''sequenciais'''.
 
* Todos os parâmetros recebidos são de entrada.
 
* Retornam apenas um valor.
 
 
 
São declaradas da forma:
 
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
FUNCTION <nome> (<argumentos de entrada>)
+
<rotulo>: FOR <indice> IN <faixa de valores> LOOP
RETURN <tipo do dado de retorno> IS
+
   <instruções sequenciais>;
  <declarações>
+
END LOOP <rotulo>;
BEGIN
 
   <instruções sequenciais>
 
  <rotulo>: RETURN <expressao>;
 
END FUNCTION <nome>
 
  
 
</syntaxhighlight>
 
</syntaxhighlight>
Linha 1 457: Linha 1 860:
 
onde:
 
onde:
  
* <argumentos de entrada>: Opcionais, é a lista de sinais de entrada da função
+
* <indice>: Variável que receberá o valor incrementado a cada iteração. Possui as seguintes características:
* <rotulo>: Opcional.
+
:* Não precisa ser declarada previamente.
* <expressao>: Expressão a ser calculada para definir o dado de retorno. Normalmente, apenas a variável de retorno é indicada.
+
:* Não pode receber valores dentro do laço.
 +
:* Somente incrementos de 1 unidade são permitidos.
 +
* <faixa de valores>: Pode ser declarada de duas formas:
 +
:* Explicitamente, com as palavras-chave TO e DOWNTO
 +
:* Implicitamente, a partir de tipos definidos pelo usuário
  
Funções podem ser declaradas na parte declarativa da ARCHITECTURE, e podem ser chamadas em qualquer lugar do código
+
Exemplos:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
  
[[Imagem:SST_Exemplo_funcao1.png|thumb|Função de exemplo. Fonte: [3].|650px|center]]
+
for cnt_val in 0 to 24 loop
<br style="clear:both;">
+
  -- sequential_statements
 +
end loop;
  
===== PROCEDURE =====
+
</syntaxhighlight>
  
Assim como as FUNCTIONs, PROCEDUREs são usados para evitar a repetição de código. Características:
+
;:<syntaxhighlight lang=vhdl>
  
* Assim como PROCESS e FUNCTION, PROCEDUREs são sequenciais.
+
for cnt_val in 24 downto 0 loop
* Podem ter qualquer número de parâmetros de entrada, saída, ou entrada e saída (inout)
+
  -- sequential_statements
* Funções normalmente fazem parte de uma expressão, enquanto que PROCEDUREs compõem uma instrução em si
+
end loop;
  
São da forma:
+
</syntaxhighlight>
  
 
;:<syntaxhighlight lang=vhdl>
 
;:<syntaxhighlight lang=vhdl>
  
PROCEDURE <nome> (<argumentos>) IS
+
type my_range is range 0 to 24;
  <declarações>
+
--
BEGIN
+
for cnt_val in my_range loop
   <instruções sequenciais>
+
   -- sequential_statements
END PROCEDURE <nome>
+
end loop;
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
onde <argumentos> define a lista de sinais de entrada e saída do PROCEDURE, e cada argumento necessita do seu modo (in, out, inout).
+
;:<syntaxhighlight lang=vhdl>
  
[[Imagem:SST_Exemplo_procedure1.png|thumb|Procedure de exemplo. Fonte: [3].|650px|center]]
+
type my_range is range 24 downto 0;
<br style="clear:both;">
+
--
 +
for cnt_val in my_range loop
 +
  -- sequential_statements
 +
end loop;
  
==== Tarefas ====
+
</syntaxhighlight>
  
Resolver os exercícios abaixo usando ao menos um tipo de dado definido, uma estrutura de repetição e uma função ou componente.
+
===== WHILE =====
  
* Desenvolva um modelo VHDL para uma porta AND com 12 entradas
+
Usado quando o desenvolvedor não conhece o total de iterações necessárias, pois elas são realizadas até uma condição determinada ser atingida.
* Desenvolva uma função VHDL para converter um vetor binário de 10 elementos para um número inteiro
 
  
 +
;:<syntaxhighlight lang=vhdl>
  
==== Referências ====
+
<rotulo>: WHILE (<condição>) LOOP
 +
  <instruções sequenciais>;
 +
END LOOP <rotulo>;
  
:: [1] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
+
</syntaxhighlight>
  
:: [2] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
+
===== Controle de iterações =====
  
:: [3] Perry, Douglas L. '''VHDL Programming by example'''. 4ª Edição. McGrw-Hill.
+
O VHDL fornece também instruções para controle de iterações
  
=== Abordagem estrutural ===
+
; NEXT
  
Das três abordagens para escrever arquiteturas em VHDL (Data-flow, Behavioral e Structural) nos falta a última, que será vista agora com a introdução de uma nova estrutura: COMPONENT. Para isso, o projeto de um sistema específico será usado como exemplo ilustrativo. Toda esta aula segue o "Capítulo 8 - VHDL Modularity with Components" de [1].
+
Pula o restante da iteração atual do laço, passando para a próxima. Duas formas são disponíveis, como pode ser visto nos exemplos abaixo:
  
Em VHDL, a  abordagem Estrutural é obtida a partir do uso de uma estrutura chamada COMPONENT. O desenvolvimento de uma COMPONENT pode ser dividido nas etapas abaixo:
+
;:<syntaxhighlight lang=vhdl>
  
# Dar nome ao módulo a ser descrito (entidade)
+
variable my_sum : integer := 0;
# Descrever o que o módulo irá fazer (arquitetura)
+
--
# Fazer o programa saber que o módulo existe e pode ser utilizado (declaração do componente)
+
for cnt_val in 0 to 50 loop
# Usar o módulo no código (instanciação do componente ou mapeamento)
+
  if (my_sum = 20) then
 +
      next;
 +
  end if;
 +
  my_sum := my_sum + 1;
 +
end loop;
  
Assim, a estrutura COMPONENT é semelhante à criação de bibliotecas próprias na programação de software, com a criação de pequenos módulos (ou funções) e sua posterior declaração e utilização no código principal. Esta semelhança pode ser vista na tabela abaixo:
+
</syntaxhighlight>
  
{| class="wikitable"
+
;:<syntaxhighlight lang=vhdl>
! style="text-align: center; font-weight: bold;" | Linguagem C
 
! style="text-align: center; font-weight: bold;" | VHDL
 
|-
 
| Descrever a interface da função
 
| ENTITY do módulo
 
|-
 
| Descrever o que a função faz
 
| ARCHITECTURE do módulo
 
|-
 
| Provê um protótipo da função para o programa principal (main)
 
| Declaração da COMPONENT na Top-level Entity
 
|-
 
| Chamar a função no programa principal (main)
 
| Instanciação ou mapeamento do COMPONENT na Top-level Entity
 
|}
 
  
==== O exemplo: Comparador de 3 bits ====
+
variable my_sum : integer := 0;
 
+
--
O exemplo que será utilizado para demonstrar a abordagem estrutural pode ser visto na figura abaixo. São características:
+
while (my_sum < 300) loop
 +
  next when (my_sum = 20);
 +
  my_sum := my_sum + 1;
 +
end loop;
  
* As 3 portas '''A_IN''' e '''B_IN''' compõem dois barramentos de entrada
+
</syntaxhighlight>
* '''EQ_OUT''' é um BIT, que indica que as entradas são iguais ('''1''') ou não ('''0''')
 
* Os sinais '''p1_out''', '''p2_out''' e '''p3_out''' são internos ao sistema
 
  
[[Imagem:SST_Exemplo_structural1.png|thumb|Exemplo - Comparador de 3 bits. Fonte: [1].|450px|center]]
+
; EXIT
<br style="clear:both;">
 
  
==== Desenvolvendo o sistema usando a abordagem Estrutural ====
+
Encerra toda a estrutura de repetição. As duas formas disponíveis ao NEXT podem ser utilizadas.
  
A partir do sistema, a abordagem Estrutural segue os 5 passos abaixo:
+
==== Repetição de código ====
  
# Implementar os módulos do circuito
+
Assim como linguagens de programação de software, VHDL também traz ferramentas para evitar a repetição de códigos. No caso, são utilizadas as estruturas FUNCTION, PROCEDURE e COMPONENT. As duas primeiras serão vistas agora.
# Declarar a entidade de nível mais alto
 
# Declarar os módulos de mais baixo nível
 
# Declarar os sinais internos usados para conectar os módulos
 
# Instanciar as unidades
 
  
===== Implementar os módulos do circuito =====
+
===== FUNCTION =====
  
Como pode ser visto, o sistema faz uso de dois sistemas menores: a porta XNOR de 2 entradas e a porta AND de 3 entradas. Assim, é necessário implementar essas duas entidades.
+
São blocos de código que podem ser chamados para realizar tarefas determinadas. Características:
 +
* Assim como processos explícitos, FUNCTIONs são '''sequenciais'''.
 +
* Todos os parâmetros recebidos são de entrada.
 +
* Retornam apenas um valor.
  
No Quartus II, criar um projeto novo com o nome da entidade de nível mais alto '''my_compare'''. Após isso, criar os dois arquivos abaixo:
+
São declaradas da forma:
  
[[Imagem:SST_Exemplo_structural_xnor.png|thumb|Módulo 1: '''big_xnor.vhd'''. Fonte: [1].|650px|left]]
+
;:<syntaxhighlight lang=vhdl>
[[Imagem:SST_Exemplo_structural_and3.png|thumb|Módulo 2: '''big_and3.vhd'''. Fonte: [1].|650px|right]]
 
<br style="clear:both;">
 
  
Repare que os arquivos são desenvolvidos da mesma forma que sistemas como um todo.
+
FUNCTION <nome> (<argumentos de entrada>)
 +
RETURN <tipo do dado de retorno> IS
 +
  <declarações>
 +
BEGIN
 +
  <instruções sequenciais>
 +
  <rotulo>: RETURN <expressao>;
 +
END FUNCTION <nome>
  
===== Declarar a entidade de nível mais alto =====
+
</syntaxhighlight>
  
Agora o comparador começará a ser desenvolvido, no arquivo '''my_compare.vhd'''. Como todo sistema, inicia-se pela entidade. A partir do diagrama acima e com base nas considerações apresentadas, a entidade será:
+
onde:
  
[[Imagem:SST_Exemplo_structural3.png|thumb|Entity. Fonte: [1].|650px|center]]
+
* <argumentos de entrada>: Opcionais, é a lista de sinais de entrada da função
<br style="clear:both;">
+
* <rotulo>: Opcional.
 +
* <expressao>: Expressão a ser calculada para definir o dado de retorno. Normalmente, apenas a variável de retorno é indicada.
  
===== Declarar os módulos de mais baixo nível =====
+
Funções podem ser declaradas na parte declarativa da ARCHITECTURE, e podem ser chamadas em qualquer lugar do código
  
A declaração das portas desenvolvidas (XNOR e AND3) no código principal são feitas usando as COMPONENTs. Para isto, basta copiar as ENTITYs criadas nos outros arquivos para a parte declarativa da ARCHITECTURE, alterando a palavra-chave ENTITY para COMPONENT.
+
[[Imagem:SST_Exemplo_funcao1.png|thumb|Função de exemplo. Fonte: [3].|650px|center]]
 
 
[[Imagem:SST_Exemplo_structural4.png|thumb|Declaração dos módulos com as COMPONENTs. Fonte: [1].|650px|center]]
 
 
<br style="clear:both;">
 
<br style="clear:both;">
  
===== Declarar os sinais internos usados para conectar os módulos =====
+
===== PROCEDURE =====
  
Os sinais internos presentes no diagrama são declarados na arquitetura. Eles são utilizados para a interligação dos módulos criados.
+
Assim como as FUNCTIONs, PROCEDUREs são usados para evitar a repetição de código. Características:
  
===== Instanciar as unidades =====
+
* Assim como PROCESS e FUNCTION, PROCEDUREs são sequenciais.
 +
* Podem ter qualquer número de parâmetros de entrada, saída, ou entrada e saída (inout)
 +
* Funções normalmente fazem parte de uma expressão, enquanto que PROCEDUREs compõem uma instrução em si
  
O último passo é criar as instâncias dos módulos. Isto é feito mapeando os sinais de entrada e saída das componentes no corpo da arquitetura. É usada a palavra-chave PORT MAP.
+
São da forma:
  
[[Imagem:SST_Exemplo_structural5.png|thumb|Instanciação dos módulos. Fonte: [1].|650px|center]]
+
;:<syntaxhighlight lang=vhdl>
<br style="clear:both;">
 
  
No caso acima, é usado o chamado '''mapeamento direto'''. Nele, a associação dos sinais da entidade de nível mais alto com os sinais internos das componentes é feito usando o operador "=>". Uma alternativa é usar o '''mapeamento implícito''', onde os sinais da entidade de nível mais alto são associados pela ordem da declaração:
+
PROCEDURE <nome> (<argumentos>) IS
 +
  <declarações>
 +
BEGIN
 +
  <instruções sequenciais>
 +
END PROCEDURE <nome>
  
[[Imagem:SST_Exemplo_structural6.png|thumb|Mapeamento implícito. Fonte: [1].|650px|center]]
+
</syntaxhighlight>
<br style="clear:both;">
 
  
===== Sistema finalizado =====
+
onde <argumentos> define a lista de sinais de entrada e saída do PROCEDURE, e cada argumento necessita do seu modo (in, out, inout).
  
O código completo pode ser visto na figura abaixo:
+
[[Imagem:SST_Exemplo_procedure1.png|thumb|Procedure de exemplo. Fonte: [3].|650px|center]]
 +
<br style="clear:both;">
  
[[Imagem:SST_Exemplo_structural7.png|thumb|Comparador finalizado. Fonte: [1].|650px|center]]
+
==== Tarefas ====
<br style="clear:both;">
 
  
==== Mapeamento de constantes ====
+
Resolver os exercícios abaixo usando ao menos um tipo de dado definido, uma estrutura de repetição e uma função ou componente.
  
O mapeamento pode ser realizado para, além das portas, as GENERICs. Com isto, sistemas genéricos podem ser criados, facilitando futuras implementações.
+
* Desenvolva um modelo VHDL para uma porta AND com 12 entradas
 +
* Desenvolva uma função VHDL para converter um vetor binário de 10 elementos para um número inteiro
  
A entidade abaixo realiza a checagem de paridade de um número genérico de bits. Repare na declaração de ''n'' como um GENERIC.
 
  
[[Imagem:SST_Exemplo_generic1.png|thumb|Checagem de paridade. Fonte: [1].|650px|center]]
+
==== Referências ====
<br style="clear:both;">
 
  
Essa entidade é utilizada numa entidade de nível maior, como pode ser visto abaixo. Repare na instrução GENERIC MAP, que assim como o PORT MAP, faz o mapeamento do número de sinais de entrada a serem utilizados.
+
:: [1] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
  
[[Imagem:SST_Exemplo_generic2.png|thumb|Checagem de paridade. Fonte: [1].|650px|center]]
+
:: [2] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
<br style="clear:both;">
 
  
==== Tarefas ====
+
:: [3] Perry, Douglas L. '''VHDL Programming by example'''. 4ª Edição. McGrw-Hill.
  
Resolver exercícios do capítulo 8, pg 129, do livro [1].
+
=== Abordagem estrutural ===
  
==== Referências ====
+
Das três abordagens para escrever arquiteturas em VHDL (Data-flow, Behavioral e Structural) nos falta a última, que será vista agora com a introdução de uma nova estrutura: COMPONENT. Para isso, o projeto de um sistema específico será usado como exemplo ilustrativo. Toda esta aula segue o "Capítulo 8 - VHDL Modularity with Components" de [1].
  
:: [1] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
+
Em VHDL, a  abordagem Estrutural é obtida a partir do uso de uma estrutura chamada COMPONENT. O desenvolvimento de uma COMPONENT pode ser dividido nas etapas abaixo:
  
=== Avaliação 1 - Sistemas combinacionais ===
+
# Dar nome ao módulo a ser descrito (entidade)
 +
# Descrever o que o módulo irá fazer (arquitetura)
 +
# Fazer o programa saber que o módulo existe e pode ser utilizado (declaração do componente)
 +
# Usar o módulo no código (instanciação do componente ou mapeamento)
  
Desenvolver os sistemas abaixo em VHDL, em dois grupos de 3 pessoas. O arquivo do QSIM deve ser gerado para realização dos testes. Escrever um relatório explicando a solução adotada, tanto para o desenvolvimento do código quanto para o arquivo de testes do QSIM.
+
Assim, a estrutura COMPONENT é semelhante à criação de bibliotecas próprias na programação de software, com a criação de pequenos módulos (ou funções) e sua posterior declaração e utilização no código principal. Esta semelhança pode ser vista na tabela abaixo:
  
Os relatórios dois dois grupos formados estar disponíveis nas páginas:
+
{| class="wikitable"
 
+
! style="text-align: center; font-weight: bold;" | Linguagem C
* [[SST20707-2015-1 - Avaliação 1 - Equipe 1|Página da equipe 1]]: Kamila, Leonardo O., Renan
+
! style="text-align: center; font-weight: bold;" | VHDL
* [[SST20707-2015-1 - Avaliação 1 - Equipe 2|Página da equipe 2]]: Nicole, Leonardo, Rogério
+
|-
 
+
| Descrever a interface da função
 
+
| ENTITY do módulo
;1 - Cruzamento de duas ruas
+
|-
 
+
| Descrever o que a função faz
Desenvolver um sistema automático para os semáforos em um cruzamento de duas ruas, com as seguintes características:
+
| ARCHITECTURE do módulo
 +
|-
 +
| Provê um protótipo da função para o programa principal (main)
 +
| Declaração da COMPONENT na Top-level Entity
 +
|-
 +
| Chamar a função no programa principal (main)
 +
| Instanciação ou mapeamento do COMPONENT na Top-level Entity
 +
|}
  
# Quando houver carros somente na rua B, o semáforo 2 deverá permanecer verde
+
==== O exemplo: Comparador de 3 bits ====
# Quando houver carros somente na rua A, o semáforo 1 deverá permanecer verde
 
# Quando houver carros nas duas ruas, o semáforo 1 deverá permanecer verde
 
  
[[Imagem:SST_Avaliacao_1a_q1.png|thumb|Cruzamento de duas ruas.|650px|center]]
+
O exemplo que será utilizado para demonstrar a abordagem estrutural pode ser visto na figura abaixo. São características:
<br style="clear:both;">
 
  
;2 - Um amplificador e três aparelhos
+
* As 3 portas '''A_IN''' e '''B_IN''' compõem dois barramentos de entrada
 +
* '''EQ_OUT''' é um BIT, que indica que as entradas são iguais ('''1''') ou não ('''0''')
 +
* Os sinais '''p1_out''', '''p2_out''' e '''p3_out''' são internos ao sistema
  
Desenvolver um sistema que comuta a utilização de um amplificador para três aparelhos, obedecendo as seguintes prioridades:
+
[[Imagem:SST_Exemplo_structural1.png|thumb|Exemplo - Comparador de 3 bits. Fonte: [1].|450px|center]]
 +
<br style="clear:both;">
  
# Toca-discos
+
==== Desenvolvendo o sistema usando a abordagem Estrutural ====
# Toca-fitas
 
# Rádio FM
 
  
;3 - Intercomunicadores
+
A partir do sistema, a abordagem Estrutural segue os 5 passos abaixo:
  
Desenvolver um sistema que comuta intercomunicadores em uma empresa, obedecendo as seguintes prioridades:
+
# Implementar os módulos do circuito
 +
# Declarar a entidade de nível mais alto
 +
# Declarar os módulos de mais baixo nível
 +
# Declarar os sinais internos usados para conectar os módulos
 +
# Instanciar as unidades
  
# Presidente
+
===== Implementar os módulos do circuito =====
# Vice-presidente
 
# Engenharia
 
# Chefe de seção
 
  
;4 - Display de 7 segmentos
+
Como pode ser visto, o sistema faz uso de dois sistemas menores: a porta XNOR de 2 entradas e a porta AND de 3 entradas. Assim, é necessário implementar essas duas entidades.
  
Desenvolver um sistema que mostra um número hexadecimal num display de 7 segmentos
+
No Quartus II, criar um projeto novo com o nome da entidade de nível mais alto '''my_compare'''. Após isso, criar os dois arquivos abaixo:
  
;5 - Tanque com fluido
+
[[Imagem:SST_Exemplo_structural_xnor.png|thumb|Módulo 1: '''big_xnor.vhd'''. Fonte: [1].|650px|left]]
 +
[[Imagem:SST_Exemplo_structural_and3.png|thumb|Módulo 2: '''big_and3.vhd'''. Fonte: [1].|650px|right]]
 +
<br style="clear:both;">
  
Desenvolver um sistema para controlar o nível de fluido em um tanque por meio de uma válvula de entrada e uma válvula de saída, de igual vazão. O nível de fluído deve ser mantido entre dois níveis, medidos com dois sensores, um de mínimo e outro de máximo. Um botão para total esvaziamento do tanque (equivalente à um botão de liga/desliga do tanque) deve ser previsto.
+
Repare que os arquivos são desenvolvidos da mesma forma que sistemas como um todo.
  
;6 - Cruzamento de três ruas
+
===== Declarar a entidade de nível mais alto =====
  
Desenvolver um sistema para controlar semáforos em um cruzamento de 3 ruas, com as seguintes características:
+
Agora o comparador começará a ser desenvolvido, no arquivo '''my_compare.vhd'''. Como todo sistema, inicia-se pela entidade. A partir do diagrama acima e com base nas considerações apresentadas, a entidade será:
  
# Fechamento dos semáforos:
+
[[Imagem:SST_Exemplo_structural3.png|thumb|Entity. Fonte: [1].|650px|center]]
:# Quando o semáforo 1 abrir para a rua A, automaticamente os semáforos 2 e 3 devem fechar
+
<br style="clear:both;">
:# Quando o semáforo 2 abrir para a rua B, automaticamente os semáforos 1 e 3 devem fechar
 
:# Quando o semáforo 3 abrir para a rua C, automaticamente os semáforos 1 e 2 devem fechar
 
# Prioridades:
 
:# O motorista que está na rua A tem prioridade sobre o que está na rua B
 
:# O motorista que está na rua B tem prioridade sobre o que está na rua C
 
:# O motorista que está na rua C tem prioridade sobre o que está na rua A
 
:# Quando houver carros nas três ruas, a rua A é preferencial
 
:# Quando não houver nenhum carro na rua, o sinal para a rua A deverá ser aberto
 
  
;7 - Tanque de dois níveis, com sensor de temperatura
+
===== Declarar os módulos de mais baixo nível =====
 +
 
 +
A declaração das portas desenvolvidas (XNOR e AND3) no código principal são feitas usando as COMPONENTs. Para isto, basta copiar as ENTITYs criadas nos outros arquivos para a parte declarativa da ARCHITECTURE, alterando a palavra-chave ENTITY para COMPONENT.
 +
 
 +
[[Imagem:SST_Exemplo_structural4.png|thumb|Declaração dos módulos com as COMPONENTs. Fonte: [1].|650px|center]]
 +
<br style="clear:both;">
  
Desenvolver um sistema para controlar o nível de água em dois tanques por meio de duas válvulas, com as seguintes características:
+
===== Declarar os sinais internos usados para conectar os módulos =====
  
# O tanque 2:
+
Os sinais internos presentes no diagrama são declarados na arquitetura. Eles são utilizados para a interligação dos módulos criados.
:# Possui saída para a distribuição, por isso seu nível está sempre em redução
 
:# Possui dois sensores, que indicam o nível mínimo (válvula 2 deve ser acionada) e o máximo (válvula 2 deve ser desligada)
 
# O tanque 1:
 
:# É alimentado pela rede pública de abastecimento
 
:# Possui os mesmos sensores do tanque 2
 
:# Além desses dois, tendo em vista as oscilações presentes na rede de abastecimento, um sensor de segurança está disponível, indicando um nível intermediário (válvula 1 deve ser acionada se a válvula 2 estiver acionada)
 
# Sempre que chegar no nível mínimo, os tanques devem ser enchidos até o nível máximo
 
  
O sensor de temperatura é composto por dois sensores, um que indica se a água está muito fria e outro que indica se a água está muito quente.
+
===== Instanciar as unidades =====
  
Para todos os sensores do sistema, casos de falhas devem acionar um alarme.
+
O último passo é criar as instâncias dos módulos. Isto é feito mapeando os sinais de entrada e saída das componentes no corpo da arquitetura. É usada a palavra-chave PORT MAP.
  
[[Imagem:SST_Avaliacao_1a_q2.png|thumb|Tanque de dois níveis, com sensor de temperatura.|650px|center]]
+
[[Imagem:SST_Exemplo_structural5.png|thumb|Instanciação dos módulos. Fonte: [1].|650px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
;8 - Circuito aritmético
+
No caso acima, é usado o chamado '''mapeamento direto'''. Nele, a associação dos sinais da entidade de nível mais alto com os sinais internos das componentes é feito usando o operador "=>". Uma alternativa é usar o '''mapeamento implícito''', onde os sinais da entidade de nível mais alto são associados pela ordem da declaração:
  
Desenvolver um circuito somador completo de 8 bits
+
[[Imagem:SST_Exemplo_structural6.png|thumb|Mapeamento implícito. Fonte: [1].|650px|center]]
 +
<br style="clear:both;">
  
 +
===== Sistema finalizado =====
  
====Adendo - Uso do FPGA====
+
O código completo pode ser visto na figura abaixo:
 
 
Das questões anteriores, implementar as discriminadas abaixo no [[SST20707-2015-1#O_kit_DE2-115|Kit DE2-115]]. Em todas as questões, defina como as entradas e saídas serão simuladas no Kit (um botão, uma chave, um display, um led, etc).
 
  
::;1 - Cruzamento de duas ruas
+
[[Imagem:SST_Exemplo_structural7.png|thumb|Comparador finalizado. Fonte: [1].|650px|center]]
::;3 - Intercomunicadores
+
<br style="clear:both;">
::;4 - Display de 7 segmentos
+
 
::;5 - Tanque com fluido
+
==== Mapeamento de constantes ====
::;7 - Tanque de dois níveis, com sensor de temperatura
 
  
=== Circuitos sequenciais em VHDL ===
+
O mapeamento pode ser realizado para, além das portas, as GENERICs. Com isto, sistemas genéricos podem ser criados, facilitando futuras implementações.
  
Muitos sistemas precisam armazenar valores por períodos de tempo determinados. Nesta aula, vamos estudar como desenvolver esse tipo de sistema em VHDL. '''Baseados no capítulo 6 do livro [1]''', vamos desenvolver um Flip-Flop do tipo D, elemento de armazenamento de 1 bit.
+
A entidade abaixo realiza a checagem de paridade de um número genérico de bits. Repare na declaração de ''n'' como um GENERIC.
  
==== Flip Flop tipo D ====
+
[[Imagem:SST_Exemplo_generic1.png|thumb|Checagem de paridade. Fonte: [1].|650px|center]]
 +
<br style="clear:both;">
  
A figura abaixo apresenta o diagrama de um flip flop tipo D;
+
Essa entidade é utilizada numa entidade de nível maior, como pode ser visto abaixo. Repare na instrução GENERIC MAP, que assim como o PORT MAP, faz o mapeamento do número de sinais de entrada a serem utilizados.
  
[[Imagem:SST_FlipFlop_D1.png|thumb|Flip Flop tipo D|500px|center]]
+
[[Imagem:SST_Exemplo_generic2.png|thumb|Checagem de paridade. Fonte: [1].|650px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
Abaixo, os estados possíveis do Flip Flop.
+
==== Tarefas ====
  
{{collapse top | Estados possíveis - Clicar no "+" para expandir }}
+
Resolver exercícios do capítulo 8, pg 129, do livro [1].
[[Imagem:SST_FlipFlop_D2.png|frameless|500px|center]]
 
{{collapse bottom}}
 
  
==== Flip Flop tipo D em VHDL ====
+
==== Referências ====
  
* '''Exercício''': Desenvolva um modelo VHDL para um Flip Flop tipo D como mostrado na seção anterior. Visando já sua aplicação como memória em um sistema maior, fazer com que a entrada D seja ''síncrona'', ou seja, só tenha influência na saída durante a borda de subida do sinal de clock.
+
:: [1] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
  
Abaixo, a solução do problema.
+
=== Avaliação 1 - Sistemas combinacionais ===
  
{{SST20707-Hidden1}}
+
{{collapse top | Avaliações dos semestres anteriores - 2015-1 - Clique no "+" para expandir}}
  
==== Entrada ''set'' síncrona e ativo-baixo ====
+
Desenvolver os sistemas abaixo em VHDL, em dois grupos de 3 pessoas. O arquivo do QSIM deve ser gerado para realização dos testes. Escrever um relatório explicando a solução adotada, tanto para o desenvolvimento do código quanto para o arquivo de testes do QSIM.
 +
 
 +
Os relatórios dois dois grupos formados está disponíveis nas páginas:
 +
 
 +
* [[SST20707-2015-1 - Avaliação 1 - Equipe 1|Página da equipe 1]]: Kamila, Leonardo O., Renan
 +
* [[SST20707-2015-1 - Avaliação 1 - Equipe 2|Página da equipe 2]]: Nicole, Leonardo, Rogério
  
[[Imagem:SST_FlipFlop_D_set.png|thumb|Flip Flop tipo D com entrada ''set''|300px|right]]
 
  
Neste caso, o Flip Flop tem as seguintes características:
+
;1 - Cruzamento de duas ruas
  
* A entrada ''set'' (S) fará com que a saída do Flip Flop seja "1", independente da sua entrada D.
+
Desenvolver um sistema automático para os semáforos em um cruzamento de duas ruas, com as seguintes características:
* Por ser síncrona, essa alteração será realizada apenas na borda de subida do clock.
 
* Por ser ativo-baixo, essa alteração será realizada apenas quando S for igual à "0".
 
  
A solução para o problema pode ser vista abaixo:
+
# Quando houver carros somente na rua B, o semáforo 2 deverá permanecer verde
 +
# Quando houver carros somente na rua A, o semáforo 1 deverá permanecer verde
 +
# Quando houver carros nas duas ruas, o semáforo 1 deverá permanecer verde
  
[[Imagem:SST_FlipFlop_VHDL2.png|thumb|Flip Flop tipo D com entrada ''set'' em VHDL|500px|center]]
+
[[Imagem:SST_Avaliacao_1a_q1.png|thumb|Cruzamento de duas ruas.|650px|center]]
 
<br style="clear:both;">
 
<br style="clear:both;">
  
Comentários:
+
;2 - Um amplificador e três aparelhos
  
* A porta S foi incluída através de um novo teste dentro do processo
+
Desenvolver um sistema que comuta a utilização de um amplificador para três aparelhos, obedecendo as seguintes prioridades:
* A prioridade da porta S sobre a porta D é implementada pela ordem dos IFs utilizada.
 
  
==== Entrada ''reset'' assíncrona e clock na borda de descida ====
+
# Toca-discos
 +
# Toca-fitas
 +
# Rádio FM
  
[[Imagem:SST_FlipFlop_D_reset.png|thumb|Flip Flop tipo D com entrada ''reset''|300px|right]]
+
;3 - Intercomunicadores
  
Neste caso, o Flip Flop tem as seguintes características:
+
Desenvolver um sistema que comuta intercomunicadores em uma empresa, obedecendo as seguintes prioridades:
  
* A entrada ''reset'' (R) fará com que a saída do Flip Flop seja "0", independente da sua entrada D.
+
# Presidente
* Por ser assíncrona, essa alteração será realizada sempre que R for alterado.
+
# Vice-presidente
 +
# Engenharia
 +
# Chefe de seção
  
A solução para o problema pode ser vista abaixo:
+
;4 - Display de 7 segmentos
  
[[Imagem:SST_FlipFlop_VHDL3.png|thumb|Flip Flop tipo D com entrada ''reset'' em VHDL|500px|center]]
+
Desenvolver um sistema que mostra um número hexadecimal num display de 7 segmentos
<br style="clear:both;">
 
  
Comentários:
+
;5 - Tanque com fluido
  
* Como a entrada R é assíncrona, ela não depende do clock. Por isso, R foi incluída na lista de sensitividade do processo.
+
Desenvolver um sistema para controlar o nível de fluido em um tanque por meio de uma válvula de entrada e uma válvula de saída, de igual vazão. O nível de fluído deve ser mantido entre dois níveis, medidos com dois sensores, um de mínimo e outro de máximo. Um botão para total esvaziamento do tanque (equivalente à um botão de liga/desliga do tanque) deve ser previsto.
* A prioridade da porta R sobre a porta D é implementada pela ordem dos IFs utilizada.
 
  
==== Flip Flop tipo T ====
+
;6 - Cruzamento de três ruas
  
A figura abaixo apresenta o diagrama de um flip flop tipo T;
+
Desenvolver um sistema para controlar semáforos em um cruzamento de 3 ruas, com as seguintes características:
  
[[Imagem:SST_FlipFlop_T1.png|thumb|Flip Flop tipo T|500px|center]]
+
# Fechamento dos semáforos:
<br style="clear:both;">
+
:# Quando o semáforo 1 abrir para a rua A, automaticamente os semáforos 2 e 3 devem fechar
 +
:# Quando o semáforo 2 abrir para a rua B, automaticamente os semáforos 1 e 3 devem fechar
 +
:# Quando o semáforo 3 abrir para a rua C, automaticamente os semáforos 1 e 2 devem fechar
 +
# Prioridades:
 +
:# O motorista que está na rua A tem prioridade sobre o que está na rua B
 +
:# O motorista que está na rua B tem prioridade sobre o que está na rua C
 +
:# O motorista que está na rua C tem prioridade sobre o que está na rua A
 +
:# Quando houver carros nas três ruas, a rua A é preferencial
 +
:# Quando não houver nenhum carro na rua, o sinal para a rua A deverá ser aberto
  
Abaixo, os estados possíveis do Flip Flop.
+
;7 - Tanque de dois níveis, com sensor de temperatura
  
{{collapse top | Estados possíveis - Clicar no "+" para expandir }}
+
Desenvolver um sistema para controlar o nível de água em dois tanques por meio de duas válvulas, com as seguintes características:
[[Imagem:SST_FlipFlop_T2.png|frameless|500px|center]]
+
 
{{collapse bottom}}
+
# O tanque 2:
 +
:# Possui saída para a distribuição, por isso seu nível está sempre em redução
 +
:# Possui dois sensores, que indicam o nível mínimo (válvula 2 deve ser acionada) e o máximo (válvula 2 deve ser desligada)
 +
# O tanque 1:
 +
:# É alimentado pela rede pública de abastecimento
 +
:# Possui os mesmos sensores do tanque 2
 +
:# Além desses dois, tendo em vista as oscilações presentes na rede de abastecimento, um sensor de segurança está disponível, indicando um nível intermediário (válvula 1 deve ser acionada se a válvula 2 estiver acionada)
 +
# Sempre que chegar no nível mínimo, os tanques devem ser enchidos até o nível máximo
 +
 
 +
O sensor de temperatura é composto por dois sensores, um que indica se a água está muito fria e outro que indica se a água está muito quente.
 +
 
 +
Para todos os sensores do sistema, casos de falhas devem acionar um alarme.
 +
 
 +
[[Imagem:SST_Avaliacao_1a_q2.png|thumb|Tanque de dois níveis, com sensor de temperatura.|650px|center]]
 +
<br style="clear:both;">
 +
 
 +
;8 - Circuito aritmético
 +
 
 +
Desenvolver um circuito somador completo de 8 bits
 +
 
 +
 
 +
;Adendo - Uso do FPGA
 +
 
 +
Das questões anteriores, implementar as discriminadas abaixo no [[SST20707-2015-1#O_kit_DE2-115|Kit DE2-115]]. Em todas as questões, defina como as entradas e saídas serão simuladas no Kit (um botão, uma chave, um display, um led, etc).
 +
 
 +
::;1 - Cruzamento de duas ruas
 +
::;3 - Intercomunicadores
 +
::;4 - Display de 7 segmentos
 +
::;5 - Tanque com fluido
 +
::;7 - Tanque de dois níveis, com sensor de temperatura
 +
 
 +
{{collapse bottom}}
 +
 
 +
{{collapse top | Avaliações dos semestres anteriores - 2015-2 - Clique no "+" para expandir}}
 +
 
 +
Desenvolver o sistema comparador do diagrama abaixo:
 +
 
 +
[[imagem:comparador.png |600px|center]]
 +
 
 +
As seguintes considerações devem ser feitas:
 +
 
 +
* O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
 +
* Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
 +
* A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
 +
 
 +
[[imagem:decoder-2014-2.png|300px|center]]
 +
 
 +
* O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
 +
* Os blocos '''Comparador''', '''Mux''' e '''Decod. 7-seg''' deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
 +
* Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
 +
* Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
 +
* Enviar ao professor, via e-mail, os seguintes arquivos:
 +
:* Projeto empacotado (.QAR)
 +
:* Arquivos .VHD usados no projeto
 +
:* Arquivo .VWF usado para simular o projeto
 +
 
 +
{{collapse bottom}}
 +
 
 +
{{collapse top | Avaliações dos semestres anteriores - 2016-1 - Clique no "+" para expandir}}
 +
 
 +
No semestre atual, a avaliação será feita em duas etapas, onde a primeira etapa será feita em aula, e a segunda será realizada ao longo da próxima semana.
 +
 
 +
===== Parte 1 =====
 +
 
 +
Escolher uma das questões abaixo e fazer uma implementação em VHDL para o FPGA. Implementar na placa, descrevendo quais dispositivos serão destinados à cada sinal.
 +
 
 +
{{collapse top | Questão 1 - Semáforo de duas ruas}}
 +
Desenvolver um sistema automático para os semáforos em um cruzamento de duas ruas, com as seguintes características:
 +
 
 +
# Quando houver carros somente na rua B, o semáforo 2 deverá permanecer verde
 +
# Quando houver carros somente na rua A, o semáforo 1 deverá permanecer verde
 +
# Quando houver carros nas duas ruas, o semáforo 1 deverá permanecer verde
 +
 
 +
[[Imagem:SST_Avaliacao_1a_q1.png|thumb|Cruzamento de duas ruas.|650px|center]]
 +
<br style="clear:both;">
 +
{{collapse bottom}}
 +
 
 +
{{collapse top | Questão 2 - Amplificador e três aparelhos}}
 +
Desenvolver um sistema que comuta a utilização de um amplificador para três aparelhos, obedecendo as seguintes prioridades:
 +
 
 +
# Toca-discos
 +
# Toca-fitas
 +
# Rádio FM
 +
{{collapse bottom}}
 +
 
 +
{{collapse top | Questão 3 - Intercomunicadores}}
 +
 
 +
Desenvolver um sistema que comuta intercomunicadores em uma empresa, obedecendo as seguintes prioridades:
 +
 
 +
# Presidente
 +
# Vice-presidente
 +
# Engenharia
 +
# Chefe de seção
 +
{{collapse bottom}}
 +
 
 +
{{collapse top | Questão 4 - Tanque de fluido}}
 +
Desenvolver um sistema para controlar o nível de fluido em um tanque por meio de uma válvula de entrada e uma válvula de saída, de igual vazão. O nível de fluído deve ser mantido entre dois níveis, medidos com dois sensores, um de mínimo e outro de máximo. Um botão para total esvaziamento do tanque (equivalente à um botão de liga/desliga do tanque) deve ser previsto.
 +
{{collapse bottom}}
 +
 
 +
===== Parte 2 =====
 +
 
 +
Desenvolver o sistema comparador do diagrama abaixo:
 +
 
 +
[[imagem:comparador.png |600px|center]]
 +
 
 +
As seguintes considerações devem ser feitas:
 +
 
 +
* O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
 +
* Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
 +
* A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
 +
 
 +
[[imagem:decoder-2014-2.png|300px|center]]
 +
 
 +
* O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
 +
* Os blocos '''Comparador''', '''Mux''' e '''Decod. 7-seg''' deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
 +
* Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
 +
* Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
 +
* Enviar ao professor, via e-mail, os seguintes arquivos:
 +
:* Projeto empacotado (.QAR)
 +
:* Arquivos .VHD usados no projeto
 +
:* Arquivo .VWF usado para simular o projeto
 +
 
 +
{{collapse bottom}}
 +
 
 +
{{collapse top | Avaliações dos semestres anteriores - 2016-2 - Clique no "+" para expandir}}
 +
No semestre atual, a avaliação será feita em duas etapas, onde a primeira etapa será feita em aula, e a segunda será realizada ao longo da próxima semana.
 +
 
 +
===== Parte 1 =====
 +
 
 +
;Tanque de dois níveis, com sensor de temperatura
 +
 
 +
Desenvolver um sistema para controlar o nível de água em dois tanques por meio de duas válvulas, com as seguintes características:
 +
 
 +
# O tanque 2:
 +
:# Possui saída para a distribuição, por isso seu nível está sempre em redução
 +
:# Possui dois sensores, que indicam o nível mínimo (válvula 2 deve ser acionada) e o máximo (válvula 2 deve ser desligada)
 +
# O tanque 1:
 +
:# É alimentado pela rede pública de abastecimento
 +
:# Possui os mesmos sensores do tanque 2
 +
:# Além desses dois, tendo em vista as oscilações presentes na rede de abastecimento, um sensor de segurança está disponível, indicando um nível intermediário (válvula 1 deve ser acionada se a válvula 2 estiver acionada)
 +
# Sempre que chegar no nível mínimo, os tanques devem ser enchidos até o nível máximo
 +
 
 +
O sensor de temperatura é composto por dois sensores, um que indica se a água está muito fria e outro que indica se a água está muito quente.
 +
 
 +
Para todos os sensores do sistema, casos de falhas devem acionar um alarme.
 +
 
 +
[[Imagem:SST_Avaliacao_1a_q2.png|thumb|Tanque de dois níveis, com sensor de temperatura.|650px|center]]
 +
<br style="clear:both;">
 +
 
 +
===== Parte 2 =====
 +
 
 +
Desenvolver o sistema comparador do diagrama abaixo:
 +
 
 +
[[imagem:comparador.png |600px|center]]
 +
 
 +
As seguintes considerações devem ser feitas:
 +
 
 +
* O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
 +
* Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
 +
* A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
 +
 
 +
[[imagem:decoder-2014-2.png|300px|center]]
 +
 
 +
* O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
 +
* Os blocos '''Comparador''', '''Mux''' e '''Decod. 7-seg''' deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
 +
* Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
 +
* Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
 +
* Enviar ao professor, via e-mail, os seguintes arquivos:
 +
:* Projeto empacotado (.QAR)
 +
:* Arquivos .VHD usados no projeto
 +
:* Arquivo .VWF usado para simular o projeto
 +
{{collapse bottom}}
 +
 
 +
{{collapse top | Avaliações dos semestres anteriores - 2017-1 - Clique no "+" para expandir}}
 +
 
 +
No semestre atual, a avaliação será feita em duas etapas, onde a primeira etapa será feita em aula, e a segunda será realizada ao longo da próxima semana.
 +
 
 +
===== Parte 1 =====
 +
 
 +
;Tanque de dois níveis, com sensor de temperatura
 +
 
 +
Desenvolver um sistema para controlar o nível de água em dois tanques por meio de duas válvulas, com as seguintes características:
 +
 
 +
# O tanque 2:
 +
:# Possui saída para a distribuição, por isso seu nível está sempre em redução
 +
:# Possui dois sensores, que indicam o nível mínimo (válvula 2 deve ser acionada) e o máximo (válvula 2 deve ser desligada)
 +
# O tanque 1:
 +
:# É alimentado pela rede pública de abastecimento
 +
:# Possui os mesmos sensores do tanque 2
 +
:# Além desses dois, tendo em vista as oscilações presentes na rede de abastecimento, um sensor de segurança está disponível, indicando um nível intermediário (válvula 1 deve ser acionada se a válvula 2 estiver acionada)
 +
# Sempre que chegar no nível mínimo, os tanques devem ser enchidos até o nível máximo
 +
 
 +
O sensor de temperatura é composto por dois sensores, um que indica se a água está muito fria e outro que indica se a água está muito quente.
 +
 
 +
Para todos os sensores do sistema, casos de falhas devem acionar um alarme.
 +
 
 +
[[Imagem:SST_Avaliacao_1a_q2.png|thumb|Tanque de dois níveis, com sensor de temperatura.|650px|center]]
 +
<br style="clear:both;">
 +
 
 +
===== Parte 2 =====
 +
 
 +
Desenvolver o sistema comparador do diagrama abaixo:
 +
 
 +
[[imagem:comparador.png |600px|center]]
 +
 
 +
As seguintes considerações devem ser feitas:
 +
 
 +
* O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
 +
* Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
 +
* A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
 +
 
 +
[[imagem:decoder-2014-2.png|300px|center]]
 +
 
 +
* O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
 +
* Os blocos '''Comparador''', '''Mux''' e '''Decod. 7-seg''' deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
 +
* Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
 +
* Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
 +
* Enviar ao professor, via e-mail, os seguintes arquivos:
 +
:* Projeto empacotado (.QAR)
 +
:* Arquivos .VHD usados no projeto
 +
:* Arquivo .VWF usado para simular o projeto
 +
{{collapse bottom}}
 +
 
 +
{{collapse top | Avaliações dos semestres anteriores - 2017-2 - Clique no "+" para expandir}}
 +
No semestre atual, a avaliação será feita em duas etapas, onde a primeira etapa será feita em aula, e a segunda será realizada ao longo da próxima semana.
 +
 
 +
===== Parte 1 =====
 +
 
 +
;6 - Cruzamento de três ruas
 +
 
 +
Desenvolver um sistema para controlar semáforos em um cruzamento de 3 ruas, com as seguintes características:
 +
 
 +
# Fechamento dos semáforos:
 +
:# Quando o semáforo 1 abrir para a rua A, automaticamente os semáforos 2 e 3 devem fechar
 +
:# Quando o semáforo 2 abrir para a rua B, automaticamente os semáforos 1 e 3 devem fechar
 +
:# Quando o semáforo 3 abrir para a rua C, automaticamente os semáforos 1 e 2 devem fechar
 +
# Prioridades:
 +
:# O motorista que está na rua A tem prioridade sobre o que está na rua B
 +
:# O motorista que está na rua B tem prioridade sobre o que está na rua C
 +
:# O motorista que está na rua C tem prioridade sobre o que está na rua A
 +
:# Quando houver carros nas três ruas, a rua A é preferencial
 +
:# Quando não houver nenhum carro na rua, o sinal para a rua A deverá ser aberto
 +
 
 +
===== Parte 2 =====
 +
 
 +
Desenvolver o sistema comparador do diagrama abaixo:
 +
 
 +
[[imagem:comparador.png |600px|center]]
 +
 
 +
As seguintes considerações devem ser feitas:
 +
 
 +
* O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
 +
* Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
 +
* A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
 +
 
 +
[[imagem:decoder-2014-2.png|300px|center]]
 +
 
 +
* O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
 +
* Os blocos '''Comparador''', '''Mux''' e '''Decod. 7-seg''' deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
 +
* Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
 +
* Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
 +
* Enviar ao professor, via e-mail, os seguintes arquivos:
 +
:* Projeto empacotado (.QAR)
 +
:* Arquivos .VHD usados no projeto
 +
:* Arquivo .VWF usado para simular o projeto
 +
{{collapse bottom}}
 +
 
 +
==== Avaliação do semestre atual ====
 +
 
 +
Desenvolver o sistema comparador do diagrama abaixo:
 +
 
 +
[[imagem:comparador.png |600px|center]]
 +
 
 +
As seguintes considerações devem ser feitas:
 +
 
 +
* O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
 +
* Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
 +
* A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
 +
 
 +
[[imagem:decoder-2014-2.png|300px|center]]
 +
 
 +
* O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
 +
* Os blocos '''Comparador''', '''Mux''' e '''Decod. 7-seg''' deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
 +
* Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
 +
* Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
 +
* Enviar ao professor, via e-mail, os seguintes arquivos:
 +
:* Projeto empacotado (.QAR)
 +
:* Arquivos .VHD usados no projeto
 +
:* Arquivo .VWF usado para simular o projeto
 +
 
 +
=== Circuitos sequenciais em VHDL ===
 +
 
 +
Muitos sistemas precisam armazenar valores por períodos de tempo determinados. Nesta aula, vamos estudar como desenvolver esse tipo de sistema em VHDL. '''Baseados no capítulo 6 do livro [1]''', vamos desenvolver um Flip-Flop do tipo D, elemento de armazenamento de 1 bit.
 +
 
 +
==== Flip Flop tipo D ====
 +
 
 +
A figura abaixo apresenta o diagrama de um flip flop tipo D;
 +
 
 +
[[Imagem:SST_FlipFlop_D1.png|thumb|Flip Flop tipo D|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
Abaixo, os estados possíveis do Flip Flop.
 +
 
 +
{{collapse top | Estados possíveis - Clicar no "+" para expandir }}
 +
[[Imagem:SST_FlipFlop_D2.png|frameless|500px|center]]
 +
{{collapse bottom}}
 +
 
 +
==== Flip Flop tipo D em VHDL ====
 +
 
 +
* '''Exercício''': Desenvolva um modelo VHDL para um Flip Flop tipo D como mostrado na seção anterior. Visando já sua aplicação como memória em um sistema maior, fazer com que a entrada D seja ''síncrona'', ou seja, só tenha influência na saída durante a borda de subida do sinal de clock.
 +
 
 +
Abaixo, a solução do problema.
 +
 
 +
{{SST20707-Hidden1}}
 +
 
 +
==== Entrada ''set'' síncrona e ativo-baixo ====
 +
 
 +
[[Imagem:SST_FlipFlop_D_set.png|thumb|Flip Flop tipo D com entrada ''set''|300px|right]]
 +
 
 +
Neste caso, o Flip Flop tem as seguintes características:
 +
 
 +
* A entrada ''set'' (S) fará com que a saída do Flip Flop seja "1", independente da sua entrada D.
 +
* Por ser síncrona, essa alteração será realizada apenas na borda de subida do clock.
 +
* Por ser ativo-baixo, essa alteração será realizada apenas quando S for igual à "0".
 +
 
 +
A solução para o problema pode ser vista abaixo:
 +
 
 +
[[Imagem:SST_FlipFlop_VHDL2.png|thumb|Flip Flop tipo D com entrada ''set'' em VHDL|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
Comentários:
 +
 
 +
* A porta S foi incluída através de um novo teste dentro do processo
 +
* A prioridade da porta S sobre a porta D é implementada pela ordem dos IFs utilizada.
 +
 
 +
==== Entrada ''reset'' assíncrona e clock na borda de descida ====
 +
 
 +
[[Imagem:SST_FlipFlop_D_reset.png|thumb|Flip Flop tipo D com entrada ''reset''|300px|right]]
 +
 
 +
Neste caso, o Flip Flop tem as seguintes características:
 +
 
 +
* A entrada ''reset'' (R) fará com que a saída do Flip Flop seja "0", independente da sua entrada D.
 +
* Por ser assíncrona, essa alteração será realizada sempre que R for alterado.
 +
 
 +
A solução para o problema pode ser vista abaixo:
 +
 
 +
[[Imagem:SST_FlipFlop_VHDL3.png|thumb|Flip Flop tipo D com entrada ''reset'' em VHDL|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
Comentários:
 +
 
 +
* Como a entrada R é assíncrona, ela não depende do clock. Por isso, R foi incluída na lista de sensitividade do processo.
 +
* A prioridade da porta R sobre a porta D é implementada pela ordem dos IFs utilizada.
 +
 
 +
==== Flip Flop tipo T ====
 +
 
 +
A figura abaixo apresenta o diagrama de um flip flop tipo T;
 +
 
 +
[[Imagem:SST_FlipFlop_T1.png|thumb|Flip Flop tipo T|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
Abaixo, os estados possíveis do Flip Flop.
 +
 
 +
{{collapse top | Estados possíveis - Clicar no "+" para expandir }}
 +
[[Imagem:SST_FlipFlop_T2.png|frameless|500px|center]]
 +
{{collapse bottom}}
 +
 
 +
==== Flip Flop tipo T em VHDL ====
 +
 
 +
* '''Exercício''': Desenvolva um modelo VHDL para um Flip Flop tipo T como mostrado na seção anterior. Visando já sua aplicação como memória em um sistema maior, fazer com que a entrada D seja ''síncrona'', ou seja, só tenha influência na saída durante a borda de subida do sinal de clock.
 +
 
 +
Abaixo, a solução do problema.
 +
 
 +
{{SST20707-Hidden2}}
 +
 
 +
==== Tarefas ====
 +
 
 +
Fazer exercícios 1 a 6 do capítulo 6 (pg 86) do livro [1].
 +
 
 +
==== Referências ====
 +
 
 +
:: [1] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
 +
 
 +
=== Atributos ===
 +
 
 +
Tem por finalidade permitir a construção de códigos genéricos e monitorar sinais. Abaixo, alguns dos atributos mais utilizados:
 +
 
 +
==== Atributos de tipos escalares ====
 +
 
 +
Tendo sido criado um tipo enumerado, e uma variável deste tipo:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
TYPE t IS RANGE 0 TO 255;
 +
 
 +
SIGNAL s : t;
 +
 
 +
</syntaxhighlight>
 +
 
 +
Alguns dos atributos disponíveis são:
 +
 
 +
* t'LOW: 0
 +
* t'HIGH: 255
 +
* t'LEFT: 0
 +
* s'RIGHT: 255
 +
* t'RANGE: 0 TO 255
 +
* s'REVERSE_RANGE: 255 DOWNTO 0
 +
* s'ASCENDING: TRUE
 +
 
 +
==== Atributos de sinais ====
 +
 
 +
São utilizados para monitorar mudanças em sinais. O mais comum deles é o '''s'EVENT''', que retorna TRUE quando houve uma alteração de valor no sinal ''s''.
 +
 
 +
=== Pacotes ===
 +
Os pacotes são utilizados para realizar operações comuns. Podem ser utilizados para fazer declarações gerais ou descrever subprogramas. Segue a forma:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
PACKAGE <nome> IS
 +
  <declarações>
 +
END PACKAGE <nome>;
 +
 +
PACKAGE BODY <nome> IS
 +
  <corpo do subprograma>
 +
END PACKAGE BODY <nome>;
 +
 
 +
</syntaxhighlight>
 +
 
 +
Podem ser declaradas componentes, funções, generics e tipos de dados. A parte declarativa do pacote é utilizada para declaração de dados e o protótipo da função (parte do cabeçalho até "IS"). No corpo, as funções são construídas.
 +
 
 +
=== Exemplo de sistema sequencial ===
 +
 
 +
O exemplo abaixo, vindo de uma avaliação da disciplina do semestre 2015-1, implementa um relógio digital para contagem dos segundos. Foi desenvolvido a partir da seção 22.3 do livro do Pedroni [1], pelos alunos Nicole, Renan, Leonardo.
 +
 
 +
::; [[Avaliação 2 - SST|Exemplo de um temporizador (relógio digital)]]:
 +
 
 +
==== Referências ====
 +
 
 +
:: [1] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
 +
 
 +
=== Avaliação 2 - Sistemas sequenciais ===
 +
 
 +
{{collapse top | Avaliações dos semestres anteriores - 2015-1 - Clique no "+" para expandir}}
 +
Em duas equipes de 3 pessoas, estudar as seções abaixo do livro [1] e fazer uma apresentação da solução adotada.
 +
 
 +
; [[Avaliação 1 - SST | Equipe A (Kamila, Leonardo O., Rogério)]]:
 +
 
 +
:* 22.2 - Debouncer para chave
 +
:* 22.1 - Registrador de deslocamento com data-load
 +
 
 +
; [[Avaliação 2 - SST|Equipe B (Nicole, Renan, Leonardo)]]:
 +
 
 +
:* 22.3 - Temporizador
 +
:* 22.5 - Medidor de frequência
 +
{{collapse bottom}}
 +
 
 +
{{collapse top | Avaliações dos semestres anteriores - 2015-2 - Clique no "+" para expandir}}
 +
Construir um relógio digital no kit Altera DE2-115. O relógio deve ter as seguintes características:
 +
 
 +
::'''(1):''' Ele deve apresentar o horário nos displays de 7 segmentos disponíveis na placa, no formato abaixo, onde as siglas indicam respectivamente ''hora'', ''minuto'', ''segundo'' e ''centésimo de segundo'', com dois dígitos.
 +
 
 +
:::: '''HH MM SSCC'''
 +
 
 +
::'''(2):''' Deve estar disponível a possibilidade de alteração nos horários, a partir da seleção dessa função na chave SW0. Quando a chave está ativada, o relógio deve parar e entrar em modo de edição. Os quatro push-buttons serão usados para editar o horário, sendo suas funções definidas como abaixo:
 +
 
 +
:::: KEY3: Alterar edição para o dígito à esquerda
 +
:::: KEY2: Alterar edição para o dígito à direita
 +
:::: KEY1: Incrementar número
 +
:::: KEY0: Decrementar número
 +
 
 +
::'''(3):''' Deve estar disponível um cronômetro, a partir da seleção dessa função na chave SW1. Quando a chave está ativada, o display deve zerar e o sistema deverá ficar aguardando o usuário pressionar o botão KEY0. Quando isso acontecer, o cronômetro deverá começar a contar. Pressionar o botão KEY0 novamente deverá pausar a contagem. O botão KEY1 deverá ser usado para zerar o cronômetro. Quando a chave SW1 for desativada, o relógio deverá continuar o horário sem problemas de atraso (o relógio não deverá ficar parado durante o cronômetro).
 +
 
 +
::'''(4):''' Deve estar disponível um alarme, a partir da seleção na chave SW2. Quando a chave está ativada, o display deve zerar e o usuário entrará com a hora do alarme através dos push-buttons da mesma forma que o item '''(2)'''. Ao voltar a chave SW2 para a posição desativada, o relógio deverá continuar o horário sem problemas de atraso. Quando o relógio atingir o horário definido no alarme, os leds deverão piscar por 10 segundos.
 +
{{collapse bottom}}
 +
 
 +
{{collapse top | Avaliações dos semestres anteriores - 2016-1 - Clique no "+" para expandir}}
 +
Construir um relógio digital no kit Altera DE2-115. O relógio deve ter as seguintes características:
 +
 
 +
::'''(1):''' Ele deve apresentar o horário nos displays de 7 segmentos disponíveis na placa, no formato abaixo, onde as siglas indicam respectivamente ''hora'', ''minuto'', ''segundo'' e ''centésimo de segundo'', com dois dígitos.
 +
 
 +
:::: '''HH MM SSCC'''
 +
 
 +
::'''(2):''' Deve estar disponível a possibilidade de alteração nos horários, a partir da seleção dessa função na chave SW0. Quando a chave está ativada, o relógio deve parar e entrar em modo de edição. Os quatro push-buttons serão usados para editar o horário, sendo suas funções definidas como abaixo:
 +
 
 +
:::: KEY3: Alterar edição para o dígito à esquerda
 +
:::: KEY2: Alterar edição para o dígito à direita
 +
:::: KEY1: Incrementar número
 +
:::: KEY0: Decrementar número
 +
 
 +
::'''(3):''' Deve estar disponível um cronômetro, a partir da seleção dessa função na chave SW1. Quando a chave está ativada, o display deve zerar e o sistema deverá ficar aguardando o usuário pressionar o botão KEY0. Quando isso acontecer, o cronômetro deverá começar a contar. Pressionar o botão KEY0 novamente deverá pausar a contagem. O botão KEY1 deverá ser usado para zerar o cronômetro. Quando a chave SW1 for desativada, o relógio deverá continuar o horário sem problemas de atraso (o relógio não deverá ficar parado durante o cronômetro).
 +
 
 +
::'''(4):''' Deve estar disponível um alarme, a partir da seleção na chave SW2. Quando a chave está ativada, o display deve zerar e o usuário entrará com a hora do alarme através dos push-buttons da mesma forma que o item '''(2)'''. Ao voltar a chave SW2 para a posição desativada, o relógio deverá continuar o horário sem problemas de atraso. Quando o relógio atingir o horário definido no alarme, os leds deverão piscar por 10 segundos.
 +
 
 +
'''A avaliação será feita em duas partes:'''
 +
 
 +
:'''1.''' Desenhar o diagrama de blocos que explica o funcionamento do sistema
 +
::: * Data da entrega: 17 de maio
 +
:'''2.''' Desenvolver o sistema
 +
::: * Data da entrega: a definir
 +
{{collapse bottom}}
 +
 
 +
==== Avaliação do semestre atual ====
 +
 
 +
Construir um relógio digital no kit Altera DE2-115. O relógio deve ter as seguintes características:
 +
 
 +
::'''(1):''' Ele deve apresentar o horário nos displays de 7 segmentos disponíveis na placa, no formato abaixo, onde as siglas indicam respectivamente ''hora'', ''minuto'', ''segundo'' e ''centésimo de segundo'', com dois dígitos.
 +
 
 +
:::: '''HH MM SSCC'''
 +
 
 +
::'''(2):''' Deve estar disponível a possibilidade de alteração nos horários, a partir da seleção dessa função na chave SW0. Quando a chave está ativada, o relógio deve parar e entrar em modo de edição. Os quatro push-buttons serão usados para editar o horário, sendo suas funções definidas como abaixo:
 +
 
 +
:::: KEY3: Alterar edição para o dígito à esquerda
 +
:::: KEY2: Alterar edição para o dígito à direita
 +
:::: KEY1: Incrementar número
 +
:::: KEY0: Decrementar número
 +
 
 +
::'''(3):''' Deve estar disponível um cronômetro, a partir da seleção dessa função na chave SW1. Quando a chave está ativada, o display deve zerar e o sistema deverá ficar aguardando o usuário pressionar o botão KEY0. Quando isso acontecer, o cronômetro deverá começar a contar. Pressionar o botão KEY0 novamente deverá pausar a contagem. O botão KEY1 deverá ser usado para zerar o cronômetro. Quando a chave SW1 for desativada, o relógio deverá continuar o horário sem problemas de atraso (o relógio não deverá ficar parado durante o cronômetro).
 +
 
 +
::'''(4):''' Deve estar disponível um alarme, a partir da seleção na chave SW2. Quando a chave está ativada, o display deve zerar e o usuário entrará com a hora do alarme através dos push-buttons da mesma forma que o item '''(2)'''. Ao voltar a chave SW2 para a posição desativada, o relógio deverá continuar o horário sem problemas de atraso. Quando o relógio atingir o horário definido no alarme, os leds deverão piscar por 10 segundos.
 +
 
 +
'''A avaliação será feita em duas partes:'''
 +
 
 +
:'''1.''' Desenhar o diagrama de blocos que explica o funcionamento do sistema
 +
::: * Data da entrega: 08 de novembro
 +
:'''2.''' Desenvolver o sistema
 +
::: * Data da entrega: a definir
 +
 
 +
==== Referências ====
 +
 
 +
:: [1] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
 +
 
 +
=== Conversão de tipos de dados em VHDL ===
 +
 
 +
: [http://www.bitweenie.com/listings/vhdl-type-conversion/ BitWeenie] - Conersão de tipos em VHDL
 +
 
 +
=== Máquina de estados finitos em VHDL ===
 +
 
 +
====Introdução às máquinas de estados finitos====
 +
 
 +
Uma Máquina de Estados Finitos ('''FSM''' - ''Finite State Machine'') é um modelo matemático usado para representar sistemas. O '''estado atual''' é composto pelas informações armazenadas no sistema, e sofre modificações à medida que condições necessárias são atingidas. Assim, o próximo estado da máquina depende do estado atual e da entrada da máquina.
 +
 
 +
Um exemplo de uso de uma FSM é a codificação convolucional.
 +
 
 +
::*[[Media: SST20707_Convolucional_apresentacao.pdf | Apresentação sobre Codificação Convolucional]]
 +
 
 +
Outro exemplo são os porteiros eletrônicos com senha. O estado inicial indica que o sistema está aguardando os caracteres na entrada, e o último estado indica que a senha está correta. Os demais estados são o número de caracteres corretos entrados, e a entrada que faz o sistema transitar entre os estados é a senha correta.
 +
 
 +
[[Imagem:SST_Maquina_estados_1.png|thumb|Porteiro eletrônico com senha.|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
Para um texto interessante sobre FSM, consultar o [http://www.skorks.com/2011/09/why-developers-never-use-state-machines/ Link]
 +
 
 +
A figura abaixo apresenta um esquema de uma FSM. As entradas externas e o estado atual são convertidos pelo decodificador (''Next State Decoder'') para definir o próximo estado. No próximo pulso de clock, o novo estado é armazenado pelo registrador (''State Registers''), e o decodificador de saída (''Output Decoder'') define a saída baseado nesse novo estado.
 +
 
 +
[[Imagem:SST_Maquina_estados_2_diagrama.png|thumb|Diagrama de uma máquina de estados genérica [1].|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
 
 +
São características das FSMs:
 +
 
 +
* '''Estados dependentes ou independentes''': quando o evento de transição pode ser reconhecido sem referência ao estado presente, a máquina possui estados independentes. Do contrário (e mais comum), quando para saber o próximo estado é usada informação da entrada e do estado presente. a máquina é dita possuir estados dependentes.
 +
* '''Máquina de Moore e Mealy''': quando a saída da máquina depende apenas do estado presente, o sistema é uma máquinda de Moore, quando a saída depende também das entradas, o sistema é uma máquina de Mealy.
 +
 
 +
====Implementação em VHDL====
 +
 
 +
A implementação em VHDL de uma máquina de estados segue o esquema da figura abaixo. São comentários dessa abordagem:
 +
 
 +
* Separa a implementação em dois processos:
 +
:* Processo síncrono: trata os procedimentos referentes ao clock e ao registrador
 +
:* Processo combinatório: realiza as funções dos blocos codificadores e decodificadores
 +
* Nomenclatura:
 +
:* '''Parallel Inputs''': são as entradas de controle dos registradores (enables, presets, clears, etc)
 +
:* '''State Transition Inputs''': entradas que causam transição de estados na máquina
 +
:* '''Present State''': são usados tanto para decodificação do próximo estado quanto para decodificação do sinal de saída
 +
 
 +
[[Imagem:SST_Maquina_estados_3_diagrama_vhdl.png|thumb|Diagrama da implementação em VHDL de uma máquina de estados genérica [1].|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
Seguindo a abordagem do livro [1], a implementação será apresentada via exemplos:
 +
 
 +
; Exemplo 1: Máquina de Moore simples
 +
 
 +
Vamos escrever o código VHDL que implementa a máquina de estados da figura abaixo. À direita, a caixa-preta do sistema (dica para a declaração da entidade):
 +
 
 +
[[Imagem:SST_FSM_ex1_diagrama_vhdl.png|thumb|Máquina de estados do exemplo 1 [1].|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
O código com a solução está disponível na figura abaixo:
 +
 
 +
[[Imagem:SST_FSM_ex1_codigo_vhdl.png|thumb|Solução do exemplo 1 [1].|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
São comentários da solução:
 +
 
 +
* Seguindo o diagrama apresentado anteriormente, são dois os processos definidos: um síncrono e outro combinacional
 +
* Foi criado um tipo especial para representar os estados, e as variáveis ''PS'' e ''NS'' (''Present State'' e ''Next State'') são deste tipo
 +
* O formato do processo síncrono é muito semelhante ao de um flip-flop tipo D simples
 +
* Embora o VHDL trabalhe em paralelo, a definição dos dois processos acaba criando uma estrutura sequencial, onde um processo dispara um evento para o outro
 +
* Como a atribuição é feita fora do '''IF''', o sinal de saída ''Z1'' depende apenas do estado atual. Isso define uma máquina de Moore
 +
* A saída ''Z1'' é pré-atribuída com o valor 0 antes da instrução '''CASE''' na linha 31. Isto é apenas uma boa prática de programação, já que a variável recebe um valor para todos os casos possíveis
 +
 
 +
[[Imagem:SST_FSM_ex1_diagrama2_vhdl.png|thumb|Acrescentando como saída o estado atual no exemplo 1 [1].|500px|right]]
 +
 
 +
Uma possível necessidade do projeto de FSMs, é que o estado atual seja também uma saída. Nesse caso, o sistema agiria como o diagrama ao lado, e o código de solução para o problema pode ser visto abaixo:
 +
 
 +
[[Imagem:SST_FSM_ex1_codigo_vhdl2.png|thumb|Solução do exemplo 1 com o estado na saída [1].|500px|center]]
 +
 
 +
Comentários:
 +
 
 +
* Apenas a parte final foi alterada, com a adição de uma atribuição de seleção para a variável ''Y''
 +
 
 +
 
 +
; Exemplo 2: Máquina de Mealy de 3 estados
 +
 
 +
Vamos escrever o código VHDL que implementa a máquina de estados da figura abaixo. À direita, a caixa-preta do sistema (dica para a declaração da entidade):
 +
 
 +
[[Imagem:SST_FSM_ex2_diagrama_vhdl.png|thumb|Máquina de estados do exemplo 2 [1].|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
O código com a solução está disponível na figura abaixo:
 +
 
 +
[[Imagem:SST_FSM_ex2_codigo_vhdl.png|thumb|Solução do exemplo 2 [1].|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
São comentários da solução:
 +
 
 +
* Os primeiros dois casos de saída são tratados fora da instrução '''IF''', como na máquina de Moore. Isso acontece porque independente da entrada, a saída é sempre a mesma para estes estados.
 +
* O terceiro caso trata efetivamente uma saída de Mealy
 +
* Um arranjo de dois bits é usado para levar os estados à saída
 +
 
 +
 
 +
; Exemplo 3: Máquina mista de 4 estados e RESET
 +
 
 +
Vamos escrever o código VHDL que implementa a máquina de estados da figura abaixo. À direita, a caixa-preta do sistema (dica para a declaração da entidade):
 +
 
 +
[[Imagem:SST_FSM_ex3_diagrama_vhdl.png|thumb|Máquina de estados do exemplo 3 [1].|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
O código com a solução está disponível na figura abaixo:
 +
 
 +
[[Imagem:SST_FSM_ex3_codigo_vhdl.png|thumb|Solução do exemplo 3 [1].|500px|center]]
 +
<br style="clear:both;">
 +
 
 +
São comentários da solução:
 +
 
 +
* O ''RESET'' está disponível na lista de sensibilidade do processo síncrono, mas não depende do clock
 +
* Há duas saídas disponíveis: ''Z1'' para Moore e ''Z2'' para Mealy
 +
 
 +
====Implementação no kit didático====
 +
 
 +
Alguns problemas podem ocorrer no momento da implementação real num kit didático. Abaixo, são destacadas algumas soluções conhecidas:
 +
 
 +
=====Problema "State-Bypass"=====
 +
 
 +
Quando botões são usados para gerar a transição entre estados, o uso do nível faz com que sejam efetuadas múltiplas transições entre os estados. O código abaixo resolve esse problema, a partir do uso de um "Flag". Esta solução foi retirada da seção 11.5 do livro [3].
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
library ieee;
 +
use ieee.std_logic_1164.all;
 +
 
 +
-- Sistema que altera o estado de um LED sempre que
 +
-- um botao e pressionado. Exemplo simples de uso de
 +
-- uma maquina de estados, com protecao contra transicoes
 +
-- indesejadas entre os estados (State-Bypass Problem).
 +
 
 +
entity my_fsm1 is
 +
 
 +
port (
 +
entrada_botao : in std_logic;
 +
CLK, CLR : in std_logic;
 +
saida_led : out std_logic
 +
);
 +
 
 +
end entity;
 +
 
 +
architecture fsm1 of my_fsm1 is
 +
 +
-- Sinais da maquina de estados
 +
type state_type is (ST0, ST1);
 +
signal PS,NS : state_type;
 +
 +
-- Flag usado para impedir que o botao
 +
-- seja pressionado mais de uma vez
 +
signal flag : std_logic;
 +
 +
begin
 +
 +
--------------------------------------- Geracao do Flag
 +
gen_flag: process (CLK)
 +
begin
 +
-- Testa se o botao esta solto a cada
 +
-- pulso de clock. Sempre que estiver
 +
-- solto, marca o flag como ativo.
 +
-- Lembrar que o botao e ativo baixo.
 +
if rising_edge(CLK) then
 +
if entrada_botao = '1' then
 +
flag <= '1';
 +
else
 +
flag <= '0';
 +
end if;
 +
end if;
 +
end process;
 +
 +
--------------------------------------- Processo sincrono
 +
sync_proc: process(CLK,CLR)
 +
begin
 +
-- Codigo normal da maquina de estados
 +
if CLR = '0' then
 +
PS <= ST0;
 +
elsif (rising_edge(CLK)) then
 +
PS <= NS;
 +
end if;
 +
 +
end process;
 +
 +
--------------------------------------- Processo assincrono
 +
comb_proc: process(entrada_botao)
 +
begin
 +
 +
case PS is
 +
when ST0 =>
 +
saida_led <= '0';
 +
-- O teste do botao e feito com relacao
 +
-- tambem ao flag. Se o botao estava solto
 +
-- nesse pulso de clock, entao o flag tera
 +
-- o valor 1. Esse fato e usado para testar
 +
-- a condicao de transicao de estado.
 +
if (entrada_botao = '0' and flag = '1') then
 +
NS <= ST1;
 +
else
 +
NS <= ST0;
 +
end if;
 +
when ST1 =>
 +
saida_led <= '1';
 +
if (entrada_botao = '0' and flag = '1') then
 +
NS <= ST0;
 +
else
 +
NS <= ST1;
 +
end if;
 +
when others =>
 +
-- Condicao nao necessaria de ser avaliada
 +
end case;
 +
 +
end process;
 +
 
 +
end architecture;
 +
 
 +
 
 +
</syntaxhighlight>
 +
 
 +
====Tarefas====
 +
 
 +
Resolver os exercícios do capítulo 7 do livro [1] indicados abaixo. Desconsidere a frase "''The state variables should be encoded as listed''" nos exercícios.
 +
 
 +
* 1, 2, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14.
 +
 
 +
Estudar os exemplos dos capítulos 23.1 e 23.3 do livro [2].
 +
 
 +
====Referências====
 +
 
 +
:: [1] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
 +
:: [2] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
 +
:: [3] Pedroni, Volnei A. '''Circuit Design Simulation with VHDL'''. 2ª edição. Londres: Mit Press, 2010.
 +
 
 +
===Simulação de circuitos usando VHDL===
 +
 
 +
Nesta aula, vamos entender como usar o VHDL para ''simular'' um circuito. Assim, o VHDL pode ser usado para:
 +
 
 +
* ''Síntese'': tradução do código-fonte em um conjunto de estruturas de hardware para construção do sistema
 +
* ''Simulação'': Procedimento de teste usado para verificar se o circuito sintetizado está de acordo com o esperado. É composto pela geração de sinais a serem inseridos no sistema a ser testado (''Design Under Test'' - DUT) e por uma verificação das saídas produzidas (opcional). Em VHDL, a simulação é feita por dois conjuntos de arquivos:
 +
:* O projeto em si
 +
:* As rotinas de criação de sinais e veirificação de resultados, comumente chamado de ''testbench''
 +
 
 +
Toda esta seção é baseada no capítulo 24 e no anexo A ([http://www.vhdl.us/Book_VHDL_2ed_unrestricted/Pedroni_VHDL_2ed_tutorial_ModelSim_10.1d_v2.pdf Link]) do livro [1].
 +
 
 +
==== Tipos de ''testbenches'' ====
 +
 
 +
A simulação em VHDL é dividida em '''funcional''' e '''temporal''', onde a segunda inclui os tempos de propagação dos sinais dentro do circuito. Assim, adicionando a possibilidade de verificar automaticamente as saídas produzidas pelo sistema, são 4 os tipos de ''testbenches'' disponíveis em VHDL:
 +
 
 +
{| class="wikitable"
 +
! style="font-weight: bold;" | Tipo de testbench
 +
! style="font-weight: bold;" | Simulação
 +
! style="font-weight: bold;" | Verificação da saída
 +
|-
 +
| style="text-align: center;" | 1
 +
| style="font-style: italic;" | Funcional
 +
| style="font-style: italic;" | Manual
 +
|-
 +
| style="text-align: center;" | 2
 +
| style="font-style: italic;" | Temporal
 +
| style="font-style: italic;" | Manual
 +
|-
 +
| style="text-align: center;" | 3
 +
| style="font-style: italic;" | Funcional
 +
| style="font-style: italic;" | Automática (VHDL)
 +
|-
 +
| style="text-align: center;" | 4
 +
| style="font-style: italic;" | Temporal
 +
| style="font-style: italic;" | Automática (VHDL)
 +
|}
 +
 
 +
==== Instruções de tempo em VHDL ====
 +
 
 +
Para definir os sinais a serem usados nas simulações, estão disponíveis instruções temporais em VHDL:
 +
 
 +
===== AFTER =====
 +
 
 +
Realiza a atribuição (concorrente) após um período de tempo pré-definido:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
A <= B and C AFTER 5 ns;
 +
 
 +
</syntaxhighlight>
 +
 
 +
A instrução acima indica que A receberá o resultado de "B and C", 5 nano segundos após a geração do evento que fez a instrução ser executada (alteração nos sinais B ou C).
 +
 
 +
===== WAIT =====
 +
 
 +
Usado dentro de processos explícitos (sequencial) sem lista de sensibilidade, o WAIT faz o processo aguardar 3 tipos de situações:
 +
 
 +
* Uma condição seja satisfeita:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
WAIT UNTIL clk'EVENT and clk='1';
 +
 
 +
</syntaxhighlight>
 +
 
 +
* Um sinal mude de valor:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
WAIT ON clk;
 +
 
 +
</syntaxhighlight>
 +
 
 +
* Um tempo seja transcorrido:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
WAIT FOR 5 ns;
 +
 
 +
</syntaxhighlight>
 +
 
 +
==== Geração de sinais para simulação ====
 +
 
 +
Abaixo, formas de gerar sinais para simulação, mostradas na figura abaixo:
 +
 
 +
[[Imagem:SST_VHDL_modelsim.png|thumb| Sinais gerados para testbench.|650px|center]]
 +
<br style="clear:both;">
 +
 
 +
===== Formas de onda periódicas regulares =====
 +
 
 +
Usadas geralmente na construção de sinais de clock.
 +
 
 +
* Usando a instrução AFTER:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
SIGNAL clk : BIT := '1';
 +
 +
clk <= NOT clk AFTER 30 ns;
 +
 
 +
</syntaxhighlight>
 +
 
 +
* Usando a instrução WAIT:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
SIGNAL clk : BIT := '1';
 +
 +
PROCESS IS
 +
BEGIN
 +
  WAIT FOR 30 ns;
 +
  clk <= NOT clk;
 +
END PROCESS;
 +
 
 +
</syntaxhighlight>
 +
 
 +
* Usando a instrução WAIT:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
SIGNAL clk : BIT := '1';
 +
 +
PROCESS IS
 +
BEGIN
 +
  WAIT FOR 30 ns;
 +
  clk <= '0';
 +
  WAIT FOR 30 ns;
 +
  clk <= '1';
 +
END PROCESS;
 +
 
 +
</syntaxhighlight>
 +
 
 +
===== Formas de onda de um só pulso =====
 +
 
 +
Usadas principalmente na geração de sinais de enable ou reset. Por não trazer uma condição limite, a última instrução WAIT prende a execução do processo.
 +
 
 +
* Usando a instrução AFTER:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
SIGNAL rst : BIT := '0';
 +
 
 +
rst <= '1' AFTER 70 ns, '0' AFTER 100 ns;
 +
 
 +
</syntaxhighlight>
 +
 
 +
* Usando a instrução WAIT:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
SIGNAL rst : BIT := '0';
 +
 +
PROCESS IS
 +
BEGIN
 +
  WAIT FOR 70 ns;
 +
  rst <= '1';
 +
  WAIT FOR 30 ns;
 +
  rst <= '0';
 +
  WAIT;
 +
END PROCESS;
 +
 
 +
</syntaxhighlight>
 +
 
 +
===== Formas de onda não periódica irregular =====
 +
 
 +
Podem ser utilizadas para simular um padrão de entrada de um sistema de comunicação.
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
CONSTANT onda1 : BIT_VECTOR(1 to 8) := "10100111";
 +
SIGNAL x : BIT := '0';
 +
 +
PROCESS IS
 +
BEGIN
 +
  FOR i IN onda'RANGE LOOP
 +
      x <= onda1(i);
 +
      WAIT FOR 30 ns;
 +
  END LOOP;
 +
  WAIT;
 +
END PROCESS
 +
 
 +
</syntaxhighlight>
 +
 
 +
===== Formas de onda periódica irregular =====
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
CONSTANT onda2 : BIT_VECTOR(1 to 8) := "10100111";
 +
SIGNAL y : BIT := '0';
 +
 
 +
PROCESS IS
 +
BEGIN
 +
  FOR i IN onda'RANGE LOOP
 +
      y <= onda2(i);
 +
      WAIT FOR 30 ns;
 +
  END LOOP;
 +
END PROCESS
 +
 
 +
</syntaxhighlight>
 +
 
 +
===== Formas de onda Multibit =====
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
SIGNAL inteiro : INTEGER RANGE 0 to 255;
 +
 +
PROCESS IS
 +
BEGIN
 +
  inteiro <= 0;
 +
  WAIT FOR 70 ns;
 +
  inteiro <= 5;
 +
  WAIT FOR 30 ns;
 +
  inteiro <= 64;
 +
  WAIT FOR 12 ns;
 +
END PROCESS;
 +
 
 +
</syntaxhighlight>
 +
 
 +
==== Geração de Testbenches ====
 +
 
 +
Um código genérico para gerar testbenches está disponível abaixo. Repare que o DUT (Design Under Test) é trazido para o testbench como uma componente, e são gerados os sinais de entradas como na seção anterior.
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
LIBRARY ieee;
 +
USE ieee.std_logic_1164.all;
 +
 
 +
ENTITY <nome_do_testbench> IS
 +
END ENTITY;
 +
 
 +
ARCHITECTURE <nome_da_arquitetura> OF <nome_do_testbench> IS
 +
 
 +
  -- Declaração da componente do sistema a ser testado
 +
  COMPONENT <nome_do_DUT> IS
 +
      PORT (<lista_de_portas_de_entrada_e_saída>);
 +
  END COMPONENT;
 +
 
 +
  -- Declaração dos sinais de entrada e saída que serão instanciados na componente
 +
 
 +
BEGIN
 +
 
 +
  -- Instanciamento da componente
 +
  DUT: <nome_do_DUT> PORT MAP (sinal1 => sinal1, sinal2 => sinal2, ...)
 +
 
 +
  -- Geração dos sinais
 +
 
 +
END ARCHITECTURE
 +
 
 +
</syntaxhighlight>
 +
 
 +
onde:
 +
 
 +
* <nome_do_testbench>: normalmente chamado de teste_<nome_do_DUT>
 +
* <nome_da_arquitetura>: qualquer nome
 +
 
 +
==== Testbenches tipo 1 e 2 ====
 +
 
 +
Nestes tipos de testbench, temos uma simulação sem e com os atrasos de propagação e a verificação dos resultados é feita sempre manualmente. Será feita a simulação para um sistema divisor de clock, que divide o seu clock de entrada por 10. Uma entrada enable (''ena'') ativa alta é prevista para habilitar a divisão de clock ou não (saída zero).
 +
 
 +
O código VHDL do sistema a ser testado (DUT) está disponível abaixo:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
------------------------------- Arquivo clock_divider.vhd
 +
 
 +
LIBRARY ieee;
 +
USE ieee.std_logic_1164.all;
 +
 
 +
ENTITY clock_divider IS
 +
PORT ( clk, ena : IN STD_LOGIC;
 +
output : OUT STD_LOGIC := '0');
 +
END ENTITY;
 +
 
 +
ARCHITECTURE clock_divider OF clock_divider IS
 +
CONSTANT max : NATURAL := 5;
 +
BEGIN
 +
 
 +
PROCESS (clk)
 +
VARIABLE count : NATURAL RANGE 0 TO max := 0;
 +
VARIABLE temp : STD_LOGIC := '0';
 +
BEGIN
 +
IF (clk'EVENT and clk='1') THEN
 +
IF (ena='1') THEN
 +
count := count + 1;
 +
IF (count=max) THEN
 +
temp := NOT temp;
 +
count := 0;
 +
END IF;
 +
END IF;
 +
output <= temp;
 +
END IF;
 +
END PROCESS;
 +
 
 +
END ARCHITECTURE;
 +
 
 +
</syntaxhighlight>
 +
 
 +
E o código VHDL do testbench é:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
------------------------------- Arquivo test_clock_divider.vhd
 +
 
 +
Library ieee;
 +
USE ieee.std_logic_1164.all;
 +
 
 +
ENTITY test_clock_divider IS
 +
END ENTITY;
 +
 
 +
ARCHITECTURE test_clock_divider OF test_clock_divider IS
 +
 
 +
------ Componente --------
 +
COMPONENT clock_divider IS
 +
PORT (clk, ena : IN STD_LOGIC;
 +
output : OUT STD_LOGIC);
 +
END COMPONENT;
 +
 
 +
 
 +
SIGNAL clk : STD_LOGIC := '0';
 +
SIGNAL ena : STD_LOGIC := '0';
 +
SIGNAL output : STD_LOGIC := '0';
 +
 
 +
BEGIN
 +
 +
----- Instanciação da componente --------
 +
dut: clock_divider PORT MAP (clk => clk, ena => ena, output => output);
 +
 
 +
----- Geração do clock -----
 +
clk <= NOT clk AFTER 30 ns;
 +
 
 +
----- Geração do enable -----
 +
 
 +
PROCESS IS
 +
BEGIN
 +
    WAIT FOR 60 ns;
 +
    ena <= '1';
 +
    WAIT;
 +
END PROCESS;
 +
 
 +
 
 +
END ARCHITECTURE;
 +
 
 +
</syntaxhighlight>
 +
 
 +
Para executá-los no Modelsim, estudar as seções 24.6 e 24.7 do livro [1], fazendo uso do apêndice A do mesmo livro, disponível em ([http://www.vhdl.us/Book_VHDL_2ed_unrestricted/Pedroni_VHDL_2ed_tutorial_ModelSim_10.1d_v2.pdf Link]).
 +
 
 +
===== Executando o Modelsim no Laboratório de programação =====
 +
 
 +
Executar a linha abaixo para abrir o Modelsim:
 +
 
 +
/opt/altera/13.0/quartus/modelsim_ase/linuxaloem/vsim
 +
 
 +
Para acesso via Cloud, ver tutorial em [[Acesso ao IFSC-CLOUD#Como executar o Modelsim-Altera|Link]].
 +
 
 +
Um tutorial interessante sobre o uso do Modelsim foi escrito pelo Professor Marcos Moecke, disponível em [[Seguindo o tutorial da ALTERA para o MODELSIM|Link]]
 +
 
 +
==== Testbenches tipo 3 ====
 +
 
 +
Este caso representa as simulações com verificação automática, sem a consideração dos atrasos de propagação. Vamos usar o mesmo projeto de divisor de clock da seção anterior, porém o testbench é modificado com as instruções de verificação. O código do testbench pode ser visto abaixo:
 +
 
 +
;:<syntaxhighlight lang=vhdl>
 +
 
 +
------------------------------- Arquivo test_clock_divider.vhd
 +
 
 +
Library ieee;
 +
USE ieee.std_logic_1164.all;
 +
 
 +
ENTITY test_clock_divider IS
 +
END ENTITY;
 +
 
 +
ARCHITECTURE test_clock_divider OF test_clock_divider IS
 +
 
 +
------ Componente --------
 +
COMPONENT clock_divider IS
 +
PORT (clk, ena : IN STD_LOGIC;
 +
output : OUT STD_LOGIC);
 +
END COMPONENT;
 +
 
 +
 
 +
SIGNAL clk : STD_LOGIC := '0';
 +
SIGNAL ena : STD_LOGIC := '0';
 +
SIGNAL output : STD_LOGIC := '0';
 +
 
 +
-- Sinal utilizado na verificação dos resultados
 +
SIGNAL template : STD_LOGIC;
 +
 
 +
BEGIN
 +
 +
----- Instanciação da componente --------
 +
dut: clock_divider PORT MAP (clk => clk, ena => ena, output => output);
 +
 
 +
----- Geração do clock -----
 +
clk <= NOT clk AFTER 30 ns;
 +
 
 +
----- Geração do enable -----
 +
 
 +
PROCESS IS
 +
BEGIN
 +
    WAIT FOR 60 ns;
 +
    ena <= '1';
 +
    WAIT;
 +
END PROCESS;
 +
 
 +
----- Geração do sinal de saída desejado -----
 +
PROCESS IS
 +
BEGIN
 +
WAIT FOR 330 ns;
 +
WHILE ena='1' LOOP
 +
template <= NOT template;
 +
WAIT FOR 300 ns;
 +
END LOOP;
 +
END PROCESS;
 +
 
 +
----- Comparação da saida efetiva com a saída desejada -----
 +
PROCESS IS
 +
BEGIN
 +
WAIT FOR 10 ns;
 +
ASSERT (output=template)
 +
REPORT "Saida diferente do desejado!"
 +
SEVERITY FAILURE;
 +
IF (NOW=2000 ns) THEN
 +
ASSERT FALSE
 +
REPORT "Saida esta OK"
 +
SEVERITY NOTE;
 +
END IF;
 +
END PROCESS;
 +
 
 +
END ARCHITECTURE;
 +
 
 +
</syntaxhighlight>
 +
 
 +
São comentários:
 +
 
 +
* O sinal ''template'' cria a forma de onda de saída esperada. Isso é feito no segundo processo explícito do código. Inicialmente, é dado o atraso necessário para considerar as 5 bordas de subida de clock mais o atraso do sinal de enable (330 ns). Após esse atraso, o sinal é alternado a cada 300 ns.
 +
* A comparação da saída com a desejada é feita, a cada 10 ns, através da instrução '''ASSERT''', que quando recebe o lógico falso executa as instruções '''REPORT''', que exibe uma mensagem na tela, e '''SEVERITY''', que define o nível da mensagem. São níveis da instrução:
 +
:* NOTE: apenas informação
 +
:* WARNING: alerta
 +
:* ERROR: problema
 +
:* FAILURE: problema grave
 +
 
 +
A execução dos testes no Modelsim segue o tutorial do exemplo anterior.
 +
 
 +
Repare que como o sinal ''template'' não recebe a informação do valor inicial, o Modelsim cairá no caso em que ele e ''output'' são diferentes. Para corrigir este provlema, basta adicionar o valor inicial ao sinal.
 +
 
 +
==== Testbenches tipo 4 ====
 +
 
 +
A principal diferença do tipo 3 para o tipo 4 é que o sinal desejado deve considerar os atrasos de propagação. Para isso, faz-se um teste com a verificação manual (tipo 2) e analisa-se o atraso gerado. Este atraso deve ser incluído no sinal desejado.
 +
 
 +
No exemplo da seção anterior, a única diferença é que o atraso inicial do sinal de saída desejado seria maior que 330 ns.
 +
 
 +
==== Referências ====
 +
 
 +
:: [1] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
 +
 
 +
=== Signal Tap ===
 +
 
 +
Nesta aula temos um caso de uso da ferramenta de depuração Signal Tap, disponível no Quartus II. Na apresentação, é criado um sinal senoidal usando o MegaWizard, e o sinal é visualizado na ferramenta. A aula é baseada totalmente no desenvolvimento do sistema e configuração das ferramentas, e um tutorial sobre o Signal Tap pode ser visto em [[Configuração e uso do Signal Tap]].
 +
 
 +
=== Oficina NCO e Filtros Digitais ===
 +
 
 +
Nesta aula construiremos um sistema composto pela geração de sinais senoidais e a construção de filtros digitais em FPGAs Altera, usando o Quartus II. O sistema criado gera sinais senoidais de 1 MHz e 4 MHz, soma os dois sinais e realiza uma filtragem passa baixas, visando manter apenas o sinal de 1 MHz. Um passo a passo está disponível em [[Oficina NCO e Filtros digitais|Link]].
 +
 
 +
=== Nios II ===
 +
 
 +
A Altera disponibiliza um processador para ser embarcado no FPGA, chamado de Nios II. Vamos desenvolver uma aplicação simples em software e fazê-la rodar no FPGA. O sistema consistirá dos seguintes blocos:
  
==== Flip Flop tipo T em VHDL ====
+
[[Imagem:Sistema_nios2.gif|thumb|Sistema com processador Nios II|500px|center]]
  
* '''Exercício''': Desenvolva um modelo VHDL para um Flip Flop tipo T como mostrado na seção anterior. Visando já sua aplicação como memória em um sistema maior, fazer com que a entrada D seja ''síncrona'', ou seja, só tenha influência na saída durante a borda de subida do sinal de clock.
+
Vamos precisar destes documentos para desenvolver este tutorial:
  
Abaixo, a solução do problema.
+
* [http://docente.ifsc.edu.br/arliones.hoeller/dlp2/docs/tt_nios2_hardware_tutorial-with_markings.pdf Tutorial com pontos importantes destacados.]
 +
* Código-base para início do tutorial [https://www.altera.com/content/dam/altera-www/global/en_US/others/literature/tt/niosii_hw_dev_tutorial.zip na ALTERA],[http://docente.ifsc.edu.br/moecke/DLP2/niosii_hw_dev_tutorial.zip no IFSC]
  
{{SST20707-Hidden2}}
+
=== Avaliação 3 ===
  
==== Tarefas ====
+
{{collapse top | Avaliações dos semestres anteriores - 2015-1 - Clique no "+" para expandir}}
  
Fazer exercícios 1 a 6 do capítulo 6 (pg 86) do livro [1].
+
A ideia é fazer um relógio digital, com horas, minutos e segundos, com possibilidade de reset e ajuste de tempo. Duas equipes foram criadas:
  
==== Referências ====
+
* Equipe 1: Leonardo, Nicole e Rogério ([[PROJETO FINAL - SST|Página]])
 +
* Equipe 2: Kamila, Leonardo Oliveira ([[PROJETO FINAL - Grupo 2 - SST|Página]])
 +
* Equipe 3: Renan ([[PROJETO FINAL - Grupo 3 - SST|Página]])
  
:: [1] Mealy, B. Tappero, F. '''Free Range VHDL'''. Free Range factory. Disponível em [http://www.freerangefactory.org/site/pmwiki.php/Main/Books Link]. Acesso em 27/02/2015.
+
{{collapse bottom}}
  
=== Avaliação 2 - Sistemas sequenciais ===
+
{{collapse top | Avaliações dos semestres anteriores - 2015-2 - Clique no "+" para expandir}}
  
Em duas equipes de 3 pessoas, estudar as seções abaixo do livro [1] e fazer uma apresentação da solução adotada.
+
Projete um sistema de controle para uma máquina que vende balas por 25 centavos. O sistema deverá ser implementado em VHDL, fazendo uso do kit DE2-115 da Altera, tendo as seguintes considerações:
  
; Equipe A (Kamila, Leonardo O., Rogério):
+
# Apenas serão aceitas moedas de 5, 10 e 25 centavos, e a entrada das moedas na máquina deverá ser simulada através de um ''push button''.
 +
# Quando a quantia de 25 centavos for somada dentro da máquina, os leds verdes deverão piscar 3 vezes, indicando que o doce está disponível, e permanecer acesos.
 +
# A quantia introduzida na máquina deverá ser exibida em tempo real no display de 7 segmentos.
 +
# A máquina deverá prever uma chave de liga-desliga. Assim, quando KEY0 estiver desligada, a máquina não receberá nenhuma moeda.
 +
# Após o recebimento de um doce/troco, a máquina deverá ser reiniciada para começar uma nova venda.
 +
# Repare que é possível que o usuário introduza mais do que 25 centavos (Ex: 10 + 10 + 10). Nesse caso, a máquina deverá devolver o troco junto com o doce. Isso será feito com os leds vermelhos:
 +
::* Os leds da esquerda indicam quantas moedas de 10 centavos serão devolvidas.
 +
::* Os leds da direita indicam quantas moedas de 5 centavos serão devolvidas.
  
:* 22.2 - Debouncer para chave
+
;Informações importantes:
:* 22.1 - Registrador de deslocamento com data-load
 
  
; Equipe B (Nicole, Renan, Leonardo):
+
:* Cuidado no projeto do sistema para evitar que o botão seja contado mais de uma vez na mesma pressionada (use o ''rising edge'')
 +
:* Nesse tipo de sistema, a implementação é facilitada quando a abordagem com máquina de estados é utilizada. Tente fazer o diagrama!
 +
:* O trabalho é INDIVIDUAL, embora vocês possam se ajudar
  
:* 22.3 - Temporizador
+
{{collapse bottom}}
:* 22.5 - Medidor de frequência
 
  
==== Referências ====
+
==== Avaliação do semestre atual ====
 
 
:: [1] Pedroni, Volnei A. '''Eletrônica Digital Moderna e VHDL'''. Rio de Janeiro: Elsevier, 2010.
 
 
 
=== Pacotes ===
 
Os pacotes são utilizados para realizar operações comuns. Podem ser utilizados para fazer declarações gerais ou descrever subprogramas. Segue a forma:
 
 
 
;:<syntaxhighlight lang=vhdl>
 
 
 
PACKAGE <nome> IS
 
  <declarações>
 
END PACKAGE <nome>;
 
 
PACKAGE BODY <nome> IS
 
  <corpo do subprograma>
 
  <especificação de constantes>
 
END PACKAGE BODY <nome>;
 
 
 
</syntaxhighlight>
 
  
A seguir, algumas das estruturas que podem ser descritas nos pacotes.
+
A avaliação final consistirá da finalização do relógio digital iniciado na avaliação 2.
  
 
==Macetário==
 
==Macetário==
Linha 1 881: Linha 3 522:
 
       nome2, nome4 : <type> (:= <initial value>)
 
       nome2, nome4 : <type> (:= <initial value>)
 
   );
 
   );
END ENTITY <entity_name>
+
END ENTITY <entity_name>;
  
 
</syntaxhighlight>
 
</syntaxhighlight>
Linha 2 102: Linha 3 743:
  
 
* [http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=379764 Brown - An overview of technology, architecture and CAD tools for programmable logic devices]
 
* [http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=379764 Brown - An overview of technology, architecture and CAD tools for programmable logic devices]
 +
* [http://eletro.g12.br/arquivos/materiais/eletronica4.pdf Apostila de eletrônica digital do Centro Paula Souza do Estado de São Paulo]

Edição atual tal como às 11h32min de 24 de abril de 2018

Ementa e referências bibliográficas

Informações da disciplina


  • Kit utilizado: EP4CE115F29C7


  • Plano de Ensino 2018-1 - Ver SIGAA
Atividades previstas - Clicar no "+" para expandir

Em 2018-1, combinamos com os alunos o esquema de aulas como abaixo:

  • Aula quinzenal de 4 horas, nas terças-feiras, das 7:30 as 11:30.
  • Aula semanal de 1 hora, nas sextas-feiras, das 9:40 as 10:35. A aula de sexta ficará sempre como aula livre para exercícios e dúvidas.
Aula Data Horas Conteúdo Recursos
01 21/02 - qua 3 Apresentação da disciplina e Dispositivos lógicos programáveis – PLD; Tecnologia de FPGA; Projetos em FPGA
02 27/02 - ter 4 Exercicios; Introdução ao VHDL; Objetos e atribuições
03 13/03 - ter 4 Correção dos exercícios; Abordagens; Atribuições de variaveis em simulações; Outros tópicos em VHDL
04 27/03 - ter 4 Abordagem estrutural; Exercícios
05 10/04 - ter 4 Avaliação – Sistemas combinacionais
06 24/04 - ter 4 Circuitos sequenciais em VHDL; Atributos; Pacotes; Conversão de tipos; Exemplos de sistemas sequenciais em VHDL
07 08/05 - ter 4 Maquina de estados finitos em VHDL
08 22/05 - ter 4 Simulação de circuitos usando VHDL
09 05/06 - ter 4 Oficina NCO e Filtros digitais
10 19/06 - ter 4 Trabalho final
11 03/07 - ter 4 Trabalho final
TOTAL 60
Planos de ensino anteriores - Clicar no "+" para expandir
Atividades previstas - Clicar no "+" para expandir
Aula Data Horas Conteúdo Recursos
01 01/08 - ter 2 Apresentação da disciplina e Dispositivos lógicos programáveis - PLD
02 04/08 - sex 2 Tecnologia de FPGA e Projetos em FPGA
03 08/08 - ter 2 Desenvolvimento via esquemático e Exercício 1
04 11/08 - sex 2 Introdução ao VHDL
05 15/08 - ter 2 Objetos e atribuições
06 18/08 - sex 2 Correção dos exercícios propostos
07 22/08 - ter 2 Abordagens
08 25/08 - sex 2 Atribuições de variáveis em simulações e Outros tópicos em VHDL
09 29/08 - ter 2 Abordagem estrutural
10 01/09 - sex 2 Exercícios sistemas combinacionais
11 05/09 - ter 2 Exercícios sistemas combinacionais
12 08/09 - sex 0 Feriado – Independência do Brasil
13 12/09 - ter 2 Avaliação - Sistemas combinacionais
14 15/09 - sex 2 Circuitos sequenciais em VHDL, Atributos e Pacotes
15 19/09 - ter 2 Exemplos de sistemas sequenciais em VHDL
16 22/09 - sex 2 Introdução às máquinas de estados finitos
17 26/09 - ter 2 Implementação em VHDL de máquinas de estados
18 29/09 - sex 2 Máquinas de estados em VHDL - Tópicos adicionais
19 03/10 - ter 2 Simulação de circuitos usando VHDL
20 06/10 - sex 2 Simulação de circuitos usando VHDL
21 10/10 - ter 2 Signal Tap
22 13/10 - sex 0 Feriado – Nossa Senhora Aparecida
23 17/10 - ter 2 Nios II
24 20/10 - sex 2 Tópicos adicionais
25 24/10 - ter 2 Trabalho final
26 27/10 - sex 2 Trabalho final
27 31/10 - ter 2 Trabalho final
28 03/11 - sex 0 Feriado – Finados
29 07/11 - ter 2 Trabalho final
30 10/11 - sex 2 Trabalho final
31 14/11 - ter 2 Trabalho final
32 17/11 - sex 2 Trabalho final
33 21/11 - ter 2 Apresentação do trabalho final
34 24/11 - sex Sem aula – Limite de CH da disciplina de 60h
35 28/11 - ter Sem aula – Limite de CH da disciplina de 60h
36 01/12 - sex Sem aula – Limite de CH da disciplina de 60h
37 05/12 - ter Sem aula – Limite de CH da disciplina de 60h
38 08/12 - sex Sem aula – Limite de CH da disciplina de 60h
39 12/12 - ter Sem aula – Limite de CH da disciplina de 60h
40 15/12 - sex Sem aula – Limite de CH da disciplina de 60h
41 19/12 - ter Sem aula – Limite de CH da disciplina de 60h
TOTAL 60
Atividades previstas - Clicar no "+" para expandir
Aula Data Horas Conteúdo Recursos
01 09/02 - qui 2 Apresentação da disciplina e Dispositivos lógicos programáveis - PLD
02 10/02 - sex 2 Tecnologia de FPGA
03 16/02 - qui 0 Sem aula – Assembleia sobre regimento do campus
04 17/02 - sex 2 Projetos em FPGA
05 21/02 - ter 2 Exercício 1 - Esquemático e outros exercícios
06 23/02 - qui 2 Avaliação esquemático
07 28/02 - ter 2 Introdução ao VHDL
08 02/03 - qui 2 Objetos e atribuições
09 07/03 - ter 2 Correção dos exercícios propostos
10 09/03 - qui 2 Abordagens
11 14/03 - ter 2 Atribuições de variáveis em simulações e Outros tópicos em VHDL
12 16/03 - qui 2 Abordagem estrutural
13 21/03 - ter 2 Exercícios sistemas combinacionais
14 23/03 - qui 2 Avaliação - Sistemas combinacionais
15 28/03 - ter 2 Circuitos sequenciais em VHDL, Atributos e Pacotes
16 30/03 - qui 2 Exemplos de sistemas sequenciais em VHDL
17 04/04 - ter 2 Introdução às máquinas de estados finitos
18 06/04 - qui 2 Implementação em VHDL de máquinas de estados
19 11/04 - ter 2 Máquinas de estados em VHDL - Tópicos adicionais
20 13/04 - qui 2 Simulação de circuitos usando VHDL
21 18/04 - ter 2 Simulação de circuitos usando VHDL
22 20/04 - qui 2 Signal Tap
23 25/04 - ter 2 Nios II
24 27/04 - qui 2 Tópicos adicionais
25 02/05 - ter 2 Trabalho final
26 04/05 - qui 2 Trabalho final
27 09/05 - ter 2 Trabalho final
28 11/05 - qui 2 Trabalho final
29 16/05 - ter 2 Trabalho final
30 18/05 - qui 2 Trabalho final
31 23/05 - ter 2 Apresentação do trabalho final
32 25/05 - qui 0 Sem aula – Limite de CH da disciplina de 60h
33 30/05 - ter 0 Sem aula – Limite de CH da disciplina de 60h
34 01/06 - qui 0 Sem aula – Limite de CH da disciplina de 60h
35 06/06 - ter 0 Sem aula – Limite de CH da disciplina de 60h
36 08/06 - qui 0 Sem aula – Limite de CH da disciplina de 60h
37 13/06 - ter 0 Sem aula – Limite de CH da disciplina de 60h
38 15/06 - qui 0 Sem aula – Limite de CH da disciplina de 60h
39 20/06 - ter 0 Sem aula – Limite de CH da disciplina de 60h
40 22/06 - qui 0 Sem aula – Limite de CH da disciplina de 60h
TOTAL 60
Atividades previstas - Clicar no "+" para expandir
Aula Data Horas Conteúdo Recursos
01 15/08 - seg 2 Apresentação da disciplina e Dispositivos lógicos programáveis - PLD
02 16/08 - ter 2 Tecnologia de FPGA
03 22/08 - seg 2 Projetos em FPGA
04 23/08 - ter 2 Exercício 1 - Esquemático e outros exercícios
05 29/08 - seg 2 Avaliação esquemático
06 30/08 - ter 2 Introdução ao VHDL
07 05/09 - seg 2 Objetos e atribuições
08 06/09 - ter 2 Correção dos exercícios propostos
09 12/09 - seg 2 Abordagens
10 13/09 - ter 2 Atribuições de variáveis em simulações e Outros tópicos em VHDL
11 19/09 - seg 2 Abordagem estrutural
12 20/09 - ter 2 Exercícios sistemas combinacionais
13 26/09 - seg 2 Avaliação - Sistemas combinacionais
14 27/09 - ter 2 Circuitos sequenciais em VHDL, Atributos e Pacotes
15 03/10 - seg 2 Exemplos de sistemas sequenciais em VHDL
16 04/10 - ter 2 Introdução às máquinas de estados finitos
17 10/10 - seg 2 Implementação em VHDL de máquinas de estados
18 11/10 - ter 2 Máquinas de estados em VHDL - Tópicos adicionais
19 17/10 - seg 2 Simulação de circuitos usando VHDL
20 18/10 - ter 2 Simulação de circuitos usando VHDL
21 24/10 - seg 2 Signal Tap
22 25/10 - ter 2 Nios II
23 31/10 - seg 2 Tópicos adicionais
24 01/11 - ter 2 Trabalho final
25 07/11 - seg 2 Trabalho final
26 08/11 - ter 2 Trabalho final
27 14/11 - seg 0 Feriado – Ponto facultativo
28 15/11 - ter 0 Feriado – Proclamação da república
29 21/11 - seg 2 Trabalho final
30 22/11 - ter 2 Trabalho final
31 28/11 - seg 2 Trabalho final
32 29/11 - ter 2 Apresentação do trabalho final
TOTAL 60
Atividades previstas - Clicar no "+" para expandir
Aula Data Horas Conteúdo Recursos
01 22/03 - ter 2 Apresentação da disciplina e Dispositivos lógicos programáveis - PLD
02 23/03 - qua 2 Tecnologia de FPGA
03 29/03 - ter 2 Projetos em FPGA
04 30/03 - qua 2 Exercício 1 - Esquemático e outros exercícios
05 05/04 - ter 2 Avaliação esquemático
06 06/04 - qua 2 Introdução ao VHDL
07 12/04 - ter 2 Objetos e atribuições
08 13/04 - qua 2 Correção dos exercícios propostos
09 19/04 - ter 2 Abordagens
10 20/04 - qua 2 Atribuições de variáveis em simulações e Outros tópicos em VHDL
11 26/04 - ter 2 Abordagem estrutural
12 27/04 - qua 2 Exercícios sistemas combinacionais
13 03/05 - ter 2 Avaliação - Sistemas combinacionais
14 04/05 - qua 2 Circuitos sequenciais em VHDL, Atributos e Pacotes
15 10/05 - ter 2 Exemplos de sistemas sequenciais em VHDL
16 11/05 - qua 2 Introdução às máquinas de estados finitos
17 17/05 - ter 2 Implementação em VHDL de máquinas de estados
18 18/05 - qua 2 Máquinas de estados em VHDL - Tópicos adicionais
19 24/05 - ter 2 Simulação de circuitos usando VHDL
20 25/05 - qua 2 Tópicos adicionais
21 31/05 - ter 2 Tópicos adicionais
22 01/06 - qua 2 Tópicos adicionais
23 04/06 - sáb 2 Tópicos adicionais
24 07/06 - ter 2 Trabalho final
25 08/06 - qua 2 Trabalho final
26 14/06 - ter 2 Trabalho final
27 15/06 - qua 2 Trabalho final
28 21/06 - ter 2 Trabalho final
29 22/06 - qua 2 Trabalho final
30 28/06 - ter 2 Apresentação do trabalho final
TOTAL '

Diário de aula

2018-1 - Clicar no "+" para expandir
Aula Data Horas Conteúdo Recursos
01 21/02 - qua 3 Apresentação da disciplina; Dispositivos lógico-programáveis - PLD; Tecnologia de FPGA; Projetos em FPGA
02 27/02 - ter 4 Exercicios; Introdução ao VHDL; Objetos e atribuições
03 13/03 - ter 4 Correção dos exercícios; Abordagens; Atribuições de variáveis em simulações; Outros tópicos em VHDL
04 27/03 - ter 4 Abordagem estrutural; Exercícios
05 10/04 - ter 4 Avaliação – Sistemas combinacionais
06 24/04 - ter 4
07 08/05 - ter 4
08 22/05 - ter 4
09 05/06 - ter 4
10 19/06 - ter 4
11 03/07 - ter 4
TOTAL 60
2017-2 - Clicar no "+" para expandir
Aula Data Horas Conteúdo Recursos
01 01/08 - ter 2 Apresentação da disciplina e Dispositivos lógicos programáveis - PLD
02 04/08 - sex 2 Tecnologia de FPGA e Projetos em FPGA
03 08/08 - ter 2 Desenvolvimento via esquemático e Exercício 1 - Esquemático
04 11/08 - sex 2 Introdução ao VHDL
05 15/08 - ter 2 Objetos e atribuições
06 18/08 - sex 2 Aula livre para dúvidas dos exercícios
07 22/08 - ter 2 Abordagens
08 25/08 - sex 2 Sem aula - alunos não compareceram
09 29/08 - ter 2 Atribuições de variáveis em simulações e Outros tópicos em VHDL
10 01/09 - sex 2 Abordagem estrutural
11 05/09 - ter 2 Aula livre para exercícios
12 08/09 - sex 0 Alfredo desistiu da disciplina, decidimos mudar a abordagem da disciplina para encerrar o projeto final do semestre passado
13 12/09 - ter 2 Projeto final – Ramon encerrou o projeto, está liberado das aulas. Valmir também está avançado, e continuará realizando o trabalho. Os demais alunos não possuem praticamente nada, e faremos o projeto desde o início juntos. Iniciaremos pela construção de um temporizador, como o disponível na Wiki.
14 15/09 - sex 2 Projeto final – Implementação do temporizador da Wiki
15 19/09 - ter 2 Projeto final – Implementação de dois temporizadores em cascata
16 22/09 - sex 2 Projeto final – Implementação de dois temporizadores em cascata
17 26/09 - ter 2 Projeto final – Implementação de dois temporizadores em cascata
18 29/09 - sex 2 Projeto final – Implementação de dois temporizadores em cascata
19 03/10 - ter 2 Projeto final – Implementação de dois temporizadores em cascata
20 06/10 - sex 2 Projeto final – Implementação de dois temporizadores em cascata
21 10/10 - ter 2 Projeto final – Implementação de dois temporizadores em cascata
22 13/10 - sex 0 Feriado nacional – Nossa Senhora Aparecida
23 17/10 - ter 2 Projeto final – Implementação de todos os temporizadores em cascata
24 20/10 - sex 2 Projeto final – Implementação de todos os temporizadores em cascata
25 24/10 - ter 2 Aula liberada para participação da SNCT – Palestra sobre empreendedorismo
26 27/10 - sex 2 Projeto final – Implementação de todos os temporizadores em cascata
27 31/10 - ter 2 Projeto final – Implementação de todos os temporizadores em cascata
28 03/11 - sex 0 Feriado nacional – Finados
29 07/11 - ter 2 Projeto final – Implementação do cronômetro
30 10/11 - sex 2 Projeto final – Implementação do cronômetro
31 14/11 - ter 2 Projeto final – Implementação do cronômetro
32 17/11 - sex 2 Projeto final – Implementação do cronômetro
33 21/11 - ter 2 Projeto final – Implementação do cronômetro
34 24/11 - sex
35 28/11 - ter
36 01/12 - sex
37 05/12 - ter
38 08/12 - sex
39 12/12 - ter
40 15/12 - sex
41 19/12 - ter
TOTAL 60
2017-1 - Clicar no "+" para expandir
Aula Data Horas Conteúdo Recursos
01 09/02 - qui 2
02 10/02 - sex 2
03 16/02 - qui 0
04 17/02 - sex 2
05 23/02 - qui 2
06 24/02 - sex 2
07 02/03 - qui 2
08 03/03 - sex 2
09 09/03 - qui 2
10 10/03 - sex 2
11 16/03 - qui 2
12 17/03 - sex 2
13 23/03 - qui 2
14 24/03 - sex 2
15 30/03 - qui 2
16 31/03 - sex 2
17 06/04 - qui 2
18 07/04 - sex 2
19 13/04 - qui 2
20 14/04 - sex 0
21 20/04 - qui 2
22 21/04 - sex 0
23 27/04 - qui 2
24 28/04 - sex 2
25 04/05 - qui 2
26 05/05 - sex 2
27 11/05 - qui 2
28 12/05 - sex 2
29 18/05 - qui 2
30 19/05 - sex 2
31 25/05 - qui 2
32 26/05 - sex 2
33 01/06 - qui 2
34 02/06 - sex
35 08/06 - qui
36 09/06 - sex
37 15/06 - qui 0
38 16/06 - sex 0
39 22/06 - qui
40 23/06 - sex
TOTAL 60
2016-2 - Clicar no "+" para expandir
Aula Data Horas Conteúdo Recursos
01 15/08 - seg 2 Apresentação da disciplina e Dispositivos lógicos programáveis - PLD
02 16/08 - ter 2 Tecnologia de FPGA
03 22/08 - seg 2 Projetos em FPGA
04 23/08 - ter 2 Exercício 1 - Esquemático e outros exercícios
05 29/08 - seg 2 Aula livre para execução dos exercícios - Professor fora, no congresso SBrT
06 30/08 - ter 2 Aula livre para execução dos exercícios - Professor fora, no congresso SBrT
07 05/09 - seg 2 Introdução ao VHDL
08 06/09 - ter 2 Objetos e atribuições
09 12/09 - seg 2 Aula livre para execução dos exercícios: Introdução e Objetos e atribuições
10 13/09 - ter 2 Abordagens e Atribuições de variáveis em simulações
11 19/09 - seg 2 Atribuições de variáveis em simulações e Outros tópicos em VHDL
12 20/09 - ter 2 Abordagem estrutural
13 26/09 - seg 2 Aula livre para execução dos exercícios
14 27/09 - ter 2 Aula de dúvida antes da avaliação
15 03/10 - seg 2 Avaliação 1 - Sistemas combinacionais
16 04/10 - ter 2 Aula livre para execução da Avaliação 1
17 10/10 - seg 2 Aula livre para execução da Avaliação 1
18 11/10 - ter 2 Circuitos sequenciais em VHDL
19 17/10 - seg 2 Atributos e discussão sobre os sistemas feitos na Avaliação 2 no semestre de 2015-1
20 18/10 - ter 2 Apresentação da Avaliação 2 e Introdução às Máquinas de estados finitos em VHDL
21 24/10 - seg 2 Implementação em VHDL de FSM
22 25/10 - ter 2 Aula livre para execução da Avaliação 2 - Construção do diagrama do sistema
23 31/10 - seg 2 Aula livre para execução da Avaliação 2
24 01/11 - ter 2 Aula livre para execução da Avaliação 2
25 07/11 - seg 2
26 08/11 - ter 2
27 14/11 - seg 0
28 15/11 - ter 0
29 21/11 - seg 2
30 22/11 - ter 2
31 28/11 - seg 2
32 29/11 - ter 2
TOTAL 60
2016-1 - Clicar no "+" para expandir
Aula Data Horas Conteúdo Recursos
01 22/03 - ter 2 Apresentação da disciplina e Dispositivos lógicos programáveis - PLD
02 23/03 - qua 0 Aula cancelada devido à realização de defesa de TCC do curso de licenciatura
03 29/03 - ter 2 Tecnologia de FPGA e Projetos em FPGA
04 30/03 - qua 2 Utilizando o FPGA e Exercício 1 - Esquemático
05 05/04 - ter 2 Introdução ao VHDL
06 06/04 - qua 2 Objetos e atribuições
07 12/04 - ter 2 Alunos não fizeram os exercícios propostos, esta aula foi livre para estudo
08 13/04 - qua 2 Abordagens e Atribuições de variáveis em simulações
09 19/04 - ter 2 Outros tópicos em VHDL
10 20/04 - qua 2 Abordagem estrutural
11 26/04 - ter 2 Aula livre para dúvidas
12 27/04 - qua 0 Aula dispensada devido à reunião da direção sobre ingresso nos cursos do campus
13 03/05 - ter 2 Avaliação 1 - Sistemas combinacionais - Execução da parte 1
14 04/05 - qua 2 Aula livre para a execução da segunda parte da avaliação 1
15 10/05 - ter 2 Circuitos sequenciais em VHDL , Atributos e Pacotes
16 11/05 - qua 2 Exemplos de sistemas sequenciais, baseados na Avaliação 2 do semestre 2015-1
17 17/05 - ter 2 Apresentação da Avaliação 2
18 18/05 - qua 2 Aula livre para desenvolvimento da Avaliação 2
19 24/05 - ter 2 Aula livre para desenvolvimento da Avaliação 2
20 25/05 - qua 2 Aula livre para desenvolvimento da Avaliação 2
21 31/05 - ter 2 Máquina de estados finitos em VHDL
22 01/06 - qua 2 Aula livre para desenvolvimento da Avaliação 2
23 04/06 - sáb 2 Aula livre para desenvolvimento da Avaliação 2
24 07/06 - ter 2 Aula liberada para assistir à palestra "Empreendedorismo e Inovação"
25 08/06 - qua 2 Máquina de estados: Implementação em VHDL
26 14/06 - ter 2 Simulação de circuitos usando VHDL e Modelsim
27 15/06 - qua 2 Outras funcionalidades do Quartus II: desenvolvimento via esquemático, Megawizard e Signal Tap
28 21/06 - ter 2 Aula livre para execução do trabalho final da disciplina, a Avaliação 2
29 22/06 - qua 2 Processador embarcado em FPGA usando o NIOS II
30 28/06 - ter 2 Aula livre para execução do trabalho final da disciplina, a Avaliação 2
31 29/06 - qua 2 Ajuda na solução da Avaliação 2 da equipe 2
32 05/07 - ter 2 Ajuda na solução da Avaliação 2 da equipe 2
TOTAL 60
2015-2 - Clicar no "+" para expandir
Aula Data Horas Conteúdo Recursos
1 06/10 2 Apresentação da disciplina
2 08/10 2 Dispositivos lógicos programáveis - PLD
3 13/10 2 Tecnologia de FPGA
4 15/10 2 Projetos em FPGA
5 20/10 2 Exercício 1 - Esquemático
6 22/10 2 Introdução ao VHDL
7 27/10 2 Objetos e atribuições
8 29/10 2 Abordagens
9 03/11 2 Atribuições de variáveis em simulações
10 05/11 2 Outros tópicos em VHDL
11 10/11 2 Abordagem estrutural
12 12/11 2 Aula livre para dúvidas
13 17/11 2 Avaliação 1 - Sistemas combinacionais
14 19/11 2 Avaliação 1 - Sistemas combinacionais
15 24/11 2 Circuitos sequenciais em VHDL
16 26/11 2 Avaliação 2 - Sistemas sequenciais - Discussão das avaliações do semestre anterior
17 01/12 2 Avaliação 2 - Sistemas sequenciais
18 03/12 2 Avaliação 2 - Sistemas sequenciais
19 08/12 2 Avaliação 2 - Sistemas sequenciais
20 10/12 2 Avaliação 2 - Sistemas sequenciais
21 15/12 2 Avaliação 2 - Sistemas sequenciais
22 17/12 2 Avaliação 2 - Sistemas sequenciais
23 22/12 2 Avaliação 2 - Sistemas sequenciais
24 02/02 2 Máquina de estados finitos em VHDL - Apresentação codificação convolucional
25 04/02 2 Máquina de estados finitos em VHDL
26 11/02 2 Apresentação do projeto final da disciplina
27 13/02 2 Aula livre para desenvolvimento do projeto final
28 16/02 2 Aula livre para desenvolvimento do projeto final
29 2
30 2
TOTAL '
2015-1 - Clicar no "+" para expandir
Aula Data Horas Conteúdo Recursos
1 06/02 2 Apresentação da disciplina
2 10/02 2 Dispositivos lógicos programáveis - PLD
3 13/02 2 Tecnologia de FPGA
4 20/02 2 Projetos em FPGA
5 24/02 2 Sem aula devido a reunião com a reitoria. Resolver exercício
6 27/02 2 Correção do exercício e utilização do Kit DE2-115 e Introdução ao VHDL
7 03/03 2 Introdução ao VHDL e Objetos e atribuições
8 06/03 2 Aula livre para a execução dos exercícios de VHDL
9 10/02 2 Abordagens e Atribuições de variáveis em simulações
10 13/03 2 Tópicos em VHDL
11 17/03 2 Uso do Modelsim - Aula prejudicada devido à problemas no laboratório
12 20/03 2 Abordagem estrutural
13 24/03 2 Aula livre para realização da Avaliação 1
14 27/03 2 Aula livre para realização da Avaliação 1
15 31/03 2 Continuação da Avaliação 1: Implementação em FPGA
16 07/04 2 Circuitos sequenciais em VHDL
17 10/04 2 Avaliação 2 - Sistemas sequenciais
18 14/04 2 Avaliação 2 - Sistemas sequenciais
19 17/04 2 Apresentação do trabalho da Avaliação 2, Atributos e Pacotes
20 24/04 2 Apresentação sobre Codificação Convolucional, como exemplo de máquina de estados finitos
21 28/04 2 Máquina de estados finitos em VHDL
22 05/05 2 Aula livre para realização da tarefa sobre Máquina de Estados
23 12/05 2 Simulação de circuitos usando VHDL
24 15/05 2 Apresentação da avaliação final - Formação das equipes e início do desenvolvimento
25 19/05 2 Aula livre para realização da avaliação final
26 22/05 2 Aula livre para realização da avaliação final - Eu estava em reunião com a reitoria em Itajaí
27 26/05 2 Aula livre para realização da avaliação final
28 29/05 2 Aula livre para realização da avaliação final
TOTAL '

Aulas

Apresentação da disciplina

Roteiro
  • Apresentação do professor;
  • Apresentação da disciplina (Plano de Ensino);
  • Avaliações: Trabalhos e Projeto Final
  • Grupo no Whatsapp
  • Horário alternativo
Atividades

Dispositivos lógicos programáveis - PLD

PLDs em sistemas digitais

Sistema digital: Saída digital definida em função de processamento realizado em entrada digital.

Sistema digital. Fonte: [1]


Os sistemas digitais foram por muito tempo projetados usando a chamada lógica fixa, composta por CIs (circuitos integrados) TTL que implementavam portas lógicas. Em meados de 1970, foram introduzidos os PLDs (Programmable Logic Devices), chips de uso geral cujo hardware pode ser configurado para atender especificações. Com os PLDs, sistemas digitais poderiam ser projetados a partir de CIs genéricos, com funções definidas a partir de configurações armazenadas em memórias. Desta forma, os PLDs possuem as seguintes vantagens sobre sistemas de lógica fixa [2]:

  • Redução de custos de projeto, chamados de custos NRE (nonrecurring engineering cost - custo de engenharia não recorrente), com a abolição de desenvolvimentos complexos de placas
  • Rapidez de desenvolvimento
  • Flexibilidade no desenvolvimento: a adição de funcionalidades é feita por simples mudanças no arquivo de configuração
  • Rapidez de produção do CI: por serem padronizados, os PLDs possuem entrega imediata
  • Atualização de hardware em tempo real

Uma alternativa de projeto é o uso de microcontroladores, dispositivos programáveis a nível de software. Porém, mesmo nesses casos, os PLDs possuem vantagens [3]:

  • PLDs são mais simples de desenvolver, pois alterações no projeto são feitas instantaneamente
  • Sistemas com processadores customizados possuem desenvolvimento lento e oneroso
  • Sistemas mais genéricos tendem a ter custos menores pela possibilidade de uso em diversas aplicações, facilitando o estoque de itens
Tempo de desenvolvimento entre sistema com microprocessador (ASIC) ou PLD (FPGA). Fonte: [3]


Em função da arquitetura e tecnologia empregada, os PLDs foram classificados em SPLDs (simple PLDs) ou CPLDs (complex PLDs).

SPLDs

São denominados SPLDs os seguintes dispositivos:

PAL - Programmable Array Logic

Um arranjo programável de portas AND seguido por um arranjo fixo de portas OR.

Arquitetura PAL. Fonte: [4]


Essa foi a primeira implementação de PLDs, e se baseia no fato de que qualquer função lógica pode ser reescrita como uma soma de produtos (SOP - sum of products) [4]. Por exemplo, sendo abaixo a tabela verdade da soma aritmética de um bit u de uma posição de um circuito somador, como função de x e y e do carry ci

ci x y u(ci,x,y)
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 0
1 1 1 1

Sendo as linhas 2, 3, 5 e 8, as que possuem saída 1, podemos escrever u como [5]:


Os PAL tem, porém, como limitação, a implementação apenas em circuitos combinacionais.


PLA - Programmable Logic Array

Muito semelhante aos PALs, os PLA diferenciam-se no fato de que tanto as ligações AND quanto OR são programáveis.

Arquitetura PLA. Fonte: [4]



GAL - Generic Array Logic

Características adicionais com relação aos PALs:

  • Célula de saída (chamada de OLMC - output logic macrocell) com flip-flop, porta XOR, multiplexadores
  • Inclusão de um sinal de retorno (feedback)
  • Utilização de memórias EEPROM na programação do circuito

Um exemplo dessa arquitetura pode ser visto na figura abaixo:

Arquitetura GAL no chip GAL 16V8. Fonte: [4]


CPLDs

Como o próprio nome já adianta, os CPLDs possuem arquitetura muito mais complexa que os SPLDs. De fato, os primeiros CPLDs eram formados pela interconexão programável de vários SPLDs, além de outros avanços. Na figura abaixo, a arquitetura básica de um CPLD:

Arquitetura de CPLDs. Fonte: [4]



FPGAs - Field programmable gate arrays - Arranjo de portas programável em campo

Os FPGAs estendem as capacidades dos CPLDs, sendo diferentes em arquitetura, tecnologia, características embutidas e custo. Por serem voláteis, precisam de uma memória de configuração não volátil para armazenar a programação do hardware. Uma simplificação da arquitetura de FPGAs pode ser vista na figura abaixo. No caso, CLBs (configurable logic blocks) e LABs (logic array blocks) são blocos semelhantes à SPLDs GAL.

Arquitetura de FPGAs Xilinx (a) e Altera (b). Fonte: [4]


Além desses blocos, FPGAs costumam possuir também:

  • Blocos RAM: Possibilitam o uso direto de memória, sem a necessidade de projetá-las
  • Blocos DSP: Muito utilizados em aplicações de processamento de áudio e vídeo digitais, o bloco DSP implementa operações de soma, multiplicação e variáveis.

Comparação entre dispositivos

Uma comparação entre os dispositivos vistos nesta aula pode ser vista na figura abaixo:

Comparação entre DLPs. Fonte: [6]


onde as características de armazenamento do programa são:

  • Fusível e antifusível - Configurado uma única vez
  • (E)EPROM - Configurado um número limitado de vezes, mantida com o chip desconectado da alimentação (não volátil)
  • SRAM - Configuração realizada cada vez que o sistema é alimantado (volátil)


Informações complementares

Referências

[1] Midorikawa, Edson. Projeto de sistemas digitais. Disponível em Link. Acesso em 09/02/2015.
[2] Xilinx. What is Programmable Logic? Disponível em Link. Acesso em 09/02/2015.
[3] Parnell, Karen & Bryner, Roger. Comparing and contrasting FPGA and microprocessor system design and development. Disponível em Link. Acesso em 09/02/2015.
[4] Pedroni, Volnei A. Eletrônica digital moderna e VHDL. Disponível em Link. Acesso em 09/02/2015.
[5] Wikipedia. Canonical normal form. Disponível em Link. Acesso em 09/02/2015.
[6] Matos, Roberto de. Apresentação da disciplina de SST. Disponível em Link.

Tecnologia de FPGA

Os FPGAs são compostos por três tipos de componentes:

  • Bloco de entrada e saída (Input/Output Block - IOB): Circuitos responsáveis pela interface de entrada e saída do FPGA. Compostos basicamente de buffers.
  • Bloco de configuração lógica (Configurable Logic Block - CLB): Circuitos construídos usando flip-flops e lógica combinacional. Onde são construídas as funções lógicas do sistema.
  • Chaves de interconexões: Trilhas configuráveis usadas para conectar os blocos de funções com os blocos de saída. O processo de escolha das interconexões é chamado de roteamento.

Os 3 blocos são interconectados em duas dimensões, otimizando as conexões entre os blocos

Arquitetura simplificada de um FPGA. Fonte: [1]


IOB

São usados para fazer a interface de entrada e saída do FPGA. Consiste em um buffer de entrada e um de saída, ambos com flip-flops, permitindo que saídas com clocks sejam disponibilizadas sem encontrar atrasos significantes e reduzindo a necessidade de manter sinais de entrada por muito tempo.


IOB. Fonte: [2]
  • Entrada e saída são concentradas num único pino descrito como Pad.
  • Flip-flops realizam a sincronização dos dados, mas caminhos diretos, sem atrasos, são configuráveis
  • Entrada do dado pelo flip-flop inferior.
  • Saídas não utilizadas necessitam ser mantidas em tri-state.
  • Slew rate controla a velocidade de mudança de polaridade. Valores menores reduzem ruídos.


CLB [3]

Contêm a lógica do FPGA, como mostra a simplificação abaixo:

CLB. Fonte: [2] e [3]


Neste bloco:

  • Disponíveis 3 elementos configuráveis, dois com 4 entradas (F e G) e um com 3 entradas (H). Estes elementos podem construir qualquer função lógica a partir de suas entradas.
  • Com os multiplexadores M1 a M3, é possível combinar os elementos para criar funções de mais de 4 entradas.
  • Com os multiplexadores M4 a M7, a saída das funções lógicas podem ser enviadas diretamente para as saídas X e Y ou podem ser capturadas pelos flip-flops F1 e F2.
  • Saída dos flip-flops nas saídas XQ e YQ, podendo os pinos serem "desativados" para simplesmente copiar sinais de entrada.
  • O clock dos flip-flops pode ser configurado para a borda de subida ou descida.
  • Os flip-flops podem também usar sinal de Enable.
  • Os multiplexadores superiores permitem escolher a função dos sinais C1 a C4, para a entrada da função H ou outros sinais internos.
  • Blocos S/R Control configuram o estado inicial dos flip-flops.

As funções lógicas são implementadas a partir de suas tabelas verdade nos elementos lógicos usando uma memória chamada de Lookup Table (LUT). Com isso, um bloco de configuração lógica também pode ser usado como uma memória, em diferentes configurações dependendo dos multiplexadores. Nesses casos, as entradas F1 a F4 e G1 a G4 fornecem endereços, e as entradas C1 a C4 fornecem os dados e sinais de enable.

Chaves de interconexões

Os CLBs estão imersos numa rede de interconexões configuráveis. As conexões possíveis por cada bloco lógico podem ser vistas na figura abaixo.

Esquema de conexão de cada CLB. Fonte: [3]


Um FPGA com 64 blocos de configuração lógica seriam a repetição dessa figura numa matriz de 8x8

Um FPGA com 64 CLBs. Fonte: [3]


Para fazer a ligação entre CLBs vizinhos, o caminho unidirecional direct pode ser utilizado. Porém, para o roteamento de dados em maiores "distâncias", 3 outros caminhos são disponíveis, dispostos como a figura abaixo:

Caminhos indiretos de interligação num FPGA. Fonte: [4]


Na figura, uma Matriz de Comutação Programável (Programmable Switch Matrix - PSM) pode ser vista, além dos 3 caminhos indiretos:

  • Single: ideal para conexão entre CLBs vizinhos, pois é conectado a todos os blocos PSM.
  • Double: conectado intercaladamente nos blocos PSM
  • Long: não é conectado nos blocos PSM

Os blocos PSM introduzem atraso na propagação do sinal no FPGA. Os 3 caminhos introduzem versatilidade ao balancear atrasos e propagação em longas distâncias.

O bloco PSM efetua a conexão entre pinos seguindo o esquema da figura abaixo. No esquema, os círculos vermelhos são chamados de Elementos de Comutação Programável (Programmable Switch Element - PSE).

Conexão numa PSM. Fonte: [5]


Com isso, várias formas de conexão são possíveis, como exemplifica a figura a seguir:

Exemplo de conexão. Fonte: [4]



Várias tecnologias podem ser usadas para realizar a conexão num PSE:

  • Antifusível: Realiza a função oposta de um fusível. Inicia com uma grande resistência, e cria um caminho condutivo ao ser aplicada uma voltagem maior do que um certo limite.
  • Ocupam uma pequena área, permitindo um maior número de conexões em estruturas chamadas de Fully Populated
  • Aumentam a flexibilidade
  • Não podem ser reprogramados
PSM com PSE de antifusíveis. Fonte: [4]


  • Transistores de passagem: Transistores controlados por posições de memória realizam a passagem do sinal entre os pinos.
  • Ocupam uma grande área no chip, resultando num menor número de conexões
  • Menor flexibilidade
  • Pode ser reprogramado
PSE com transistor de passagem. Fonte: [4]



O trabalho de roteamento de sinais dentro de um FPGA é realizado por ferramentas de Placement & Routing, que buscam otimizar a propagação de sinais.

Antes e depois de um processo de Placement e routing. Fonte: [6]


NOTA: Os nomes dos blocos disponíveis nesta aula seguem os termos utilizados pela Xilinx, e os blocos referem-se a
      uma família específica, a XC4000E. Para fabricantes diferentes, ou mesmo famílias diferentes, mudanças podem
      ser observadas. Para informações sobre a arquitetura dos FPGAs da Altera, consultar [7].

Tabela comparativa entre FPGAs

A tabela a seguir é um exemplo de dados de fabricantes, no caso, da Xilinx.

Comparação FPGAs. Fonte: [3]


  • Max user I/O: Número de entradas e saídas por FPGA. Devido aos diferentes encapsulamentos possíveis, nem todos os pinos de entrada e saída podem estar disponíveis
  • Flip-flops: Número total de flip-flops disponíveis, sendo 2 por CLB e 2 por IOB
  • Max RAM bits (no logic): Número de bits de RAM disponíveis no caso de todos os CLBs estarem configurados como RAM
  • Max gates (no RAM): Número total de portas disponíveis quando nenhum CLB estiver configurado como RAM

Informações complementares (Altera)

Toda a arquitetura apresentada aqui foi baseada nos dispositivos fabricados pela Xilinx. Como dito acima, mais informação sobre dispositivos Altera pode ser encontrada na referência [7], além do curso abaixo:

Referências

[1] Oskin, Mark. Apresentação sobre FPGAs da disciplina Advanced Digital Design. Disponível em Link. Acesso em 12/02/2015.
[2] Zeidman, bob. All about FPGAs. Disponível em Link. Acesso em 12/02/2015.
[3] Wakerly, John. Digital Design: Principles & practices. Disponível (versão para demonstração) em Link. Acesso em 12/02/2015.
[4] Wang, Haibo. FPGA Programmable Interconnect and I/O Cells. Disponível em Link. Acesso em 13/02/2015.
[5] Wikipedia. Field-programmable gate array. Disponível em Link. Acesso em 13/02/2015.
[6] Wong, William. FPGA Design Suite Generates Global Minimum Layout. Disponível em Link. Acesso em 13/02/2015.
[7] Altera. White Paper: FPGA architecture. Disponível em Link. Acesso em 13/02/2015.


Projetos em FPGA

Altera

A Altera é uma das maiores fabricantes de FPGAs e CPLDs. Há no seu portfólio PLDs dos mais baixo custo até dos mais avançados do mercado. O Quartus II é o software de desenvolvimento de PLDs da Altera.

Dispositivos da Altera. Fonte: [1]



Licença

A licença de uso é dada da seguinte forma:

  • Web Edition: de uso livre, com limitações quanto ao número de DLPs disponíveis
  • Full Edition - Fixed License: pago, com licença nativa no computador
  • Full Edition - Float License: pago, com licença em rede
Edições do Quartus II da Altera. Fonte: [1]


Uma comparação entre as edições Web e Full está disponível em Link.

Para configurar uma licença, acessar Link. A licença Web é gerada em Link.

Acesso ao Quartus II

Para acessar o Quartus II, ver página (Uso do Quartus II nos Labs do IFSC). Para acesso ao Quartus II via servidor Cloud, ver página (Acesso ao IFSC-CLOUD)

Como obter informações

A Altera preparou uma série de materiais sobre o desenvolvimento usando o Quartus II. Existem cursos on-line e presenciais, pagos e gratuitos:

  • A página de cursos pode ser acessada em Link.
  • O treinamento completo (muito material!) está disponível em Link.
  • Um bom material escrito pode ser acessado em Link.

Quartus II

Abaixo, um roteiro para o reconhecimento do software da Altera:

  • Abrir o Quartus II
  • Getting Started
  • Janelas:
  • Project Navigator
  • Message Window
  • Tool View Window
  • Tasks Window
  • Custom Tasks Flow

Fluxo de desenvolvimento em PLDs

Fluxo de desenvolvimento em PLDs. Fonte: [1]


  • RTL: nível de abstração usado para descrever o circuito, dentre 3:
  • Behavioural: mais alto nível de abstração, descreve o comportamento do circuito (entradas e saídas)
  • RTL - Register Transfer Level: descrição do Hardware a partir de lógica, indicando como dados são transferidos entre registradores
  • Gate Level: usa componentes como portas lógicas, flip-flops e multiplexadores
  • Synthesis: processo em que o comportamento de um circuito numa forma abstrata (por exemplo, em RTL) é convertido para uma implementação em termos de portas lógicas.
  • Netlist: descreve a conectividade dos terminais para o desenvolvimento do circuito.
  • Place & Route - Fitting: otimiza a localização dos elementos e o roteamento dos dados entre eles.


Projeto no Quartus II

Wizard
  • Selecionar como dispositivo o Cyclone IV EP4CE115F29C7, ou o mais próximo disponível. É esse o modelo que será utilizado nas nossas aulas.


Arquivos [2]
  • .QPF - Quartus II Project File: informação da versão do Quartus 2 e da data. Traz as revisões efetuadas no projeto.
  • .QDF - Quartus II Defaults File: configurações padrão de todo novo projeto criado
  • .QSF - Quartus II Settings File: configurações específicas do projeto, como arquivos, dispositivo escolhido, etc.
  • Pasta dB: informação do projeto compilado
  • .SDC - Synopsys Design Constraint: restrições temporais do projeto
O Quartus também oferece ferramentas para controle de versão de projetos a partir de arquivos .QAR - Quartus II Compressed Archive File. Disponível no menu Project. Com revisões, é possível fazer testes com outros parâmetros sem perder resultados anteriores.

Formas de desenvolvimento

Ir em File -> New, e selecionar um dos Design Files disponíveis.

Formas de desenvolvimento no Quartus II. Fonte: [1]


Nesta aula, usaremos o desenvolvimento via Esquemático - Block File.


Desenvolvimento via esquemático

Um exemplo de sistema será usado para apresentar a ferramenta. O sistema que será desenvolvido está disponível na figura abaixo:

Sistema a ser desenvolvido. Fonte: [3]


O desenvolvimento é feito a partir dos seguintes passos:

  • Criar novo arquivo do tipo Schematic
  • Importar portas lógicas
  • Importar sinais de entrada e saída
  • Atribuir nomes aos pinos
  • Conectar os componentes
  • Compilar
  • Atribuir pinos físicos do FPGA aos pinos do sistema (Pin planner)
  • Pinos atribuídos podem ser exportados para futuros desenvolvimentos
  • Descrever sinais de entrada (criar arquivo VWF - Vector Waveform File)
  • Simular (Tool -> Simulation)

Utilizando o FPGA

O kit DE2-115

O Kit Altera DE2-115 pode ser visto na figura abaixo.

Kit Altera DE2-115. Fonte: [4]


Algumas características do kit:

  • FPGA Altera Cyclone IV EP4CE115F29C7
  • 2 MB de SRAM
  • 64 MB de SDRAM
  • 8 MB de Flash
  • Interfaces:
  • Botões
  • Switch
  • Leds
  • Módulo LCD


Para ligar o kit, seguir os passos:

  1. Conectar o cabo USB no computador e no kit na porta USB Blaster. Talvez seja necessário instalar o driver específico para o USB da Altera. Para instalar, consultar Link e Link.
  2. Desligar o kit soltando o botão ON/OFF vermelho.
  3. Conectar o adaptador 12V.
  4. Selecione a posição RUN no switch RUN/PROG (SW19).
  5. Ligue o kit pressionando o botão ON/OFF vermelho.


Para mais informações, consultar a página Software e equipamentos recomendados para programação de FPGAs, e a página Preparando para gravar o circuito lógico no FPGA

Informações sobre kits da Altera

Veja abaixo um resumo dos kits da Altera mais comumente utilizados. Informação importante e constantemente utilizada é a distribuição da pinagem do FPGA no kit.

Kit Fabricante do Kit Família FPGA Device Documentos disponíveis Arquivo qsf Pinagem do kit Disponíveis no IFSC
DE0-Nano TERASIC Cyclone® IV E - ALTERA EP4CE22F17C6 User Manual qsf Pinagem do kit DE0-Nano 4
DE2-115 TERASIC Cyclone® IV E - ALTERA EP4CE115F29C7 User Manual qsf Interfaces de entrada e saída da DE2-115 10
MERCÚRIO IV MACNICA Cyclone® IV E - ALTERA EP4CE30F23C7 Manual do Usuário qsf Pinagem dos dispositivos de entrada e saída do kit MERCURIO IV 20

Exercício 1 - Esquemático

Executar o roteiro disponível em Link. São informações complementares ao roteiro:

  • Para atribuir os pinos usando o arquivo .qsf fornecido pela Altera, usar o menu Assignments → Import Assignments.
  • Uma outra referência para o processo de programação do FPGA pode ser vista em Link.

Outros exercícios

  1. Acrescentar mais um dígito na contagem, de forma que quando o contador atinja o "xF" o próximo dígito seja incrementado.
  2. Acrescentar ao sistema de contagem de dois dígitos um botão de reset.
  3. Mudar a contagem para que ela aconteça na base decimal. Assim, o primeiro dígito contará de "0" a "9", e o próximo dígito será incrementado.
  4. Desenvolver um sistema de contagem de dois dígitos com uma chave de direção de contagem, onde, dependendo da seleção da chave, a contagem seja crescente ou decrescente.

Referências

[1] Altera Training Courses. Using the Quartus II Software: An Introduction. Disponível em Link. Acesso em 19/02/2015.
[2] Altera. Quartus II Volume I: Design and Synthesis. Disponível em Link. Acesso em 19/02/2015.
[3] Altera. Quartus II Introduction Using Schematic Designs. Disponível em Link. Acesso em 27/02/2015.
[4] Altera. DE2-115 User Manual. Disponível em Link.

Introdução ao VHDL

VHDL vem de VHSIC (Very High Speed Integrated Circuito) Hardware Description Language. É a linguagem padrão IEEE para a descrição de hardware na indústria.

  • Características:
  • Linguagem de descrição de hardware, não de programação
  • Maior parte da linguagem não é Case Sensitive
  • Expressões são terminadas com ponto-e-vírgula
  • É Space Insensitive
  • Comentários feitos com um "--" no início da linha. Não há comentários em bloco


Unidades do código VHDL

O código VHDL é inicialmente dividido em 3 seções:

PACKAGE
ENTITY
ARCHITECTURE
PACKAGE

Declara as bibliotecas utilizadas no sistema. Usa o formato:

LIBRARY nome1, nome2;
USE nome1.pack_name1.object;
USE nome2.pack_name2.ALL;

Duas LIBRARYs disponibilizadas automaticamente:


  • STD: tipos básicos de dados:
  • BIT: dois valores ('0' e '1')
  • BIT_VECTOR: deve indicar a ordem dos bits
SIGNAL s1 : BIT_VECTOR (3 DOWNTO 0);
SIGNAL s2 : BIT_VECTOR (0 TO 3);
  • BOOLEAN: dois valores (False, true)
  • INTEGER: Valores positivos e negativos em decimal
SIGNAL s3 : INTEGER;                  -- Número de 32 bits
SIGNAL s4 : INTEGER RANGE 0 TO 255    -- Número de 8 bits
  • NATURAL: Inteiro sem sinal
  • CHARACTER: ASCII
  • STRING: Array de ASCII
  • TIME: Valores com unidades de tempo (ps, ms, min, hr)
  • REAL: Número de ponto flutuante de precisão dupla


  • WORK: indica onde estão armazenados os arquivos do projeto


Um pacote frequentemente incluído é STD_LOGIC_1164, da LIBRARY IEEE, que define os tipos:

  • STD_LOGIC: bit com 3-state (Z) e "não importa" (-)
  • STD_ULOGIC: tipo lógico com 9 valores Link

A declaração do pacote IEEE ficaria assim:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY

Define a visão externa do modelo (símbolo). Usa o formato:

ENTITY <entity_name> IS
   GENERIC
   PORT
END ENTITY <entity_name>;

onde:

  • PORT: descreve entradas e saídas
PORT (
   nome1, nome2 : <mode> <type>;
   nome3, nome4 : <mode> <type>
);
  • <mode>:
  • in (input): sinais de entrada - São apenas lidos
  • out (output): sinais de saída - São apenas escritos
  • inout (bidirecional): podem ser lidos e escritos
  • <type>: tipo do dado
  • GENERIC: passa informações globais (constantes) ao modelo
GENERIC (
   nome1, nome2 : <type> (:= <initial value>);
   nome2, nome4 : <type> (:= <initial value>)
);
  • <type>: tipo do dado
  • <initial value>: opcional
ARCHITECTURE

Define a função do modelo (esquemático). Segue o formato:

ARCHITECTURE <identifier> OF <entity_identifier> IS
   <declaration>
BEGIN
   <body>
END ARCHITECTURE <identifier>;

onde:

  • <entity_identifier>: nome da ENTITY a qual pertence a ARCHITECTURE
  • <identifier>: nome da ARCHITECTURE, que deve ser único dentre as ARCHITECTUREs da ENTITY
  • <declaration>: identificadores locais usados na ARCHITECTURE que não são PORTs nem GENERICs. Devem ser declarados antes de usados.
  • <body>: corpo da ARCHITECTURE

Nomes para identificadores

Os identificadores das entidades, arquiteturas e portas devem ser compactos e informativos. Abaixo, exemplos de nomes bons e ruins.

Exemplos de nomes de identificadores. Fonte: [4]


Desenvolvimento via VHDL

Um exemplo de sistema será usado para apresentar o Quartus II e o VHDL. O sistema que será desenvolvido está disponível na figura abaixo:

Sistema a ser desenvolvido. Fonte: [2]


O desenvolvimento é feito a partir dos seguintes passos:

  • Criar novo arquivo do tipo VHDL File
  • Escrever o código
  • Templates podem ser usados (Edit -> Insert Template)
Código VHDL


  • Compilar
  • Atribuir pinos físicos do FPGA aos pinos do sistema (Pin planner)
  • Pinos atribuídos podem ser exportados para futuros desenvolvimentos
  • Descrever sinais de entrada (criar arquivo VWF - Vector Waveform File)
  • Simular (Tool -> Simulation)


Concorrência do código

Os código VHDL tem uma característica importante que é a concorrência. Assim, todas as instruções tem a mesma procedência, diferentemente das linguagens de programação. O exemplo abaixo demonstra isso:

Multiplexador com buffer de 3 estados. Fonte: [3].


A solução do problema pode ser vista abaixo:

Solução do exercício.


Erros clássicos

Em desenvolvimento com VHDL, são comuns os seguintes erros [3]:

  1. Tipos de dados diferentes (um lado é BIT e outro é BOOLEAN)
  2. Tamanhos não são iguais
  3. Valor ou representação inválido (BIT não aceita valor 'Z', vetor de bits requer aspas duplas)
  4. Indexação incorreta (ordem)
  5. Operador de atribuição incorreto (para sinais é "<="; para variáveis e constantes é ":="

Tarefa - Introdução ao VHDL

Ler os capítulos 1, 2 e 3 do livro [4], resolvendo os exercícios do capítulo 3.

Referências

[1] Altera Training Courses. VHDL Basics. Disponível em Link. Acesso em 27/02/2015.
[2] Altera. Quartus II Introduction Using VHDL Designs. Disponível em Link. Acesso em 27/02/2015.
[3] Pedroni, Volnei A. Eletrônica Digital Moderna e VHDL. Rio de Janeiro: Elsevier, 2010.
[4] Mealy, B. Tappero, F. Free Range VHDL. Free Range factory. Disponível em Link. Acesso em 27/02/2015.


Objetos e atribuições

Objetos

Há quatro tipos de objetos em VHDL: CONSTANT, SIGNAL, VARIABLE e FILE. Vamos ver agora os dois primeiros [1].

CONSTANT

É uma forma de atribuir um valor constante a um nome. Não pode então ser alterada durante a execução. É utilizada para melhorar:

  • Legibilidade
  • Flexibilidade

A declaração segue o formato:

CONSTANT <nome> : <tipo> := <valor>;


O escopo é definido pela localização da sua declaração:

  • GENERIC: Global
  • ARCHITECTURE: Local
Código com CONSTANTs declaradas.



SIGNAL

Representa a interconexão entre blocos. É declarada da seguinte forma:

SIGNAL <nome> : <tipo>;

Um valor inicial é opcionalmente passado ao objeto, da seguinte forma:

SIGNAL <nome> : <tipo> := <valor_inicial>;
Código com um SIGNAL declarado.



Bit e múltiplos bits

Na atribuição de valores binários, há diferenças de declaração entre um único bit ou múltiplos bits:

  • Um único bit: aspas simples:
x <= '1';
  • Múltiplos bits: aspas duplas:
x <= "10101010";
Indexação

É possível atribuir valores à membros específicos de um barramento (vetor). Abaixo, alguns exemplos ilustrativos:

x(3)          <= '0';
x(0)          <= '1';
x(7 DOWNTO 4) <= "1010";

É possível ainda usar vírgulas e os operadores OTHERS e => para fazer atribuições específicas [2]:

  • Nominal:
x <= (7 => '0', 5 => '0', OTHERS => '1');
  • Posicional:
x <= ('0', '1', '0', OTHERS => '1');
Bases numéricas

É possível atribuir à barramentos valores em bases numéricas diferentes. Para isso, o seguinte formato pode ser usado:

y <= [<tamanho>][<preenchimento>]<base>"<valor>";
  • <valor>: valor a ser atribuído
  • <base>: b (binário), x (hexadecimal) ou o (octal)
  • <tamanho>: número de sinais atribuídos (opcional)
  • <preenchimento>: caso o número de sinais atribuídos (<tamanho>) seja maior que o número de sinais gerados no <valor>, os demais sinais são preenchidos com 1's (s) ou 0's (u)

Atribuições simultâneas

Uma das maiores diferenças de VHDL para linguagens de programação de software é que as atribuições do código VHDL são simultâneas. De fato, todas as atribuições dentro de uma arquitetura representam processos implícitos que executam em paralelo. Quando um sinal de entrada do processo é alterado, o novo valor é imediatamente atribuído à variável.

São três os tipos de atribuições simultâneas no VHDL:

Simples

São da forma:

<nome> <= <expressão>;

No exemplo abaixo, há dois processos implícitos, cujas atribuições de sinais são feitas simultaneamente:

x1 <= a1 OR b1;
x2 <= a2 AND b2;
Condicional

São da forma:

<nome> <= <valor> WHEN <condição_1> ELSE
       <valor> WHEN <condição_2> ELSE
                      .
                      .
                      .
       <valor> WHEN <condição_3> ELSE
       <valor>;

O exemplo abaixo representa dois multiplexadores (A e B) em série, onde:

  • Sinal sel_A seleciona a saída do multiplexador A, entre x e y, que é conectada na entrada do multiplexador B
  • Sinal sel_B seleciona a saída do multiplexador B ('saida'), entre a saída do A e z
saida <= z WHEN sel_B = '1' ELSE
         y WHEN sel_A = '1' ELSE
         x;

De certa forma, o operador condicional é semelhante ao operador if em linguagens de programação de software.

De seleção

São da forma:

WITH <expressão> SELECT
   <nome> <= <valor> WHEN <condição_1>,
             <valor> WHEN <condição_2>,
                          .
                          .
                          .
             <valor> WHEN OTHERS;

No exemplo abaixo, um multiplexador de 4 entradas (a, b, c, d) e uma seleção de 2 elementos sel é desenvolvido:

WITH sel SELECT
   y <= a  WHEN "00",
        b  WHEN "01",
        c  WHEN "10",
        d  WHEN "11",
       '0' WHEN OTHERS;

Operadores

Abaixo, um resumo dos operadores utilizados nas expressões:

Lógicos
  • NOT
  • AND
  • NAND
  • OR
  • NOR
  • XOR
  • XNOR
Aritméticos
  • Adição: +
  • Subtração: -
  • Multiplicação: *
  • Divisão: /
  • Exponenciação: **
  • Valor absoluto: ABS
Comparação
  • Igual: =
  • Diferente: /=
  • Maior: >
  • Menor: <
  • Maior igual: >=
  • Menor igual: <=
Concatenação

Para concatenar valores, usa-se o operador &:

x <= '1' & "0001";         -- x <= "10001"


Desta forma, a ordem das atribuições dentro de uma arquitetura não importa!.

Exercícios - Objetos e atribuições

Resolver os seguintes exemplos do capítulo 4 do livro [3]:

  • Exemplo 2: pg 36
Solução - Clicar no "+" para expandir
Exemplo 2. Fonte: [3].


Exemplo 2 usando sinais intermediários. Fonte: [3].


  • Exemplo 3: pg 39
Solução - Clicar no "+" para expandir
Exemplo 3. Fonte: [3].


  • Exemplo 4: pg 40
Solução - Clicar no "+" para expandir
Exemplo 4. Fonte: [3].


Exemplo 4 com elementos separados. Fonte: [3].


  • Exemplo 5: pg 42
Solução - Clicar no "+" para expandir
Exemplo 5. Fonte: [3].


  • Exemplo 6: pg 43
Solução - Clicar no "+" para expandir
Exemplo 6. Fonte: [3].


  • Exemplo 7: pg 44
Solução - Clicar no "+" para expandir
Exemplo 7. Fonte: [3].


  • Exemplo 8: pg 46
Solução - Clicar no "+" para expandir
Exemplo 8. Fonte: [3].


Resolver os exercícios do capítulo 4 do livro [3] (Pg. 48).

Referências

[1] Altera Training Courses. VHDL Basics. Disponível em Link. Acesso em 27/02/2015.
[2] Pedroni, Volnei A. Eletrônica Digital Moderna e VHDL. Rio de Janeiro: Elsevier, 2010.
[3] Mealy, B. Tappero, F. Free Range VHDL. Free Range factory. Disponível em Link. Acesso em 27/02/2015.

Abordagens

Há 3 tipos de abordagens para escrever arquiteturas em VHDL: Data-flow, Behavioral e Structural.

Data-flow (fluxo de dados)

Especifica o circuito como uma representação do fluxo de dados através do circuito. São informadas as relações entre as entradas que geram as saídas do modelo, ou como o dado de entrada "flui" até a saída, a partir das operações descritas. As atribuições simples, condicional e de seleção fazem parte da abordagem Data-flow.

Vantagens:

  • Dá uma visão do fluxo dos sinais no circuito diretamente do código
  • Indica como o sistema será implementado no FPGA

Desvantagens:

  • Se torna difícil de ser utilizado à medida que os circuitos ficam mais complexos

Behavioral (comportamental)

Não traz detalhes de como o sistema será quando sintetizado. Modela como as saídas do sistema irão reagir às entradas do sistema, e os detalhes de implementação são deixados para a ferramenta de sintetização.

Enquanto a abordagem Data-flow descreve como o circuito deve ser, a abordagem behavioral descreve o seu comportamento. Assim, a abordagem comportamental é considerada de um nível de abstração maior.

PROCESS

É o coração da abordagem behavioral, pois seu corpo possui instruções sequenciais. Possui a forma:

<label>: process (<sinal1>,<sinal2>) is
   <declaração>
begin
   <instruções sequenciais>
end process <label>

onde:

  • <label>: rótulo do processo. É opcional mas recomendado para melhorar a legibilidade do código
  • <sinal1>,<sinal2>: lista de sinais que compõem a lista de sensibilidade, parte fundamental da estrutura process (mais detalhes abaixo)
  • <declaração>: declaração de variáveis com escopo local ao process
  • <instruções sequenciais>: corpo da estrutura, onde a lógica é descrita
Lista de sensibilidade

Temos abaixo duas formas diferentes de descrever a mesma função, uma operação de XOR entre as portas de entrada A e B.

XOR com Data-flow. Fonte: [1].
XOR com Behavioral. Fonte: [1].


Na abordagem Data-flow, a cada vez que um sinal (A ou B) é alterado, a expressão é avaliada e o sinal do lado esquerdo do operador de atribuição (F) é atualizado. Na abordagem Behavioral, para o corpo da função ser executado, é necessário que haja alteração num dos sinais presentes da lista de sensibilidade. É importante ter em mente no entanto que embora seja composta por instruções sequenciais, a estrutura process é executada simultaneamente com instruções Data-flow dentro da mesma arquitetura.

Execução sequencial

As instruções no corpo de um process são sintetizadas de forma a serem executadas sequencialmente, como numa programação de software comum. Abaixo, serão demonstrados os 3 tipos de instruções sequenciais do VHDL.

Instrução de atribuição de sinal

São as instruções vistas nas aulas anteriores, com o operador de atribuição "<=".

Instrução de teste

É a versão sequencial para a atribuição condicional vista anteriormente. Segue a forma:

if (<condição>) then
   <instruções>;
elsif (<condição>) then
   <instruções>;
else
   <instruções>;
end if;

Considerações:

  • Os parênteses são opcionais
  • Instruções de teste podem ser aninhadas para obter testes mais complexos
  • A instrução pode ser escrita em uma única linha se isso melhorar a legibilidade
Uso do IF - Exemplo 9, pg 58. Fonte: [1].



Instrução de seleção

Versão sequencial para a atribuição de seleção vista anteriormente. Segue a forma:

case (<expressão>) is
   when <resultado> =>
      <instruções>;
   when <resultado> =>
      <instruções>;
   when others =>
      <instruções>;
end case;

Considerações:

  • Os parênteses são opcionais
  • Somente um conjunto de instruções é executado
  • A instrução pode ser escrita em uma única linha se isso melhorar a legibilidade
Uso do CASE - Exemplo 12, pg 64. Fonte: [1].


Referências

[1] Mealy, B. Tappero, F. Free Range VHDL. Free Range factory. Disponível em Link. Acesso em 27/02/2015.


Atribuições de variáveis em simulações

As atribuições de sinais podem ser agendadas usando a instrução AFTER:

x <= A or B AFTER 0.5 ns;
 
y <= a AFTER 1 s WHEN z = 0 ELSE
     b;

Mesmo quando não há um agendamento explícito, as atribuições de sinais não são executadas imediatamente após a instrução. Tanto em processos implícitos (atribuições simples, condicionais e de seleção) quanto em processos explícitos (instrução PROCESS), as atribuições são realizadas após um tempo chamado de Delta Delay. O Delta Delay é definido como o tempo necessário para que todos os processos simultaneamente em execução sejam encerrados. Após esse tempo, todas as atribuições sem agendamento indicado são realizadas. Isso significa que as atribuições realizadas dentro de processos explícitos só serão efetuadas após a conclusão do processo.

A necessidade deste fato pode ser confirmada no exemplo a seguir [1].

Circuito combinacional. Fonte: [1].


Para o circuito apresentado, duas formas de avaliação podem ser utilizadas:

Formas de avaliação do circuito. Fonte: [1].


Se esse comportamento não for bem definido, erros graves podem ser gerados na fase de compilação. Por isso, os Delta Delays são utilizados, e o problema é resolvido da seguinte forma:

Circuito avaliado com o Delta Delay. Fonte: [1].


Nos códigos abaixo, três formas aparentemente semelhantes são exibidas. Você consegue confirmar se os códigos são funcionalmente iguais?

Códigos e Delta Time. Fonte: [2].


PENSE A RESPEITO e depois clique no "+" para expandir

Repare que há diferenças no número de processos envolvidos. No caso, os códigos esquerdo e direito são funcionalmente iguais. O código central é diferente dos outros pois o c usado na segunda atribuição não terá o valor atualizado da operação a AND b.

Simulação

A simulação do modelo VHDL segue duas fases: inicialização e ciclos de simulação.

  • Inicialização:
  • Valores iniciais são atribuídos aos sinais
  • Processos sensíveis aos sinais são executados
  • Atribuição de sinais são agendadas
  • Ciclo de simulação:
  • Tempo de simulação é avançado ao próximo tempo em que há uma atribuição de sinal agendada
  • São realizadas as atribuições
  • Processos sensíveis aos sinais são executados
  • Atribuição de sinais são agendadas
  • Quando todos os processos terminam sua execução, o ciclo atual de simulação é encerrado, e um novo ciclo é executado
  • Quando todos os processos forem executados e não houver mais alterações nos sinais, a simulação é encerrada
Fluxo de simulação de um modelo VHDL. Fonte: [2].


O objeto VARIABLE

Dentro de processos explícitos (instrução PROCESS) o objeto VARIABLE pode ser utilizado. Sua declaração é igual à declaração de objetos SIGNAL, mas há algumas diferenças:

  • Atribuição de valores: Enquanto objetos SIGNAL usam o operador "<=", objetos VARIABLE usam ":=".
  • Atualização: Enquanto objetos SIGNAL são atualizados ao final do Delta Time, objetos VARIABLE são atualizados imediatamente.

Além disso, como objetos VARIABLE só podem ser declarados dentro de instruções PROCESS, eles são de escopo local. Uma forma de alterar isso é utilizar um objeto SHARED VARIABLE, normalmente declarado na arquitetura. Uma SHARED VARIABLE possui escopo global, mas só pode ser modificada em códigos sequenciais (dentro de um PROCESS, por exemplo). A passagem do seu valor à um SIGNAL pode ser feita em qualquer lugar [4].

SHARED VARIABLE x : BIT;

Assim como variáveis globais em linguagens de programação de software, é recomendado que objetos SHARED VARIABLE sejam usados apenas em casos muito específicos.

A tabela abaixo resume as diferenças entre objetos SIGNAL e VARIABLE [4]:

Regra SIGNAL VARIABLE
1. Local de declaração Proibido declarar em código sequencial Somente em código sequencial (PROCESS ou subprograma)
2. Escopo Pode ser global Sempre local (visível somente no código sequencial correspondente)
3. Atualização Ao final do DELTA TIME Atualização imediata
4. Atribuição sig <= 5 var := 5

Tarefas

  • Resolver exercícios do Capítulo 5 (pg 68) do livro [3].

Referências

[1] Perry, Douglas L. VHDL Programming by example. 4ª Edição. McGrw-Hill.
[2] Altera Training Courses. VHDL Basics. Disponível em Link. Acesso em 27/02/2015.
[3] Mealy, B. Tappero, F. Free Range VHDL. Free Range factory. Disponível em Link. Acesso em 27/02/2015.
[4] Pedroni, Volnei A. Eletrônica Digital Moderna e VHDL. Rio de Janeiro: Elsevier, 2010.

Outros tópicos em VHDL

Tipos de dados definidos pelo usuário

O projetista pode também criar seus próprios tipos de dados. Eles podem ser declarados na entidade, arquitetura, entre outros. Tipos de dados devem ser definidos sempre que possível, pois melhora a legibilidade do código [1].

Tipos baseados em inteiros

São declarados usando a forma:

TYPE <nome do tipo> IS RANGE <faixa de valores>;

onde <faixa de valores> define a faixa de valores que o tipo de dado pode assumir. Usa as palavras chaves TO ou DOWNTO.

Exemplos:

type scores is range 0 to 100;
type years is range -3000 to 3000;
type apples is range 0 to 15;
type oranges is range 0 to 15;
Tipos enumerados

Definem uma lista de valores. Seguem o formato:

TYPE <nome do tipo> IS (<lista de nomes ou números>);

onde <lista de nomes ou números> define os valores possíveis, separados por vírgula.

Exemplos:

type machine_state is (idle, forward, backward);
type counter is (zero, one, two, three);
Tipos baseados em arranjos

Seguem a forma:

TYPE <nome do tipo> IS ARRAY (<faixa de valores>) OF <tipo do dado>;

Exemplos [2]:

  • Arranjos linha:
type vector is array (7 downto 0) of std_logic;
  • Arranjos 1D x 1D (conjunto de linhas):
type array1D1D is array (1 to 4) of bit_vector (7 downto 0);
type vector_array is array (1 to 4) of vector;
  • Arranjos matriciais
type array2D is array (1 to 8, 1 to 16) of std_logic;


NOTA: Todos os tipos de dados declarados acima poderiam ter sido criados com o uso da palavra SUBTYPE. A vantagem de definir subtipos é a possibilidade de fazer atribuições entre os tipos de origem e novo.

Laços de repetição

No corpo de processos explícitos é possível criar laços de repetição. São normalmente utilizados para atribuição de valores à múltiplas portas, contagem, etc.

FOR

Usado quando o desenvolvedor sabe o número de iterações a serem realizadas. Segue a forma:

<rotulo>: FOR <indice> IN <faixa de valores> LOOP
   <instruções sequenciais>;
END LOOP <rotulo>;

onde:

  • <indice>: Variável que receberá o valor incrementado a cada iteração. Possui as seguintes características:
  • Não precisa ser declarada previamente.
  • Não pode receber valores dentro do laço.
  • Somente incrementos de 1 unidade são permitidos.
  • <faixa de valores>: Pode ser declarada de duas formas:
  • Explicitamente, com as palavras-chave TO e DOWNTO
  • Implicitamente, a partir de tipos definidos pelo usuário

Exemplos:

for cnt_val in 0 to 24 loop
   -- sequential_statements
end loop;
for cnt_val in 24 downto 0 loop
   -- sequential_statements
end loop;
type my_range is range 0 to 24;
--
for cnt_val in my_range loop
   -- sequential_statements
end loop;
type my_range is range 24 downto 0;
--
for cnt_val in my_range loop
   -- sequential_statements
end loop;
WHILE

Usado quando o desenvolvedor não conhece o total de iterações necessárias, pois elas são realizadas até uma condição determinada ser atingida.

<rotulo>: WHILE (<condição>) LOOP
   <instruções sequenciais>;
END LOOP <rotulo>;
Controle de iterações

O VHDL fornece também instruções para controle de iterações

NEXT

Pula o restante da iteração atual do laço, passando para a próxima. Duas formas são disponíveis, como pode ser visto nos exemplos abaixo:

variable my_sum : integer := 0;
--
for cnt_val in 0 to 50 loop
   if (my_sum = 20) then
      next;
   end if;
   my_sum := my_sum + 1;
end loop;
variable my_sum : integer := 0;
--
while (my_sum < 300) loop
   next when (my_sum = 20);
   my_sum := my_sum + 1;
end loop;
EXIT

Encerra toda a estrutura de repetição. As duas formas disponíveis ao NEXT podem ser utilizadas.

Repetição de código

Assim como linguagens de programação de software, VHDL também traz ferramentas para evitar a repetição de códigos. No caso, são utilizadas as estruturas FUNCTION, PROCEDURE e COMPONENT. As duas primeiras serão vistas agora.

FUNCTION

São blocos de código que podem ser chamados para realizar tarefas determinadas. Características:

  • Assim como processos explícitos, FUNCTIONs são sequenciais.
  • Todos os parâmetros recebidos são de entrada.
  • Retornam apenas um valor.

São declaradas da forma:

FUNCTION <nome> (<argumentos de entrada>)
RETURN <tipo do dado de retorno> IS
   <declarações>
BEGIN
   <instruções sequenciais>
   <rotulo>: RETURN <expressao>;
END FUNCTION <nome>

onde:

  • <argumentos de entrada>: Opcionais, é a lista de sinais de entrada da função
  • <rotulo>: Opcional.
  • <expressao>: Expressão a ser calculada para definir o dado de retorno. Normalmente, apenas a variável de retorno é indicada.

Funções podem ser declaradas na parte declarativa da ARCHITECTURE, e podem ser chamadas em qualquer lugar do código

Função de exemplo. Fonte: [3].


PROCEDURE

Assim como as FUNCTIONs, PROCEDUREs são usados para evitar a repetição de código. Características:

  • Assim como PROCESS e FUNCTION, PROCEDUREs são sequenciais.
  • Podem ter qualquer número de parâmetros de entrada, saída, ou entrada e saída (inout)
  • Funções normalmente fazem parte de uma expressão, enquanto que PROCEDUREs compõem uma instrução em si

São da forma:

PROCEDURE <nome> (<argumentos>) IS
   <declarações>
BEGIN
   <instruções sequenciais>
END PROCEDURE <nome>

onde <argumentos> define a lista de sinais de entrada e saída do PROCEDURE, e cada argumento necessita do seu modo (in, out, inout).


Tarefas

Resolver os exercícios abaixo usando ao menos um tipo de dado definido, uma estrutura de repetição e uma função ou componente.

  • Desenvolva um modelo VHDL para uma porta AND com 12 entradas
  • Desenvolva uma função VHDL para converter um vetor binário de 10 elementos para um número inteiro


Referências

[1] Mealy, B. Tappero, F. Free Range VHDL. Free Range factory. Disponível em Link. Acesso em 27/02/2015.
[2] Pedroni, Volnei A. Eletrônica Digital Moderna e VHDL. Rio de Janeiro: Elsevier, 2010.
[3] Perry, Douglas L. VHDL Programming by example. 4ª Edição. McGrw-Hill.

Abordagem estrutural

Das três abordagens para escrever arquiteturas em VHDL (Data-flow, Behavioral e Structural) nos falta a última, que será vista agora com a introdução de uma nova estrutura: COMPONENT. Para isso, o projeto de um sistema específico será usado como exemplo ilustrativo. Toda esta aula segue o "Capítulo 8 - VHDL Modularity with Components" de [1].

Em VHDL, a abordagem Estrutural é obtida a partir do uso de uma estrutura chamada COMPONENT. O desenvolvimento de uma COMPONENT pode ser dividido nas etapas abaixo:

  1. Dar nome ao módulo a ser descrito (entidade)
  2. Descrever o que o módulo irá fazer (arquitetura)
  3. Fazer o programa saber que o módulo existe e pode ser utilizado (declaração do componente)
  4. Usar o módulo no código (instanciação do componente ou mapeamento)

Assim, a estrutura COMPONENT é semelhante à criação de bibliotecas próprias na programação de software, com a criação de pequenos módulos (ou funções) e sua posterior declaração e utilização no código principal. Esta semelhança pode ser vista na tabela abaixo:

Linguagem C VHDL
Descrever a interface da função ENTITY do módulo
Descrever o que a função faz ARCHITECTURE do módulo
Provê um protótipo da função para o programa principal (main) Declaração da COMPONENT na Top-level Entity
Chamar a função no programa principal (main) Instanciação ou mapeamento do COMPONENT na Top-level Entity

O exemplo: Comparador de 3 bits

O exemplo que será utilizado para demonstrar a abordagem estrutural pode ser visto na figura abaixo. São características:

  • As 3 portas A_IN e B_IN compõem dois barramentos de entrada
  • EQ_OUT é um BIT, que indica que as entradas são iguais (1) ou não (0)
  • Os sinais p1_out, p2_out e p3_out são internos ao sistema
Exemplo - Comparador de 3 bits. Fonte: [1].


Desenvolvendo o sistema usando a abordagem Estrutural

A partir do sistema, a abordagem Estrutural segue os 5 passos abaixo:

  1. Implementar os módulos do circuito
  2. Declarar a entidade de nível mais alto
  3. Declarar os módulos de mais baixo nível
  4. Declarar os sinais internos usados para conectar os módulos
  5. Instanciar as unidades
Implementar os módulos do circuito

Como pode ser visto, o sistema faz uso de dois sistemas menores: a porta XNOR de 2 entradas e a porta AND de 3 entradas. Assim, é necessário implementar essas duas entidades.

No Quartus II, criar um projeto novo com o nome da entidade de nível mais alto my_compare. Após isso, criar os dois arquivos abaixo:

Módulo 1: big_xnor.vhd. Fonte: [1].
Módulo 2: big_and3.vhd. Fonte: [1].


Repare que os arquivos são desenvolvidos da mesma forma que sistemas como um todo.

Declarar a entidade de nível mais alto

Agora o comparador começará a ser desenvolvido, no arquivo my_compare.vhd. Como todo sistema, inicia-se pela entidade. A partir do diagrama acima e com base nas considerações apresentadas, a entidade será:

Entity. Fonte: [1].


Declarar os módulos de mais baixo nível

A declaração das portas desenvolvidas (XNOR e AND3) no código principal são feitas usando as COMPONENTs. Para isto, basta copiar as ENTITYs criadas nos outros arquivos para a parte declarativa da ARCHITECTURE, alterando a palavra-chave ENTITY para COMPONENT.

Declaração dos módulos com as COMPONENTs. Fonte: [1].


Declarar os sinais internos usados para conectar os módulos

Os sinais internos presentes no diagrama são declarados na arquitetura. Eles são utilizados para a interligação dos módulos criados.

Instanciar as unidades

O último passo é criar as instâncias dos módulos. Isto é feito mapeando os sinais de entrada e saída das componentes no corpo da arquitetura. É usada a palavra-chave PORT MAP.

Instanciação dos módulos. Fonte: [1].


No caso acima, é usado o chamado mapeamento direto. Nele, a associação dos sinais da entidade de nível mais alto com os sinais internos das componentes é feito usando o operador "=>". Uma alternativa é usar o mapeamento implícito, onde os sinais da entidade de nível mais alto são associados pela ordem da declaração:

Mapeamento implícito. Fonte: [1].


Sistema finalizado

O código completo pode ser visto na figura abaixo:

Comparador finalizado. Fonte: [1].


Mapeamento de constantes

O mapeamento pode ser realizado para, além das portas, as GENERICs. Com isto, sistemas genéricos podem ser criados, facilitando futuras implementações.

A entidade abaixo realiza a checagem de paridade de um número genérico de bits. Repare na declaração de n como um GENERIC.

Checagem de paridade. Fonte: [1].


Essa entidade é utilizada numa entidade de nível maior, como pode ser visto abaixo. Repare na instrução GENERIC MAP, que assim como o PORT MAP, faz o mapeamento do número de sinais de entrada a serem utilizados.

Checagem de paridade. Fonte: [1].


Tarefas

Resolver exercícios do capítulo 8, pg 129, do livro [1].

Referências

[1] Mealy, B. Tappero, F. Free Range VHDL. Free Range factory. Disponível em Link. Acesso em 27/02/2015.

Avaliação 1 - Sistemas combinacionais

Avaliações dos semestres anteriores - 2015-1 - Clique no "+" para expandir

Desenvolver os sistemas abaixo em VHDL, em dois grupos de 3 pessoas. O arquivo do QSIM deve ser gerado para realização dos testes. Escrever um relatório explicando a solução adotada, tanto para o desenvolvimento do código quanto para o arquivo de testes do QSIM.

Os relatórios dois dois grupos formados está disponíveis nas páginas:


1 - Cruzamento de duas ruas

Desenvolver um sistema automático para os semáforos em um cruzamento de duas ruas, com as seguintes características:

  1. Quando houver carros somente na rua B, o semáforo 2 deverá permanecer verde
  2. Quando houver carros somente na rua A, o semáforo 1 deverá permanecer verde
  3. Quando houver carros nas duas ruas, o semáforo 1 deverá permanecer verde
Cruzamento de duas ruas.


2 - Um amplificador e três aparelhos

Desenvolver um sistema que comuta a utilização de um amplificador para três aparelhos, obedecendo as seguintes prioridades:

  1. Toca-discos
  2. Toca-fitas
  3. Rádio FM
3 - Intercomunicadores

Desenvolver um sistema que comuta intercomunicadores em uma empresa, obedecendo as seguintes prioridades:

  1. Presidente
  2. Vice-presidente
  3. Engenharia
  4. Chefe de seção
4 - Display de 7 segmentos

Desenvolver um sistema que mostra um número hexadecimal num display de 7 segmentos

5 - Tanque com fluido

Desenvolver um sistema para controlar o nível de fluido em um tanque por meio de uma válvula de entrada e uma válvula de saída, de igual vazão. O nível de fluído deve ser mantido entre dois níveis, medidos com dois sensores, um de mínimo e outro de máximo. Um botão para total esvaziamento do tanque (equivalente à um botão de liga/desliga do tanque) deve ser previsto.

6 - Cruzamento de três ruas

Desenvolver um sistema para controlar semáforos em um cruzamento de 3 ruas, com as seguintes características:

  1. Fechamento dos semáforos:
  1. Quando o semáforo 1 abrir para a rua A, automaticamente os semáforos 2 e 3 devem fechar
  2. Quando o semáforo 2 abrir para a rua B, automaticamente os semáforos 1 e 3 devem fechar
  3. Quando o semáforo 3 abrir para a rua C, automaticamente os semáforos 1 e 2 devem fechar
  1. Prioridades:
  1. O motorista que está na rua A tem prioridade sobre o que está na rua B
  2. O motorista que está na rua B tem prioridade sobre o que está na rua C
  3. O motorista que está na rua C tem prioridade sobre o que está na rua A
  4. Quando houver carros nas três ruas, a rua A é preferencial
  5. Quando não houver nenhum carro na rua, o sinal para a rua A deverá ser aberto
7 - Tanque de dois níveis, com sensor de temperatura

Desenvolver um sistema para controlar o nível de água em dois tanques por meio de duas válvulas, com as seguintes características:

  1. O tanque 2:
  1. Possui saída para a distribuição, por isso seu nível está sempre em redução
  2. Possui dois sensores, que indicam o nível mínimo (válvula 2 deve ser acionada) e o máximo (válvula 2 deve ser desligada)
  1. O tanque 1:
  1. É alimentado pela rede pública de abastecimento
  2. Possui os mesmos sensores do tanque 2
  3. Além desses dois, tendo em vista as oscilações presentes na rede de abastecimento, um sensor de segurança está disponível, indicando um nível intermediário (válvula 1 deve ser acionada se a válvula 2 estiver acionada)
  1. Sempre que chegar no nível mínimo, os tanques devem ser enchidos até o nível máximo

O sensor de temperatura é composto por dois sensores, um que indica se a água está muito fria e outro que indica se a água está muito quente.

Para todos os sensores do sistema, casos de falhas devem acionar um alarme.

Tanque de dois níveis, com sensor de temperatura.


8 - Circuito aritmético

Desenvolver um circuito somador completo de 8 bits


Adendo - Uso do FPGA

Das questões anteriores, implementar as discriminadas abaixo no Kit DE2-115. Em todas as questões, defina como as entradas e saídas serão simuladas no Kit (um botão, uma chave, um display, um led, etc).

1 - Cruzamento de duas ruas
3 - Intercomunicadores
4 - Display de 7 segmentos
5 - Tanque com fluido
7 - Tanque de dois níveis, com sensor de temperatura
Avaliações dos semestres anteriores - 2015-2 - Clique no "+" para expandir

Desenvolver o sistema comparador do diagrama abaixo:

Comparador.png

As seguintes considerações devem ser feitas:

  • O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
  • Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
  • A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
Decoder-2014-2.png
  • O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
  • Os blocos Comparador, Mux e Decod. 7-seg deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
  • Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
  • Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
  • Enviar ao professor, via e-mail, os seguintes arquivos:
  • Projeto empacotado (.QAR)
  • Arquivos .VHD usados no projeto
  • Arquivo .VWF usado para simular o projeto
Avaliações dos semestres anteriores - 2016-1 - Clique no "+" para expandir

No semestre atual, a avaliação será feita em duas etapas, onde a primeira etapa será feita em aula, e a segunda será realizada ao longo da próxima semana.

Parte 1

Escolher uma das questões abaixo e fazer uma implementação em VHDL para o FPGA. Implementar na placa, descrevendo quais dispositivos serão destinados à cada sinal.

Questão 1 - Semáforo de duas ruas

Desenvolver um sistema automático para os semáforos em um cruzamento de duas ruas, com as seguintes características:

  1. Quando houver carros somente na rua B, o semáforo 2 deverá permanecer verde
  2. Quando houver carros somente na rua A, o semáforo 1 deverá permanecer verde
  3. Quando houver carros nas duas ruas, o semáforo 1 deverá permanecer verde
Cruzamento de duas ruas.


Questão 2 - Amplificador e três aparelhos

Desenvolver um sistema que comuta a utilização de um amplificador para três aparelhos, obedecendo as seguintes prioridades:

  1. Toca-discos
  2. Toca-fitas
  3. Rádio FM
Questão 3 - Intercomunicadores

Desenvolver um sistema que comuta intercomunicadores em uma empresa, obedecendo as seguintes prioridades:

  1. Presidente
  2. Vice-presidente
  3. Engenharia
  4. Chefe de seção
Questão 4 - Tanque de fluido

Desenvolver um sistema para controlar o nível de fluido em um tanque por meio de uma válvula de entrada e uma válvula de saída, de igual vazão. O nível de fluído deve ser mantido entre dois níveis, medidos com dois sensores, um de mínimo e outro de máximo. Um botão para total esvaziamento do tanque (equivalente à um botão de liga/desliga do tanque) deve ser previsto.

Parte 2

Desenvolver o sistema comparador do diagrama abaixo:

Comparador.png

As seguintes considerações devem ser feitas:

  • O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
  • Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
  • A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
Decoder-2014-2.png
  • O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
  • Os blocos Comparador, Mux e Decod. 7-seg deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
  • Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
  • Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
  • Enviar ao professor, via e-mail, os seguintes arquivos:
  • Projeto empacotado (.QAR)
  • Arquivos .VHD usados no projeto
  • Arquivo .VWF usado para simular o projeto
Avaliações dos semestres anteriores - 2016-2 - Clique no "+" para expandir

No semestre atual, a avaliação será feita em duas etapas, onde a primeira etapa será feita em aula, e a segunda será realizada ao longo da próxima semana.

Parte 1
Tanque de dois níveis, com sensor de temperatura

Desenvolver um sistema para controlar o nível de água em dois tanques por meio de duas válvulas, com as seguintes características:

  1. O tanque 2:
  1. Possui saída para a distribuição, por isso seu nível está sempre em redução
  2. Possui dois sensores, que indicam o nível mínimo (válvula 2 deve ser acionada) e o máximo (válvula 2 deve ser desligada)
  1. O tanque 1:
  1. É alimentado pela rede pública de abastecimento
  2. Possui os mesmos sensores do tanque 2
  3. Além desses dois, tendo em vista as oscilações presentes na rede de abastecimento, um sensor de segurança está disponível, indicando um nível intermediário (válvula 1 deve ser acionada se a válvula 2 estiver acionada)
  1. Sempre que chegar no nível mínimo, os tanques devem ser enchidos até o nível máximo

O sensor de temperatura é composto por dois sensores, um que indica se a água está muito fria e outro que indica se a água está muito quente.

Para todos os sensores do sistema, casos de falhas devem acionar um alarme.

Tanque de dois níveis, com sensor de temperatura.


Parte 2

Desenvolver o sistema comparador do diagrama abaixo:

Comparador.png

As seguintes considerações devem ser feitas:

  • O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
  • Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
  • A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
Decoder-2014-2.png
  • O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
  • Os blocos Comparador, Mux e Decod. 7-seg deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
  • Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
  • Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
  • Enviar ao professor, via e-mail, os seguintes arquivos:
  • Projeto empacotado (.QAR)
  • Arquivos .VHD usados no projeto
  • Arquivo .VWF usado para simular o projeto
Avaliações dos semestres anteriores - 2017-1 - Clique no "+" para expandir

No semestre atual, a avaliação será feita em duas etapas, onde a primeira etapa será feita em aula, e a segunda será realizada ao longo da próxima semana.

Parte 1
Tanque de dois níveis, com sensor de temperatura

Desenvolver um sistema para controlar o nível de água em dois tanques por meio de duas válvulas, com as seguintes características:

  1. O tanque 2:
  1. Possui saída para a distribuição, por isso seu nível está sempre em redução
  2. Possui dois sensores, que indicam o nível mínimo (válvula 2 deve ser acionada) e o máximo (válvula 2 deve ser desligada)
  1. O tanque 1:
  1. É alimentado pela rede pública de abastecimento
  2. Possui os mesmos sensores do tanque 2
  3. Além desses dois, tendo em vista as oscilações presentes na rede de abastecimento, um sensor de segurança está disponível, indicando um nível intermediário (válvula 1 deve ser acionada se a válvula 2 estiver acionada)
  1. Sempre que chegar no nível mínimo, os tanques devem ser enchidos até o nível máximo

O sensor de temperatura é composto por dois sensores, um que indica se a água está muito fria e outro que indica se a água está muito quente.

Para todos os sensores do sistema, casos de falhas devem acionar um alarme.

Tanque de dois níveis, com sensor de temperatura.


Parte 2

Desenvolver o sistema comparador do diagrama abaixo:

Comparador.png

As seguintes considerações devem ser feitas:

  • O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
  • Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
  • A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
Decoder-2014-2.png
  • O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
  • Os blocos Comparador, Mux e Decod. 7-seg deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
  • Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
  • Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
  • Enviar ao professor, via e-mail, os seguintes arquivos:
  • Projeto empacotado (.QAR)
  • Arquivos .VHD usados no projeto
  • Arquivo .VWF usado para simular o projeto
Avaliações dos semestres anteriores - 2017-2 - Clique no "+" para expandir

No semestre atual, a avaliação será feita em duas etapas, onde a primeira etapa será feita em aula, e a segunda será realizada ao longo da próxima semana.

Parte 1
6 - Cruzamento de três ruas

Desenvolver um sistema para controlar semáforos em um cruzamento de 3 ruas, com as seguintes características:

  1. Fechamento dos semáforos:
  1. Quando o semáforo 1 abrir para a rua A, automaticamente os semáforos 2 e 3 devem fechar
  2. Quando o semáforo 2 abrir para a rua B, automaticamente os semáforos 1 e 3 devem fechar
  3. Quando o semáforo 3 abrir para a rua C, automaticamente os semáforos 1 e 2 devem fechar
  1. Prioridades:
  1. O motorista que está na rua A tem prioridade sobre o que está na rua B
  2. O motorista que está na rua B tem prioridade sobre o que está na rua C
  3. O motorista que está na rua C tem prioridade sobre o que está na rua A
  4. Quando houver carros nas três ruas, a rua A é preferencial
  5. Quando não houver nenhum carro na rua, o sinal para a rua A deverá ser aberto
Parte 2

Desenvolver o sistema comparador do diagrama abaixo:

Comparador.png

As seguintes considerações devem ser feitas:

  • O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
  • Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
  • A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
Decoder-2014-2.png
  • O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
  • Os blocos Comparador, Mux e Decod. 7-seg deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
  • Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
  • Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
  • Enviar ao professor, via e-mail, os seguintes arquivos:
  • Projeto empacotado (.QAR)
  • Arquivos .VHD usados no projeto
  • Arquivo .VWF usado para simular o projeto

Avaliação do semestre atual

Desenvolver o sistema comparador do diagrama abaixo:

Comparador.png

As seguintes considerações devem ser feitas:

  • O sistema compara o número passado através das chaves (SW) 0 a 3 com o número passado através das chaves 4 a 7;
  • Caso a comparação seja verdadeira, o sistema acenderá o led verde (LEDG) 0;
  • A comparação realizada será escolhida através das chaves 15 a 17, a partir da ordem abaixo:
Decoder-2014-2.png
  • O símbolo da comparação deverá ser mostrado num display de 7 segmentos;
  • Os blocos Comparador, Mux e Decod. 7-seg deverão ser utilizados na entidade de nível mais alto a partir de uma abordagem estrutural;
  • Escrever um arquivo .VWF que teste o sistema desenvolvido antes de implementá-lo na placa;
  • Implementar no kit DE2-115 da Altera, e mostrar ao professor a conclusão da atividade;
  • Enviar ao professor, via e-mail, os seguintes arquivos:
  • Projeto empacotado (.QAR)
  • Arquivos .VHD usados no projeto
  • Arquivo .VWF usado para simular o projeto

Circuitos sequenciais em VHDL

Muitos sistemas precisam armazenar valores por períodos de tempo determinados. Nesta aula, vamos estudar como desenvolver esse tipo de sistema em VHDL. Baseados no capítulo 6 do livro [1], vamos desenvolver um Flip-Flop do tipo D, elemento de armazenamento de 1 bit.

Flip Flop tipo D

A figura abaixo apresenta o diagrama de um flip flop tipo D;

Flip Flop tipo D


Abaixo, os estados possíveis do Flip Flop.

Estados possíveis - Clicar no "+" para expandir
SST FlipFlop D2.png

Flip Flop tipo D em VHDL

  • Exercício: Desenvolva um modelo VHDL para um Flip Flop tipo D como mostrado na seção anterior. Visando já sua aplicação como memória em um sistema maior, fazer com que a entrada D seja síncrona, ou seja, só tenha influência na saída durante a borda de subida do sinal de clock.

Abaixo, a solução do problema.


Flip Flop tipo D em VHDL


Comentários:

  • O armazenamento de informação no Flip Flop é feito através das seguintes características no código:
  • Sendo o processo sensível apenas à CLK, a informação de entrada será avaliada apenas em casos de alteração nesse sinal
  • A função rising_edge() certifica que o corpo da instrução IF será executado apenas na borda de subida do clock
  • A ausência de uma instrução ELSE evita que outras operações sejam executadas dentro do bloco
  • Foi usada a abordagem behavioral ao invés da data-flow.
  • A função rising_edge() poderia ser substituída pelo teste abaixo:
if CLK = '1' then

Entrada set síncrona e ativo-baixo

Flip Flop tipo D com entrada set

Neste caso, o Flip Flop tem as seguintes características:

  • A entrada set (S) fará com que a saída do Flip Flop seja "1", independente da sua entrada D.
  • Por ser síncrona, essa alteração será realizada apenas na borda de subida do clock.
  • Por ser ativo-baixo, essa alteração será realizada apenas quando S for igual à "0".

A solução para o problema pode ser vista abaixo:

Flip Flop tipo D com entrada set em VHDL


Comentários:

  • A porta S foi incluída através de um novo teste dentro do processo
  • A prioridade da porta S sobre a porta D é implementada pela ordem dos IFs utilizada.

Entrada reset assíncrona e clock na borda de descida

Flip Flop tipo D com entrada reset

Neste caso, o Flip Flop tem as seguintes características:

  • A entrada reset (R) fará com que a saída do Flip Flop seja "0", independente da sua entrada D.
  • Por ser assíncrona, essa alteração será realizada sempre que R for alterado.

A solução para o problema pode ser vista abaixo:

Flip Flop tipo D com entrada reset em VHDL


Comentários:

  • Como a entrada R é assíncrona, ela não depende do clock. Por isso, R foi incluída na lista de sensitividade do processo.
  • A prioridade da porta R sobre a porta D é implementada pela ordem dos IFs utilizada.

Flip Flop tipo T

A figura abaixo apresenta o diagrama de um flip flop tipo T;

Flip Flop tipo T


Abaixo, os estados possíveis do Flip Flop.

Estados possíveis - Clicar no "+" para expandir
SST FlipFlop T2.png

Flip Flop tipo T em VHDL

  • Exercício: Desenvolva um modelo VHDL para um Flip Flop tipo T como mostrado na seção anterior. Visando já sua aplicação como memória em um sistema maior, fazer com que a entrada D seja síncrona, ou seja, só tenha influência na saída durante a borda de subida do sinal de clock.

Abaixo, a solução do problema.


Flip Flop tipo T em VHDL


Comentários:

  • Enquanto a saída do Flip Flop D depende apenas de sua entrada, no caso do Flip FLop T ela depende também da saída anterior.

Tarefas

Fazer exercícios 1 a 6 do capítulo 6 (pg 86) do livro [1].

Referências

[1] Mealy, B. Tappero, F. Free Range VHDL. Free Range factory. Disponível em Link. Acesso em 27/02/2015.

Atributos

Tem por finalidade permitir a construção de códigos genéricos e monitorar sinais. Abaixo, alguns dos atributos mais utilizados:

Atributos de tipos escalares

Tendo sido criado um tipo enumerado, e uma variável deste tipo:

TYPE t IS RANGE 0 TO 255;

SIGNAL s : t;

Alguns dos atributos disponíveis são:

  • t'LOW: 0
  • t'HIGH: 255
  • t'LEFT: 0
  • s'RIGHT: 255
  • t'RANGE: 0 TO 255
  • s'REVERSE_RANGE: 255 DOWNTO 0
  • s'ASCENDING: TRUE

Atributos de sinais

São utilizados para monitorar mudanças em sinais. O mais comum deles é o s'EVENT, que retorna TRUE quando houve uma alteração de valor no sinal s.

Pacotes

Os pacotes são utilizados para realizar operações comuns. Podem ser utilizados para fazer declarações gerais ou descrever subprogramas. Segue a forma:

PACKAGE <nome> IS
   <declarações>
END PACKAGE <nome>;
 
PACKAGE BODY <nome> IS
   <corpo do subprograma>
END PACKAGE BODY <nome>;

Podem ser declaradas componentes, funções, generics e tipos de dados. A parte declarativa do pacote é utilizada para declaração de dados e o protótipo da função (parte do cabeçalho até "IS"). No corpo, as funções são construídas.

Exemplo de sistema sequencial

O exemplo abaixo, vindo de uma avaliação da disciplina do semestre 2015-1, implementa um relógio digital para contagem dos segundos. Foi desenvolvido a partir da seção 22.3 do livro do Pedroni [1], pelos alunos Nicole, Renan, Leonardo.

Exemplo de um temporizador (relógio digital)

Referências

[1] Pedroni, Volnei A. Eletrônica Digital Moderna e VHDL. Rio de Janeiro: Elsevier, 2010.

Avaliação 2 - Sistemas sequenciais

Avaliações dos semestres anteriores - 2015-1 - Clique no "+" para expandir

Em duas equipes de 3 pessoas, estudar as seções abaixo do livro [1] e fazer uma apresentação da solução adotada.

Equipe A (Kamila, Leonardo O., Rogério)
  • 22.2 - Debouncer para chave
  • 22.1 - Registrador de deslocamento com data-load
Equipe B (Nicole, Renan, Leonardo)
  • 22.3 - Temporizador
  • 22.5 - Medidor de frequência
Avaliações dos semestres anteriores - 2015-2 - Clique no "+" para expandir

Construir um relógio digital no kit Altera DE2-115. O relógio deve ter as seguintes características:

(1): Ele deve apresentar o horário nos displays de 7 segmentos disponíveis na placa, no formato abaixo, onde as siglas indicam respectivamente hora, minuto, segundo e centésimo de segundo, com dois dígitos.
HH MM SSCC
(2): Deve estar disponível a possibilidade de alteração nos horários, a partir da seleção dessa função na chave SW0. Quando a chave está ativada, o relógio deve parar e entrar em modo de edição. Os quatro push-buttons serão usados para editar o horário, sendo suas funções definidas como abaixo:
KEY3: Alterar edição para o dígito à esquerda
KEY2: Alterar edição para o dígito à direita
KEY1: Incrementar número
KEY0: Decrementar número
(3): Deve estar disponível um cronômetro, a partir da seleção dessa função na chave SW1. Quando a chave está ativada, o display deve zerar e o sistema deverá ficar aguardando o usuário pressionar o botão KEY0. Quando isso acontecer, o cronômetro deverá começar a contar. Pressionar o botão KEY0 novamente deverá pausar a contagem. O botão KEY1 deverá ser usado para zerar o cronômetro. Quando a chave SW1 for desativada, o relógio deverá continuar o horário sem problemas de atraso (o relógio não deverá ficar parado durante o cronômetro).
(4): Deve estar disponível um alarme, a partir da seleção na chave SW2. Quando a chave está ativada, o display deve zerar e o usuário entrará com a hora do alarme através dos push-buttons da mesma forma que o item (2). Ao voltar a chave SW2 para a posição desativada, o relógio deverá continuar o horário sem problemas de atraso. Quando o relógio atingir o horário definido no alarme, os leds deverão piscar por 10 segundos.
Avaliações dos semestres anteriores - 2016-1 - Clique no "+" para expandir

Construir um relógio digital no kit Altera DE2-115. O relógio deve ter as seguintes características:

(1): Ele deve apresentar o horário nos displays de 7 segmentos disponíveis na placa, no formato abaixo, onde as siglas indicam respectivamente hora, minuto, segundo e centésimo de segundo, com dois dígitos.
HH MM SSCC
(2): Deve estar disponível a possibilidade de alteração nos horários, a partir da seleção dessa função na chave SW0. Quando a chave está ativada, o relógio deve parar e entrar em modo de edição. Os quatro push-buttons serão usados para editar o horário, sendo suas funções definidas como abaixo:
KEY3: Alterar edição para o dígito à esquerda
KEY2: Alterar edição para o dígito à direita
KEY1: Incrementar número
KEY0: Decrementar número
(3): Deve estar disponível um cronômetro, a partir da seleção dessa função na chave SW1. Quando a chave está ativada, o display deve zerar e o sistema deverá ficar aguardando o usuário pressionar o botão KEY0. Quando isso acontecer, o cronômetro deverá começar a contar. Pressionar o botão KEY0 novamente deverá pausar a contagem. O botão KEY1 deverá ser usado para zerar o cronômetro. Quando a chave SW1 for desativada, o relógio deverá continuar o horário sem problemas de atraso (o relógio não deverá ficar parado durante o cronômetro).
(4): Deve estar disponível um alarme, a partir da seleção na chave SW2. Quando a chave está ativada, o display deve zerar e o usuário entrará com a hora do alarme através dos push-buttons da mesma forma que o item (2). Ao voltar a chave SW2 para a posição desativada, o relógio deverá continuar o horário sem problemas de atraso. Quando o relógio atingir o horário definido no alarme, os leds deverão piscar por 10 segundos.

A avaliação será feita em duas partes:

1. Desenhar o diagrama de blocos que explica o funcionamento do sistema
* Data da entrega: 17 de maio
2. Desenvolver o sistema
* Data da entrega: a definir

Avaliação do semestre atual

Construir um relógio digital no kit Altera DE2-115. O relógio deve ter as seguintes características:

(1): Ele deve apresentar o horário nos displays de 7 segmentos disponíveis na placa, no formato abaixo, onde as siglas indicam respectivamente hora, minuto, segundo e centésimo de segundo, com dois dígitos.
HH MM SSCC
(2): Deve estar disponível a possibilidade de alteração nos horários, a partir da seleção dessa função na chave SW0. Quando a chave está ativada, o relógio deve parar e entrar em modo de edição. Os quatro push-buttons serão usados para editar o horário, sendo suas funções definidas como abaixo:
KEY3: Alterar edição para o dígito à esquerda
KEY2: Alterar edição para o dígito à direita
KEY1: Incrementar número
KEY0: Decrementar número
(3): Deve estar disponível um cronômetro, a partir da seleção dessa função na chave SW1. Quando a chave está ativada, o display deve zerar e o sistema deverá ficar aguardando o usuário pressionar o botão KEY0. Quando isso acontecer, o cronômetro deverá começar a contar. Pressionar o botão KEY0 novamente deverá pausar a contagem. O botão KEY1 deverá ser usado para zerar o cronômetro. Quando a chave SW1 for desativada, o relógio deverá continuar o horário sem problemas de atraso (o relógio não deverá ficar parado durante o cronômetro).
(4): Deve estar disponível um alarme, a partir da seleção na chave SW2. Quando a chave está ativada, o display deve zerar e o usuário entrará com a hora do alarme através dos push-buttons da mesma forma que o item (2). Ao voltar a chave SW2 para a posição desativada, o relógio deverá continuar o horário sem problemas de atraso. Quando o relógio atingir o horário definido no alarme, os leds deverão piscar por 10 segundos.

A avaliação será feita em duas partes:

1. Desenhar o diagrama de blocos que explica o funcionamento do sistema
* Data da entrega: 08 de novembro
2. Desenvolver o sistema
* Data da entrega: a definir

Referências

[1] Pedroni, Volnei A. Eletrônica Digital Moderna e VHDL. Rio de Janeiro: Elsevier, 2010.

Conversão de tipos de dados em VHDL

BitWeenie - Conersão de tipos em VHDL

Máquina de estados finitos em VHDL

Introdução às máquinas de estados finitos

Uma Máquina de Estados Finitos (FSM - Finite State Machine) é um modelo matemático usado para representar sistemas. O estado atual é composto pelas informações armazenadas no sistema, e sofre modificações à medida que condições necessárias são atingidas. Assim, o próximo estado da máquina depende do estado atual e da entrada da máquina.

Um exemplo de uso de uma FSM é a codificação convolucional.

Outro exemplo são os porteiros eletrônicos com senha. O estado inicial indica que o sistema está aguardando os caracteres na entrada, e o último estado indica que a senha está correta. Os demais estados são o número de caracteres corretos entrados, e a entrada que faz o sistema transitar entre os estados é a senha correta.

Porteiro eletrônico com senha.


Para um texto interessante sobre FSM, consultar o Link

A figura abaixo apresenta um esquema de uma FSM. As entradas externas e o estado atual são convertidos pelo decodificador (Next State Decoder) para definir o próximo estado. No próximo pulso de clock, o novo estado é armazenado pelo registrador (State Registers), e o decodificador de saída (Output Decoder) define a saída baseado nesse novo estado.

Diagrama de uma máquina de estados genérica [1].



São características das FSMs:

  • Estados dependentes ou independentes: quando o evento de transição pode ser reconhecido sem referência ao estado presente, a máquina possui estados independentes. Do contrário (e mais comum), quando para saber o próximo estado é usada informação da entrada e do estado presente. a máquina é dita possuir estados dependentes.
  • Máquina de Moore e Mealy: quando a saída da máquina depende apenas do estado presente, o sistema é uma máquinda de Moore, quando a saída depende também das entradas, o sistema é uma máquina de Mealy.

Implementação em VHDL

A implementação em VHDL de uma máquina de estados segue o esquema da figura abaixo. São comentários dessa abordagem:

  • Separa a implementação em dois processos:
  • Processo síncrono: trata os procedimentos referentes ao clock e ao registrador
  • Processo combinatório: realiza as funções dos blocos codificadores e decodificadores
  • Nomenclatura:
  • Parallel Inputs: são as entradas de controle dos registradores (enables, presets, clears, etc)
  • State Transition Inputs: entradas que causam transição de estados na máquina
  • Present State: são usados tanto para decodificação do próximo estado quanto para decodificação do sinal de saída
Diagrama da implementação em VHDL de uma máquina de estados genérica [1].


Seguindo a abordagem do livro [1], a implementação será apresentada via exemplos:

Exemplo 1
Máquina de Moore simples

Vamos escrever o código VHDL que implementa a máquina de estados da figura abaixo. À direita, a caixa-preta do sistema (dica para a declaração da entidade):

Máquina de estados do exemplo 1 [1].


O código com a solução está disponível na figura abaixo:

Solução do exemplo 1 [1].


São comentários da solução:

  • Seguindo o diagrama apresentado anteriormente, são dois os processos definidos: um síncrono e outro combinacional
  • Foi criado um tipo especial para representar os estados, e as variáveis PS e NS (Present State e Next State) são deste tipo
  • O formato do processo síncrono é muito semelhante ao de um flip-flop tipo D simples
  • Embora o VHDL trabalhe em paralelo, a definição dos dois processos acaba criando uma estrutura sequencial, onde um processo dispara um evento para o outro
  • Como a atribuição é feita fora do IF, o sinal de saída Z1 depende apenas do estado atual. Isso define uma máquina de Moore
  • A saída Z1 é pré-atribuída com o valor 0 antes da instrução CASE na linha 31. Isto é apenas uma boa prática de programação, já que a variável recebe um valor para todos os casos possíveis
Acrescentando como saída o estado atual no exemplo 1 [1].

Uma possível necessidade do projeto de FSMs, é que o estado atual seja também uma saída. Nesse caso, o sistema agiria como o diagrama ao lado, e o código de solução para o problema pode ser visto abaixo:

Solução do exemplo 1 com o estado na saída [1].

Comentários:

  • Apenas a parte final foi alterada, com a adição de uma atribuição de seleção para a variável Y


Exemplo 2
Máquina de Mealy de 3 estados

Vamos escrever o código VHDL que implementa a máquina de estados da figura abaixo. À direita, a caixa-preta do sistema (dica para a declaração da entidade):

Máquina de estados do exemplo 2 [1].


O código com a solução está disponível na figura abaixo:

Solução do exemplo 2 [1].


São comentários da solução:

  • Os primeiros dois casos de saída são tratados fora da instrução IF, como na máquina de Moore. Isso acontece porque independente da entrada, a saída é sempre a mesma para estes estados.
  • O terceiro caso trata efetivamente uma saída de Mealy
  • Um arranjo de dois bits é usado para levar os estados à saída


Exemplo 3
Máquina mista de 4 estados e RESET

Vamos escrever o código VHDL que implementa a máquina de estados da figura abaixo. À direita, a caixa-preta do sistema (dica para a declaração da entidade):

Máquina de estados do exemplo 3 [1].


O código com a solução está disponível na figura abaixo:

Solução do exemplo 3 [1].


São comentários da solução:

  • O RESET está disponível na lista de sensibilidade do processo síncrono, mas não depende do clock
  • Há duas saídas disponíveis: Z1 para Moore e Z2 para Mealy

Implementação no kit didático

Alguns problemas podem ocorrer no momento da implementação real num kit didático. Abaixo, são destacadas algumas soluções conhecidas:

Problema "State-Bypass"

Quando botões são usados para gerar a transição entre estados, o uso do nível faz com que sejam efetuadas múltiplas transições entre os estados. O código abaixo resolve esse problema, a partir do uso de um "Flag". Esta solução foi retirada da seção 11.5 do livro [3].

library ieee;
use ieee.std_logic_1164.all;

-- Sistema que altera o estado de um LED sempre que
-- um botao e pressionado. Exemplo simples de uso de
-- uma maquina de estados, com protecao contra transicoes
-- indesejadas entre os estados (State-Bypass Problem).

entity my_fsm1 is

	port (
		entrada_botao 	: in std_logic;
		CLK, CLR 		: in std_logic;
		saida_led 		: out std_logic
	);

end entity;

architecture fsm1 of my_fsm1 is
	
	-- Sinais da maquina de estados
	type state_type is (ST0, ST1);
	signal PS,NS : state_type;
	
	-- Flag usado para impedir que o botao
	-- seja pressionado mais de uma vez
	signal flag : std_logic;
	
begin
	
	--------------------------------------- Geracao do Flag
	gen_flag: process (CLK)
	begin
		-- Testa se o botao esta solto a cada
		-- pulso de clock. Sempre que estiver
		-- solto, marca o flag como ativo.
		-- Lembrar que o botao e ativo baixo.
		if rising_edge(CLK) then
			if entrada_botao = '1' then
				flag <= '1';
			else
				flag <= '0';
			end if;
		end if;
	end process;
	
	--------------------------------------- Processo sincrono
	sync_proc: process(CLK,CLR)
	begin
		-- Codigo normal da maquina de estados
		if CLR = '0' then
			PS <= ST0;
		elsif (rising_edge(CLK)) then
			PS <= NS;
		end if;
		
	end process;
	
	--------------------------------------- Processo assincrono
	comb_proc: process(entrada_botao)
	begin
		
		case PS is
			when ST0 =>
				saida_led <= '0';
				-- O teste do botao e feito com relacao
				-- tambem ao flag. Se o botao estava solto
				-- nesse pulso de clock, entao o flag tera
				-- o valor 1. Esse fato e usado para testar
				-- a condicao de transicao de estado.
				if (entrada_botao = '0' and flag = '1') then
					NS <= ST1;
				else
					NS <= ST0;
				end if;
			when ST1 =>
				saida_led <= '1';
				if (entrada_botao = '0' and flag = '1') then
					NS <= ST0;
				else
					NS <= ST1;
				end if;
			when others =>
				-- Condicao nao necessaria de ser avaliada
		end case;
		
	end process;

end architecture;

Tarefas

Resolver os exercícios do capítulo 7 do livro [1] indicados abaixo. Desconsidere a frase "The state variables should be encoded as listed" nos exercícios.

  • 1, 2, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14.

Estudar os exemplos dos capítulos 23.1 e 23.3 do livro [2].

Referências

[1] Mealy, B. Tappero, F. Free Range VHDL. Free Range factory. Disponível em Link. Acesso em 27/02/2015.
[2] Pedroni, Volnei A. Eletrônica Digital Moderna e VHDL. Rio de Janeiro: Elsevier, 2010.
[3] Pedroni, Volnei A. Circuit Design Simulation with VHDL. 2ª edição. Londres: Mit Press, 2010.

Simulação de circuitos usando VHDL

Nesta aula, vamos entender como usar o VHDL para simular um circuito. Assim, o VHDL pode ser usado para:

  • Síntese: tradução do código-fonte em um conjunto de estruturas de hardware para construção do sistema
  • Simulação: Procedimento de teste usado para verificar se o circuito sintetizado está de acordo com o esperado. É composto pela geração de sinais a serem inseridos no sistema a ser testado (Design Under Test - DUT) e por uma verificação das saídas produzidas (opcional). Em VHDL, a simulação é feita por dois conjuntos de arquivos:
  • O projeto em si
  • As rotinas de criação de sinais e veirificação de resultados, comumente chamado de testbench

Toda esta seção é baseada no capítulo 24 e no anexo A (Link) do livro [1].

Tipos de testbenches

A simulação em VHDL é dividida em funcional e temporal, onde a segunda inclui os tempos de propagação dos sinais dentro do circuito. Assim, adicionando a possibilidade de verificar automaticamente as saídas produzidas pelo sistema, são 4 os tipos de testbenches disponíveis em VHDL:

Tipo de testbench Simulação Verificação da saída
1 Funcional Manual
2 Temporal Manual
3 Funcional Automática (VHDL)
4 Temporal Automática (VHDL)

Instruções de tempo em VHDL

Para definir os sinais a serem usados nas simulações, estão disponíveis instruções temporais em VHDL:

AFTER

Realiza a atribuição (concorrente) após um período de tempo pré-definido:

A <= B and C 	AFTER 5 ns;

A instrução acima indica que A receberá o resultado de "B and C", 5 nano segundos após a geração do evento que fez a instrução ser executada (alteração nos sinais B ou C).

WAIT

Usado dentro de processos explícitos (sequencial) sem lista de sensibilidade, o WAIT faz o processo aguardar 3 tipos de situações:

  • Uma condição seja satisfeita:
WAIT UNTIL clk'EVENT and clk='1';
  • Um sinal mude de valor:
WAIT ON clk;
  • Um tempo seja transcorrido:
WAIT FOR 5 ns;

Geração de sinais para simulação

Abaixo, formas de gerar sinais para simulação, mostradas na figura abaixo:

Sinais gerados para testbench.


Formas de onda periódicas regulares

Usadas geralmente na construção de sinais de clock.

  • Usando a instrução AFTER:
SIGNAL clk : BIT := '1';
 
clk <= NOT clk AFTER 30 ns;
  • Usando a instrução WAIT:
SIGNAL clk : BIT := '1';
 
PROCESS IS
BEGIN
   WAIT FOR 30 ns;
   clk <= NOT clk;
END PROCESS;
  • Usando a instrução WAIT:
SIGNAL clk : BIT := '1';
 
PROCESS IS
BEGIN
   WAIT FOR 30 ns;
   clk <= '0';
   WAIT FOR 30 ns;
   clk <= '1';
END PROCESS;
Formas de onda de um só pulso

Usadas principalmente na geração de sinais de enable ou reset. Por não trazer uma condição limite, a última instrução WAIT prende a execução do processo.

  • Usando a instrução AFTER:
SIGNAL rst : BIT := '0';

rst <= '1' AFTER 70 ns, '0' AFTER 100 ns;
  • Usando a instrução WAIT:
SIGNAL rst : BIT := '0';
 
PROCESS IS
BEGIN
   WAIT FOR 70 ns;
   rst <= '1';
   WAIT FOR 30 ns;
   rst <= '0';
   WAIT;
END PROCESS;
Formas de onda não periódica irregular

Podem ser utilizadas para simular um padrão de entrada de um sistema de comunicação.

CONSTANT onda1 : BIT_VECTOR(1 to 8) := "10100111";
SIGNAL x : BIT := '0';
 
PROCESS IS
BEGIN
   FOR i IN onda'RANGE LOOP
      x <= onda1(i);
      WAIT FOR 30 ns;
   END LOOP;
   WAIT;
END PROCESS
Formas de onda periódica irregular
CONSTANT onda2 : BIT_VECTOR(1 to 8) := "10100111";
SIGNAL y : BIT := '0';

PROCESS IS
BEGIN
   FOR i IN onda'RANGE LOOP
      y <= onda2(i);
      WAIT FOR 30 ns;
   END LOOP;
END PROCESS
Formas de onda Multibit
SIGNAL inteiro : INTEGER RANGE 0 to 255;
 
PROCESS IS
BEGIN
   inteiro <= 0;
   WAIT FOR 70 ns;
   inteiro <= 5;
   WAIT FOR 30 ns;
   inteiro <= 64;
   WAIT FOR 12 ns;
END PROCESS;

Geração de Testbenches

Um código genérico para gerar testbenches está disponível abaixo. Repare que o DUT (Design Under Test) é trazido para o testbench como uma componente, e são gerados os sinais de entradas como na seção anterior.

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY <nome_do_testbench> IS
END ENTITY;

ARCHITECTURE <nome_da_arquitetura> OF <nome_do_testbench> IS

   -- Declaração da componente do sistema a ser testado
   COMPONENT <nome_do_DUT> IS
      PORT (<lista_de_portas_de_entrada_e_saída>);
   END COMPONENT;

   -- Declaração dos sinais de entrada e saída que serão instanciados na componente

BEGIN

   -- Instanciamento da componente
   DUT: <nome_do_DUT> PORT MAP (sinal1 => sinal1, sinal2 => sinal2, ...)

   -- Geração dos sinais

END ARCHITECTURE

onde:

  • <nome_do_testbench>: normalmente chamado de teste_<nome_do_DUT>
  • <nome_da_arquitetura>: qualquer nome

Testbenches tipo 1 e 2

Nestes tipos de testbench, temos uma simulação sem e com os atrasos de propagação e a verificação dos resultados é feita sempre manualmente. Será feita a simulação para um sistema divisor de clock, que divide o seu clock de entrada por 10. Uma entrada enable (ena) ativa alta é prevista para habilitar a divisão de clock ou não (saída zero).

O código VHDL do sistema a ser testado (DUT) está disponível abaixo:

------------------------------- Arquivo clock_divider.vhd

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY clock_divider IS
	PORT (	clk, ena 	: IN STD_LOGIC;
		output		: OUT STD_LOGIC := '0');
END ENTITY;

ARCHITECTURE clock_divider OF clock_divider IS
	CONSTANT max		: NATURAL := 5;
BEGIN

	PROCESS (clk)
		VARIABLE count	: NATURAL RANGE 0 TO max := 0;
		VARIABLE temp	: STD_LOGIC := '0';
	BEGIN
		IF (clk'EVENT and clk='1') THEN
			IF (ena='1') THEN
				count := count + 1;
				IF (count=max) THEN
					temp := NOT temp;
					count := 0;
				END IF;
			END IF;
			output <= temp;
		END IF;
	END PROCESS;

END ARCHITECTURE;

E o código VHDL do testbench é:

------------------------------- Arquivo test_clock_divider.vhd

Library ieee;
USE ieee.std_logic_1164.all;

ENTITY test_clock_divider IS
END ENTITY;

ARCHITECTURE test_clock_divider OF test_clock_divider IS

	------ Componente --------
	COMPONENT clock_divider IS
		PORT (clk, ena : IN STD_LOGIC;
			output : OUT STD_LOGIC);
	END COMPONENT;


	SIGNAL clk : STD_LOGIC := '0';
	SIGNAL ena : STD_LOGIC := '0';
	SIGNAL output : STD_LOGIC := '0';

BEGIN
	
	----- Instanciação da componente --------
	dut: clock_divider PORT MAP (clk => clk, ena => ena, output => output);

	----- Geração do clock -----
	clk <= NOT clk AFTER 30 ns;

	----- Geração do enable ----- 

 	PROCESS IS
 	BEGIN
    		WAIT FOR 60 ns;
    		ena <= '1';
    		WAIT;
 	END PROCESS;


END ARCHITECTURE;

Para executá-los no Modelsim, estudar as seções 24.6 e 24.7 do livro [1], fazendo uso do apêndice A do mesmo livro, disponível em (Link).

Executando o Modelsim no Laboratório de programação

Executar a linha abaixo para abrir o Modelsim:

/opt/altera/13.0/quartus/modelsim_ase/linuxaloem/vsim

Para acesso via Cloud, ver tutorial em Link.

Um tutorial interessante sobre o uso do Modelsim foi escrito pelo Professor Marcos Moecke, disponível em Link

Testbenches tipo 3

Este caso representa as simulações com verificação automática, sem a consideração dos atrasos de propagação. Vamos usar o mesmo projeto de divisor de clock da seção anterior, porém o testbench é modificado com as instruções de verificação. O código do testbench pode ser visto abaixo:

------------------------------- Arquivo test_clock_divider.vhd

Library ieee;
USE ieee.std_logic_1164.all;

ENTITY test_clock_divider IS
END ENTITY;

ARCHITECTURE test_clock_divider OF test_clock_divider IS

	------ Componente --------
	COMPONENT clock_divider IS
		PORT (clk, ena : IN STD_LOGIC;
			output : OUT STD_LOGIC);
	END COMPONENT;


	SIGNAL clk : STD_LOGIC := '0';
	SIGNAL ena : STD_LOGIC := '0';
	SIGNAL output : STD_LOGIC := '0';

	-- Sinal utilizado na verificação dos resultados
	SIGNAL template : STD_LOGIC;

BEGIN
	
	----- Instanciação da componente --------
	dut: clock_divider PORT MAP (clk => clk, ena => ena, output => output);

	----- Geração do clock -----
	clk <= NOT clk AFTER 30 ns;

	----- Geração do enable ----- 

 	PROCESS IS
 	BEGIN
    		WAIT FOR 60 ns;
    		ena <= '1';
    		WAIT;
 	END PROCESS;

	----- Geração do sinal de saída desejado -----
	PROCESS IS
	BEGIN
		WAIT FOR 330 ns;
		WHILE ena='1' LOOP
			template <= NOT template;
			WAIT FOR 300 ns;
		END LOOP;
	END PROCESS;

	----- Comparação da saida efetiva com a saída desejada -----
	PROCESS IS
	BEGIN
		WAIT FOR 10 ns;
		ASSERT (output=template)
			REPORT "Saida diferente do desejado!"
			SEVERITY FAILURE;
		IF (NOW=2000 ns) THEN
			ASSERT FALSE
				REPORT "Saida esta OK"
				SEVERITY NOTE;
		END IF;
	END PROCESS;

END ARCHITECTURE;

São comentários:

  • O sinal template cria a forma de onda de saída esperada. Isso é feito no segundo processo explícito do código. Inicialmente, é dado o atraso necessário para considerar as 5 bordas de subida de clock mais o atraso do sinal de enable (330 ns). Após esse atraso, o sinal é alternado a cada 300 ns.
  • A comparação da saída com a desejada é feita, a cada 10 ns, através da instrução ASSERT, que quando recebe o lógico falso executa as instruções REPORT, que exibe uma mensagem na tela, e SEVERITY, que define o nível da mensagem. São níveis da instrução:
  • NOTE: apenas informação
  • WARNING: alerta
  • ERROR: problema
  • FAILURE: problema grave

A execução dos testes no Modelsim segue o tutorial do exemplo anterior.

Repare que como o sinal template não recebe a informação do valor inicial, o Modelsim cairá no caso em que ele e output são diferentes. Para corrigir este provlema, basta adicionar o valor inicial ao sinal.

Testbenches tipo 4

A principal diferença do tipo 3 para o tipo 4 é que o sinal desejado deve considerar os atrasos de propagação. Para isso, faz-se um teste com a verificação manual (tipo 2) e analisa-se o atraso gerado. Este atraso deve ser incluído no sinal desejado.

No exemplo da seção anterior, a única diferença é que o atraso inicial do sinal de saída desejado seria maior que 330 ns.

Referências

[1] Pedroni, Volnei A. Eletrônica Digital Moderna e VHDL. Rio de Janeiro: Elsevier, 2010.

Signal Tap

Nesta aula temos um caso de uso da ferramenta de depuração Signal Tap, disponível no Quartus II. Na apresentação, é criado um sinal senoidal usando o MegaWizard, e o sinal é visualizado na ferramenta. A aula é baseada totalmente no desenvolvimento do sistema e configuração das ferramentas, e um tutorial sobre o Signal Tap pode ser visto em Configuração e uso do Signal Tap.

Oficina NCO e Filtros Digitais

Nesta aula construiremos um sistema composto pela geração de sinais senoidais e a construção de filtros digitais em FPGAs Altera, usando o Quartus II. O sistema criado gera sinais senoidais de 1 MHz e 4 MHz, soma os dois sinais e realiza uma filtragem passa baixas, visando manter apenas o sinal de 1 MHz. Um passo a passo está disponível em Link.

Nios II

A Altera disponibiliza um processador para ser embarcado no FPGA, chamado de Nios II. Vamos desenvolver uma aplicação simples em software e fazê-la rodar no FPGA. O sistema consistirá dos seguintes blocos:

Sistema com processador Nios II

Vamos precisar destes documentos para desenvolver este tutorial:

Avaliação 3

Avaliações dos semestres anteriores - 2015-1 - Clique no "+" para expandir

A ideia é fazer um relógio digital, com horas, minutos e segundos, com possibilidade de reset e ajuste de tempo. Duas equipes foram criadas:

  • Equipe 1: Leonardo, Nicole e Rogério (Página)
  • Equipe 2: Kamila, Leonardo Oliveira (Página)
  • Equipe 3: Renan (Página)
Avaliações dos semestres anteriores - 2015-2 - Clique no "+" para expandir

Projete um sistema de controle para uma máquina que vende balas por 25 centavos. O sistema deverá ser implementado em VHDL, fazendo uso do kit DE2-115 da Altera, tendo as seguintes considerações:

  1. Apenas serão aceitas moedas de 5, 10 e 25 centavos, e a entrada das moedas na máquina deverá ser simulada através de um push button.
  2. Quando a quantia de 25 centavos for somada dentro da máquina, os leds verdes deverão piscar 3 vezes, indicando que o doce está disponível, e permanecer acesos.
  3. A quantia introduzida na máquina deverá ser exibida em tempo real no display de 7 segmentos.
  4. A máquina deverá prever uma chave de liga-desliga. Assim, quando KEY0 estiver desligada, a máquina não receberá nenhuma moeda.
  5. Após o recebimento de um doce/troco, a máquina deverá ser reiniciada para começar uma nova venda.
  6. Repare que é possível que o usuário introduza mais do que 25 centavos (Ex: 10 + 10 + 10). Nesse caso, a máquina deverá devolver o troco junto com o doce. Isso será feito com os leds vermelhos:
  • Os leds da esquerda indicam quantas moedas de 10 centavos serão devolvidas.
  • Os leds da direita indicam quantas moedas de 5 centavos serão devolvidas.
Informações importantes
  • Cuidado no projeto do sistema para evitar que o botão seja contado mais de uma vez na mesma pressionada (use o rising edge)
  • Nesse tipo de sistema, a implementação é facilitada quando a abordagem com máquina de estados é utilizada. Tente fazer o diagrama!
  • O trabalho é INDIVIDUAL, embora vocês possam se ajudar

Avaliação do semestre atual

A avaliação final consistirá da finalização do relógio digital iniciado na avaliação 2.

Macetário

Abaixo, as estruturas da linguagem VHDL:

LIBRARY nome1, nome2;
USE nome1.pack_name1.object;
USE nome2.pack_name2.ALL;
ENTITY <entity_name> IS
   PORT (
      nome1, nome2 : <mode> <type>;
      nome3, nome4 : <mode> <type>
   );
   GENERIC (
      nome1, nome2 : <type> (:= <initial value>);
      nome2, nome4 : <type> (:= <initial value>)
   );
END ENTITY <entity_name>;
ARCHITECTURE <identifier> OF <entity_identifier> IS
   <declaration>
BEGIN
   <body>
END ARCHITECTURE <identifier>
CONSTANT <nome> : <tipo> := <valor>;
SIGNAL <nome> : <tipo> := <valor_inicial>;
VARIABLE <nome> : <tipo> := <valor_inicial>;
SHARED VARIABLE <nome> : <tipo> := <valor_inicial>;
-- Simples
<nome> <= <expressão>;

-- Condicional
<nome> <= <valor> WHEN <condição_1> ELSE
          <valor> WHEN <condição_2> ELSE
                     .
                     .
                     .
          <valor> WHEN <condição_3> ELSE
          <valor>;

-- De seleção
WITH <expressão> SELECT
    <nome> <= <valor> WHEN <condição_1>,
              <valor> WHEN <condição_2>,
                         .
                         .
                         .
              <valor> WHEN OTHERS;
<label>: process (<sinal1>,<sinal2>) is
   <declaração>
begin
   <instruções sequenciais>
end process <label>
-- Teste
if (<condição>) then
   <instruções>;
elsif (<condição>) then
   <instruções>;
else
   <instruções>;
end if;

-- Seleção
case (<expressão>) is
   when <resultado> =>
      <instruções>;
   when <resultado> =>
      <instruções>;
   when others =>
      <instruções>;
end case
-- Baseados em inteiros
TYPE <nome do tipo> IS RANGE <faixa de valores>;

type scores is range 0 to 100;
type years is range -3000 to 3000;
type apples is range 0 to 15;
type oranges is range 0 to 15;

-- Tipos enumerados
TYPE <nome do tipo> IS (<lista de nomes ou números>);

type machine_state is (idle, forward, backward);
type counter is (zero, one, two, three);

-- Tipos baseados em arranjos
TYPE <nome do tipo> IS ARRAY (<faixa de valores>) OF <tipo do dado>;

type vector is array (7 downto 0) of std_logic;
type array1D1D is array (1 to 4) of bit_vector (7 downto 0);
type vector_array is array (1 to 4) of vector;
type array2D is array (1 to 8, 1 to 16) of std_logic;
-- For
<rotulo>: FOR <indice> IN <faixa de valores> LOOP
   <instruções sequenciais>;
END LOOP <rotulo>;

-- While
<rotulo>: WHILE (<condição>) LOOP
   <instruções sequenciais>;
END LOOP <rotulo>;
-- NEXT
variable my_sum : integer := 0;

for cnt_val in 0 to 50 loop
    if (my_sum = 20) then
        next;
    end if;
    my_sum := my_sum + 1;
end loop;

variable my_sum : integer := 0;

while (my_sum < 300) loop
    next when (my_sum = 20);
    my_sum := my_sum + 1;
end loop;

-- EXIT
variable my_sum : integer := 0;

for cnt_val in 0 to 50 loop
    if (my_sum = 20) then
        exit;
    end if;
    my_sum := my_sum + 1;
end loop;

variable my_sum : integer := 0;

while (my_sum < 300) loop
    exit when (my_sum = 20);
    my_sum := my_sum + 1;
end loop;
FUNCTION <nome> (<argumentos de entrada>)
RETURN <tipo do dado de retorno> IS
   <declarações>
BEGIN
   <instruções sequenciais>
   <rotulo>: RETURN <expressao>;
END FUNCTION <nome>
PROCEDURE <nome> (<argumentos>) IS
   <declarações>
BEGIN
   <instruções sequenciais>
END PROCEDURE <nome>
<rótulo>: <nome_da_componente>
   GENERIC MAP (
      <gen1> => <genA>,
      <gen2> => <genB>)
   PORT MAP (
      <por1> => <porA>,
      <por2> => <parB>);

Referências

Sites

Livros, artigos, apostilas