ELD129003-Engtelecom (Diário) - Prof. Marcos Moecke

De MediaWiki do Campus São José
Revisão de 12h04min de 6 de março de 2025 por Moecke (discussão | contribs) (Avaliações)
Ir para navegação Ir para pesquisar

1 Registro on-line das aulas

1.1 Unidade 1 - Aula inicial, Introdução a disciplina

  • 1 ENCONTRO
Unidade 1 - Aula inicial, Introdução a disciplina
Encontro 1 (17 set)
  • A página da UC contém os materiais que não alteram entre semestre.
  • Relação com as outras UCs do Eixo Sistemas Computacionais (Marrom). Ver grafo do curriculo
  • ELD129002 - ELETRÔNICA DIGITAL I (ELD1): Sistema de numeração e códigos. Lógica booleana. Circuitos combinacionais. Circuitos aritméticos. Linguagem de descrição de hardware. Implementação e teste de circuitos digitais. Projeto de circuitos lógicos.
  • ELD129003 - ELETRÔNICA DIGITAL II (ELD2): Dispositivos lógicos programáveis. Circuitos sequenciais. Metodologia síncrona. Projeto hierárquico e parametrizado. Máquinas de estados finita. Register Transfer Methodology. Teste de circuitos digitais. Implementação em FPGA. Introdução a Linguagem de Descrição de Hardware.
  • AOC129004 - ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES (AOC): Introdução à Arquitetura Computadores. Linguagem Assembly. Linguagem de Máquina. Programação Assembly. Modos de Endereçamento. Processo de compilação e carga de um programa. Introdução à Organização de Computadores. Organização Monociclo e Multiciclo. Pipeline. Memória e Sistema de E/S.
  • MIC129007 - MICROCONTROLADORES (MIC): Introdução a Microcontroladores e Aplicações. Arquitetura de um microcontrolador. Pilha e Subrotinas. Interrupção. Contadores e Temporizadores. Interface com Periféricos. Programação em alto nível (ex.: C, C++ e RUST) para Microcontroladores: Mapeamento de tipos e estruturas de alto nível para sistemas com recursos limitados. Projeto de hardware e firmware com microcontroladores.
  • STE129008 - STE - SISTEMAS EMBARCADOS (STE): Conceitos em Sistemas Embarcados. Metodologia de Desenvolvimento de Sistemas Embarcados. Sistemas Operacionais para Sistemas Embarcados. Ferramentas de desenvolvimento e depuração. Barramentos e dispositivos de acesso a redes. Desenvolvimento de Projeto.
  • Nesta página está o Registro diário dos encontros e avaliações.
  • A entrega de atividades e avaliações será através da plataforma Moodle. A inscrição dos alunos é automática a partir do SIGAA.
  • Para a comunicação entre professor-aluno, além dos avisos no SIGAA, utilizaremos o chat institucional. A princípio todos os alunos já estão previamente cadastrados pelo seu email institucional. Confiram enviando uma mensagem de apresentação.
  • Utilizaremos durante as aulas algumas ferramentas computacionas como o site do Falstad para entender circuitos digitais e fazer simulações básicas.
  • Também utilizaremos os softwares Quartus Light e ModelSim instalados nas maquinas do laboratório para praticar a parte de programação de hardware (descrição de hardware). Esses softwares também podem ser usados através da Nuvem do IFSC..
LER PARA O PRÓXIMO ENCONTRO
  • Revisão dos conceitos sobre circuitos combinacionais vistos em CIL/ELD1
  • Para alunos que não cursaram ELD1 (não conhecem VHDL), irei fornecer uma sequência de estudos para conhecer melhor as instruções concorrentes do VHDL.
  • Ler Introdução a linguagem de descrição de hardware (DHL)

1.2 Unidade REV - PRIMEIRO CONTATO COM VHDL

  • 3 ENCONTROS
Unidade REV - PRIMEIRO CONTATO COM VHDL
Encontro 2 (19 set)
  • Estrutura do código VHDL
  • Declaração das bibliotecas e pacotes LIBRARY / PACKAGE
 library library_name;
 use library_name.package_name.all;
  • ENTITY
 entity entity_name is
   [generic (
     cons_name1: const_type const_value;
     cons_name2: const_type const_value;
     ...
     cons_nameN: const_type const_value);]
   [port (
     signal_name1: mode signal_type;
     signal_name2: mode signal_type;
     ...
     signal_nameN: mode signal_type);]
   [declarative_part]
 [begin
   statement_part]
 end [entity] [entity_name];
  • ARCHITECTURE
 architecture arch_name of entity_name is
   [declarative_part]
 begin
   statement_part
 end [architecture] [arch_name];


PARA O PRÓXIMO ENCONTRO
  • Para os alunos que são da matriz curricular 1290 (PPC 2023).
  • Para conhecer um pouco mais da linguagem VHDL, ler VHDL ou VHDL.en. A maioria dessas instruções serão tratadas posteriormente.
Encontro 3 (24 set)
  • Descrição do harware utilizando código VHDL no Quartus.
  • Rever a IDE do Quartus
  • Realizar análise e síntese.
  • Obter Diagrama RTL e Technology Map do circuito
  • Realizar simulação funcional com ModelSim
  • Conhecer a IDE do ModelSim
  • Seguir o procedimento descrito em Uso do ambiente EDA - QUARTUS Prime para programação em VHDL
Encontro 4 (26 set)
Como arquivar um projeto
Conhecer instruções WHEN_ELSE, WITH_SELECT, CONFIGURATION

Para ilustrar essas instruções utilizaremos o exemplo de um Mux4x1. Um multiplexador digital de N entradas e 1 saída, frequentemente abreviado como MUX N:1, é um circuito digital muito utilizado para rotear sinais digitais. Ele desempenha a função de selecionar uma das entradas para ser encaminhada para a saída com base em um sinal de seleção (ou controle).

Mux2x1

A tabela verdade que descreve um MUX2:1 é mostrada abaixo:

X1 X0 Sel Y
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 0
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1

O MUX2:1 também pode ser representado de forma resumida por:

X1 X0 Sel Y
- X0 0 X0
X1 - 1 X1

Onde o X0 e X1 na entrada podem assumir os valores 0 ou 1, e o simbolo "-" corresponde ao don't care (em VDHL)

A função booleana que descreve a operação de um MUX 2:1 pode ser representada da seguinte forma:


Y=Sel.X0+Sel.X1

Onde Y é a saída; Sel é o sinal de seleção; X0 e X1 são as entradas.

Mux4x1

O MUX4:1 pode ser representado de forma resumida pela tabela verdade:

Entradas Seleção Saída
X3 X2 X1 X0 Sel1 Sel0 Y
- - - X0 0 0 X0
- - X1 - 0 1 X1
- X2 - - 1 0 X2
X3 - - - 1 1 X3

A função booleana que descreve a operação de um MUX 4:1 pode ser representada da seguinte forma:

Y=X0.Sel1.Sel0+X1.Sel1.Sel0+X2.Sel1.Sel0+X3.Sel1.Sel0

Dada a função booleana do MUX4:1 é simples para descreve-lo em VHDL utilizando apenas operadores lógicos.

entity mux4x1 is
	port
	(
		-- Input ports
		X: in  bit_vector (3 downto 0);
                Sel : in bit_vector (1 downto 0);
		-- Output ports
		Y : out bit
	);
end entity;

-- Implementação com lógica pura
architecture v_logica_pura of mux4x1 is

begin
 Y <= (X(0) and (not Sel(1)) and (not Sel(0))) or
      ...
end architecture;

No entanto, o MUX4:1 também pode ser descrito utilizando a instrução WHEN-ELSE

<optional_label>: <target> <= 
	<value> when <condition> else
	<value> when <condition> else 
	...
	<value> else
	<value>;
  • Importante: O último ELSE sem condição para cobrir todos os demais valores para evitar a criação de LATCHES.
Warning (13012): Latch ... has unsafe behavior
  • No QuartusII existe um template pronto para ser utilizado em: [Edit > Insert Template > Language templates = VHDL (+) > Constructs (+) > Concurrent Statemens (+) > Conditional Signal Assignment]

No caso do MUX4:1 ele poderia ser descrito como:

-- Implementação com WHEN ELSE
architecture v_WHEN_ELSE of mux4x1 is
begin
 Y <= X(0) when Sel = "00" else
      X(1) when Sel = "01" else
      X(2) when Sel = "10" else
      X(3);
end architecture;

Outra forma de descrever o MUX4:1 seria utilizando a instrução WITH-SELECT

<optional_label>: with <expression> select
	<target> <= 
		<value> when <choices>,
		<value> when <choices>,
		...
		<value> when others;
  • Importante: Para cobrir todas as demais possibilidades deve ser utilizado o WHEN OTHERS evitando novamente a criação de LATCHES, ou erros de análise.
Error (10313): VHDL Case Statement error ...: Case Statement choices must cover all possible values of expression
  • No QuartusII existe um template pronto para ser utilizado em: [Edit > Insert Template > Language templates = VHDL (+) > Constructs (+) > Concurrent Statemens (+) > Selected Signal Assignment]. Mas ATENÇÃO, faltam as virgulas após cada escolha.
-- Implementação com WITH SELECT
architecture v_WITH_SELECT of mux4x1 is

begin
 with Sel select
 Y <= X(0) when "00",    -- note o uso da ,
      X(1) when "01",
      X(2) when "10",
      X(3) when others;  -- note o uso de others, para todos os demais valores.  
                         -- Não pode ser substituido por "11" mesmo que o signal seja bit_vector.
end architecture;
  • Note que para associar uma entre várias arquiteturas com a sua ENTITY pode-se utilizar a instrução CONFIGURATION. No exemplo abaixo a ARCHITECTURE que está descomentada é a que será associada a ENTITY mux4x1.
  • Caso não se use a instrução CONFIGURATION, a última ARCHITECTURE será associada a ENTITY.
  • Apesar de apenas uma das ARCHITECTUREs ser associada, todas elas devem estar sintaticamente corretas, pois passarão pelo processo de ANÁLISE E SINTESE.
CONFIGURATION <configuration_name> OF <entity_name> IS
	FOR <architecture_name> END FOR;
END CONFIGURATION;
-- Design Unit que associa a architecture com a entity
CONFIGURATION cfg_ifsc OF mux4x1 IS
	FOR v_logica_pura END FOR;
--	FOR v_WHEN_ELSE END FOR;
--	FOR v_WITH_SELECT END FOR;
END CONFIGURATION;
  • Faça a análise e sintese do mux4x1, associando a architecture v_logica_pura, depois v_WITH_SELECT, depois v_WHEN e por último v_IF_ELSE.
  • Note a diferença entre os RTL Viewer obtidos para cada architecture.

Figura 2.1 - Código RTL do mux4x1 v_logica_pura
Fonte: Elaborado pelo autor.

Figura 2.2 - Código RTL do mux4x1 v_WHEN_ELSE
Fonte: Elaborado pelo autor.

Figura 2.3 - Código RTL do mux4x1 v_WITH_SELECT
Fonte: Elaborado pelo autor.
OBS: Register Transfer-Level (RTL) é uma abstração na qual o circuito é descrito em termos de fluxo de sinais entre os registradores presentes no hardware e as operações combinacionais realizadas com esses dados.
RESUMO
PARA O PRÓXIMO ENCONTRO
  • Realize a simulação das 3 arquiteturas do MUX4:1 no Modelsim
  • Crie um arquivo tb_mux4x1_v1.do que repita a simulação da arquitetura v1
  • Crie um arquivo tb_mux4x1_v2.do que repita a simulação da arquitetura v2
  • Crie um arquivo tb_mux4x1_v3.do que repita a simulação da arquitetura v1
  • Inclua todos os arquivos .do no projeto do Quartus e salve o arquivo QAR
  • Ver essa página Simulação Funcional usando o ModelSim

1.3 Unidade 2 - Dispositivos Lógicos Programáveis

  • 3 ENCONTROS
Unidade 2 - Dispositivos Lógicos Programáveis
Encontro 5 (1 out)
  • Introdução aos dispositivos lógicos programáveis:
  • Conceito, tipos de PLDs
  • SPLD:
Exemplos de PLDs

Figura 2.1 - Exemplo de PAL
Fonte: http://www.vhdl.us/book/Pedroni_VHDL_3E_Chapter4.pdf.

Figura 2.2 - Exemplo de PLA
Fonte: http://www.vhdl.us/book/Pedroni_VHDL_3E_Chapter4.pdf.

Figura 2.3 - Macrobloco do PLD EP300 da ALTERA
Fonte: https://www.altera.com/solutions/technology/system-design/articles/_2013/in-the-beginning.html.

Figura 2.4 - Macrocélula dos PLDs Clássicos EP600, EP900, EP1800 da ALTERA (1999)
Fonte: https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ds/archives/classic.pdf.

Figura 2.5 - Architetura do PLD EP1800 da ALTERA
Fonte: https://www.altera.com/solutions/technology/system-design/articles/_2013/in-the-beginning.html.

Figura 2.6 - Architetura do PLD EP1800 da ALTERA
Fonte: https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ds/archives/classic.pdf.

Figura 2.7 - Pinagem e tipos de encapsulamento do PLD EP1800 da ALTERA
Fonte: https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ds/archives/classic.pdf.

Figura 2.8 - Architetura do CPLD MAX 5000 da ALTERA
Fonte: https://www.altera.com/solutions/technology/system-design/articles/_2013/in-the-beginning.html.
PARA O PRÓXIMO ENCONTRO
Encontro 6 (3 out)
  • Arquitetura de FPGAs (Xilinx e Altera): CLB, LAB, LUT, Flip_flop D, RAM, DSP, Clock, PLL, DLL, I/O
FONTE: FPGA Architecture - ALTERA
Exemplos de FPGA

Figura 2.9 - Arquitetura de um FPGA
Fonte: https://www.intel.com/content/www/us/en/docs/programmable/683176/18-1/fpga-overview-opencl-standard.html.

Figura 2.10 - Diagrama simplificado da ALM de um FPGA Intel/Altera
Fonte: https://www.intel.com/content/www/us/en/content-details/771003/fpga-architecture-8-input-lut-legacy-white-paper.html.

Figura 2.11 - Arquitetura interna de uma LUT
Fonte: FPGA Architecture - ALTERA.

Figura 2.12 - Configuração de uma LUT
Fonte: https://www.allaboutcircuits.com/technical-articles/purpose-and-internal-functionality-of-fpga-look-up-tables/.

Figura 2.13 - Arquitetura do Cyclone® V Intel/Altera
Fonte: https://www.intel.com.br/content/www/br/pt/products/details/fpga/cyclone/v/article.html.

Figura 2.14 - Leiaute de um FPGA Xilinx genérico
Fonte: https://www.sciencedirect.com/science/article/pii/B9780750678667500032.

Figura 2.15 - Roteamento de sinal em um FPGA
Fonte: https://www.sciencedirect.com/science/article/pii/B9780750678667500032.

Figura 2.16 - Tecnologias usadas na configuração de FPGAs
Fonte: https://www.sciencedirect.com/topics/computer-science/one-time-programmable.
Ver também SRAM, EEPROM, What Is Flash Memory
PARA O PRÓXIMO ENCONTRO
  • Leia a assista a alguns dos vídeos sobre a historia e processo de produção dos chips.
Encontro 7 (8 out)
  • System on Chip

Figura 2.17 - Altera - Visão geral do dispositivo Arria V SX e ST
Fonte: https://br.mouser.com/datasheet/2/612/av_51001-1623623.pdf.

Figura 2.18 - Altera - Agilex 7 SoCs HPS Digrama de Blocos
Fonte: https://static6.arrow.com/aropdfconversion/b568cfe009abfed6a28eff56700189883d7fc179/ag-overview-683458-666707.pdf.
PARA O PRÓXIMO ENCONTRO
  • Ver preços de DLPs em
  • Fabricantes de DLPs/FPGAs e familias de DLPs atuais.

1.4 Unidade 3 - Circuitos sequenciais (Implementação com HDL)

  • 8 ENCONTROS
Unidade 3 - Circuitos sequenciais (Implementação com HDL)
Encontro 8 (10 out)
  • Flip-Flop e circuitos sequenciais.
  • Diferenças entre código concorrente e sequencial <=> circuitos combinacional e sequencial
  • Diferenças entre os objetos SIGNAL e VARIABLE
  • Tipos de elementos de memória: Latch x Flip-flop
  • Latch D
  • Flip-flop tipo D com reset assíncrono e com reset (clear) síncrono
  • Seção de código sequencial PROCESS: lista de sensibilidade
[rótulo:] PROCESS [(lista_de_sensibilidade)] [IS]
             [parte_declarativa]
         BEGIN
             afirmação_sequencial;
             afirmação_sequencial;
             ...
         END PROCESS [rótulo];
  • Instrução IF
[rótulo:] IF condição THEN
             afirmação_sequencial;
             afirmação_sequencial;
             ...
         ELSIF condição THEN
             afirmação_sequencial;
             afirmação_sequencial;
             ...
         ELSE
             afirmação_sequencial;
             afirmação_sequencial;
             ...
         END IF [rótulo];
  • Exemplos:
  • DFFs com Reset Assincrono e Reset Sincrono, com Enable, com Preset (Variação Ex 6.1).
--Flip Flop tipo D com reset assincrono, sensivel a borda de subida.
process (clock,reset)
begin
   if (reset = '1') then
      q <= '0';
-- elsif (clock'event and clock = '1') then or
   elsif (rising_edge(clock)) then
      q <= d;
   end if;
end process;

Figura 5.1 - RTL de Flip-flop D de borda de subida, com reset assíncrono
Fonte: Elaborado pelo autor.
--Flip Flop tipo D com preset assincrono e sinal de enable, sensivel a borda de descida.
process (clock, preset)
begin
   if (preset = '1') then
      q <= '1';
   elsif (falling_edge(clock)) then
      if (enable = '1') then
         q <= d;
      end if;
   end if;
end process;

Figura 5.2 - RTL de Flip-flop D de borda de descida, com preset assíncrono e enable
Fonte: Elaborado pelo autor.
Encontro 9 (15 out)
  • Comparar com Latch (sem clk'event).
--Latch tipo D com reset assincrono.
process (enable, reset, d)
begin
   if (reset = '1') then
      q <= '0';
   elsif (enable='1')) then
      q <= d;
   end if;
end process;

Figura 5.3 - RTL de Latch D de com reset assíncrono e enable ativo alto
Fonte: Elaborado pelo autor.
  • Na figura abaixo, note que o Latch é implementado utilizando a LUT do elemento lógico do FPGA, enquanto que o Flip-flop utiliza o componente já disponível neste elemento lógico.
  • Evite os latches no projeto

Figura 5.4 - Comparação do Technology Map de um Latch_D (esquerda) com FF_D (direita)
Fonte: Elaborado pelo autor.
-- Flip Flop tipo D com reset síncrono sensível a borda de subida. 
-- Modifique a descrição para que o reset_ass seja assíncrono e reset_sinc seja síncrono.
-- Note que a função rising_edge(clock) é equivalente a (clock'event and clock'last_value = '0' and clock = '1'))

process (clock, reset)
begin
   if (reset = '1') then
      q <= '0';
   elsif (clock'event and clock'last_value = '0' and clock = '1')) then
      q <= d;
   end if;
end process;

Figura 5.5 - RTL do Flip-flop D com reset assíncrono e reset síncrono
Fonte: Elaborado pelo autor.
  • Exercício: Implemente um registrador com N FF_D no lugar de um único FF_D.

Figura 5.6 - RTL do Registrador (de 4 bits) com reset assíncrono
Fonte: Elaborado pelo autor.

Figura 5.7 - Techonogy Map do Registrador (de 4 bits) com reset assíncrono
Fonte: Elaborado pelo autor.
  • Faça a simulação funcional do DFFs e do Latch
Encontro 10 (17 out)
  • Revisão de alguns tópicos tratados pelo prof. Roberto de Matos.
Encontro 11 (22 out)
  • Simulação de contadores vistos nas aulas anteriores com o prof. Roberto de Matos.
Encontro 12 e 13 (24 e 29 out.)
Encontro 14 (31 out.)
  • Temporizações de um Flip-Flop.
  • atraso do clock para saída (Tcq)
  • tempo de setup (T_{setup}) e tempo de hold (T_{hold})

Figura 5.22 - Temporizações de um Flip Flop
Fonte: RTL Hardware Desing, P. Chu.

Nota: a violação do tempo de setup ou hold leva ao estado de meta-estabilidade, na qual a saída fica temporariamente em um valor indefenido.

  • Os circuitos devem ser projetos para serem globalmente síncronos.

Exemplos de contadores com projeto Sincrono.

  • Contador de sequencia arbitraria (implementado com when else)
  • Contador de livre com indicação de valor máximo. (implementado com incrementador)
  • Contador com opções de clear sincrono, load, e parada
  • Contador de modulo 10.
  • Violação do tempo de Setup do FF e frequência máxima do circuito (Fmax).

Figura 5.23 - Modelo de Circuito Sequencial
Fonte: RTL Hardware Desing, P. Chu.

Figura 5.24 - Tempo de Setup e Fmax
Fonte: RTL Hardware Desing, P. Chu.

Figura 5.25 - Equações do Tempo de Setup e Fmax (1/Tc(min))
Fonte: RTL Hardware Desing, P. Chu.

Figura 5.26 - Equações do Tempo de Hold
Fonte: RTL Hardware Desing, P. Chu.

Figura 5.27 - Atraso da saída
Fonte: RTL Hardware Desing, P. Chu.

Exemplos de outros contadores com projeto síncrono.

  • Contador de modulo m (onde m é uma entrada).
- Versão two_seg_clear_arch (12 EL, Fmax = 542,89 MHz para Slow 1,2V 125C Model)
- Versão two_seg_effi_arch (8 EL, Fmax = 444,64 MHz para Slow 1,2V 125C Model)
O contador realiza m contagens, e precisa log2(m) registradores (flip-flops)
Encontro 15 (5 nov.)
-- Instrução concorrente FOR GENERATE.
-- Note que neste caso o '''label''' é obrigatório

label: FOR identificador IN faixa GENERATE
   [Parte_Declarativa
BEGIN]
   Instruções_concorrentes
   ...
END GENERATE [label];
  • Implementar um registrador de deslocamento de N bits.
entity shift_reg is
	generic ( N : natural := 4);
	port 	(
		clock, reset : in  std_LOGIC ;
		d_in:  in std_LOGIC;
		q_out : out std_LOGIC);
end entity;

architecture ifsc_v1 of shift_reg is
	signal d: std_logic_vector(N-1 downto 0);
	signal q: std_logic_vector(N-1 downto 0);
begin
   ...
end architecture;

*Implementar um registrador com N FF_D usando a instrução '''FOR GENERATE'''.

Figura 5.8 - Technology Map de Shift Register
Fonte: Elaborado pelo autor.

Figura 5.9 - Simulação de Shift Register
Arquivo:Shift reg SIM.png
Fonte: Elaborado pelo autor.
  • Implementar Uma porta or (and) ou xor de N entradas usando a instrução FOR GENERATE.


Encontro 16 (7 nov.)

Instruções do tipo LOOP: LOOP incondicional, FOR-LOOP, WHILE-LOOP, NEXT, EXIT

  • Instrução LOOP incondicional:
[rótulo:] LOOP
             afirmação_sequencial;
             afirmação_sequencial;
             ...
          END LOOP [rótulo];
  • Instrução FOR-LOOP:
[rótulo:] FOR identificador IN faixa LOOP
             afirmação_sequencial;
             afirmação_sequencial;
             ...
          END LOOP [rótulo];
  • Instrução WHILE-LOOP:
[rótulo:] WHILE condição LOOP            -- Executa as "afirmações enquanto a "condição" for verdadeira
             afirmação_sequencial;
             afirmação_sequencial;
             ...
          END LOOP [rótulo];
  • Instrução LOOP com EXIT:
[rótulo:] [FOR identificador IN faixa] LOOP
             afirmação_sequencial;
             EXIT [rótulo] [WHEN condição];    -- Se a "condição" é verdadeira, termina o "LOOP"
             afirmação_sequencial;
             ...
          END LOOP [rótulo];
  • Instrução LOOP com NEXT:
[rótulo:] [FOR identificador IN faixa] LOOP
             afirmação_sequencial;
             NEXT [rótulo] [WHEN condição];    -- Se a "condição" é verdadeira, não executa as linhas até a linha "END LOOP"
                                               -- e incrementa o "identificador".
             afirmação_sequencial;
             ...
          END LOOP [rótulo];
  • Instrução CASE
 [rótulo opcional:] CASE expressão IS
                  WHEN valor =>                             -- valor único
                    afirmação_sequencial;                            
                    afirmação_sequencial;                            
                    ...
                  WHEN valor1 | valor2 | ... | valorN  =>   -- lista de valores
                    afirmação_sequencial;                            
                    afirmação_sequencial;                            
                    ...
                  WHEN valor1 TO valor2 =>                  -- faixa de valores
                    afirmação_sequencial;                            
                    afirmação_sequencial; 
                    ...
                  WHEN OTHERS  =>                          -- para evitar latches
                    afirmação_sequencial;                            
                    afirmação_sequencial; 
                    ...
          END CASE;
Exemplos
  • Leading Zeros (LOOP com EXIT) (Ex 6.5) - Esse circuito deve determinar quantos zeros tem em um vetor de entrada Data antes do primeiro bit '1', começando da esquerda para a direita.
  • Fazer a síntese do circuito; fazer simulação no Modelsim; analisar a forma como o compilador implementou o incrementador.
entity leading_zeros is
	generic (N : natural := 8);
	port
		(	________ : in std_logic_vector(0 to N-1);
			count	: out integer range 0 to N
		);
end entity;

architecture ____ of leading_zeros is

begin
	process (data)
	variable count : integer ____ 0 to N
	begin
		count := 0;
		for i ___ data'range ____
			case data(i) is
				when '0' => count := count + 1;
				when _____ => exit;
			end  ___
		end ____
		zeros <= count;
	end process;
end _______;

Figura 5.15 - Simulação do leading_zeros
Fonte: Elaborado pelo autor.
  • Contador de zeros (LOOP com NEXT ou apenas LOOP) - Esse circuito deve determinar quantos zeros tem em um vetor de entrada Data.
  • Fazer a síntese do circuito; fazer simulação no Modelsim; analisar a forma como o compilador implementou o incrementador.

Figura 5.16 - Simulação do counting_zeros
Fonte: Elaborado pelo autor.
  • Ver pag. 161 a 164 de [1]
Encontro 17 (12 nov.)
  • Uso de type para definir novos tipos de dados. Exemplo de integer_vector
  • Instrução WAIT: WAIT UNTIL, WAIT FOR (simulação apenas), WAIT ON (não implementada no Quartus II).
 [rótulo:] WAIT UNTIL <condition>;
 [rótulo:] WAIT ON sensitivity_list;
 [rótulo:] WAIT FOR time_expression;
Recomenda-se utilizar a lista de sensibilidade do PROCESS e a instrução IF no lugar do WAIT.
Algumas instruções de WAIT serão utilizadas na criação de TestBench em VHDL para a simulação com o MODELSIM.
  • Projetar um contador em BCD entre 0 e 99 (countBCD_DU.vhd), com entrada de clock, reset e saidas unidade(0 a 9) e dezena (0 a 9). Projete o contador para parar em qualquer valor de DU onde D é a dezena e U é a unidade.
  • versão 1 - contagem crescente.

Figura 5.18 - RTL do contador BCD 00 a 99
Fonte: Elaborado pelo autor.

Figura 5.19 - Simulação do contador BCD 00 a 99
Fonte: Elaborado pelo autor.
DESAFIO

Implementar um contador BCD de 00 a 99, com parada em qualquer valor MAX_DU. Onde se D = 5, U = 9, implica em contar de 000 até 59 e ficar parado neste valor. A atingir o valor final MAX_DU, uma saída adicional OPA deve ser ativada.

  • Versão 1: O contador crescente deve usar a proposta de contagem separada de 0 a 9 da Unidade, Dezena (feito em aula), com parada em MAX_DU.
  • Versão 2: O contador crescente deve fazer a contagem em binário, e incrementar 6 nos bits da unidade sempre que passar de 9(1001) para 10 (1010), com parada em MAX_DU.
  • Versão 3: O contador decrescente deve usar a proposta de contagem separada de 0 a 9 da Unidade, Dezena (feito em aula), com início em MAX_DU e parada em 00.
Encontro 18 (14 nov.)
  • Instrução IF GENERATE
<generate_label>: 
	if <condition> generate
		-- Concurrent Statement(s)
	end generate;

Essa instrução é utilizada para a geração condicional de código durante a elaboração. Com isso, partes do projeto são sintetizadas e outras não, dependendo de certas condições ou parâmetros definidos no projeto. Como ela faz parte do grupo de instruções concorrentes, ela não pode ser utilizada dentro de PROCESS, FUNCTION ou PROCEDURE.

Para exemplificar, consideramos a situação em que um contador crescente (UP) OU um contador decrescente (DOWN) devem serm utilizados, mas o contador nunca será aplicado nas duas direções de contagem. Neste caso, é possível estabelecer um parâmetro GENERIC, que definirá se a contagem é UP ou DOWN. Analise o código a seguir:

entity contador_up_down_if_generate is
	generic
	(
		MIN : natural := 3;
		MAX : natural := 21;
		UPDOWN : natural := 0 -- 0 => up; 1 => down
	);
	port
	(
		clk, rst		   : in std_logic;
		count_out   : out integer range MIN to MAX
	);
end entity;

architecture ifsc_v1 of contador_up_down_if_generate is
begin
	L1: if UPDOWN = 0 generate
		process (clk, rst)
			variable cnt : integer range MIN to MAX;
		begin
			if rst = '1' then
				cnt := MIN;
			elsif (rising_edge(clk)) then
					if cnt = MAX then
						cnt := MIN;
					else
						cnt := cnt + 1;
					end if;
			end if;
			count_out <= cnt;
		end process;
	end generate;
	L2: if UPDOWN = 1 generate
		process (clk, rst)
			variable cnt : integer range MIN to MAX;
		begin
			if rst = '1' then
				cnt := MAX;
			elsif (rising_edge(clk)) then
					if cnt = MIN then
						cnt := MAX;
					else
						cnt := cnt - 1;
					end if;
			end if;
			count_out <= cnt;
		end process;	
	end generate;
end architecture;

Se o parâmetro UPDOWN for instanciado com 0, teremos um contador crescente. Caso seja instanciado com 1, o contador será decrescente. Veja a simulação nos dois casos.


Figura 5.20 - Simulação do contador UPDOWN com 0
Fonte: Elaborado pelo autor.

Figura 5.21 - Simulação do contador UPDOWN com 1
Fonte: Elaborado pelo autor.
  • Uso de duas architecture para obter a mesma opção do IF GENERATE
entity contador_up_down_two_arch is
	generic
	(
		MIN : natural := 3;
		MAX : natural := 21
	);
	port
	(
		clk, rst    : in std_logic;
		count_out   : out integer range MIN to MAX
	);
end entity;

architecture arch_up of contador_up_down_two_arch is
begin
		process (clk, rst)
			variable cnt : integer range MIN to MAX;
		begin
			if rst = '1' then
				cnt := MIN;
			elsif (rising_edge(clk)) then
					if cnt = MAX then
						cnt := MIN;
					else
						cnt := cnt + 1;
					end if;
			end if;
			count_out <= cnt;
		end process;
end architecture;

architecture arch_down of contador_up_down_two_arch is
begin
		process (clk, rst)
			variable cnt : integer range MIN to MAX;
		begin
			if rst = '1' then
				cnt := MAX;
			elsif (rising_edge(clk)) then
					if cnt = MIN then
						cnt := MAX;
					else
						cnt := cnt - 1;
					end if;
			end if;
			count_out <= cnt;
		end process;	
end architecture;

configuration ifsc_cfg of contador_up_down_2arch is
--	for arch_up end for;
	for arch_down end for;
end configuration;
  • Uso de uma porta de entrada UPDOWN fixada em '0' ou '1' para obter a mesma opção do IF GENERATE
entity contador_up_down_pin is
	generic
	(
		MIN : natural := 3;
		MAX : natural := 21
	);
	port
	(
		clk, rst		   : in std_logic;
		UPDOWN : natural := 1; -- 0 => up; 1 => down
		count_out   : out integer range MIN to MAX
	);
end entity;

architecture ifsc_v1 of contador_up_down_pin is
	signal cnt_down, cnt_up   : integer range MIN to MAX;
begin
		process (clk, rst)
			variable cnt : integer range MIN to MAX;
		begin
			if rst = '1' then
				cnt := MIN;
			elsif (rising_edge(clk)) then
					if cnt = MAX then
						cnt := MIN;
					else
						cnt := cnt + 1;
					end if;
			end if;
			cnt_up <= cnt;
		end process;

		process (clk, rst)
			variable cnt : integer range MIN to MAX;
		begin
			if rst = '1' then
				cnt := MAX;
			elsif (rising_edge(clk)) then
					if cnt = MIN then
						cnt := MAX;
					else
						cnt := cnt - 1;
					end if;
			end if;
			cnt_down <= cnt;
		end process;	
	count_out <= cnt_up when UPDOWN = 1 else cnt_down;
end architecture;
  • Uso de componentes e instanciação de componentes.

Nesta parte da materia, o aluno deverá aprender a perguntar para uma ferramente de IA (e.g. ChatGPT) sobre um conteúdo específico formulando perguntas que conduzam a resposta e detalhamento desejado. De acordo com as respostas as perguntas precisam ser adaptadas. As respostas precisam ser avaliadas, pois podem conter erros graves. Exemplo de ordem de perguntas:

1) Como é feita a instanciação de componentes em VHDL?
2) Como devem ser os arquivos da entidade e do top level?
3) Quais tipos de instanciação existem? Além dessa instanciação nominal, também existe a posicional, podes explicar e exemplificar os dois casos?
4) O que devo fazer se não for utilizada uma porta de entrada ou de saída na instanciação de um componente?
Resposta do ChatGPT

A instanciação de componentes em VHDL é o processo de incluir e conectar componentes em um design hierárquico. Isso permite que você reutilize módulos já implementados em diferentes partes do projeto. O processo de instanciação segue algumas etapas, conforme descrito abaixo:

Declaração do componente

Antes de usar um componente em uma arquitetura, ele precisa ser declarado no escopo da arquitetura (a menos que você esteja usando bibliotecas com pacotes, onde a declaração pode ser omitida). A declaração define os sinais de entrada e saída do componente.

Exemplo de declaração do componente:

component MeuComponente
    generic (
        WIDTH : natural := 4
    )
    port (
        clk   : in  std_logic;
        reset : in  std_logic;
        data  : in  std_logic_vector(7 downto 0);
        valid : out std_logic
    );
end component;
Instanciação do componente

Após declarar o componente, ele pode ser instanciado dentro do corpo da arquitetura. Na instanciação, você define um "rótulo" (um nome para a instância) e conecta as portas do componente aos sinais locais do módulo que o utiliza. Existem duas formas principais de conectar as portas durante a instanciação:

Conexão posicional: As portas são conectadas pela ordem em que aparecem no port map. Deve-se garantir que a ordem dos sinais corresponda à ordem definida no componente.

Exemplo:

Instancia2: MeuComponente
    generic map (
         8
    )
    port map (
        clk_signal,
        reset_signal,
        input_data,
        output_valid
    );

Conexão nomeada: As portas são conectadas explicitamente pelo nome, o que é mais claro e menos propenso a erros. Este é o método preferido, especialmente em designs complexos.

Instancia1: MeuComponente
    generic map (
        WIDTH => 8
    )
    port map (
        clk   => clk_signal,
        reset => reset_signal,
        data  => input_data,
        valid => output_valid
    );

No exemplo acima

  • Instancia1 é o rótulo da instância.
  • clk, reset, data, e valid são os nomes das portas do componente.
  • clk_signal, reset_signal, input_data, e output_valid são os sinais do módulo que está utilizando o componente.

Em VHDL, os arquivos da entidade (componente) e do top level (nível superior do design) seguem uma estrutura organizada para garantir a modularidade, reutilização de código e facilidade de manutenção. Abaixo está uma explicação de como estruturar esses arquivos corretamente.

Arquivo da Entidade (Componente)

Um arquivo que define uma entidade (componente) deve conter:

  • A declaração da entidade, que define as entradas e saídas do módulo.
  • A arquitetura, que contém a lógica do componente (ou uma descrição de como ele é implementado).

Exemplo de Arquivo para o Componente:

-- Arquivo: MeuComponente.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Declaração da entidade
entity MeuComponente is
    port (
        clk   : in  std_logic;
        reset : in  std_logic;
        data  : in  std_logic_vector(7 downto 0);
        valid : out std_logic
    );
end MeuComponente;

-- Declaração da arquitetura
architecture Behavioral of MeuComponente is
begin
    -- Implementação da lógica do componente
    process(clk, reset)
    begin
        if reset = '1' then
            valid <= '0';
        elsif rising_edge(clk) then
            if data = "11111111" then
                valid <= '1';
            else
                valid <= '0';
            end if;
        end if;
    end process;
end Behavioral;

Neste exemplo:

  • Entidade: Define as portas (clk, reset, data, valid).
  • Arquitetura: Implementa a lógica funcional do componente.
Arquivo do Top Level

O arquivo do Top Level é responsável por integrar e conectar os componentes em um design hierárquico. Ele também define as entradas e saídas globais do sistema e instancia os componentes (como o MeuComponente no exemplo).

Exemplo de Arquivo Top Level:

-- Arquivo: TopLevel.vhd

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Declaração da entidade do Top Level
entity TopLevel is
    port (
        clk   : in  std_logic;
        reset : in  std_logic;
        data  : in  std_logic_vector(7 downto 0);
        valid : out std_logic
    );
end TopLevel;

-- Declaração da arquitetura do Top Level
architecture Structural of TopLevel is
    -- Sinais internos para conexão
    signal clk_signal   : std_logic;
    signal reset_signal : std_logic;
    signal input_data   : std_logic_vector(7 downto 0);
    signal output_valid : std_logic;

    -- Declaração do componente
    component MeuComponente
        port (
            clk   : in  std_logic;
            reset : in  std_logic;
            data  : in  std_logic_vector(7 downto 0);
            valid : out std_logic
        );
    end component;

begin
    -- Conectando sinais externos aos sinais internos
    clk_signal   <= clk;
    reset_signal <= reset;
    input_data   <= data;

    -- Instanciação do componente
    Instancia1: MeuComponente
        port map (
            clk   => clk_signal,
            reset => reset_signal,
            data  => input_data,
            valid => output_valid
        );

    -- Conectando o sinal interno à saída global
    valid <= output_valid;
end Structural;

Neste exemplo:

  • O Top Level possui sua própria entidade e arquitetura.
  • Ele instancia o componente MeuComponente e conecta os sinais externos (entradas e saídas globais) aos sinais internos que se conectam ao componente.
Organização dos Arquivos

Nomeação dos Arquivos:

  • O nome do arquivo deve corresponder ao nome da entidade definida dentro dele.
  • Por exemplo:
  • Para a entidade MeuComponente, o arquivo deve ser MeuComponente.vhd.
  • Para a entidade TopLevel, o arquivo deve ser TopLevel.vhd.

Separação de Arquivos:

  • Cada entidade e arquitetura deve estar em um arquivo separado.
  • Isso facilita a reutilização e a organização, especialmente em projetos maiores.

Hierarquia:

  • O Top Level deve ser o ponto de entrada do design. Ele referencia (ou instancia) os componentes.
Como Compilar e Simular

Para que os arquivos funcionem juntos, siga estas etapas:

Compilação:

  • Compile primeiro os arquivos dos componentes, como MeuComponente.vhd.
  • Depois, compile o arquivo do Top Level, que depende dos componentes.

Simulação:

  • Simule o arquivo do Top Level, pois ele integra todos os componentes.
  • Use um banco de testes (testbench) conectado ao Top Level para verificar o comportamento geral.

Ferramentas de Desenvolvimento:

  • Use ferramentas como ModelSim, Quartus, Xilinx Vivado ou GHDL para compilar, simular e sintetizar os arquivos.

Quando uma porta de entrada ou saída de um componente não é utilizada durante a instanciação em VHDL, você deve explicitamente informar isso no momento da conexão com o port map. Isso garante que o design seja claro e sem erros de compilação, já que todas as portas devem ser conectadas (mesmo que não sejam usadas).

A forma de lidar com isso depende se a porta é de entrada ou saída:

Para uma Porta de Entrada Não Utilizada

As portas de entrada devem receber um valor, mesmo que não sejam usadas na lógica. Nesse caso, você pode: Você pode conectar a porta a um literal (como '0', '1' ou "000...").

Exemplo:

Instancia1: MeuComponente
    port map (
        clk   => clk,
        reset => reset,
        data  => (others => '0'), -- Porta de entrada não utilizada
        valid => valid_signal
    );

No exemplo acima, a entrada data foi conectada a (others => '0'), indicando que todos os bits do vetor serão definidos como 0.

Para uma Porta de Saída Não Utilizada

As portas de saída não precisam ser conectadas diretamente a nada, mas é necessário indicar explicitamente que você está ignorando a saída. Para isso, você pode usar a palavra-chave open.

Exemplo:

Instancia3: MeuComponente
    port map (
        clk   => clk,
        reset => reset,
        data  => data_signal,
        valid => open -- Porta de saída não utilizada
    );

O open informa que a saída valid não será usada e evita que o compilador gere erros.

Ao fazer as mesmas perguntas para a mesma IA, as respostas podem ser diferentes. Por isso, todas respostas de IA deve passar por um processo de curadoria por humanos.


Encontro 19 e 20 (19 e 21 nov.)
  • Projetar um conversor de BCD para SSD - display de sete segmentos (bcd2ssd.vhd). O circuito deve ter uma entrada que permite escolher se o mostrador é do tipo anodo comum ou catodo comum, utilizando a instrução IF GENERATE. Para possibilitar mostrar ou não o zero, deve haver uma entrada que ao ser ativada fará com que o número zero não seja mostrada no mostrador.
  • Crie um projeto top_level no qual existem 4 instancias do componente bcd2ssd.
1) Onde é usado a entrada do tipo anodo comum e catodo comum em diferentes instâncias para testar ambos os tipos de mostradores.
2) A entrada que permite esconder o zero deve ser configurada de modo que a primeira instância mostre o número zero, enquanto a segunda instância ocultará o zero.

O projeto top_level deve incluir uma entrada BCD de 4 bits e os sinais de controle para o tipo de mostrador (anodo comum ou catodo comum) e a ativação/desativação do zero.

entity top_level is
	port (
		bcd_tl       : in std_logic_vector(3 downto 0);
		ACn_CC       : in std_logic; -- '1' para anodo comum, '0' para catodo comum
		Z_OPC        : in std_logic; -- '1' para mostrar zero, '0' para ocultar
		ssd1         : out std_logic_vector(6 downto 0);
		ssd2         : out std_logic_vector(6 downto 0);
		ssd3         : out std_logic_vector(6 downto 0);
		ssd4         : out std_logic_vector(6 downto 0)
	);
end entity;

architecture ifsc of top_level is
	component bcd2ssd is
		port (
			bcd          : in std_logic_vector(3 downto 0);
			ACn_CC       : in std_logic;
			Z_OPC        : in std_logic;
			ssd          : out std_logic_vector(6 downto 0)
		);
	end component;
begin
	u1 : bcd2ssd
	port map(bcd_tl => bcd, ACn_CC => '1', Z_OPC => '1', ssd => ssd1);
	u2 : bcd2ssd
	port map(bcd_tl => bcd, ACn_CC => '1', Z_OPC => '0', ssd => ssd2);
	u3 : bcd2ssd
	port map(bcd_tl => bcd, ACn_CC => '0', Z_OPC => '1', ssd => ssd3);
	u4 : bcd2ssd
	port map(bcd_tl => bcd, ACn_CC => '0', Z_OPC => '0', ssd => ssd4);
end architecture;
  • Faça a simulação do componente bcd2ssd e também do top_level.
  • Em seguida configure o circuito para ser implementado nos 4 mostradores (HEX0, HEX1, HEX2, HEX3). Para entrada de dados utilize as chaves SW3 downto SW0 do kit DE2-115.


Encontro 21 (26 nov.)
  • Projetar um divisor de clock que dado um clock de entrada de f Hz, produza na saída um sinal de clock de f/N onde N é um número inteiro (div_clk_N)
  • Utilize esse circuito para obter um clock de 1 Hz a partir do sinal de 50MHz existente no kit DE2-115.
  • Utilize um segundo circuito para obter um clock de 0,1 Hz
  • Teste o circuito no kit DE2-115.


Encontro 22 (28 nov.)
ver Código Gray
Encontro 23 (3 dez.)
  • Implementar um contador LFSR de n bits.
  • Consultar [2] ou a página 5 de [3] para obter os termos que são usados na realimentação.
  • Circuito de PWM (Pulse Width Modulation - Modulação por largura de pulso) Listagem 9.14 do livro do P. Chu.
  • Em algumas aplicações ao invés de usar diretamente a contagem, se usa o estado do contador para geram sinais de saída. Um exemplo é um circuito de modulação por largura de pulso (PWM), que gera um pulso de saída com um ciclo de trabalho ajustável.
  • Por exemplo, em um circuito PWM que tem 16 passos, o ciclo de trabalho pode ser ajustado em incrementos de 1/16, ou seja, o ciclo de trabalho pode ser 1/16, 2/16, 3/16, ..., até 16/16. Este circuito pode ser implementado por um contador mod-16 com um circuito de saída especial, que define o valor da saída em alto de acordo com o valor da contagem. O período dos pulsos de saída neste caso sempre será de 16 vezes o período do relógio.
  • Note que uma expressão booleana adicional, w="0000", é incluída para acomodar a condição especial.
   buf_next <= '1' when (r_reg<unsigned(w)) or (w="0000") else '0';

Figura 5.X - RTL do circuito de PWM
Fonte: Elaborado pelo autor.

Na simulação abaixo, um clock de 50 ps foi utilizado, e o valor da entrada w foi definida como (3, 8, 0, 1, 15) a cada 1600 ps. Note que a largura do pulso da saída pwm_pulse está de acordo com aquela entrada.


Figura 5.X - Simulação do circuito de PWM
Fonte: Elaborado pelo autor.
Encontro 24 e 25 (5 e 10 dez.)
Encontro 26 (12 dez.)
  • Testes finais do relógio HHMMSS (se todos alunos estiverem com simulações feitas e pinagem pronta).
  • Implementação da função de LOAD para definir os valores iniciais da HH, MM e SS no relógio.
  • Sugestão utilizar 4 chaves para definir o valor em binário da unidade, outras 4 chaves para definir a dezena, e por último 1 chave para carregar a hora, 1 para o minuto e 1 para o segundo. É fundamental que a chave stop esteja funcionando para permitir iniciar o relógio no momento exato.
  • Ajustar pelo Horário de Brasilia
Encontro 27 e 28 (17 e 19 dez.)
  • Registradores como armazenamento temporário

1.5 Unidade 4 - Maquinas de Estado Finitas

Unidade 4 - Maquinas de Estado Finitas
Encontro 29 (28 jan.)
  • O que é uma FSM - Finite State Machine

Figura 4.1 - Exemplo de diagrama de estados de uma FSM Fig4.1(a) e implementação em hardware da FSM Fig4.2(a)
Fonte: Figura 11.1 e 11.2 de [1].
  • Modelo básico em VHDL de FSM
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
----------------------------------------------------------
ENTITY < entity_name > IS
PORT (
	clk, rst : IN STD_LOGIC;
	entradas : IN < data_type > ;
	saidas : OUT < data_type >);
END entity;
----------------------------------------------------------
ARCHITECTURE < architecture_name > OF < entity_name > IS
	TYPE state IS (A, B, C, ...);
	SIGNAL pr_state, nx_state : state;
	-- ATTRIBUTE ENUM_ENCODING : STRING; --optional attribute
	-- ATTRIBUTE ENUM_ENCODING OF state : TYPE IS "sequential";
	-- ATTRIBUTE SYN_ENCODING OF state : TYPE IS "safe";
BEGIN
	------Logica Sequencial da FSM:------------
	PROCESS (clk, rst)
	BEGIN
		IF (rst = '1') THEN
			pr_state <= A;
		ELSIF rising_edge(clk) THEN
			-- apenas na borda do "clk" ocorre a mudança de estado da FSM
			pr_state <= nx_state;
		END IF;
	END PROCESS;
	------Logica Combinacional da FSM:------------
	PROCESS (pr_state, entradas)
	BEGIN
		------Valores default das saidas------------
                saidas <= < valor > ;
		CASE pr_state IS
			WHEN A =>
				-- é necessário um  WHEN para definir as "saidas" durante cada estado 
				-- e analisar as "entradas" para definir o próximo estado
				saidas <= < valor > ;   -- apenas se diferente do valor default
				IF (entradas = < valor >) THEN
					nx_state <= B;
					...
				ELSE
					nx_state <= A;
				END IF;
			WHEN B =>
				saidas <= < valor > ; -- apenas se diferente do valor default
				-- dependendo das "entradas", pode ser que hajam mais de um estados de destino
				IF (entradas = < valor >) THEN
					nx_state <= C;
				ELSIF (entradas = < valor >) THEN
					nx_state <= A;
				ELSE
					nx_state <= B;
				END IF;
			WHEN C =>
				saidas <= < valor > ; -- apenas se diferente do valor default
				-- a passagem para outro estado pode não depender de nenhuma "entrada"
				nx_state <= D;
			WHEN ...


		END CASE;
	END PROCESS;
	------Seção de Saída (opcional):-------
	-- Essa seção visa garantir que a saida new_output esteja sincronizada com o clk.  
	-- Se isso não for importante, ela pode ser suprimida
	PROCESS (clk, rst)
	BEGIN
		IF (rst = '1') THEN
			new_output <= < valor > ;
		ELSIF rising_edge(clk) THEN --or falling_edge(clk)
			new_output <= output;
		END IF;
	END PROCESS;
END architecture;
Dica
Se ao discrever uma FSM, faltar algum estado, o Quartus dará erro durante a compilação. Para resolver temporariamente isso pode se usar antes de encerrar o case
	WHEN others => 
		nx_state <= <initial_state>;
  • Usando o template acima descreva em VHDL a FSM indicada na Figura 11.1.
  • Faça a simulação da FSM com Modelsim utilizando um testbench em VHDL que faça a FSM seguir os estados

RSTAx=0Ax=1Ax=2Bx=2Bx=0Cx=0Cx=2Cx=1Ax=2Bx=1A

Ver pag. 277 a 280 de [1]
Note que o uso da atribuição manual do enum_encoding pode faz com que o compilador do Quartus não reconheça a FSM, mas use logica regular para representar o sistema.
Encontro 30 (30 jan.)
  • Máquina de vendas
  • Use o template da FSM para modelar o sistema mostrado na figurar a seguir.

Figura 7.2 - FSM - Máquina de vendas (diagrama de estados)
Fonte: Adaptado da Figura 11.3 de [1].

Figura 7.3 - FSM - Máquina de vendas (diagrama de estados com default
Fonte: Elaborado pelo autor.
  • Simule a FSM com Modelsim utilizando um testbench em VHDL para gerar o teste mostrado na figura abaixo.

Figura 7.4 - FSM - Máquina de vendas (simulação)
Fonte: Elaborado pelo autor.
  • Exercício: Altere a FSM para vender doces que custam 30 centavos. Considere que as moedas aceitas são 5, 10, 25 e 50 centavos. Desenho primeiro a FSM e em seguida implemente-a em VHDL e faça a simulação.
Ver pag. 281 a 282 de [1]
Dica: para desenhar a FSM recomendo utilizar um software on-line para tal finalidade. Por Ex. Visual Paradigm.
DESAFIO
  • Implementar um controlador para máquina de Lavar Roupas baseado na FSM abaixo.

Figura 7.4 - FSM da Máquina de Lavar Roupas
Fonte: Elaborado pelo autor.
PARA A PRÓXIMA AULA
  • Implementação em VHDL da FSM de máquina de Lavar Roupas
  • Simulação em ModelSim da FSM de máquina de Lavar Roupas


Encontro 31 (4 fev.)
  • Diagrama de blocos de uma FSM completa. Diferença entre saída Moore e saída Mealy.
No diagrama abaixo, uma FSM (Finite State Machine) é modelada através dos seus componentes básicos:
  • Entradas - são os sinais que fazem a FSM evoluir para os próximos estados.
  • Clock: o clock (relógio) é o sinal que sincroniza as transições entre os estados. A mudança sempre ocorre na transição (borda) desse sinal.
  • Lógica do Próximo Estado: é um circuito combinacional que Determina o próximo estado com base no estado atual e nas entradas.
  • Registrador de Estado: Armazena o estado atual
  • Lógica de Saída Moore: Gera a saída apenas com base no estado atual.
  • Lógica de Saída Mealy: Gera a saída com base no estado atual e na entrada.

Figura 4.3 - Diagrama de blocos de um FSM
Fonte: Elaborado pelo autor.
  • Modelagem de FSM com Diagrama de Estados e ASM (Algorithmic State Machine). Exemplo da modelagem de um controlador de memória com modo de leitura BURST.

Figura 4.4 - Diagrama de estados de um controlador de memória
Fonte: RTL Hardware Desing, P. Chu.

Figura 4.5 - ASM de um controlador de memória
Fonte: RTL Hardware Desing, P. Chu.
  • A partir da descrição da FSM em diagrama de estados ou na forma ASM, é possível implementar essa FSM em VHDL. No código a seguir, é feita a descrição da FSM usando um código em dois segmentos, no qual o primeiro PROCESS realiza a atualização do Registrador de Estado, e o segundo PROCESS realiza a Lógica do Próximo Estado, Lógicas de Saída Moore e a Lógica de Saída Mealy.
library ieee;
use ieee.std_logic_1164.all;
entity mem_ctrl is
	port (
		clk            : in std_logic;
		reset          : in std_logic;
		mem, rw, burst : in std_logic;
		oe, we, we_me  : out std_logic
	);
end entity;
architecture two_seg_arch2 of mem_ctrl is
	type mc_state_type is
	(idle, read1, read2, read3, read4, write1);
	signal state_reg, state_next : mc_state_type;
begin
	process (clk, reset)
	begin
		if (reset = '1') then
			state_reg <= idle;
		elsif rising_edge(clk) then
			state_reg <= state_next;
		end if;
	end process;
	process (state_reg, mem, rw, burst)
		begin
			oe    <= '0';
			we    <= '0';
			we_me <= '0';
			case state_reg is
				when idle =>
					if mem = '1' then
						if rw = '1' then
							state_next <= read1;
						else
							state_next <= write1;
							we_me      <= '1';
						end if;
					else
						state_next <= idle;
					end if;
				when write1 =>
					we         <= '1';
					state_next <= idle;
				when read1 =>
					oe <= '1';
					if (burst = '1') then
						state_next <= read2;
					else
						state_next <= idle;
					end if;
				when read2 =>
					oe         <= '1';
					state_next <= read3;
				when read3 =>
					oe         <= '1';
					state_next <= read4;
				when read4 =>
					oe         <= '1';
					state_next <= idle;
			end case;
		end process;
end architecture;

Fonte: adaptado de RTL Hardware Desing, P. Chu.


Figura 4.6 - RTL do controlador de memória
Fonte: Quartus Light.

Figura 4.7 - FSM do controlador de memória
Fonte: Quartus Light.


  • Simulação do controlador de memória.

Na figura abaixo a FSM modelada tem duas saídas Moore ("oe" e "we"), e uma saída Mealy ("we_me"). Note que as saídas do tipo Moore sempre tem a duração de um período de clock, e elas não dependem diretamente de nenhuma entrada, mas são consequência do estado em que se encontra a FSM. No caso da saída Mealy, as entradas afeta diretamente a saída, conforme se pode ver os gliches da entrada "mem" são transmitidas para a saída "we_me".


Figura 4.8 - Simulação do controlador de memoria - diferença entre a saída Moore e saída Mealy
Fonte: Elaborado pelo autor.

Figura 4.9 - Simulação de escritas, leituras simples e leitura em burst no controlador de memoria
Fonte: Elaborado pelo autor.
Encontro 32 (6 fev.)
  • Circuito detector de borda
library ieee;
use ieee.std_logic_1164.all;
entity edge_detector1 is
   port(
      clk, reset: in std_logic;
      strobe: in std_logic;
      p1: out std_logic
   );
end edge_detector1;

architecture moore_arch of edge_detector1 is
   type state_type is (zero, up, one);
   signal state_reg, state_next: state_type;
begin
   -- state register
   process(clk,reset)
   begin
      if (reset='1') then
         state_reg <= zero;
      elsif (clk'event and clk='1') then
         state_reg <= state_next;
      end if;
   end process;
   -- next-state logic
   process(state_reg,strobe)
   begin
      case state_reg is
         when zero=>
            if strobe= '1' then
               state_next <= up;
            else
               state_next <= zero;
            end if;
         when up=>
            if strobe= '1' then
               state_next <= one;
            else
               state_next <= zero;
            end if;
         when one =>
            if strobe= '1' then
               state_next <= one;
            else
               state_next <= zero;
            end if;
      end case;
   end process;
   -- Moore output logic
   p1 <= '1' when state_reg=up else
         '0';
end moore_arch;

Fonte: RTL Hardware Desing, P. Chu.


Figura 4.10 - Simulação do detector de borda - implementação com saídas Moore
Fonte: Elaborado pelo autor.

Ao simular o detector de borda, percebe-se que o primeiro pulso (140ps) não foi detectado, pois não durou tempo suficiente para ter o estado atualizado no próximo clock. Isso ocorre pois na saída tipo Moore, as mudanças das saídas só acontecem sincronizadas com o clock. Note ainda que os pulsos em p1 tem a duração exata de um período de clock.

library ieee;
use ieee.std_logic_1164.all;
entity edge_detector2 is
   port(
      clk, reset: in std_logic;
      strobe: in std_logic;
      p2: out std_logic
   );
end edge_detector2;

architecture mealy_arch of edge_detector2 is
   type state_type is (zero, one);
   signal state_reg, state_next: state_type;
begin
   -- state register
   process(clk,reset)
   begin
      if (reset='1') then
         state_reg <= zero;
      elsif (clk'event and clk='1') then
         state_reg <= state_next;
      end if;
   end process;
   -- next-state logic
   process(state_reg,strobe)
   begin
      case state_reg is
         when zero=>
            if strobe= '1' then
               state_next <= one;
            else
               state_next <= zero;
            end if;
         when one =>
            if strobe= '1' then
               state_next <= one;
            else
               state_next <= zero;
            end if;
      end case;
   end process;
   -- Mealy output logic
   p2 <= '1' when (state_reg=zero) and (strobe='1') else
         '0';
end mealy_arch;

Fonte: RTL Hardware Desing, P. Chu.


Figura 4.11 - Simulação do detector de borda - implementação com saídas Mealy
Fonte: Elaborado pelo autor.

Ao simular o detector de borda, percebe-se que o primeiro pulso (140ps) agora foi detectado. Isso ocorre pois na saída tipo Mealy, as mudanças das saídas dependem do estado atual e da entrada, e por isso não são sincronizadas com o clock. Note que agora os pulsos em p1 tem duração variável.

1.6 Unidade 5 - Metodologia RT (Register Transfer)

Unidade 5 - Metodologia RT (Register Transfer)

A fonte principal dessa unidade é o capítulo 11 e 12 do livro "RTL Hardware Desing, P. Chu.". É recomendado que os alunos leiam estes capítulos e usem como fonte de consulta.

Encontro 33 (11 fev.)
  • Ver capítulo 11 slide 1 a 30
  • Introdução (exemplo de algoritmo de soma de 4 números, divisão inteira do resultado por 8.
  • Visão geral do FSMD

Figura 4.12 - Diagrama de blocos básico de uma FSMD
Fonte: RTL Hardware Desing, P. Chu.
Encontro 34 (13 fev.)

Figura 4.13 - Diagrama ASMD do algoritmo multiplicador L11.1
Fonte: RTL Hardware Desing, P. Chu.
  • Simulação essa FSMD, verificando o funcionamento da FSM através da simulação no MODELSIM. Teste com multiplicações menores (2 x 31 = 62); (31 x 2 = 62) e maiores (9 x 31 = 279) (31 x 9 = 279).
  • Anote a Fmax e meça o número de clocks (N_clk) transcorrido entre duas bordas de subida do sinal READY. Dica use dois cursores para medir o tempo total , e divida pelo período do clock utilizado na simulação.
  • Analise se ocorre alguma melhorias em termos de tempo de processamento (N_clk/Fmax) e número de elementos lógicos nas versões L11.1 a L11.3, L11.5 e L11.6. Também verifique se o resultado está correto em todas as versões. Verifique também a versão 11.4.


Encontro 35 (18 fev.)

Figura 4.14 - Diagrama ASMD do algoritmo multiplicador L11.7 e 11.8
Fonte: RTL Hardware Desing, P. Chu.
  • Análise de tempo e desempenho do FSMD
  • Implementação de um multiplicador por somas sucessivas em dataflow (a + a + a + ...)
  • Implementação de um multiplicador pelo bloco multiplicador (a x b)
Encontro 36 a 39 (20, 22, 25, 27 fev.)
Encontro 40 (6 mar.)
  • Atividade de recuperação para alunos com conceito inferior a 6.
  • Os demais alunos foram dispensados

2 Avaliações

Durante o semestre serão realizadas 4 avaliações. As avaliações devem ser enviadas pela plataforma Moodle com os arquivos solicitados.

Data das avaliações
  • A1 - : AE3 - Projeto de uma FSM para controle semafórico
  • A2 - : AE4 - Projeto de uma FSMD
  • AEs - : Média ponderada de (4*AE1 + 15*AE2)/19
  • R - Recuperação de A1 a A2 : Novo prazo para entrega das AE3 e AE4.
  • Folha de consulta de VHDL

3 Atividade relâmpago (AR)

As atividades relâmpago devem ser entregues no Moodle da disciplina. A não entrega dessas atividades não gera nenhum desconto, apenas geram pontos de BÔNUS que são adicionados aos conceitos das avaliações A1 a AN.

4 Atividade extra-classe (AE)

A média ponderada das atividades extra-classe será considerada no cálculo do conceito final da UC. A entrega das mesmas será feita pelo Moodle, e cada dia de atraso irá descontar 0,2 na nota da atividade. Muitas dessas atividades também geram pontos de BÔNUS que são adicionados aos conceitos das avaliações A1 a AN. Para os BÔNUS só serão considerados projetos entregues no prazo.

4.1 AE1 - Conhecendo os dispositivos lógicos programáveis

AE1 - Conhecendo os dispositivos lógicos programáveis
Objetivos
  • Conhecer o Quartus Prime e as características dos dispositivos lógicos programáveis
  • Analisar os tempos de propagação em um circuito combinacional
  • Alterar configurações do compilador
  • Fazer a simulação funcional e temporal de um circuito combinacional.
Atividades
  • Ao escolher a família de FPGAS, escolha inicialmente um dispositivo da família Max II. Anote o código desse dispositivo.
  • Capture as telas solicitadas e depois utilize-as no relatório da atividade.
  • Anote o tempo utilizado para cada uma das etapas do processo de compilação.
  • Anote o número de elementos lógicos utilizados e o número de pinos utilizados, bem com o percentual em relação ao número total do dispositivo.
  • Anote algum erro (Error) ou alertas (Warnings) que o Quartus II indicar no painel de mensagens [Messages]
  • Ao final salve o projeto em um arquivo QAR (sugestão PJ1.QAR)
  • Observe as mudanças que ocorrem tanto no tipo de Elemento Lógico disponível, no Chip Planner, no Pin Planner, e no circuito dos pinos de I/O. Note que estes FPGAs também apresenta novos componentes, tais como: Memória, Multiplicadores, DSP, PLL, DLL, etc. Verifique se consegue encontra-los no leiaute mostrado no Chip Planner, e documente aqueles que encontrar.
  • Compare os resultados obtidos nos procedimentos do PASSO 1 e PASSO 2.
  • Ao escolher a família de FPGAS, escolha um dispositivo FPGA da família Cyclone IV E. Anote o código desse dispositivo.
  • Capture as telas mostradas no roteiro e depois utilize-as no relatório da atividade.
  • Anote o máximo tempo de propagação entre entrada e saída.
  • Anote o número de elementos lógicos utilizados e o número de pinos utilizados, bem com o percentual em relação ao número total do dispositivo.
  • Experimente modificar as configurações do compilador, conforme mostrado em Configurando o compilador. Se desejar mude a semente inicial trocando o valor de [Seed: 1]
  • Experimente inserir diferentes restrições de atraso máximo para o compilador, e analise o resultado obtido.
  • Anote algum erro (Error) ou alertas (Warnings) que o Quartus II indicar no painel de mensagens [Messages]
  • Ao final salve o projeto em um arquivo QAR (sugestão PJ2.QAR)
  • PASSO 4: Realize a simulação funcional de um dos projetos CI74161 ou do cálculo da distância de Hamming
  • Capture as telas que mostram o circuito funcionando e depois utilize-as no relatório da atividade.
Entregas
  1. Envie um arquivo QAR contendo todos os arquivos necessário para compilar cada um dos projetos.
  2. Envie um relatório em PDF, incluindo as imagens capturadas (inclua um título para cada figura) e escreva para cada imagem um texto comentando o que representa. O relatório também deve ter a identificação (autor, título, data) uma breve introdução e uma conclusão. A descrição dos procedimentos feita na página wiki não precisa incluída no relatório.
  3. Use preferencialmente o Overleaf para gerar o relatório. Mas o uso de MS-Word, Libreoffice e Google Docs também é permitida.
  4. A entrega será feita através do Moodle da disciplina. Observe o prazo de entrega.

4.2 AE2 - Laboratório de programação de FPGA - Relógio HHMMSS

AE2 - Laboratório de programação de FPGA - Relógio HHMMSS
Objetivos
  • Desenvolver sistemas utilizando componentes já desenvolvidos.
  • Apreender a instanciar componentes e conectá-los com sinais.
  • Realizar um projeto hierárquico.
Consulte
Passo 1 - Projeto do Relogio_HHMMSS
  • Projete um relógio para indicar hora (HH), minuto (MM) e segundo (SS), mostrando as unidades e dezenas em 6 Display de 7 segmentos, usando os seguintes componentes: 1) Divisor de clock para obter um sinal de período de 1 segundo. (div_clk); 2) Contador configurável BCD de 00 a 99 (contador_bcd) 3) Conversor de BCD para SSD, com configuração de apagamento do zero e tipo de ligação dos segmentos.
  • Componente 1 - Divisor de Clock, com o valor da divisão configurável pelo parâmetro fclk2. O sinal de saída será usado como "enable" ou "clock" a cada 1 segundo para o componente contador_bcd.
component div_clk is
	generic (fclk2 : natural := 50);       -- frequencia para simulacao
	port (
		clk_in : in std_logic;
		rst : in std_logic;
		clk_out : out std_logic
	);
end component;
  • Componente 2 - Contador de 00 a 99 com saída em BCD, (pode ser um contador em BCD (ou um contador binário + conversor bin2bcd). O valor final deve ser configurável pelos parâmetros max_dezena e max_unidade
	component contador_bcd is
		 generic (max_dezena : natural := 5; max_unidade : natural := 9);
		 port (
			  clk: in std_logic;
			  rst: in std_logic;
			  fim: out std_logic;
			  bcd_unidade, bcd_dezena : out std_logic_vector(3 downto 0)
		 );
	end component;

Para esse contador pode ser usado o desenvolvido em aula, mas ele precisa ser modificado para permitir que o clock seja síncrono em todos os flip-flops. Assim é necessário usar um sinal de enable_in para habilitar a contagem durante um período de clock. Também será necessário gerar o sinal de enable_out para habilitar a contagem do próximo contador.

  • Componente 3 - Conversor de BCD para SSD, com um parâmetro configurável ac_ccn para selecionar o tipo de mostrador (Anodo Comum / Catodo Comum).
	component bcd2ssd is
		generic (ac_ccn : natural := 0);  -- 1 para mostrador de anodo comum, 0 para mostrador de catodo comum
		port (
				bcd_in :  in std_logic_vector(3 downto 0);
				z_opc:    in std_logic;   -- 1 o zero é mostrado, 0 - o zero é apagado.
				ssd_out : out std_logic_vector(6 downto 0)
		 );
	end component;
  • O valor ac_ccn será utilizado para configurar o circuito de modo a acender os segmentos com ALTO para display de catodo comum (ac_ccn=0), ou BAIXO para display de anodo comum (ac_ccn=1).
  • A entrada zero_option pode ser usada para apagar a dezena da HH, MM e SS.
  • Opção 1 - Na entidade TOP LEVEL, podem ser instanciados os seguintes componentes: um div_clk; três contador_bcd e seis bcd2ssd. Além disso, se necessário podem ser inseridos os inversores necessários para adequar ao hardware do kit DE2-115.
  • Opção 2 - Se quiser, você pode criar um componente com um contador_bcd e dois bcd2ssd e replicar 3 vezes esse componente na entidade TOP LEVEL.
  • IMPORTANTE: É necessário incluir um RESET no circuito sequencial e também uma entrada de enable no contador.
entity relogio_HHMMSS IS 
        -- O valor do fclk2 corresponde a metade do periodo do clock de entrada em Hz
	generic (fclk2 : natural := 50);  -- ao simular o circuito utilize um valor baixo para acelerar a simulaçao
        -- generic (fclk2 : natural := 25000000);  -- ao implementar no hardware use o valor do clock em Hz
	port
	(
		clk_50MHz_kit:	in  STD_LOGIC;
		rst_SW:		in STD_LOGIC;  -- use uma chave deslizante para essa função RESET
		stop_SW:	in STD_LOGIC;  -- use uma chave deslizante para essa função PARAR e CONTINUAR 
		z_opc_SW:	in STD_LOGIC;  -- use uma chave deslizante para essa função apagar o zero das dezenas 
		ssd_DS, ssd_DM, ssd_DH:	out  STD_LOGIC_VECTOR(6 downto 0);
		ssd_US, ssd_UM, ssd_UH:	out  STD_LOGIC_VECTOR(6 downto 0)
	);
end entity;

Figura AE2.a - RTL do Relógio Digital de 24 horas
Fonte: Elaborado pelo autor.
Passo 2 - Simule os componentes e o relógio completo
  • Efetue a simulação funcional do div_clock, definindo a entrada de clk_in como um sinal de 100 Hz, e realizando a simulação para produzir um clk_out de 1Hz. Certifique-se que a duração do sinal alto é de apenas 1 período do sinal de clk_in.
  • Efetue a simulação funcional do contador_bcd fazendo a contagem de 00 a 99 e também de 00 a DU, onde DU é um valor qualquer configurável pelo genéricos D e U. O contador só deverá contar se o enable_in estiver ALTO. Durante a mudança de DU para 00 o enable_out deverá ir para ALTO. Na simulação use um clock de 1 segundo, e faça uma simulação de pelo menos 120 segundos.
  • Efetue a simulação do bcd2ssd testando o circuito para as estradas bcd_in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9). Para os valores inválidos de entrada (10, 11, 12, 13, 14, 15), a saída deve mostrar "E" (de erro).
  • Nas simulações dos circuitos sequencias é necessário iniciar o circuito com um RESET de 10 ps.
  • Realize a simulação do relógio completo relogio_HHMMSS durante 48 horas. Para esta simulação é importante configurar o divisor de clock para realizar uma divisão com um fator menor que aquele a ser usado no circuito final (veja o comentário no código acima).

Figura AE4.b - Simulação funcional do Relógio Digital de 24 horas
Fonte: Elaborado pelo autor.

Figura AE4.c - Simulação funcional do Relógio Digital de 24 horas - detalhe enable 1sec
Fonte: Elaborado pelo autor.
Passo 3 - Implemente o relógio no kit DE2-115
  • Após verificar que a simulação do circuito está funcionando, configurar um FPGA para implementar este circuito. Existem duas opções de kit disponíveis com displays de sete segmentos. As informações necessárias estão em Preparando para gravar o circuito lógico no FPGA. Neste caso iremos usar o kit DE2-115 da TERASIC, pois precisamos de 6 mostradores de 7 segmentos.
  • Analise no diagrama esquemático como funcionam as chaves e também o mostrador de sete segmentos. Note que no projeto o signal RST foi descrito como normalmente ALTO, por isso dependendo da chave que usar pode ser necessário acrescentar um inversor neste sinal para que funcione corretamente. O Display de 7 segmentos da DE2-115 é do tipo anodo comum (aplicando um nível lógico '0' no pino correspondente fará com que o segmento acenda, enquanto a aplicação do nível lógico '1' fará com com que o segmento apague).
  • Anote a pinagem que será utilizada para conectar o circuito projetado no FPGA aos circuitos externos do kit (mostradores, chaves e leds).
definição dos pinos
To Direction Location
clk50MHz Input PIN_Y2
clk_1sec_LED Output PIN_F17
rst_sw Input PIN_AB28
ssd_DHH[0] Output PIN_AD17
ssd_DHH[1] Output PIN_AE17
ssd_DHH[2] Output PIN_AG17
ssd_DHH[3] Output PIN_AH17
ssd_DHH[4] Output PIN_AF17
ssd_DHH[5] Output PIN_AG18
ssd_DHH[6] Output PIN_AA14
ssd_DMM[0] Output
ssd_DMM[1] Output
ssd_DMM[2] Output
ssd_DMM[3] Output
ssd_DMM[4] Output
ssd_DMM[5] Output
ssd_DMM[6] Output
ssd_DSS[0] Output
ssd_DSS[1] Output
ssd_DSS[2] Output
ssd_DSS[3] Output
ssd_DSS[4] Output
ssd_DSS[5] Output
ssd_DSS[6] Output
ssd_UHH[0] Output
ssd_UHH[1] Output
ssd_UHH[2] Output
ssd_UHH[3] Output
ssd_UHH[4] Output
ssd_UHH[5] Output
ssd_UHH[6] Output
ssd_UMM[0] Output
ssd_UMM[1] Output
ssd_UMM[2] Output
ssd_UMM[3] Output
ssd_UMM[4] Output
ssd_UMM[5] Output
ssd_UMM[6] Output
ssd_USS[0] Output
ssd_USS[1] Output
ssd_USS[2] Output
ssd_USS[3] Output
ssd_USS[4] Output
ssd_USS[5] Output
ssd_USS[6] Output
  • Dica para testar o relógio sem aguardar 24 horas. Acelere o clock de entrada do contador de segundos de 60 (ou 1440 vezes), com isso o sistema realizará a contagem de 00:00:00 a 23:59:59 em 24 minutos (ou 1 minuto).
Passo 4 - Entregas
  • Documentar o experimento em um relatório técnico que contenha no mínimo:
  • identificação (título, disciplina, data, autores);
  • introdução;
  • Descrição dos componentes utilizados e do sistema completo. Cada componente deve ser descrito em termos funcionais, e também deve ter uma simulação que demonstre o seu funcinamento.
  • resultados obtidos (com imagens dos itens importantes) e análise dos resultados;
  • apresente tabelas da pinagem utilizada na configuração do FPGA, número de elementos lógicos usados em cada componente e pelo sistema completo.
  • conclusão.
  • apêndice (se desejar pode ser disponibilizados vídeos do funcionamento do circuito
  • O relatório deve também responder as questões levantadas e mostrar que os objetivos apresentados na introdução foram atendidos.
  • O arquivo QAR contendo o projeto
  • Os arquivos para simulação (DO) necessárias para simular o sistema relogio_HHMMSS e seus componentes.
  • O arquivo SOF usado na programação do FPGA.

4.3 AE3 - Projeto de uma FSM para controle semafórico

AE3 - Projeto de uma FSM para controle semafórico
Objetivos
  • Aplicar o conhecimento de FSM no projeto de um controle semafórico.
  • Obter a especificação do projeto pela observação do funcionamento do equipamento atual
  • Fazer a simulação funcional dos componentes individuais e do controle semafórico
  • Utilizar saídas do tipo Moore (para os focos luminosos) e Meally (inicialização das temporizações)
  • O projeto será desenvolvido por equipes de até 2 estudantes, e cada equipe deverá escolher um cruzamento de vias que tenha além de dois grupos semafóricos progressivo, também pelo menos um semáforo de pedestre.
  • Cada equipe deverá sugerir e implementar uma melhoria em relação ao equipamento atual instalado no cruzamento das vias. Um dos objetivos do projeto é buscar por soluções semafóricas inovadoras, incluindo aprimoramentos específicos para o período noturno ou economia de energia. O objetivo é proporcionar uma experiência mais segura e visível para veículos e pedestres ao cruzar vias durante o dia e a noite.

Como material auxiliar se sugere consultar o Manual Brasileiro de Sinalização de trânsito: VOLUME V - Sinalização Semafórica do CONTRAN. Outro material resumido sobre o tema pode ser consultado em Sinalização semafórica: definições - Universidade Presbiteriana Mackenzie

Atividades
  • PASSO 1 - fazer o levantamento do semáforo selecionado para o projeto.
  • Selecionar um semáforo e obter a imagem das vias e da área de conflito que é controlada pelo semáforo.

Figura AE3.1 - Imagem aérea do Google do cruzamento Shibuya Crossing, em Tóquio, Japão
Fonte: Google maps.
  • Fazer um croqui das vias e passagens de pedestre dessa área.

Figura AE3.2 - Diagrama do cruzamento Shibuya Crossing
Fonte: Google Maps.
  • Elaborar um rascunho ou foto dos semáforos existentes

Figura AE3.3 - Imagem do Google Street do cruzamento Shibuya Crossing
Fonte: Google Street.
  • Elaborar um rascunho do diagrama de estágios pag. 72 e pag. 150
  • Medir os tempos de ciclo do semáforo.
  • Elaborar um rascunho do diagrama de intervalos luminosos (Diagrama de barras). pag.72 e pag. 190
  • PASSO 2 - Projetar a FSM do controlador de semáforo
  • Desenhar o diagrama de transições da FSM
  • Desenhar o ASM
  • Escrever o código em VHDL da FSM
  • Fazer a Análise e Síntese no Quartus
  • Observar e analisar o RTL e o diagrama de estados no Quartus
  • Verificar o número de elementos lógicos usados
  • Fazer Timing Analysis e anotar as FMax
  • Fazer a simulação funcional, permitindo um (ou dois) ciclos completo do controlador semafórico (Dica utilize cores verde, vermelha e amarela para facilitar a visualização dos semáforos).
  • PASSO 3 - Implementar um sistema hierárquico para o controlador
  • Para a geração do tempo do controlador de semáforo utilize pelo menos um componente para o contador de segundos (binário ou BCD).
  • O controlador semafórico deve ser um componente separado
  • Se preferir utilize também um componente para o divisor de clock para gerar o sinal de 1 segundo a partir do clock de 50MHz, não esqueça de usar um divisor menor na simulação (sugestão 5)
  • O Top Level do projeto deve conter apenas a instanciação dos componentes do projeto.
  • Observar e analisar o RTL e o diagrama de estados no Quartus
  • Verificar o número de elementos lógicos usados e o FMax
  • Fazer a simulação funcional de um ciclo completo do controlador semafórico.
Entregas
  1. Envie um arquivo QAR contendo todos os arquivos necessário para compilar e simular o projeto. O QAR deve conter todos os arquivos .vhd e arquivos .do dos componentes e do top level.
  2. Envie um relatório em PDF, incluindo as imagens capturadas (inclua um título para cada figura) e escreva para cada imagem um texto comentando o que representa. O relatório também deve ter a identificação (autor, título, data) uma breve introdução e uma conclusão. A descrição dos procedimentos feita na página wiki não precisa incluída no relatório. Dados numéricos devem ser apresentados na forma gráfica ou tabela, jamais como imagem capturada de tela.
  3. Use preferencialmente o Overleaf para gerar o relatório. Mas o uso de MS-Word, Libreoffice e Google Docs também é permitida.
  4. A entrega será feita através do Moodle da disciplina. Observe o prazo de entrega.

4.4 AE4 - Comparação de Hardware projetado por FSMD e Dataflow

AE4 - Comparação de Hardware projetado por FSMD e Dataflow
Objetivos
  • Analisar o funcionamento de diferentes versões de FSMD para multiplicação de dois números.
  • Analisar o funcionamento de diferentes versões de algoritmos dataflow para multiplicação de dois números.
  • Fazer a simulação funcional de várias FSMDs e comparar com a implentação estruturada em fluxo de dados.
  • Analisar a influência do número de bits sobre o número de elementos lógicos, frequencia máxima e tempo total de cálculo.
  • O projeto será desenvolvido por equipes de até 2 estudantes.
  • Cada exipe deverá realizar a simulação com pelo menos duas multiplicações, uma com um fator baixo (< 5) e outra com ambos fatores > 10. As equipes devem informar de antemão os valores que irão utilizar, e não poderão usar valores iguais as demais equipes.
Atividades
  • PASSO 1 - Entender e testar os códigos das Listing (L11.1 ou L11.2 ou L11.3), L11.5, L11.6, L11.7 e L11.8 do livro do CHU.
Entre as L11.1, L11.2 e L11.3, escolha apenas uma delas para os testes. A L11.4 fica de fora pois conter erro.
  • Realize a Analyses e Synthesis, Fitter e Timing Analysis de cada versão
  • Obtenha os valores de frequência máxima (Fmax) e número de elementos lógicos (Nel) de cada versão
  • Efetue a simulação utilizando um clock de 1 ns com pelo menos duas multiplicações, uma com um fator baixo (< 5) e outra com ambos fatores > 10. Essa etapa ajuda a determinar o número de clocks
  • Meça o número de clocks (Nclk) necessário para realizar a operação, e calcule o tempo total (Tcal) para realizar a operação.
  • PASSO 2 - Análise da variação do número de bits
  • Altere o código do CHU para que funcione para um número genérico de bits.
Dica: Para gerar um vetor de N zeros, crie uma constante e utilize a constante no código.
constant zeros : std_logic_vector(N-1 downto 0) := (others => '0');
  • Repita o PASSO 1 variando o tamanho do multiplicador para 4, 8, 16, 32, 64 bits.
Nota: A simulação com 32 e 64 bits da (L11.1 ou L11.2 ou 11.3) ficará muito longa, e por isso não deve ser feita. Nestes casos estime o número de clocks a partir dos fatores multiplicadores.
  • Anote em uma tabela os valores Fmax, Nel, Nclk, Tcal para cada uma das versões e número de bits
  • Guarde a imagem do circuito RTL para 4 bits obtido em cada versão, incluindo o diagrama de estado da FSM se for o caso.
  • Ao efetuar a simulação use um fator alto que seja proporcional ao número de bits. Ou seja para 8 bits use um número maior que 128 = 2^(8-1).
  • PASSO 3 - Análise de um multiplicador direto
  • Escreva um código de um multiplicador que utilize diretamente a função de multiplicação
r <= a * b;
  • Também insira registradores nas duas entradas de dados e também na saída, de modo que fique semelhante ao destacado na figura em contorno vermelho.

Figura AE4.1 - RTL do multiplicador direto
Fonte: Elaborado pelo autor.
  • Faça toda a análise para 4, 8, 16, 32, 64 bits.
  • Anote em uma tabela os valores Fmax, Nel, Nclk, Tcal para cada número de bits
  • Guarde a imagem do circuito RTL para 4 bits obtido.
  • Ao efetuar a simulação use os mesmos fator utilizados no PASSO 2 para cada tamanho do multiplicador.
  • PASSO 4 - Análise de um multiplicador por somas sucessivas
  • Escreva um código de um multiplicador que efetue somas sucessivas para efetuar a multiplicação
	-- declare o sinal aux como um vetor de dados do tipo unsigned
	type uns_vector is array (0 to 2**W) of unsigned(2*W-1 downto 0);
	signal aux : uns_vector;

	-- utilize o vetor aux para guardar as sucessivas somas da entrada a_in
	-- utilize a entrada b_in para decidir qual dos somas correspode ao resultado.
	-- NOTA: este código é muito ineficiente, e está apenas sendo usado para comparar com os códigos desenvolvidos com a metodologia RT;
	aux(0) <= to_unsigned(0,2*W);
	l1: for k in 0 to 2**W-1 generate
		aux(k+1) <= aux(k) + resize(unsigned(a_in),2*W);
	end generate;
	r <= std_logic_vector(aux(to_integer(unsigned(b_in))));
  • Também insira registradores nas duas entradas de dados e também na saída, de modo que fique semelhante ao destacado na figura em contorno vermelho.

Figura AE4.2 - RTL do multiplicador por somas sucessivas
Fonte: Elaborado pelo autor.
  • Faça toda a análise para 4 e 8 bits apenas.
  • Anote em uma tabela os valores Fmax, Nel, Nclk, Tcal para cada número de bits
  • Guarde a imagem do circuito RTL para 4 bits obtido.
  • Ao efetuar a simulação use os mesmos fator utilizados no PASSO 2 para cada tamanho do multiplicador.
Entregas
  1. Envie um arquivo QAR contendo todos os arquivos necessário para compilar e simular o projeto. O QAR deve conter todos os arquivos .vhd e arquivos .do.
  2. Envie um relatório em PDF, incluindo as imagens capturadas (inclua um título para cada figura) e escreva para cada imagem um texto comentando o que representa. O relatório também deve ter a identificação (autor, título, data) uma breve introdução e uma conclusão. A descrição dos procedimentos feita na página wiki não precisa incluída no relatório. Dados numéricos devem ser apresentados na forma gráfica ou tabela, jamais como imagem capturada de tela.
  3. Faça uma extensa análise sobre o tempo de cálculo x áreas que o circuito ocupa no FPGA para as diferentes versões. Faça a análise para os diferentes tamnhos do barramento de entrada e saída.
  4. Sugira qual circuito utilizaria em diferentes situações e quais jamais utilizaria.
  5. Escreva uma boa conclusão sobre isso
  6. Use preferencialmente o Overleaf para gerar o relatório. Mas o uso de MS-Word, Libreoffice e Google Docs também é permitida.
  7. A entrega será feita através do Moodle da disciplina. Observe o prazo de entrega.


5 Referências Bibliográficas:

  1. 1,0 1,1 1,2 1,3 1,4 1,5 Erro de citação: Marca <ref> inválida; não foi fornecido texto para as refs chamadas PEDRONI2010b


Curso de Engenharia de Telecomunicações