Mudanças entre as edições de "DLP29006-Engtelecom (Diário) - Prof. Marcos Moecke"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 1 945: Linha 1 945:
 
{{collapse bottom}}
 
{{collapse bottom}}
  
 +
<!--
 
===Unidade 5 - Código Sequencial===
 
===Unidade 5 - Código Sequencial===
 
* 5 ENCONTROS
 
* 5 ENCONTROS

Edição das 08h39min de 18 de agosto de 2022

Registro on-line das aulas

Unidade 1 - Introdução a disciplina

  • 4 ENCONTROS
Unidade 1 - Introdução a disciplina
Encontro 1 (18 ago.)
  • APRESENTAÇÃO DA DISCIPLINA
  • Os materiais, prazos, documentação, histórico de trabalhos anteriores estão publicados nesta wiki.
  • A PÁGINA DA DISCIPLINA contem os materiais que não alteram entre semestre.
  • Nesta página está o REGISTRO DIÁRIO E AVALIAÇÕES.
  • Para a realização e entrega das atividades será utilizada a plataforma Moodle.
  • Para a comunicação entre professor-aluno, além dos avisos no SIGAA, utilizaremos o chat institucional. É necessário que forneçam o seu email institucional para serem cadastrados.
  • Para participar das aulas é recomendado que o aluno acesse a Nuvem do IFSC ou instale a VM com softwares Quartus II e Modelsim.
  • 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.
  • Preços
  • Fabricantes de DLPs/FPGAs e familias de DLPs atuais.
  • Ver também:

|}


Encontro 37 (5 jul.)

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]
  • 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;
  • 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.

|}

Unidade 6 - Projeto a nível de Sistema

  • 5 Encontros
Unidade 6 - Projeto a nível de Sistema
Encontro 38 (7 jul.)
  • 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.
  • Ver outros exemplos
  • Exemplo: Registrador de deslocamento (variar o tamanho do registrador
  • Exemplo: Registrador Circular Ex. 8.2
  • Exemplo: Porta E com N entradas.
  • Exemplo: Detector de Paridade Ex. 8.3
  • Ver pag. 201 a 213 de [1]
Encontro 39 e 40 (12 e 14 jul.)
  • 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;
  • Uso da instrução CONFIGURATION.
  • Ligação direta: ARCHITECTURE-ENTITY.
  • Ligação da instanciação dos componentes: COMPONENT-ENTITY(ARCHITECTURE).


  • 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
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;
Encontro 41 e 42 (16 jul. Sábado)

Unidade 7 - Maquinas de Estado Finitas

Unidade 7 - Maquinas de Estado Finitas
  • 2 AULAS

ATUAL

Encontro 43 e 44 (18 e 19 jul.)
  • Introdução ao Projeto de Maquinas de Estado Finitas (FSM) em VHDL
  • 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 de FSM
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;
	-- 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 (clk'EVENT AND clk = '1') THEN
			pr_state <= nx_state;
		END IF;
	END PROCESS;
	------Logica Combinacional da FSM:------------
	PROCESS (pr_state, input)
	BEGIN
                ------Valores default das saidas------------
                output <= < value > ;
		CASE pr_state IS
			WHEN A =>
				output <= < value > ;   -- apenas se diferente do valor default
				IF (input =< value >) THEN
					nx_state <= B;
					...
				ELSE
					nx_state <= A;
				END IF;
			WHEN B =>
				output <= < value > ; -- apenas se diferente do valor default
				IF (input =< value >) THEN
					nx_state <= C;
					...
				ELSE
					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;
  • 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.
  • 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.


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

Avaliações

Nas avaliações A1 e A2 serão realizadas de forma presencial e 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.


Projeto Final (PF)

  • O projeto final é uma atividade de avaliação desenvolvida em equipe (ou individual), e consiste no desenvolvimento de um sistema que aplica os conhecimento adquiridos durante o semestre. A avaliação do projeto final corresponde a no mínimo 25% do peso no conceito final. São avaliados no projeto final os quesitos:
  1. Sistema desenvolvido (projeto, simulação e realização, demostração do harware);
  2. Relatório com a documentação completa do projeto;
  3. A avaliação individual do aluno durante o desenvolvimento do projeto e/ou entrevista (avaliação oral).
PF - Projeto Final - Sistema de transmissão serial assíncrono (Entrega e prazos ver Moodle)
  • Cada aluno (ou equipe de 2 alunos) deverá desenvolver um sistema de de transmissão serial assíncrono.
  • A descrição exata do funcionamento deve ser obtida com o cliente durante a entrevista de requisitos.



Figura 1 - Interface transmissora serial
APF DLP29006 2017 2 UART TX.png
Fonte: Elaborado pelo autor.

Figura 2 - Interface receptora serial
APF DLP29006 2017 2 UART RX.png
Fonte: Elaborado pelo autor.
  • A entrada DATA_IN deve ter apenas 8 bits e usar as chaves do kit como entrada de dados, e o valor deve ser mostrado em dois displays de sete segmentos em hexadecimal (0 a F)
  • A saída DATA_OUT deve ter apenas 8 bits usar os leds como saída de dados, e o valor também deve ser mostrado em dois displays de sete segmentos em hexadecimal (0 a F)
  • As taxa de transmissão deverão ser geradas a partir do clock principal CLK50MHz do kit a ser utilizado.
  • A seleção da taxa de transmissão será feita através das chaves SW_BAUD_TX[1..0] para o transmissor e das SW_BAUD_RX[1..0] para o receptor.
Por exemplo:
00 => 0.1 bps, 01 => 10 bps, 10 => 9600 bps, 11 => 100 kbps.
  • Na transmissão deverá ser enviado um bit paridade (par ou impar) de acordo com a chave seletora SW_PARITY.
0 => paridade par, 1 => paridade impar.
  • No receptor a saída RX_ERROR deve ser usada para indicar que houve erro na recepção do dado.
  • O sistema no seu TOP LEVEL deverá ser constituído de um Conversor Paralelo Serial, um Conversor Serial Paralelo, dois Geradores de Baud Rate, um Gerador de Paridade, um Detector de Paridade, um Circuito de Entrada de Dados, e um Circuito de Saída de Dados.
  • O projeto deve ser desenvolvido integrando estes componentes no TOP LEVEL, de modo que neste nível existam apenas conexões entre estes componentes. Recomenda-se utilizar também componentes para a criação dos circuitos no segundo nível. O reuso de componentes já desenvolvidos nas aulas é fortemente encorajado.
  • Durante a fase das simulações recomenda-se alterar o valor da frequência do CLK50MHz para um clock menor de modo a viabilizar uma simulação mais rápida. As simulações de cada componente do TOP LEVEL e da integração de todos componentes no TOP LEVEL devem ser feitas no MODELSIM.
  • O sistema deverá ser implementado, testado e demonstrado no kit de hardware FPGA DE2-115 usando as chaves e leds disponíveis e os pinos da GPIO para acionar circuitos externos. (opcional)
  • O arquivo QAR do projeto, e os arquivos .do do MODELSIM devem ser enviados antecipadamente para o professor para conferencia antes da implementação no kit de hardware.
  • Escreva um relatório técnico contendo os resultados em no máximo 10 paginas A4. O relatório além das tabelas com os dados de frequência máxima, número de componente, número de pinos, deverá conter a figura dos circuitos RTL da ENTITY top level com uma explicação do seu funcionamento. Também devem ser apresentadas as simulações funcionais e uma análise textual dos resultados obtidos. A descrição da função dos pinos no Kit DE2-115 também deve ser feita.

ATIVIDADE EXTRA-CLASSE (AE)

A soma das atividades Extra-classe será correspondente a 20% do conceito final na disciplina. A entrega das mesmas será feita pelo Moodle da disciplinas, 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.

AE1 - Palavras-cruzadas INTRODUÇÃO

AE1 - Palavras-cruzadas INTRODUÇÃO

AE2 - Conhecendo os dispositivos lógicos programáveis

AE2 - Conhecendo os dispositivos lógicos programáveis
Objetivos
  • Conhecer o Quartus II 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.
Atividade
  • Ao escolher a família de FPGAS, escolha inicialmente um dispositivo da família Cyclone 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)
  • PASSO 2: Repita a atividade descrita em Conhecendo os dispositivos lógicos programáveis, trocando a família e dispositivo a ser usado na implementação. Escolha nesta vez um dispositivos da família Cyclone IV E ou Stratix II GX. Anote o código desse dispositivo.
  • 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 e também a temporal 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 dois arquivos QAR contendo todos os arquivos necessário para compilar os dois projetos.
  2. Envie um relatório em PDF, incluindo as imagens capturadas (inclua legenda em 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.

AE3 - Programação do kit Mercurio IV

AE3 - Programação do kit Mercurio IV
Objetivos
  • Revisar o processo de programação do FPGA usando um kit de desenvolvimento
  • Fazer as adaptações necessárias para o circuito funcionar no kit
  • Verificar e corrigir o problema do repique (bouncing) da chave usada no CLK
Procedimento de laboratório
Passo 1
  • Escrever o código do projeto counter (já simulado em aula anterior), incluindo as adaptações necessárias para o uso dos LEDs da matriz de leds do kit Mercurio IV.
  • Fazer a análise e síntese e corrigir eventuais erros.
entity counter is
  generic (WIDTH : in natural := 4);
  port (
    RST   : in std_logic;
    CLK   : in std_logic;
    LOAD  : in std_logic;
    DATA  : in std_logic_vector(WIDTH-1 downto 0);
    R0	  : out std_logic
    Q     : out std_logic_vector(WIDTH-1 downto 0));
end entity;

architecture ifsc_v1 of counter is
	signal Q_aux : std_logic(WIDTH-1 downto 0);
begin
  process(RST,CLK) is
  begin
    if RST = '1' then
      Q_aux <= (others => '0');
    elsif rising_edge(CLK) then
      if LOAD= '1' then
        Q_aux <= DATA;
      else
        Q_aux <= std_logic_vector(unsigned(Q_aux) + 1);
      end if;
    end if;
  end process;
  -- Adaptacao feita devido a matriz de leds acender com ZERO
  Q <= not Q_aux;
  -- Para acender um led eh necessario colocar ZERO na linha correspondente da matriz.
  R0 <= '0';
end architecture;
Passo 2
  • Escolher o DEVICE: EP4CE30F23C7
  • Usar como pinos de entrada e saída do FPGA os seguintes:
CLK:     PIN_Y17 ou PIN_V21
DATA[3]: PIN_H18
DATA[2]: PIN_H20 
DATA[1]: PIN_K21 
DATA[0]: PIN_J21
LOAD:    PIN_Y22
Q[3]:    PIN_J6 
Q[2]:    PIN_K8 
Q[1]:    PIN_J8 
Q[0]:    PIN_L8 
RST:     PIN_W21
R0:      PIN_F10
Passo 3
  • Realizar os seguintes testes, acionando as chaves e observando o resultado nos LEDs:
  1. Carregar um valor nas chaves DATA[3..0], mudar LOAD para ALTO e acionar a chave CLK. Verificar e anotar o comportamento. Repetir com valores diferentes nas DATA[3..0].
  2. Mudar RST para ALTO, e verificar e anotar o comportamento.
  3. Manter LOAD em BAIXO e acionar a chave CLK várias vezes (no mínimo 16 vezes). Verificar e anotar o comportamento. O comportamento é o esperado para o número de mudanças da chave CLK?
Dica
  • Se desejar desligar a luz do LCD, basta fixar o pino LCD_BACKLIGHT (V10) - Controlador do backlight em '0'.
 -- insira na declaração das portas da entity a linha
 LCD_BACKLIGHT:	out std_logic;

 -- insira na architecture a linha
 LCD_BACKLIGHT <= '0';
  • Após fazer a Análise e Síntese, defina o pino v10 para essa porta.
LCD_BACKLIGHT: PIN_V10
Passo 4
  • Eliminar o repique da chave CLK, inserindo no código um circuito anti-repique, com um tempo de anti-repique de 10ms:
entity COUNTER_db is
...
    CLK50MHz : in std_logic;
...
end entity

architecture ifsc_v2 of COUNTER_db is
...
	signal CLK_db:	std_logic := '0';
...
begin
	-- debouncer de 10ms
	process (CLK50MHz, CLK, RST, CLK_db) is
		constant max_cnt: natural := 500000; -- 500000 10ms para clk 20ns
		variable cnt_db : integer range 0 to max_cnt-1;
	begin
			if (RST = '1') then
				cnt_db := 0;
				CLK_db <= '0';
			elsif ((CLK = '0') and (CLK_db = '0')) or 
			      ((CLK = '1') and (CLK_db = '1')) then
				cnt_db := 0;
			elsif (rising_edge(CLK50MHz)) then
				if (cnt_db = max_cnt - 1) then
					CLK_db <= not CLK_db;
				else
					cnt_db := cnt_db + 1;
				end if;
			end if;
 	end process;
...
-- Troque no process(RST,CLK) a entrada '''CLK''' do circuito anterior pela entrada '''CLK_db'''
  • Acrescentar o pinos de entrada CLK50MHz:
CLK50MHz:     PIN_T1
  • acrescente um arquivo para restringir a análise temporal (Timing Analysis) a 50MHz para a entrada de clock CLK50MHz
Restringir a frequencia máxima de clock no Quartus II
create_clock -name CLK50MHz -period 50MHz [get_ports -no_case {clk*}]
Passo 5
  • Repita os teste feitos no Passo 3, acionando as chaves e observando o resultado nos LEDs:
  1. Carregar um valor nas chaves DATA[3..0], mudar LOAD para ALTO e acionar a chave CLK. Verificar e anotar o comportamento. Repetir com valores diferentes nas DATA[3..0].
  2. Mudar RST para ALTO, e verificar e anotar o comportamento.
  3. Manter LOAD em BAIXO e acionar a chave CLK várias vezes (no mínimo 16 vezes). Verificar e anotar o comportamento. O comportamento é o esperado para o número de mudanças da chave CLK?
    1. Reduza o tempo do circuito anti-repique para 1us (microsegundo) max_cnt = 50, e verifique o funcionamento da chave CLK
Relatório Técnico
  • 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 do procedimento realizado;
  • resultados obtidos (com imagens dos itens importantes) e análise dos resultados;
  • conclusão.
  • apêndice (se desejar pode ser disponibilizados vídeos do funcionamento do circuito nos Passos 3 e 5
  • O relatório deve também responder as questões levantadas e mostrar que os objetivos apresentados na introdução foram atendidos.

AE4 - Conversor de binário para BCD

AE4 - Conversor de binário para BCD
Atividades

Neste laboratório remoto, os alunos deverão implementar uma ou mais soluções do para um circuito conversor de binário para BCD (bin2bcd) com entrada binária variando de 0 a 9999.

  • Baseado no exemplo do conversor de binário para BCD - Binary-coded decimal de dois dígitos decimais (00 a 99), mostrado em aula, projete um conversor para 4 dígitos (000 a 9999).
  • Escreva o código em VHDL, que dada uma entrada C (entre 0 e 9999), fornece nas saídas os dígitos da milhar (sm), centena (sc), dezena (sd) e unidade (su).

Figura AE6(a) - Exemplo de simulação funcional de 0 a 999
Bin2bcd SIM fucional.png
Fonte: Elaborado pelo autor.

Figura AE6(b) - Exemplo de simulação temporal de 0 a 999
Bin2bcd SIM temporal.png
Fonte: Elaborado pelo autor.
  • Anote a quantidade de elementos lógicos do circuito.

Figura AE6(c) - Exemplo de número de elementos (166)
Bin2bcd logic elements basico.png
Fonte: Elaborado pelo autor.

Figura AE6(d) - Exemplo de número de elementos (166)
Bin2bcd logic elements melhorado.png
Fonte: Elaborado pelo autor.
  • Anote o tempo máximo de propagação do circuito.

Figura AE6(e) - Exemplo de tempo máximo de propagação (60,588 ns)
Bin2bcd propagation delay.png
Fonte: Elaborado pelo autor.
  • Procure reduzir essa quantidade, aproveitando resultados intermediários e evitando a realização de uma nova divisão pelo uso do operador REM. O uso de configurações diferentes no compilador Quartus e escolha de qualquer família de FPGA e dispositivo é permitida. A única limitação é o uso do Quartus
  • Analise o tempo de propagação e área ocupada (número de elementos lógicos) e tente otimizar um ou os dois parâmetros. Se realizar diversas versões, pode anotar os valores de todas elas e fornecer todas as versões, mas foque no melhor desempenho.
  • O aluno pode apresentar dois projetos como resultado, sendo um para o menor tempo máximo de propagação e outro para menor área ocupada (número de elementos lógicos).
  • Faça uma simulação que mostre que o circuito projetado funciona.
  • O arquivo QAR entregue deve ser plenamente compilável e permitir após a Análise e Síntese e execução do arquivo de simulação VWF apresentar o resultado final.
  • Neste laboratório é necessário fornecer as imagens RTL e Technology Map usadas para obter e melhorar os circuitos, e a imagem da simulação que mostra que a versão entregue funciona.
  • Se desejar você pode incluir os arquivos com as imagens de simulação e RTL de comprovação na entrega.
Entregas
  1. Envie dois arquivos QAR contendo todos os arquivos necessário para compilar e simular os projetos .
  2. Poste no comentário da atividade: 1) O número de elementos lógicos de cada versão entregue. 2) O tempo máximo de propagação de cada versão entregue.
  3. A entrega será feita através do Moodle da disciplina.

  1. NÃO é necessário entregar um relato simples em PDF, mas pode ser feito se desejar.
  2. Caso faça o relato ele deve ter a identificação (autor, título, data), conter informações essenciais para mostrar que o circuito funciona e relatar os resultados obtidos para os parâmetros solicitados. Nesta caso aproveite para descrever como conseguiu reduzir o tempo de propagação e o número de elementos lógicos.
  3. Use preferencialmente o Overleaf para gerar o documento. Mas o uso de MS-Word, Libreoffice e Google Docs também é permitida.

Bônus
  • 0,5 pontos na avaliação A1 - O aluno que apresentar por primeiro a solução funcionando com comprovação por simulação.
  • 0,5 pontos na avaliação A1 - O aluno que apresentar a solução funcionando e fique em primeiro lugar no parâmetro menor área ocupada, com comprovação por simulação.
  • 0,5 pontos na avaliação A1 - O aluno que apresentar a solução funcionando e fique em primeiro lugar no parâmetro menor tempo máximo de propagação entre entradas e saída, com comprovação por simulação.
  • 0,1 pontos na avaliação A1 - O aluno que apresentar por segundo a solução funcionando com comprovação por simulação.
  • 0,1 pontos na avaliação A1 - O aluno que apresentar a solução funcionando e fique em segundo lugar no parâmetro menor área ocupada, com comprovação por simulação.
  • 0,1 pontos na avaliação A1 - O aluno que apresentar a solução funcionando e fique em segundo lugar no parâmetro menor tempo máximo de propagação entre entradas e saída, com comprovação por simulação.

AE5 - Calculadora básica implementada no kit DE2-115

AE5 - Calculadora básica implementada no kit DE2-115
Objetivos
InterfacesDE2-115.png
  • Estudar as limitações dos operadores aritméticos de (+, -, *, / e REM)
  • Desenvolver soluções para sinalizar erro, evitar erro ou aplicar saturação na saída
  • Analisar a área ocupado pelo circuito e também o máximo tempo de propagação
  • Programar o kit DE2-115 para atuar como calculadora básica de 4 operações
Procedimento de laboratório
Passo 1
  • Desenvolver uma calculadora de 4 operações com números sem sinal.
  • Defina para as entradas a e b um total de 4 bits
  • Usar as chaves deslizantes para as entradas a e b, e sinalizar nos led acima das chaves o estado das chaves.
  • Usar as chaves de contato momentâneo "PUSH BUTTON" para escolher a operação (+, -, *, /).
  • Usar os leds para mostrar os resultados da operação selecionada. No caso da divisão mostrar o quociente seguido do resto nestes leds.
  • Enviar dados das entradas e saída para os mostradores de sete segmentos.
  • Fazer a simulação funcional com Modelsim para se assegurar que a calculadora funciona. Planejar os testes a serem feitos antes, visando detectar tanto resultados corretos como possíveis erros.
Passo 2
ConectDE2-115-KEY0-3.png


Passo 3 - Circuito com overflow e erro
  • Realizar os seguintes testes, acionando as chaves e observando o resultado nos LEDs:
Carregar valores nas chaves de entrada e observar o resultado ao acionar os PUSH BUTTON.
De preferencia coloque valores que produzam erros de soma, subtração e divisão também. Use os mesmos valores da simulação.
Passo 4 - Circuito com sinalização de erro
  • Acrescente um circuito que trate os erros, indicando essa situação através de um bit de erro.
  • Realize novamente os testes de simulação com o circuito.
  • Realize novamente os testes na placa com o circuito.
Relatório Técnico
  • 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 do procedimento realizado;
  • resultados obtidos (com imagens dos itens importantes) e análise dos resultados;
  • conclusão.
  • apêndice (se desejar pode ser disponibilizados vídeos do funcionamento do circuito nos Passos 3 e 4
  • O relatório deve também responder as questões levantadas e mostrar que os objetivos apresentados na introdução foram atendidos.


AE6 - Laboratório de programação de FPGA - Timer 000 a 999 (versão 1)

AE6 - Laboratório de programação de FPGA - Timer 000 a 999 (versão 1)
Objetivos
  • Desenvolver sistemas utilizando blocos já desenvolvidos.
  • Apreender a conectar os circuitos através de sinais.
  • Perceber a necessidade de realizar projeto hierárquico.
  • Perceber o componente hardware real na definição final das entradas e saídas do sistema.
Procedimento de laboratório
Passo 1 - Projete um contador BCD de 000 a 999 configurável com saída em 3 mostradores de 7 segmentos (versão 1)
  • Utilize o contador BCD 00 a 99, a função bcd2ssd e o divisor de clock já desenvolvidas em aula como base.
  • O contador deve ser configurável para contar qualquer valor entre 001 até 999.
  • IMPORTANTE: É necessário incluir um RESET no circuito sequencial e também uma entrada de enable no contador.
entity Timer000_999seg is
        generic ( fclk : natural := 50000000); -- Valor usado para a implementação em kit com clock de 50MHz
        -- generic ( fclk : natural := 10); -- Valor usado para simulação com clock de 0.1 Hz (100 ms)
	port (
		clk50MHz : in std_logic;
                reset    : in std_logic;
                enable   : in std_logic;
		clk1seg  : out std_logic;
		SSD_Useg : out std_logic_vector(0 to 6);
		SSD_Dseg : out std_logic_vector(0 to 6);
		SSD_Cseg : out std_logic_vector(0 to 6) 
	);
end entity;
Passo 2 - Simule o contador BCD
  • Efetue a simulação funcional (Usando Modelsim/QSIM) fazendo a contagem de 000 a 999 e também de 000 a XYZ, onde XYZ é um valor qualquer.
  • Na simulação defina o clk50MHz como 100ms para produzir um clk1sec com duração de 1 segundo.
  • Também é necessário iniciar o circuito com um reset de 10 ps na simulação.
  • Veja um exemplo de um segmento de simulação na figura abaixo:

Simulação do contador ssd 00 a 99 no Modelsim

Passo 3 - Implemente o contador BCD no kit DE2-115
  • Após verificar que o circuito funciona "simulado", configurar o FPGA do kit DE2-115 para implementar este circuito.
  • Utilize os mostradores ssd HEX2, HEX1 e HEX0. Analise o tipo de mostrador que o kit possui catodo comum ou anodo comum (ler Display de 7 segmentos).
  • Se desejar pode também mostrar os valores bcd utilizando os leds.
  • As informações necessárias para configurar o dispositivo e seus pinos estão em Preparando para gravar o circuito lógico no FPGA.
Entregas
  • Projeto e simulação com Modelsim do sistema Timer000-999 com display de 7 segmentos e divisor de clock.
  • Relatório do projeto
  • Veja um exemplo de implementação no kit Mercúrio IV de um timer00_99:

AE7 - Laboratório de programação de FPGA - Timer 000 a 999 (versão 2)

AE7 - Laboratório de programação de FPGA - Timer 000 a 999 (versão 2)
Objetivos
  • Desenvolver sistemas utilizando componentes já desenvolvidos.
  • Apreender a instanciar componentes e conectá-los com sinais.
  • Realizar um projeto hierárquico.
Procedimento de laboratório
Passo 1 - Reprojete o contador BCD de 000 a 999 configurável com saída em 3 mostradores de 7 segmentos, usando os componentes
  • Divisor de clock (div_clock)
  • Contador BCD (ou contador binário + conversor bin2bcd) de 000 a 999 (count_bcd)
  • Conversor de BCD para SSD. (bcd2ssd)
  • Utilize a versão 1 do contador BCD 000 a 999 como base para esse projeto
  • Na entidade TOP LEVEL, devem ser instanciados os componentes div_clock, um count_bcd e 3 bcd2ssd, e inseridos os inversores necessários para adequar ao hardware do kit DE2-115.
Passo 2 - Simule o contador BCD
  • Repita as simulações da AE6.
Passo 3 - Implemente o contador BCD no kit DE2-115
  • Repita os passos da AE6.
Entregas
  • Projeto e simulação com Modelsim do sistema Timer000-999 com display de 7 segmentos e divisor de clock (versão 2).
  • Relatório do projeto
  1. 1,00 1,01 1,02 1,03 1,04 1,05 1,06 1,07 1,08 1,09 1,10 Erro de citação: Marca <ref> inválida; não foi fornecido texto para as refs chamadas PEDRONI2010b