DI2022802 2021 1 AULA16

De MediaWiki do Campus São José
Revisão de 13h05min de 6 de setembro de 2021 por Douglas (discussão | contribs) (→‎Parte 1 - VHDL)
Ir para navegação Ir para pesquisar

Lista de Exercícios para AT2

Parte 1 - VHDL

  1. O que significa CPLD, FPGA e VHDL?
  2. Quais as principais vantagens no uso do VHDL?
  3. Quais as etapas de um ciclo de projeto de sistemas em VHDL?
  4. Qual a diferença entre uma Entidade (entity) e uma Arquitetura (architecture)?
  5. O que são os Ports?
  6. Que tipo de pinos (ports) existem e onde são aplicados?
  7. O que é uma Descrição comportamental?
  8. O que é uma Descrição por fluxo de dados?
  9. O que é uma Descrição estrutural?
  10. Quais são as regras para a formação dos Identificadores?
  11. O que é uma constante?
  12. Qual a diferença de Sinais e de Variáveis?
  13. Quais os tipos de dados disponíveis em VHDL?
  14. Projetar e simular:
    1. Biestável tipo JK com clock e borda de subida, com descrição comportamental.
    2. Idem, com Preset e Clear assíncronos
  15. Realizar o projeto de um contador síncrono, com uma sequência pré-definida em VHDL e simular.
  16. Comentar os exemplos:
Exemplo 1
 
library ieee;
use ieee.std_logic_1164.all;

entity FF_D is
	port
	(
		D	: in  std_logic;
		clk	: in  std_logic;
		Q	: out std_logic
	);
end FF_D;

architecture Ex1 of FF_D is
begin
-- Update the register output on the clock's rising edge
process (clk)
begin
	if (rising_edge(clk)) then
		Q <= D;
	end if;
end process;
end Ex1;
Exemplo 2
 
library ieee;
use ieee.std_logic_1164.all;
 
ENTITY ff_jk is
    port(j,k,clk: in bit;
         q: out bit);
END ff_jk;
 
ARCHITECTURE teste of ff_jk is
BEGIN

process(clk)
variable temp : bit :='0';
begin
	if( falling_edge(clk) ) then
		if (j='1' and k='0') then
			temp:='1';
		elsif (j='0' and k='1') then
			temp:='0';
		elsif (j='1' and k='1') then
			temp:= not temp;
		else
			temp:=temp;
		end if;
		q<=temp;
	end if;
end process;
END teste;
Exemplo 3
 
library ieee;
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all;

entity CONTADOR is
port(
	CLK:	in  std_logic;
    	RESET:	in  std_logic;
	ENABLE:	in  std_logic;
	Q:	out std_logic_vector (3 downto 0)
);
end CONTADOR;

architecture CONTADOR_arq of CONTADOR is 
begin
	process(CLK,RESET)
		variable X: integer range 0 to 15;
	begin
		if (RESET = '1') then
			X := 0;

		elsif (CLK'event and CLK='1') then
			if (ENABLE = '1') then
				X := X + 1;
			end if;
		end if;

		Q <= conv_std_logic_vector(X, 4);

	end process;
end CONTADOR_arq;
Outros Exemplos
Exemplo 4: VIGIA
--1 - VIGIA
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY Vigia IS
PORT( clk : IN STD_LOGIC;
      SensorA, SensorB : IN STD_LOGIC;
      Multa_Vel, Multa_Comp : OUT STD_LOGIC);
END Vigia;

ARCHITECTURE Intuitiva OF Vigia IS
    TYPE STATE_TYPE IS (Espera,
        Verificando_Velocidade,
        Verificando_Tamanho,
        Multa_Velocidade,
        Multa_Tamanho, 
    Erro);
    SIGNAL Estado: STATE_TYPE;
    SIGNAL Cronometro: INTEGER RANGE 0 to 31;

BEGIN
    PROCESS (clk)
    BEGIN
        IF clk'EVENT AND clk = '1' THEN
            Multa_Vel <= '0';
            Multa_Comp <= '0';
            CASE Estado IS
                WHEN Espera =>
                    IF SensorA = '1' THEN
                        IF SensorB = '0' THEN
                            Estado <= Verificando_Velocidade;
                        ELSE
                            Estado <= Erro;
                        END IF;
                    END IF;
                WHEN Verificando_Velocidade =>
                    IF SensorA = '1' THEN
                        IF SensorB = '0' THEN
                            Cronometro <= Cronometro + 1;
                        ELSE
                            IF Cronometro < 8 OR Cronometro > 24 THEN
                                Estado <= Multa_Velocidade;
                            ELSE
                                Estado <= Verificando_Tamanho;
                            END IF;
                        END IF;
                    ELSE
                        IF SensorB = '0' THEN
                            Estado <= Espera;
                            Cronometro <= 0;
                        ELSE
                            Estado <= Erro;
                        END IF;
                    END IF;
                WHEN Verificando_Tamanho =>
                    IF SensorA = '1' THEN
                        IF SensorB = '1' THEN
                            Cronometro <= Cronometro -1;
                            IF Cronometro = 0 THEN
                                Estado <= Multa_Tamanho;
                            END IF;
                        ELSE
                            Estado <= Erro;
                        END IF;
                    ELSE
                        Estado <= Espera;
                        Cronometro <= 0;
                    END IF;
                WHEN Multa_Velocidade =>
                    Multa_Vel <= '1';
                WHEN Multa_Tamanho =>
                    Multa_Comp <= '1';
                WHEN Erro =>
                    Multa_Vel <= '1';
                Multa_Comp <= '1';
            END CASE;
        END IF;
END PROCESS;
END Intuitiva;
Exemplo 5: RECEPTOR
--2 – RECEPTOR
-- Receptor serial
entity Receptor is
    port( data_in, clock, limpa: in bit;
          pronto, ocupado: out bit;
          data_out: buffer bit_vector(7 downto 0));
end Receptor

architecture Receptor of Receptor is
    TYPE STATE_TYPE IS ( Espera,
                         Start_bit,
                         Recebendo,
                         Pronto);
    SIGNAL Estado: STATE_TYPE;
    SIGNAL Cronometro: INTEGER RANGE 0 to 7;
    SIGNAL Conta_bits: INTEGER RANGE 0 to 7;
process
begin
    if clock'event and clock = '1' then
    CASE Estado IS
        WHEN Espera =>
            IF Data_in = '0'then
                Cronometro <= 0;
                Ocupado <= '1';
                Estado <= Start_bit;
            ELSE
                Ocupado <= '0';
            END IF;
        WHEN Start_bit =>
            IF Cronometro < 4 then
                Cronometro = Cronometro+1;
            ELSE
                Cronômetro = 0;
                Conta_bits =0;
                Estado <= Recebendo;
            END IF;
        WHEN Recebendo =>
            IF Conta_bits < 6 then
                IF Cronometro < 3 then
                    Cronometro = Cronometro+1;
                ELSE
                    Cronômetro = 0;
                    Conta_bits = Conta_bits+1;
                    Data_out(0)<= Data_out(1);
                    Data_out(1)<= Data_out(2);
                    Data_out(2)<= Data_out(3);
                    Data_out(3)<= Data_out(4);
                    Data_out(4)<= Data_out(5);
                    Data_out(5)<= Data_out(6);
                    Data_out(6)<= Data_out(7);
                    Data_out(7)<= Data_in;
                END IF;
            ELSE
                Estado <= Pronto;
                Pronto <= '1';
            END IF;
        WHEN Pronto =>
            IF Limpa = 0 Then
                Ocupado <= '0';
                Pronto <= '0';
                Estado <= Espera;
            END IF;
    END CASE;
    END IF;
end process;
end Receptor;



Icone voltar.png Icone menu.png Icone prox.png