Mudanças entre as edições de "DI2022802 2021 1 AULA16"
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
- O que significa CPLD, FPGA e VHDL?
- Quais as principais vantagens no uso do VHDL?
- Quais as etapas de um ciclo de projeto de sistemas em VHDL?
- Qual a diferença entre uma Entidade (entity) e uma Arquitetura (architecture)?
- O que são os Ports?
- Que tipo de pinos (ports) existem e onde são aplicados?
- O que é uma Descrição comportamental?
- O que é uma Descrição por fluxo de dados?
- O que é uma Descrição estrutural?
- Quais são as regras para a formação dos Identificadores?
- O que é uma constante?
- Qual a diferença de Sinais e de Variáveis?
- 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
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 |
---|
--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;
--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;
|