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

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

Registro on-line das aulas

Unidade 1 - Introdução a disciplina

  • 6 ENCONTROS
Unidade 1 - Introdução a disciplina
Encontro 1 (8 fev.)
  • Introdução aos dispositivos lógicos programáveis:
  • Conceito, tipos de PLDs
  • SPLD: PAL, PLA e GAL
  • CPLDs
Exemplos de PLDs

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

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

Figura 1.3a - Architetura do PLD EP1800 da ALTERA
Ep1800 block diagram.jpg
Fonte: https://www.altera.com/solutions/technology/system-design/articles/_2013/in-the-beginning.html.

Figura 1.3b - Architetura do PLD EP1800 da ALTERA
Ep1800 block diagram2.jpg
Fonte: https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ds/archives/classic.pdf.

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

Figura 1.6 - Architetura do CPLD MAX 5000 da ALTERA
Max 5000 architecture.jpg
Fonte: https://www.altera.com/solutions/technology/system-design/articles/_2013/in-the-beginning.html.

Unidade 2 - Introdução ao VHDL e ambienta EDA - QUARTUS

  • 10 ENCONTROS
Unidade 2 - Introdução ao VHDL e ambienta EDA - QUARTUS

Unidade 3 - Tipos de Dados e Operadores em VHDL

  • 10 ENCONTROS
Unidade 3 - Tipos de Dados e Operadores em VHDL

Unidade 4 - Código Concorrente

  • 4 ENCONTROS
Unidade 4 - Código Concorrente

Unidade 5 - Código Sequencial

  • 5 ENCONTROS
Unidade 5 - Código Sequencial
Encontro 30 e 31 (10 e 11 mai.)
  • Código Sequencial.
  • 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;

--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;
  • 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;
  • Ver pag. 151 a 156 de [1]
-- 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;
  • Simulação funcional do DFFs e do Latch
  • Porta paralela com N DFFs.
  • Contador crescente 0-N (baseado no Ex.6.2), com N = 2^Mbits-1 (1 3 7 15)
  • Com overflow no valor máximo
Encontro 32 e 33 (16 e 17 mai.)
  • Contador crescente 0-N (baseado no Ex.6.2), com N =/= 2^Mbits (5, 10)
  • Com parada no valor máximo
  • Com overflow no valor máximo
  • Converter os contadores para modo decrescente 0-N
  • Com parada no valor mínimo
  • Com underflow no valor máximo
  • Contador bidirecional 0 a 5
contagem crescente ou decrescente controlado por uma entrada DIR. Se DIR = '1' a contagem é crescente se DIR = '0' a contagem é decrescente.

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:] CASE expressão IS
                  WHEN valor => atribuições;                            -- valor único
                  ...
                  WHEN valor1 | valor2 | ... | valorN  => atribuições;  -- lista de valores
                  ...
                  WHEN valor1 TO valor2    => atribuições;              -- faixa de valores
                  ...

          END CASE;
  • Exemplos:
  • Leading Zeros (LOOP com EXIT) (Ex 6.5) - Esse circuito deve determinar quantos zeros tem em um vetor de entrada Vin 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 _______;
  • Contador de zeros (FOR LOOP) - Esse circuito deve determinar quantos zeros tem em um vetor de entrada Vin.
  • Fazer a síntese do circuito; fazer simulação no Modelsim; analisar a forma como o compilador implementou o incrementador.
  • Ver pag. 161 a 164 de [1]
Encontro 34 (23 mai.)
  • Avaliação A1
Encontro 35 e 36 (24 e 25 mai.)
  • Carry-Ripple Adder (FOR-LOOP) (Ex 6.4) - apenas analisar.
  • Um somador do tipo carry ripple utiliza o bloco básico full adder para construir somadores de qualquer número de bits. Os bits carry são adicionados aos blocos posteriores, produzindo um hardware combinário.
  • O full adder é baseado nas funções.
onde é o carry out, é o carry in
entity carry_ripple_adder is
	generic (N : integer := 4);
	port (
		a, b : std_logic_vector (N-1 downto 0);
		cin  : std_logic
		s    : out std_logic_vector (N downto 0);
		cout : out std_logic;
	);
end entity;

architecture estrutural of carry_ripple_adder
begin
	-- Uso de um codigo sequencial para geracao de um circuito combinacional
	process (a, b, cin)
	variable c : std_logic_vector(N downto);
	begin
		c(0) := cin;
		for i in 0 to N - 1 loop
			-- Codigo de um full adder
			-- soma de dois bits e carry_in do full adder anterior
			s(i) <= a(i) xor b(i) xor c(i);
			-- geraao do carry_out para o proximo full adder
			c(i + 1) := (a(i) and b(i)) or (a(i) and c(i)) or (b(i) and c(i));
		end loop;
		cout <= c(N);
	end process;
end architecture;

Figura 5.1 - RTL do carry_ripple_adder de 3 bits
RTL carry ripple adder3.png
Fonte: Elaborado pelo autor.
  • 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, com entrada de clock, reset e saidas unidade(0 a 9) e dezena (0 a 9).
  • versão 1 - contagem crescente.

Figura 5.2 - RTL do contador BCD 00 a 99
RTL countBCD00-99.png
Fonte: Elaborado pelo autor.

Figura 5.3 - Simulação do contador BCD 00 a 99
MODELSIM countBCD00-99.png
Fonte: Elaborado pelo autor.
  • versão 2 - contagem decrescente.
  • versão 3 - contagem crescente ou decrescente controlado por uma entrada DIR. Se DIR = '0' a contagem é crescente se DIR = '1' a contagem é decrescente.

Figura 5.4 - RTL do contador bidirecional BCD 00 a 99
800 px
Fonte: Elaborado pelo autor.

Figura 5.5 - Simulação do contador bidirecional BCD 00 a 99
800 px
Fonte: Elaborado pelo autor.
  • versão 4 - contagem crescente de 0 a 59 ou de 0 a 23. Essa versão será usado no relógio.
Nota:
Antes de implementar a versão 3 verifique no RTL das versões 1 e 2 as diferenças, e pense nas possibilidades de reutilização do hardware. O que é comum entre elas e o que precisa ser acrescentado na versão 3.
Tente obter uma versão com o mínimo acréscimo em elementos lógicos.
  • Registrador de deslocamento (Ex.6.3)

Figura 5.6 - RTL do registrador de deslocamento (Ex.6.3)
RTL ShifRegRight.png
Fonte: Elaborado pelo autor.

Figura 5.7 - Technology Map do registrador de deslocamento (Ex.6.3)
TM ShifRegRight.png
Fonte: Elaborado pelo autor.
Versão 1 - Implementação com 4 FF D.
entity shift_reg4_right is
	port
	(
		din, clk, rst : in std_logic;
		dout          : out std_logic
	);
end entity;

architecture ifsc of shift_reg4_right is
begin
end architecture;
Versão 2 - Implementação com for generate da conexão de FF D.
entity shift_reg_right is
	generic (N : integer := 4);
	port
	(
		din, clk, rst : in std_logic;
		dout          : out std_logic
	);
end entity;

architecture ifsc of shift_reg_right is
begin

end architecture;
Versão 3 - Implementação com formação de agregado via concatenação.
entity shift_reg_right is
	generic (N : integer := 4);
	port
	(
		din, clk, rst : in std_logic;
		dout          : out std_logic
	);
end entity;

architecture ifsc of shift_reg_right is
begin
	process (clk, rst)
		variable q : std_logic_vector (N-1 downto 0);
	begin
		if (rst = '1') then
			q := (others => '0');
		elsif (clk'EVENT and clk = '1') then
			q := din & q (N-1 downto 1);
		end if;
		dout <= q(0);
	end process;
end architecture;
  • Simule o Registrador de Deslocamento visualizando os sinais internos para perceber o deslocamento.

Unidade 6 - Projeto a nível de Sistema

  • 5 Encontros
Unidade 6 - Projeto a nível de Sistema
Encontro 37 (30 mai.)
  • Projeto a nível de Sistema.
  • O PACKAGE e PACKAGE BODY: onde declarar e como usar.
  • O COMPONENT: declaração (cópia da ENTITY) e instanciação.

Assim a entity contador_bcd_00_99

entity  contador_bcd_00_99 is
  generic (max_dezena : natural := 5; max_unidade : natural := 9);
  port (
    clk, rst : in std_logic;
    bcd_dezena, bcd_unidade : out std_logic_vector(3 downto 0)
  );
end entity;

Será declarada como um COMPONENT

component  contador_bcd_00_99 is
  generic (max_dezena : natural := 5; max_unidade : natural := 9);
  port (
    clk, rst : in std_logic;
    bcd_dezena, bcd_unidade : out std_logic_vector(3 downto 0)
  );
end component;
  • Associação dos nomes das portas aos sinais. PORT -> PORT MAP:
  • Mapeamento por posição e nominal.
comp1 : contador_bcd_00_99
GENERIC MAP    (2, 3)		
PORT MAP       (clk,rst, bcd_dezena, bcd_unidade);
comp1 : contador_bcd_00_99
GENERIC MAP    ( max_dezena => 2, max_unidade => 3) 		
PORT MAP       ( clk => clk,
		 rst => rst,
		 bcd_dezena => bcd_dezena,
		 bcd_unidade => bcd_unidade);
  • Métodos de declaração de COMPONENT.
  • Criação de COMPONENT redimensionáveis. GENERIC -> GENERIC MAP
  • Exemplo: Porta NAND de 8 entradas e de 40 entradas, baseado em uma porta NAND genérica.

Figura 5.1 - RTL portas NAND genéricas
NAND8&NAND40.png
Fonte: Elaborado pelo autor.
  • Refazer o projeto do contador_ssd_00_99 usando componentes.

Figura 5.2 - RTL do contador_ssd_00_99 usando componentes
Contador ssd 00 99 TL.png
Fonte: Elaborado pelo autor.
Encontro 38 (31 mai.)
  • AE4 - Laboratório de programação de FPGA - Relogio HHMMSS


Encontro 39 e 40 (6 e 7 jun.)
  • Instanciação de COMPONENT com GENERATE.
gen: for i in 0 to 7 generate
   comp: flip_flop port map (clk, rst, d(i), q(i));
end generate;
  • FUNCTION e PROCEDURE (são chamados de subprogramas), e podem ser construídos em um PACKAGE, ENTITY, ARCHITECTURE, ou PROCESS.

A instrução ASSERT é útil para verificar as entradas de um subprograma. Seu propósito não é criar circuito, mas assegurar que certos requisitos são atendidos durante a síntese e/ou simulação. Pode ser condicional ou incondicional (condição_booleana = FALSE). A sintaxe da instrução é:

[rótulo:] assert condição_booleana
[report mensagem]
[severity nivel_severidade];

A mensagem pode ser criada usando STRINGs que podem ser concatenadas.

O nível de severidade pode ser NOTE (para passar informação para o compilador/simulator), WARNING (para informar que algo não usual ocorreu), ERROR (para informar que alguma condição não usual "sério" ocorreu), ou FAILURE (para informar que uma condição não aceitável ocorreu). Normalmente o compilador para quando ocorre um ERROR ou FAILURE. ERROR é o valor "default" [1].

  • A FUNCTION: declaração, uso, mapeamento posicional x nominal, PURE x IMPURE.
function nome_funçao (lista_parametros_entrada) return tipo_saida is
   declarações
begin
   afirmações sequenciais
   return value; 
end function;
  • A PROCEDURE: declaração e uso
procedure nome_procedimento (lista_parâmetros_entrada, lista_parâmetros_saída) is
   declarações
begin
   afirmações sequenciais
end procedure;
Exemplos de uso ASSERT, FUNCTION e PROCEDURE
  • Exemplo: Cálculo do log2 de um número inteiro. Pode ser usado para determinar o número de bits necessário para um número natural.
function log2c (n : integer) return integer is
	variable m , p : integer;
begin
	m := 0;
	p : = 1;
	while p < n loop
		m : = m + 1;
		p := p * 2;
	end loop;
	return m;
end log2c;
  • Exemplo: Declaração de FUNCTION em ARCHITECTURE Ex.9.1
  • Aplicação no projeto do timer0_9
  • Exemplo: Declaração em FUNCTION PACKAGE Ex. 9.2
-- FILE: comparator.vhd
-- Fonte: PEDRONI, Volnei A. Circuit Design and Simulation with VHDL; 2 ed. Massachusetts-EUA:MIT, 2010.

library ieee;
use ieee.numeric_std.all;
use work.my_package.all;
entity organizer is
	generic (size : natural := 3);
	port
	(
		x  : in UNSIGNED(2 to 5);
		y  : out UNSIGNED(size - 1 downto 0)
	);
end entity;
architecture organizer of organizer is
begin
	y <= order_and_fill(x, size);
end architecture;
-- FILE: my_pkg.vhd
-- Fonte: PEDRONI, Volnei A. Circuit Design and Simulation with VHDL; 2 ed. Massachusetts-EUA:MIT, 2010. 608 p. ISBN 9780262014335

library ieee;
use ieee.numeric_std.all;
package my_package is
	function order_and_fill (input : UNSIGNED; bits : natural) return UNSIGNED;
end package;

package body my_package is
	function order_and_fill (input : UNSIGNED; bits : natural) return UNSIGNED is
		variable a : UNSIGNED(input'LENGTH - 1 downto 0);
		variable result : UNSIGNED(bits - 1 downto 0);
	begin
		assert (input'LENGTH <= bits)
			report "Improper input size!"
			severity FAILURE;
		if (input'LEFT > input'RIGHT) then
			a := input;
		else
			for i in a'range loop
				a(i) := input(input'LEFT + i);
			end loop;
		end if;
		if (a'LENGTH < bits) then
			result(bits - 1 downto a'LENGTH) := (others => '0');
			result(a'LENGTH - 1 downto 0) := a;
		else
			result := a;
		end if; 
		return result;
	end function;
end package body;
  • Exemplo: min_max Ex.9.4

Figura 6.1 - Fluxograma da PROCEDURE min_max
FluxogramMinMax.png
Fonte: pag. 232 de [1].
-- FILE: comparator.vhd
-- Fonte: PEDRONI, Volnei A. Circuit Design and Simulation with VHDL; 2 ed. Massachusetts-EUA:MIT, 2010.

use work.my_package.all;

entity comparator is
	port
	(
		a, b, c   : in integer range 0 to 255;
		min, max  : out integer range 0 to 255
	);
end entity;

architecture comparator of comparator is
begin
	min_max(a, b, c, min, max);
end architecture;
-- FILE: my_pkg.vhd
-- Fonte: PEDRONI, Volnei A. Circuit Design and Simulation with VHDL; 2 ed. Massachusetts-EUA:MIT, 2010.


package my_package is
	procedure min_max (
		signal a, b, c : in integer;
		signal min, max : out integer
	);
end package;
package body my_package is
	procedure min_max (
		signal a, b, c : in integer range 0 to 255;
		signal min, max : out integer range 0 to 255) is
	begin
		if (a >= b) then
			if (a >= c) then
				max <= a;
				if (b >= c) then
					min <= c;
				else
					min <= b;
				end if;
			else
				max <= c;
				min <= b;
			end if;
		else
			if (b >= c) then
				max <= b;
				if (a >= c) then
					min <= c;
				else min <= a;
				end if;
			else
				max <= c;
				min <= a;
			end if;
		end if;
	end procedure;
end package body;

Unidade 7 - Maquinas de Estado Finitas

  • 2 AULAS
Unidade 7 - Maquinas de Estado Finitas
Encontro 40 (7 jun.)
  • O que é uma FSM - Finite State Machine

Figura 7.1 - Exemplo de diagrama de estados de uma FSM Fig11.1(a) e implementação em hardware da FSM Fig11.2(a)
Fig11 1 FSM.png
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 <= C;
			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;
  • 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
rst -> A -(x=0)-> A -(x=1)-> A -(x=2)-> B -(x=2)-> B -(x=0)-> C -(x=0)-> C -(x=2)-> C -(x=1)-> A -(x=2)-> B -(x=1)-> A.
Ver pag. 277 a 280 de [1]
Ver Quartus II Handbook Version 13.1: Manually Specifying Enumerated Types Using the enum_encoding Attribute, pag 16-37 sobre a atribuição manual do enum_encoding.
Note que o uso desse atributo faz com que o compilar do Quartus não reconheça a FSM, mas use logica regular para representar o sistema.
Ver Quartus II Handbook Version 13.1: Safe State Machines, pag 16-38.
Encontro 41 (13 jun.)
  • Introdução ao Projeto de Maquinas de Estado Finitas (FSM) em VHDL
  • Máquina de vender doces
  • Use o template da FSM para modelar o sistema mostrado na figurar a seguir.

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

Figura 7.3 - FSM - Máquina de vender doces (diagrama de estados com default
FSM MVD default.png
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 vender doces (simulação)
FSM tb40.png
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.
  • O problema de oscilando entre os estados em FSM.

Figura 7.5 - FSM - alarme (oscilando entre os estados quando remoto é 1)
Alarme erro.png
Fonte: Adaptado de Figura 11.9(a) de [1].
  • Solução através do uso de FLAG

Figura 7.6 - FSM - alarme (solução com flag)
Alarme flag.png
Fonte: Adaptado de Figura 11.9(b) de [1].
  • Solução através do uso de estados de WAIT adicionais.

Figura 7.7 - FSM - alarme (solução com estados de WAIT)
Alarme wait.png
Fonte: Adaptado de Figura 11.9(c) de [1].

Figura 7.8 - Simulação da FSM - alarme (solução com estados de WAIT)
Simulation alarme wait.png
Fonte: Elaborado pelo autor.
Ver pag. 292 a 297 de [1]
  • Exercício: Faça o download do arquivo simple_car_alarm.qar, disponível no Moodle da disciplina e realize as seguintes avaliações:
  1. Perceba que existem 4 versões para o mesmo Alarme de Carro. Realize a simulação no ModelSim das 4 versões e perceba qual é a diferença de funcionamento desses circuitos.
  2. Anote o número de elementos em cada versão.
  3. Qual versão é a mais adequada na sua opinião?
  4. Modifique a sua escolha para que o alarme não possa ser ativado se o "sensor" estiver em "1".
  5. Analise o arquivo tb_vX.do e modifique-o para testar também essa nova condição. A simulação deve obrigatoriamente fazer o sistema passar por todos os estados e todas as transições.
  6. Implemente a nova versão como uma nova arquitetura "fsm_v5", e escrever o arquivo de simulação "tbv5.do".
  7. Salve as telas da simulação ("v5_sim.png"), tela da fsm ("v5_fsm.png"), tela do RTL ("v5_rtl.png").
  8. Acrescente os novos arquivos no projeto e salve o novo .qar
Encontro 42 (14 jun.)
  • Projeto de FSM temporizadas (nas quais as transições são ativadas também pelo tempo).

Figura 7.9 - Tipos de FSM (Condicional, Temporizada e Hibrida)
FSM type.png
Fonte: Figura 11.12 de [1].
  • Modelo de FSM temporizada
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
----------------------------------------------------------
ENTITY < entity_name > IS
PORT (
	clk, rst : IN STD_LOGIC;
	input : IN < data_type > ;
	output : OUT < data_type >);
END entity;
----------------------------------------------------------
ARCHITECTURE < architecture_name > OF < entity_name > IS
	TYPE state IS (A, B, C, ...);
	SIGNAL pr_state, nx_state : state;
        signal timer: integer range 0 to MAX;
--	ATTRIBUTE ENUM_ENCODING : STRING; --optional attribute
--	ATTRIBUTE ENUM_ENCODING OF state : TYPE IS "sequential";
BEGIN
	------Logica Sequencial da FSM:------------
	PROCESS (clk, rst)
		variable count: integer range o to MAX;
	BEGIN
		IF (rst = '1') THEN
			pr_state <= A;
			count := 0;
		ELSIF (clk'EVENT AND clk = '1') THEN
			count := count + 1;
			if (count >= timer) then
				pr_state <= nx_state;
				count := 0;
			end if;
		END IF;
	END PROCESS;
	------Logica Combinacional da FSM:------------
	PROCESS (pr_state, input)
	BEGIN
                ------Valores default das saidas------------
                output <= < value >;
                ------Valores default do timer------------
		timer <= <value>;
		CASE pr_state IS
			WHEN A =>
				output <= < value > ;   -- apenas se diferente do valor default
				IF (input =< value >) THEN
					timer <= <value>;  -- apenas se diferente do valor default
					nx_state <= B;
					...
				ELSE
					timer <= <value>; -- apenas se diferente do valor default
					nx_state <= A;
				END IF;
			WHEN B =>
				output <= < value > ; -- apenas se diferente do valor default
				IF (input =< value >) THEN
					timer <= <value>;  -- apenas se diferente do valor default
					nx_state <= C;
					...
				ELSE
					timer <= <value>;  -- apenas se diferente do valor default
					nx_state <= B;
				END IF;
			WHEN ...
		END CASE;
	END PROCESS;
	------Seção de Saída (opcional):-------
	PROCESS (clk, rst)
	BEGIN
		IF (rst = '1') THEN
			new_output <= < value > ;
		ELSIF (clk'EVENT AND clk = '1') THEN --or clk='0'
			new_output <= output;
		END IF;
	END PROCESS;
END architecture;
Ver pag. 298 a 301 de [1]
Exemplo de FSM temporizada - semáforo temporizado
  • Usando o template acima descreva em VHDL a FSM de um controlador de semáforo Regular indicado pela FSM da figura abaixo:

Figura 7.10 - Diagrama de estados do controlador de semáforo
Semaforo FSM v2.png
Fonte: Elaborado pelo autor.

Figura 7.11 - Simulação do controlador de semáforo no Modelsim
Semaforo FSM v2 ModelSim.png
Fonte: Elaborado pelo autor.


Exercício - Semaforo
  • Usando o template acima descreva em VHDL a FSM de um controlador de semáforo Regular da Figura 11.15 (pag. 304 de [1]).

Figura 7.12 - Diagrama de estados do controlador de semáforo
Semaforo FSM VD.png
Fonte: Adaptado de Figura 11.15 de [1].

Figura 7.13 - Diagrama de estados do Quartus do controlador de semáforo
Semaforo FSM.png
Fonte: Elaborado pelo autor.
  • Para definir as temporizações utilize GENERICs que permitam instanciar diferentes semáforos em um projeto de controle de tráfego de uma avenida.
Para uma instância do semáforo S1 use (timeRY = 2 segundos; timeGR = 40 segundos; timeYR = 2 segundos; timeRG = 15 segundos.
Para uma instância do semáforo S2 use (timeRY = 5 segundos; timeGR = 90 segundos; timeYR = 5 segundos; timeRG = 30 segundos.
  • Considere que o sinal de clock tem período de 1 segundo.

Unidade 8 - Testbench

  • 2 ENCONTROS
Unidade 8 - Testbench

Avaliações

Nas avaliações A1 e A2 vocês poderão consultar apenas as folhas entregues:

Dica use também como fonte de consulta os templates do Quartus.
Ao final das avaliações o aluno deverá enviar a avaliação para a plataforma Moodle com os arquivos solicitados.
Data das avaliações
  • A1 - Unidade 1 a Unidade 4: dia XX/XX
  • A2 - Unidade 5 a Unidade 7: dia XX/XX
  • PF - Entrega do projeto final: dia 15/12
  • R12 - Recuperação de A1 e A2 : dia 12/12


Atividade relâmpago (AR)

As atividades relâmpago devem ser entregues no Moodle da disciplina. Elas geram BÔNUS que são adicionados aos conceitos das avaliações A1 e A2.


Atividade extra-classe (AE)

A soma das atividades Extra-classe será correspondente a 30% do conceito final na disciplina. 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 possuem BÔNUS que são adicionados aos conceitos das avaliações A1 e A2. Para os BÔNUS só serão considerados projetos entregues no prazo.


  1. 1,00 1,01 1,02 1,03 1,04 1,05 1,06 1,07 1,08 1,09 1,10 1,11 1,12 1,13 1,14 Erro de citação: Marca <ref> inválida; não foi fornecido texto para as refs chamadas PEDRONI2010b