Introdução ao VHDL
João M. P. Cardoso
Um Contador de 0 a 7
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
architecture Behavioral of count is
signal cnt1 : std_logic_vector(2
downto 0);
begin
process(clk, reset)
begin
if reset = '1' then
entity count is
cnt1 <= (others => '0');
Port ( clk : in std_logic;
elsifclk'event AND clk = '1' then
reset : in std_logic;
cnt1 <= cnt1 + 1;
cnt : out std_logic_vector(2 downto
0));
end if;
end count;
end process;
cnt <= cnt1;
end Behavioral;
Simulação

Descrição em VHDL de uma bancada de
teste




Instância o componente
Define o valor dos sinais
Só serve para simulação!
Criação de um ficheiro do tipo Test Bench
Waveform

Permite a atribuição de valores aos sinais
utilizando uma interface gráfica
Bancada de Teste
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY testbench IS
END testbench;
ARCHITECTURE behavior OF testbench IS
COMPONENT count
PORT(
clk : IN std_logic;
reset : IN std_logic;
cnt : OUT std_logic_vector(2 downto 0)
);
END COMPONENT;
SIGNAL clk : std_logic;
SIGNAL reset : std_logic;
SIGNAL cnt : std_logic_vector(2 downto 0);
SIGNAL clock : std_logic := '0'; -- for simulation
BEGIN
uut: count PORT MAP(
clk => clk,
reset => reset,
cnt => cnt
);
clock <= not clock after 10 ns; -- T = 20ns
clk <= clock;
-- *** Test Bench - User Defined Section ***
tb : PROCESS
BEGIN
reset <= '1';
wait for 20 ns;
reset <= '0';
wait for 200 ns;
--wait; -- will wait forever
END PROCESS;
-- *** End Test Bench - User Defined Section ***
END;
ModelSim XE II/Starter 5.7c

Janela de ondas do simulador
Descodificador de Sete
Segmentos
architecture Behavioral of seven_seg is
begin
process(inp_data)
begin
case inp_data is
when "0000" =>
out_data <= "10000001";
when "0001" =>
out_data <= "11001111";
entity seven_seg is
when "0010" =>
Port ( inp_data : in std_logic_vector(3 downto 0);
out_data <= "10010010";
out_data : out std_logic_vector(7 downto 0));
when "0011" =>
end seven_seg;
out_data <= "10000110";
when "0100" =>
out_data <= "11001100";
c0
when
"0101"
=>
c1
c5
out_data <= "10100100";
c6
when "0110" =>
c4
c2
out_data <= "10100001";
when "0111" =>
c3
out_data <= "10001111";
c0 c1 c2 c3 c4 c5 c6
when "1000" =>
out_data <= "10000000";
when
"1001"
=>
Descodificador de
out_data <= "10000100";
BCD para 7–
when
others
=>
segmentos
out_data <= "11111111";
end case;
A B C D
end process;
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
Exemplo: Máquina de Bebidas



Disponibiliza a lata depois de 150 ou mais
escudos terem sido depositados
Uma única abertura para moedas (50$00 e
Reset
100$00)
Não dá troco
CEM
Sensor
de
Moedas
CINQ
FSM
da máquina
de
bebidas
Clock
Abre
Mecanismo
de
Libertar Lata
Exemplo: Máquina de Bebidas

Tabela e Diagrama de Estados
Estado
Actual
0$
Reset
0$
50$
CINQ
50$
CEM
100$
CINQ
CEM
100$
CEM + CINQ
150$
[open]
150$
Entrada
CEM CINQ
0
0
0
1
1
0
1
1
0
0
0
1
1
0
1
1
0
0
0
1
1
0
1
1
–
–
Próx.
Estado
0$
50$
100$
–
50$
100$
150$
–
100$
150$
150$
–
150$
Tabela de estados Simbólica
Saída
open
0
0
0
–
0
0
0
–
0
0
0
–
1
Exemplo: Máquina de Bebidas
fsm1: process(current_state, CEM, CINQ)
begin
case current_state is
when zero =>
s_open <= '0';
if CINQ = '1' then next_state <= cinquenta;
entity fsm is
else next_state <= zero; end if;
Port ( clk : in std_logic;
when cinquenta =>
reset : in std_logic;
s_open <= '0';
CEM : in std_logic;
if CINQ = '1' then next_state <= st_cem;
CINQ : in std_logic;
elsif CEM = '1' then next_state <= cent_cinq;
s_open : out std_logic);
else next_state <= cinquenta; end if;
end fsm;
when st_cem =>
s_open <= '0';
architecture Behavioral of fsm is
if CINQ = '1' OR CEM = '1' then next_state <= cent_cinq;
type state_type is (zero, cinquenta, st_cem,
cent_cinq);
else next_state <= st_cem; end if;
signal current_state, next_state: state_type;
when cent_cinq =>
begin
s_open <= '1';
fsm2: process(reset, clk)
next_state <= zero;
begin
when others =>
if reset = '1' then
s_open <= '0';
current_state <= zero;
next_state <= zero;
elsif clk'event AND clk='1' then
end case;
current_state <= next_state;
end process;
end if;
end
Behavioral;
end process;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
Exemplo: Máquina de Bebidas


Quantos Flip-Flops existem no hardware
sintetizado?
Modificar as directivas de síntese para utilizar
o menor número de FFs possível

4 estados => 2 FFs
Download

Alguns Exemplos de VHDL