Escolar Documentos
Profissional Documentos
Cultura Documentos
Sistemas Digitais I
Pergunta fundamental:
Como criar um elemento de memória?!
entradas saídas
circuito
combinatório próximo Elementos
estado de memória estado
atual
3
Elementos de Memória
0 1
0
1
4
Latch RS
S Q
1 0 1
1 1 Qt Estado anterior
Q (memória!)
Aplicação: Circuito de Debouncing
RS negativo
RS positivo
Latch RS com Clock
Repouso na
C=0 S+C = R+C = 1
célula básica
Clock em 1 Clock em 0
Q=D Q(t) = Q(t-1)
Flip-Flops: sensíveis à Borda
CLK CLK
Porta de retardo Porta de retardo
CLK CLK
CLK CLK
CLK* CLK*
Flip-Flop RS
R
Flip-Flop RS
Flip-Flop D
Flip-Flops D: borda negativa
D(t) C D(t+1)
t+1
D Q
0 0
>C t
Q 1 1 clock
D Q
D(t) C D(t+1)
t
0 0
>C
Q clock t+1
1 1
FF tipo com entradas assíncronas
22
VHDL Comportamental: processos
Bloco contendo instruções sequenciais: process
• Embora “sequencial” para projetista, sintetizador cria
hardware concorrente...
• Bloco deve ser simples, ou hardware fica complexo e lento...
• Processos podem ser “ativados” em resposta a sinais: permite
construção de circuitos sequenciais
label: process (signal1, signal2, ... , signalN)
<variaveis_locais>
begin -- exec. sequencial
<comando_sequencial>
...
<comando_sequencial>
end process label;
3 A <= B or C;
24
Ex.: Fluxo de dados vs. Comportamental
A
F
B
-- library declaration
-- library declaration library IEEE;
library IEEE; use IEEE.bit_1164.all;
use IEEE.bit_1164.all; -- entity
-- entity entity my_xor is
entity my_xor is port (A,B : in bit;
port (A,B : in bit; F : out bit);
F : out bit); end my_xor;
end my_xor; -- architecture: comportamental
-- architecture: fluxo de dados architecture behav of my_xor is
architecture dflow of my_xor is begin
begin xor_proc: process(A,B)
F <= A xor B; begin
end dflow; F <= A xor B;
end process xor_proc;
end behav;
25
Ex.: Fluxo de dados vs. Comportamental
A X = A2 + B2
quad
B Y = A2 – 2*B2
-- entity: IDÊNTICA
...
-- entity
-- architecture: comportamental
entity quad is
architecture comp of quad is
port (A,B : in integer;
begin
X,Y : out integer);
squares: process(A,B)
end quad;
variable a2,b2 : integer;
-- architecture: fluxo de dados
begin
architecture fdados of quad is
a2 := A**2;
begin
b2 := B**2;
X <= A**2 + B**2;
X <= a2 + b2;
Y <= A**2 – 2*(B**2);
b2 := 2*b2;
end fdados;
Y <= a2 - b2;
end process squares;
end comp;
26
Processos: lista de sensibilidade
Atribuição condicional: if
• Ex.: saída recebe entrada só se chave “load” mudar para 1
8 8
d_in d_out
buffer
load
entity buffer is
port (load : in bit;
d_in : in bit_vector (7 downto 0);
d_out : out bit_vector (7 downto 0));
end buffer;
architecture impl of buffer is
begin
loader: process(load) -- sensível apenas a “load”
begin -- se load “0 → 1” (borda de subida)
if (load='1') then d_out <= d_in; end if;
end process loader;
end impl;
29
Processos: atribuição condicional
2 8
Atribuição condicional: if ctr disp
val
Ex.: Impressão de “P” “O” “L” “I” em display f
a h e
• P = abc’d’efg’h ; O = abcdefg’h’ ; b
g
d
• L = abc(defgh)’ ; I = (abcdefg)’h c
entity disp is
port (ctr : in bit_vector (1 downto 0);
val : out bit_vector (7 downto 0));
end disp;
30
Processos: atribuição condicional
2 8
Atribuição condicional: if ctr disp
val
Ex.: Impressão de “P” “O” “L” “I” em display f
a h e
• P = abc’d’efg’h ; O = abcdefg’h’ ; b
g
d
• L = abc(defgh)’ ; I = (abcdefg)’h c
...
architecture mydisp of disp is
begin
printer: process(ctr)
begin
if (ctr = “00”) then val <= “11001101”; -- “P”
elsif (ctr = “01”) then val <= “11111100”; -- “O”
elsif (ctr = “10”) then val <= “11100000”; -- “L”
elsif (ctr = “11”) then val <= “00000001”; -- “I”
else val <= “00000010”; -- catch all: “-”
end if;
end process printer;
end mydisp;
31
Processos: atribuição condicional
32
Processos: atribuição condicional
33
Processos: atribuição condicional
2 8
Atribuição condicional com seleção: case ctr
disp
val
Ex.: Impressão de “P” “O” “L” “I” em display f
• P = abc’d’efg’h ; O = abcdefg’h’ ;
a h e
g
b d
• L = abc(defgh)’ ; I = (abcdefg)’h c
...
architecture mydisp2 of disp is
begin
printer: process(ctr)
begin
case (ctr) is
when “00” => val <= “11001101”; -- “P”
when “01” => val <= “11111100”; -- “O”
when “10” => val <= “11100000”; -- “L”
when “11” => val <= “00000001”; -- “I”
when others => val <= “00000010”; -- catch all: “-”
end case;
end process printer;
end mydisp2;
34
Processos: atribuição condicional
8 val
2
Atribuição condicional com seleção: case ctr
disp 4
sol
Ex.: Impressão de “P” “O” “L” “I” em display f
a h e
• Com “sol piscante” extra b
g
y z
d x w
...
architecture mydisp3 of disp2 is Pode haver mais
begin de um comando
printer: process(ctr) por when
begin
case (ctr) is
when “00” => val <= “11001101”; sol <= “1000”; -- “P” , x
when “01” => val <= “11111100”; sol <= “0100”; -- “O” , y
when “10” => val <= “11100000”; sol <= “0010”; -- “L” , z
when “11” => val <= “00000001”; sol <= “0001”; -- “I” , w
when others => val <= “00000010”; sol <= “0000”; -- catch all: “-”
end case;
end process printer;
end mydisp3;
35
Processos: atribuição condicional
2 8
Atribuição condicional com seleção: case dispE
ctr val
Ex.: Impressão de “P” “O” “L” “I” em display
• Com sinal de habilitação (enable) enable
...
architecture archE of dispE is f
begin a h e
printer: process(ctr) b
g
d
begin
c
if (enable = ‘1’) then
case (ctr) is
when “00” => val <= “11001101”; -- “P”
when “01” => val <= “11111100”; -- “O”
when “10” => val <= “11100000”; -- “L”
when “11” => val <= “00000001”; -- “I”
when others => val <= “00000010”; -- catch all: “-”
end case;
else val <= “00000000”; -- apagado se enable desativado
end if;
end process printer;
end archE;
36
VHDL: Latch D D Q
entity latchD is C Q
port (D, C : in bit;
Q, Q_L : out bit;
end latchD;
architecture impl of latchD is
begin
procD: process(C,D) -- lista de sensibilidade
begin
if (C='1') then -- só carrega enquanto clock = '1'
Q <= D;
Q_L <= not D;
end if;
end process procD;
end impl;
37
VHDL: Latch D D Q
entity latchD is C Q
port (D, C : in bit;
Q, Q_L : out bit;
end latchD;
architecture impl of latchD is
signal qi : bit;
begin
procD: process(C,D) -- lista de sensibilidade
begin
if (C='1') then -- só carrega enquanto clock = '1'
qi <= D;
end if;
end process procD;
Q <= qi; -- funciona como abordagem estrutural
Q_L <= not qi;
end impl;
38
VHDL: Flip-Flop D D Q
entity flipflopD is C Q
port (D, C : in bit;
Q, Q_L : out bit;
end flipflopD;
architecture impl of flipflopD is
signal qi : bit;
begin
procD: process(C) -- lista de sensibilidade
begin
if (C'event and C='1') then -- borda de subida do clock
qi <= D;
end if;
end process procD;
Q <= qi; -- funciona como abordagem estrutural
Q_L <= not qi;
end impl;
39
VHDL: Flip-Flop D D Q
entity flipflopD is C Q
port (D, C : in bit;
Q, Q_L : out bit;
end flipflopD;
architecture impl of flipflopD is
signal qi : bit;
begin
procD: process(C) -- lista de sensibilidade
begin
if rising_edge(C) then -- borda de subida do clock
qi <= D;
end if;
end process procD;
Q <= qi; -- funciona como abordagem estrutural
Q_L <= not qi;
end impl;
40
VHDL: Flip-Flop D SET
D Q
entity flipflopD is
port (D, C, set, reset: in bit; C Q
Q, Q_L : out bit;
end flipflopD ; RESET
architecture impl of flipflopD is
signal qi : bit;
begin
procD: process(C, set, reset) -- lista de sensibilidade
begin
if (set = '1') then qi <= '1'; -- assíncrono
elsif (reset = '1') then qi <= '0'; -- assíncrono
elsif rising_edge(C) then -- borda de subida do clock
qi <= D;
end if;
end process procD;
Q <= qi; -- funciona como abordagem estrutural
Q_L <= not qi;
end impl;
41
APÊNDICE
42
VHDL: Exemplos Wakerly
Flip-flop D
(descrição estrutural)
43
VHDL: Exemplos Wakerly
Latch D
(descrição estrutural)
44
VHDL: Exemplos Wakerly
45
VHDL: Exemplos Wakerly
46
VHDL: Exemplos Wakerly
CI 74x74
47
APÊNDICE
48
Latches e Flip-Flops
Metaestabilidade:
• Circuito pode entrar em estado de oscilação (pouco
estável, mas possível)
0 1 1 0
0 1 1 0
PCS2012 / ETM 50
Elementos Biestáveis
Meta estabilidade
• Poderia permanecer nesse estado para sempre (não um
estado binário/digital)
Comportamento Meta-estável
Tipos de Flip-Flops
53
Tabela Funcional por Tipo de Flip-Flop
S
Q Entradas Saídas
T T Q Q
Q Q Q
R
Tabela Funcional por Tipo de Flip-Flop
Tabela funcional
Símbolo funcional
S Entradas Saídas
T Q
T CK Q Q
CK 0 Q Q
Q
R 1 Q Q
Tabela Funcional por Tipo de Flip-Flop
Tabela funcional
Símbolo funcional
S Entradas Saídas
D Q
D CK Q Q
CK
Q 0 0 1
R
1 1 0
Tabela Funcional por Tipo de Flip-Flop
Tabela funcional
Símbolo funcional
S Entradas Saídas
D Q
D CK Q Q
CK
Q 0 0 1
R
1 1 0
Tabela Funcional por Tipo de Flip-Flop
Flip-Flop tipo JK – Sensível à borda de subida do clock
Entradas Saídas
J K CK Q Q
S
J Q 0 0 Q Q
CK 0 1 0 1
K Q
R 1 0 1 0
1 1 Q Q
Tabela Funcional por Tipo de Flip-Flop
Flip-Flop tipo JK – Sensível à borda de descida do clock
Entradas Saídas
J K CK Q Q
S
J Q 0 0 Q Q
CK 0 1 0 1
K Q
R 1 0 1 0
1 1 Q Q
APÊNDICE
60
Conversão de Flip-Flops
J
Lógica Q
K D
adicional
CLK CLK Q
Conversão de Flip-Flops
Exemplos
• Flip-Flop tipo JK → Flip-Flop tipo D
Conversão de Flip-Flops
Exemplos
• Flip-Flop tipo D → Flip-Flop tipo JK
Conversão de Flip-Flops
X1 Y1
Lógica Q
X2 adicional Y2
CLK CLK Q
Conversão de Flip-Flops
JK
Q 00 01 11 10
J D 0 0 0 1 1
Lógica Q
K adicional 1 1 0 0 1
CLK CLK Q
Lógica adicional em D:
JQ + KQ
Conversão de Flip-Flops
JK
Q 00 01 11 10
J T 0 0 0 1 1
Lógica Q
K adicional 1 0 1 1 0
CLK CLK Q
Lógica adicional em T:
JQ + KQ
Conversão de Flip-Flops
D
Q 0 1
J 0 0x 1x
D Lógica Q
adicional K 1 x1 x0
CLK CLK Q