Mudanças entre as edições de "DI2022802 2021 1 AULA16"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 16: Linha 16:
 
#Qual a diferença de Sinais e de Variáveis?
 
#Qual a diferença de Sinais e de Variáveis?
 
#Quais os tipos de dados disponíveis em VHDL?
 
#Quais os tipos de dados disponíveis em VHDL?
 +
#Projetar e simular:
 +
##Biestável tipo JK com ''clock'' e borda de subida, com descrição comportamental.
 +
##Idem, com ''Preset'' e ''Clear'' assíncronos
 +
#Realizar o projeto de um contador síncrono, com uma sequência pré-definida em VHDL e simular.
 +
#Comentar os exemplos:
 +
;Exemplo 1
 +
<syntaxhighlight lang=vhdl>
 +
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;
 +
 +
</syntaxhighlight>
 +
;Exemplo 2
 +
<syntaxhighlight lang=vhdl>
 +
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;
 +
 +
</syntaxhighlight>
 +
;Exemplo 3
 +
<syntaxhighlight lang=vhdl>
 +
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;
 +
 +
</syntaxhighlight>
 +
 +
{{collapse top|Outros Exemplos}}
 +
 +
::Exemplo 4: VIGIA
 +
<syntaxhighlight lang=vhdl>
 +
--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;
 +
</syntaxhighlight>
 +
::Exemplo 5: RECEPTOR
 +
<syntaxhighlight lang=vhdl>
 +
--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;
 +
</syntaxhighlight>
 +
 +
{{collapse bottom}}
  
  

Edição das 13h05min de 6 de setembro de 2021

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