Circuitos Lógicos e Organização de
Computadores
Capítulo 7 – Flip-Flops e Circuitos Seqüenciais
Ricardo Pannain
pannain@puc-campinas.edu.br
http://docentes.puc-campinas.edu.br/ceatec/pannain/
1
Circuito Seqüenciais
Circuito combinacional  saídas dependem apenas das entradas
Cicuito seqüencial  saídas dependem das entradas e do
comportamento anterior do circuito
Exemplo - Controle de Sistema de Alarme
Sensor
Set
Memory
element
On Off
Alarm
Reset
2
Elemento de memória simples
A
B
Elemento de memória com portas NOR
Reset
Elemento de memória controlado
Set
Q
Load
A
Data
B
Output
TG1
TG2
3
Latch construído com portas NOR
R
Qa
Qb
S
(a) Circuito
t1
t2
S
R
Qa Qb
0
0
0/11/0
0
1
0
1
1
0
1
0
1
1
0
0
(sem alteração)
(b) Tabela Verdade
t3
t4
t5
t6
t7
t8
t9
t 10
1
R
0
1
S
0
1
Qa
?
0
1
Qb
?
0
Time
(c) Diagrama de Tempo
4
Latch SR com clock (gated)
R
R
Q
Clk
Q
S
S
Clk
S
R
Q(t + 1)
0
x
x
Q(t) (sem alteração)
1
0
0
Q(t) (sem alteração)
1
0
1
0
1
1
0
1
1
1
1
x
(a) Circuito
(b) Tabela Verdade
1
Clk
0
1
R
S
0
Q
Clk
1
S
R
0
1
?
Q
Q
(d) Símbolo Gráfico
0
Q
1
?
0
Time
(c) Timing diagram
5
Latch SR Gated SR com portas NAND
S
Q
Clk
Q
R
6
Latch D Gated
S
D
(Data)
Clk D
Q
0
1
1
Clk
Q(t )
0
1
(b) Tabela Verdade
Q
R
x
0
1
Q(t + 1)
D
Q
(a) Circuito
Clk Q
t1
t2
t3
t4
(c) Símbolo Gráfico
Clk
D
Q
Time
(d) Diagrama de Tempo
7
Setup and hold times
t su
th
Clk
D
Q
Setup time  tempo mínimo que D deve estar estável antes da descida do clock
Hold time  temp mínimo que D deve ser mantido estável após a descida do clock
Valores típos (CMOS): tsu = 3ns e th = 2ns
8
Flip-Flop D Master-slave
Master
D
Clock
D
Q
Slave
Qm
Clk Q
D
Q
Clk Q
Qs
Q
Q
D
(a) Circuito
Q
Q
(c) Símbolo Gráfico
Clock
D
CLK = 1 master armazena
e slave não muda
CLK = 0 master não muda
e slave armazena
Qm
Q = Qs
(b) Diagrama de tempo
9
Sensível à borda de descida
Flip-Flop D sensível à borda de subida
1
P3
D
2
Clock
P1
5
Q
Q
(b) Símbolo Gráfico
Clock
3
D
Q
4
P2
P4
(a) Circuito
6
Q
Clk = 0  P1 = P2 = 1
P3 = D
P4 = D
Clk =1  P3 e P4 são transmitidos através de 2 e 3
P1 = D e P2 = D  Q = D e Q = D
Obs - P4 e P3 DEVEM ESTAR ESTÁVEIS QUANDO
CLK MUDA PARA 1
10
Comparação de Flip-Flops D sensíveis a nivel e sensíveis a borda
D
Clock
Q
Qa
Clk Q
Qa
D
Clock
D
D
Q
Qb
D
Q
Qb
Qa
Q
Qc
Qb
Q
Qc
Qc
(a) Circuito
(b) Diagrama de Tempo
11
Flip-Flop Master-slave tipo D com Clear e Preset
Preset
D
Q
Clock
Q
Clear
(a) Circuito
Preset
D
Q
Q
Clear
(b) Símbolo Gráfico
12
Flip-Flop D sensível à borda de subida com Clear e Preset
Preset
Q
Preset
D
Q
Clock
Q
Q
Clear
(b) Símbolo Gráfico
D
Clear
(a) Circuito
13
Flip-Flop D com reset síncrono
Clear
D
D
Clock
Q
Q
Q
Q
14
Flip-Flop tipo T (toogle)
D
T
Q
Q
Q
Q
T
Q(t + 1)
0
Q(t )
1
Q(t )
(b) Tabela Verdade
T
Q
Q
Clock
(c) Símbolo Gráfico
(a) Circuito
Clock
T
Q
(d) Diagrama de tempo
15
Flip-Flop JK
D=JQ+ KQ
J
D
K
Q
Q
Q
Q
J e K  entradas
De controle
FFs SR e T juntos
Clock
(a) Circuito
J K Q ( t + 1)
0
0
1
1
0
1
0
1
Q (t)
0
1
Q (t )
(b) Tabela Verdade
J
Q
K
Q
(c) Símbolo Gráfico
16
Registrador de deslocamento com entrada e saída serial
Registrador é um conjunto de n Flip-Flops
In
Q
D
Clock
Q1
Q
D
Q
Q2
Q
D
Q
Q3
D
Q
Q
Q4
Out
Q
(a) Circuito
t0
In
1
Q1
0
Q2
0
Q3
0
Q4 = Out
0
t1
0
1
0
0
0
t2
1
0
1
0
0
t3
1
1
0
1
0
t4
1
1
1
0
1
t5
0
1
1
1
0
t6
0
0
1
1
1
t7
0
0
0
1
1
(b) Exemplo de uma seqüência
FFs master-slave
ou sensível à borda.
Porque não
sensível a nível ?
17
Registrador de deslocamento com entrada paralela e serial e saída paralela
Parallel output
Q3
D
Q
Q
Serial
input
Shift/Load
Q2
D
Q
Q
Parallel input
Q1
D
Q
Q
Q0
D
Q
Q
Clock
18
Contadores
Contador de 3 bits up-counter
1
Q
T
Clock
Q
T
Q
Q
T
Q
Q0
Q
Q1
Q2
(a) Circuito
Clock
Q0
Q1
Q2
Count
0
1
2
3
4
5
6
7
0
19
(b) Diagrama de tempo
Contador de 3 bits down-counter
Clock
1
T
Q
T
Q
Q
T
Q
Q0
Q
Q
Q1
Q2
(a) Circuit
Clock
Q0
Q1
Q2
Count
0
7
6
5
4
3
(b) Timing diagram
2
1
0
20
Derivação de contador síncrono up-counter
Clock cycle
0
1
2
3
4
5
6
7
8
Q2 Q1 Q0
0
0
0
0
1
1
1
1
0
0
0
1
1
0
0
1
1
0
0
1
0
1
0
1
0
1
0
Q1 muda
Q2 muda
T0 = 1
T1 = Q0
T2 = Q0 Q1
T3 = Q0 Q1 Q2
Tn = Q0 Q1 ... Qn
21
Contador síncrocno de quatro-bits up-counter
1
Q
T
Q
T
T
Q0
Clock
Q
Q1
Q
T
Q
Q2
Q
Q3
Q
Q
(a) Circuito
Clock
Q0
Q1
Q2
Q3
Count 0
1
2
3
4
5
6
7
8
9
10 11
(b) Diagrama de tempo
12 13
14 15
0
1
22
Inclusão de sinais de enable e clear
Enable
Clock
T
Q
Q
T
Q
Q
T
Q
Q
T
Q
Q
Clear
23
Enable
D Q
Q0
Q
Contador de 4 bits com FF D
D Q
Q1
Q
D Q
Q2
Q
D Q
Q3
Q
Clock
Output
carry 24
Enable
D0
D1
0
1
D Q
Q0
Q
0
1
D Q
Q1
Q
Contador com entrada paralela
D2
0
1
D Q
Q2
Q
D3
0
1
D Q
Q3
Q
Load
Clock
Output
carry
25
Contador modulo-6 com reset síncrono
1
Enable
0
D0
Q0
0
D1
Q1
0
D2
Q2
Load
Clock
Clock
(a) Circuito
Clock
Q0
Q1
Q2
Count 0
1
2
3
4
(b) Diagrama de tempo
5
0
1
26
Contador modulo-6 com reset síncrono
1
T
Clock
Q
Q0
Q
T
Q
Q
T
Q1
Q
Q2
Q
(a) Circuito
Clock
Q0
Q1
Q2
Count 0
1
2
3
4
5
(b) Diagrama de tempo
0
1
2
27
Contador BCD de 2 dígitos
1
0
0
0
0
Enable
D0
D1
D2
D3
Q0
Q1
Q2
Q3
BCD 0
Q0
Q1
Q2
Q3
BCD 1
Load
Clock
Clock
Clear
0
0
0
0
Enable
D0
D1
D2
D3
Load
Clock
28
Q0
Q1
Qn ”
1
Start
D
Q
D
Q
Q
D
Q
Q
Q
Clock
(a) An n -bit ring counter
Q0 Q1 Q2 Q3
Contador em Anel
y0
y1
y2
y3
2-to-4 decoder
w1
1000, 0100, 0010, 0001
w0
En
1
Clock
Clock
Q1
Q0
Two-bit up-counter
Start
Clear
(b) A four-bit ring counter
29
Contador Johnson
Q0
D
Q
Q
Q1
D
Q
Q
Qn – 1
D
Q
Q
Reset
Clock
30
Inatalação de um FF D de um package
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
LIBRARY altera ;
USE altera.maxplus2.all ;
ENTITY flipflop IS
PORT ( D, Clock
Resetn, Presetn
Q
END flipflop ;
: IN
: IN
: OUT
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC ) ;
ARCHITECTURE Structure OF flipflop IS
BEGIN
dff_instance: dff PORT MAP ( D, Clock, Resetn, Presetn, Q ) ;
END Structure ;
31
Memória
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY implied IS
PORT ( A, B
AeqB
END implied ;
: IN
: OUT
STD_LOGIC ;
STD_LOGIC ) ;
ARCHITECTURE Behavior OF implied IS
BEGIN
PROCESS ( A, B )
BEGIN
IF A = B THEN
AeqB <= '1' ;
END IF ;
END PROCESS ;
END Behavior ;
32
Codigo para um latch D gated
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY latch IS
PORT ( D, Clk
Q
END latch ;
: IN
: OUT
STD_LOGIC ;
STD_LOGIC) ;
ARCHITECTURE Behavior OF latch IS
BEGIN
PROCESS ( D, Clk )
BEGIN
IF Clk = '1' THEN
Q <= D ;
END IF ;
END PROCESS ;
END Behavior ;
33
Código para um FF D
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY flipflop IS
PORT ( D, Clock : IN
STD_LOGIC ;
Q
: OUT STD_LOGIC) ;
END flipflop ;
ARCHITECTURE Behavior OF flipflop IS
BEGIN
PROCESS ( Clock )
BEGIN
IF Clock'EVENT AND Clock = '1' THEN
Q <= D ;
END IF ;
END PROCESS ;
END Behavior ;
34
Código para um FF D usando WAIT UNTIL
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY flipflop IS
PORT ( D, Clock : IN
Q
: OUT
END flipflop ;
STD_LOGIC ;
STD_LOGIC ) ;
ARCHITECTURE Behavior OF flipflop IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
Q <= D ;
END PROCESS ;
END Behavior ;
35
FF D com reset assíncrono
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY flipflop IS
PORT ( D, Resetn, Clock
Q
END flipflop ;
: IN
: OUT
STD_LOGIC ;
STD_LOGIC) ;
ARCHITECTURE Behavior OF flipflop IS
BEGIN
PROCESS ( Resetn, Clock )
BEGIN
IF Resetn = '0' THEN
Q <= '0' ;
ELSIF Clock'EVENT AND Clock = '1' THEN
Q <= D ;
END IF ;
END PROCESS ;
END Behavior ;
36
FF D com reset síncrono
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY flipflop IS
PORT ( D, Resetn, Clock
Q
END flipflop ;
: IN
: OUT
STD_LOGIC ;
STD_LOGIC) ;
ARCHITECTURE Behavior OF flipflop IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF Resetn = '0' THEN
Q <= '0' ;
ELSE
Q <= D ;
END IF ;
END PROCESS ;
END Behavior ;
37
Instanciação do módulo lpm_shiftreg
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
LIBRARY lpm ;
USE lpm.lpm_components.all ;
ENTITY shift IS
PORT ( Clock
Reset
Shiftin, Load
R
Q
END shift ;
: IN
: IN
: IN
: IN
: OUT
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC_VECTOR(3 DOWNTO 0) ;
STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
ARCHITECTURE Structure OF shift IS
BEGIN
instance: lpm_shiftreg
GENERIC MAP (LPM_WIDTH => 4, LPM_DIRECTION => "RIGHT")
PORT MAP (data => R, clock => Clock, aclr => Reset,
load => Load, shiftin => Shiftin, q => Q ) ;
END Structure ;
38
Código um registrador de 8 bits com clear assíncrono
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY reg8 IS
PORT ( D
Resetn, Clock
Q
END reg8 ;
: IN
STD_LOGIC_VECTOR(7 DOWNTO 0) ;
: IN
STD_LOGIC ;
: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ) ;
ARCHITECTURE Behavior OF reg8 IS
BEGIN
PROCESS ( Resetn, Clock )
BEGIN
IF Resetn = '0' THEN
Q <= "00000000" ;
ELSIF Clock'EVENT AND Clock = '1' THEN
Q <= D ;
END IF ;
END PROCESS ;
END Behavior ;
39
Código um registrador de n-bit com clear assíncrono
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY regn IS
GENERIC ( N : INTEGER := 16 ) ;
PORT ( D
: IN
STD_LOGIC_VECTOR(N-1 DOWNTO 0) ;
Resetn, Clock : IN
STD_LOGIC ;
Q
: OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ;
END regn ;
ARCHITECTURE Behavior OF regn IS
BEGIN
PROCESS ( Resetn, Clock )
BEGIN
IF Resetn = '0' THEN
Q <= (OTHERS => '0') ;
ELSIF Clock'EVENT AND Clock = '1' THEN
Q <= D ;
END IF ;
END PROCESS ;
END Behavior ;
40
Código para um FF D com um multiplexador 2-para-1 na entrada D
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY muxdff IS
PORT ( D0, D1, Sel, Clock : IN
Q
: OUT
END muxdff ;
STD_LOGIC ;
STD_LOGIC ) ;
ARCHITECTURE Behavior OF muxdff IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF Sel = '0' THEN
Q <= D0 ;
ELSE
Q <= D1 ;
END IF ;
END PROCESS ;
END Behavior ;
41
Código hierárquico para um shift-register de 4 bits
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY shift4 IS
PORT ( R
L, w, Clock
Q
END shift4 ;
: IN
: IN
: BUFFER
STD_LOGIC_VECTOR(3 DOWNTO 0) ;
STD_LOGIC ;
STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
ARCHITECTURE Structure OF shift4 IS
COMPONENT muxdff
PORT ( D0, D1, Sel, Clock : IN
STD_LOGIC ;
Q
: OUT STD_LOGIC ) ;
END COMPONENT ;
BEGIN
Stage3: muxdff PORT MAP ( w, R(3), L, Clock, Q(3) ) ;
Stage2: muxdff PORT MAP ( Q(3), R(2), L, Clock, Q(2) ) ;
Stage1: muxdff PORT MAP ( Q(2), R(1), L, Clock, Q(1) ) ;
Stage0: muxdff PORT MAP ( Q(1), R(0), L, Clock, Q(0) ) ;
END Structure ;
42
Alternativa para o shift register
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY shift4 IS
PORT ( R
: IN
Clock
: IN
L, w
: IN
Q
: BUFFER
END shift4 ;
STD_LOGIC_VECTOR(3 DOWNTO 0) ;
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
ARCHITECTURE Behavior OF shift4 IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF L = '1' THEN
Q <= R ;
ELSE
Q(0) <= Q(1) ;
Q(1) <= Q(2);
Q(2) <= Q(3) ;
Q(3) <= w ;
END IF ;
END PROCESS ;
END Behavior ;
43
Contador up-counter quatro-bits
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
USE ieee.std_logic_unsigned.all ;
ENTITY upcount IS
PORT ( Clock, Resetn, E
Q
END upcount ;
: IN
STD_LOGIC ;
: OUT STD_LOGIC_VECTOR (3 DOWNTO 0)) ;
ARCHITECTURE Behavior OF upcount IS
SIGNAL Count : STD_LOGIC_VECTOR (3 DOWNTO 0) ;
BEGIN
PROCESS ( Clock, Resetn )
BEGIN
IF Resetn = '0' THEN
Count <= "0000" ;
ELSIF (Clock'EVENT AND Clock = '1') THEN
IF E = '1' THEN
Count <= Count + 1 ;
ELSE
Count <= Count ;
END IF ;
END IF ;
END PROCESS ;
Q <= Count ;
END Behavior ;
44
Contador de 4 bits com carga paralela usando sinais INTEGER
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY upcount IS
PORT ( R
Clock, Resetn, L
Q
END upcount ;
: IN
: IN
: BUFFER
INTEGER RANGE 0 TO 15 ;
STD_LOGIC ;
INTEGER RANGE 0 TO 15 ) ;
ARCHITECTURE Behavior OF upcount IS
BEGIN
PROCESS ( Clock, Resetn )
BEGIN
IF Resetn = '0' THEN
Q <= 0 ;
ELSIF (Clock'EVENT AND Clock = '1') THEN
IF L = '1' THEN
Q <= R ;
ELSE
Q <= Q + 1 ;
END IF;
END IF;
END PROCESS;
END Behavior;
45
Contador down-counter
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY downcnt IS
GENERIC ( modulus : INTEGER := 8 ) ;
PORT ( Clock, L, E : IN
STD_LOGIC ;
Q
: OUT INTEGER RANGE 0 TO modulus-1 ) ;
END downcnt ;
ARCHITECTURE Behavior OF downcnt IS
SIGNAL Count : INTEGER RANGE 0 TO modulus-1 ;
BEGIN
PROCESS
BEGIN
WAIT UNTIL (Clock'EVENT AND Clock = '1') ;
IF E = '1' THEN
IF L = '1' THEN
Count <= modulus-1 ;
ELSE
Count <= Count-1 ;
END IF ;
END IF ;
END PROCESS;
Q <= Count ;
END Behavior ;
46
Sistema digital com k registradores
Data
Extern
Bus
Clock
R1
R1in
R1out
R2
R2in
R2out
Rk
Rkin
Rkout
Control circuit
Function
47
Conexão dos registradoes ao barramento
Bus
R 1out
D
R 2out
Q
D
Q
Q
D
Q
R 1in
Q
D
Q
Q
Q
R 2in
Clock
R1
R2
48
Circuito de controle com um shift-register
R2out ,R3in
w
Clock
D
Q
Q
R1out ,R2in
D
Q
Q
R3out ,R1in
D
Q
Q
Reset
49
Circuito de controle modificado
R2out ,R3in
R1out ,R2in
R3out ,R1in
Reset
w
D PQ
Clock
Q
D
Q
Q
D
Q
Q
50
Cicuito de controle com FF sem preset
R2out ,R3in
R1out ,R2in
R3out ,R1in
w
D
Clock
Q
Q
D
Q
Q
D
Q
Q
Reset
51
Usando multiplexadores para implementação de um barramento
Bus
R1in
R2in
R1
R2
Rkin
Rk
Clock
Data
S0
Multiplexers
Sj – 1
52
Código para registrador de n-bits com enable
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY regn IS
GENERIC ( N : INTEGER := 8 ) ;
PORT ( R
: IN
STD_LOGIC_VECTOR(N-1 DOWNTO 0) ;
Rin, Clock
: IN
STD_LOGIC ;
Q
: OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ;
END regn ;
ARCHITECTURE Behavior OF regn IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock'EVENT AND Clock = '1' ;
IF Rin = '1' THEN
Q <= R ;
END IF ;
END PROCESS ;
END Behavior ;
53
Código para buffer tri-sate n-bits
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY trin IS
GENERIC ( N : INTEGER := 8 ) ;
PORT ( X : IN
STD_LOGIC_VECTOR(N-1 DOWNTO 0) ;
E : IN
STD_LOGIC ;
F : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ;
END trin ;
ARCHITECTURE Behavior OF trin IS
BEGIN
F <= (OTHERS => 'Z') WHEN E = '0' ELSE X ;
END Behavior ;
54
Código para controlador com for the shift-register
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY shiftr IS -- left-to-right shift register with async reset
GENERIC ( K : INTEGER := 4 ) ;
PORT ( Resetn, Clock, w
: IN
STD_LOGIC ;
Q
: BUFFER STD_LOGIC_VECTOR(1 TO K) ) ;
END shiftr ;
ARCHITECTURE Behavior OF shiftr IS
BEGIN
PROCESS ( Resetn, Clock )
BEGIN
IF Resetn = '0' THEN
Q <= (OTHERS => '0') ;
ELSIF Clock'EVENT AND Clock = '1' THEN
Genbits: FOR i IN K DOWNTO 2 LOOP
Q(i) <= Q(i-1) ;
END LOOP ;
Q(1) <= w ;
END IF ;
END PROCESS ;
END Behavior ;
55
Declaração de package e component
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
PACKAGE components IS
COMPONENT regn -- register
GENERIC ( N : INTEGER := 8 ) ;
PORT ( R
: IN
Rin, Clock
: IN
Q
: OUT
END COMPONENT ;
STD_LOGIC_VECTOR(N-1 DOWNTO 0) ;
STD_LOGIC ;
STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ;
COMPONENT shiftr -- left-to-right shift register with async reset
GENERIC ( K : INTEGER := 4 ) ;
PORT
( Resetn, Clock, w
: IN
STD_LOGIC ;
Q
: BUFFER STD_LOGIC_VECTOR(1 TO K) ) ;
END component ;
COMPONENT trin -- tri-state buffers
GENERIC ( N : INTEGER := 8 ) ;
PORT ( X : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0) ;
E : IN STD_LOGIC ;
F : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0) ) ;
END COMPONENT ;
END components ;
56
Sistema digital com bus
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
USE work.components.all ;
ENTITY swap IS
PORT ( Data
: IN
DOWNTO 0) ;
Resetn, w
: IN
Clock, Extern : IN
RinExt
: IN
BusWires : INOUT
DOWNTO 0) ) ;
END swap ;
STD_LOGIC_VECTOR(7
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC_VECTOR(1 TO 3) ;
STD_LOGIC_VECTOR(7
57
Sistema digital com bus - continuação
ARCHITECTURE Behavior OF swap IS
SIGNAL Rin, Rout, Q : STD_LOGIC_VECTOR(1 TO 3) ;
SIGNAL R1, R2, R3 : STD_LOGIC_VECTOR(7 DOWNTO 0) ;
BEGIN
control: shiftr GENERIC MAP ( K => 3 )
PORT MAP ( Resetn, Clock, w, Q ) ;
Rin(1) <= RinExt(1) OR Q(3) ;
Rin(2) <= RinExt(2) OR Q(2) ;
Rin(3) <= RinExt(3) OR Q(1) ;
Rout(1) <= Q(2) ; Rout(2) <= Q(1) ; Rout(3) <= Q(3) ;
tri_ext: trin PORT MAP ( Data, Extern, BusWires ) ;
reg1: regn PORT MAP ( BusWires, Rin(1), Clock, R1 ) ;
reg2: regn PORT MAP ( BusWires, Rin(2), Clock, R2 ) ;
reg3: regn PORT MAP ( BusWires, Rin(3), Clock, R3 ) ;
tri1: trin PORT MAP ( R1, Rout(1), BusWires ) ;
tri2: trin PORT MAP ( R2, Rout(2), BusWires ) ;
tri3: trin PORT MAP ( R3, Rout(3), BusWires ) ;
END Behavior ;
58
Usando multiplexadores para implementar um bus
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
USE work.components.all ;
ENTITY swapmux IS
PORT ( Data
Resetn, w
Clock
RinExt
BusWires
END swapmux ;
: IN
: IN
: IN
: IN
: BUFFER
STD_LOGIC_VECTOR(7 DOWNTO 0) ;
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC_VECTOR(1 TO 3) ;
STD_LOGIC_VECTOR(7 DOWNTO 0) ) ;
ARCHITECTURE Behavior OF swapmux IS
SIGNAL Rin, Q : STD_LOGIC_VECTOR(1 TO 3) ;
SIGNAL S : STD_LOGIC_VECTOR(1 DOWNTO 0) ;
SIGNAL R1, R2, R3 : STD_LOGIC_VECTOR(7 DOWNTO 0) ;
BEGIN
control: shiftr GENERIC MAP ( K => 3 )
PORT MAP ( Resetn, Clock, w, Q ) ;
… con’t
59
Usando multiplexadores para implementar um bus - continuação
Rin(1) <= RinExt(1) OR Q(3) ;
Rin(2) <= RinExt(2) OR Q(2) ;
Rin(3) <= RinExt(3) OR Q(1) ;
reg1: regn PORT MAP ( BusWires, Rin(1), Clock, R1 ) ;
reg2: regn PORT MAP ( BusWires, Rin(2), Clock, R2 ) ;
reg3: regn PORT MAP ( BusWires, Rin(3), Clock, R3 ) ;
encoder:
WITH Q SELECT
S <= "00" WHEN "000",
"10" WHEN "100",
"01" WHEN "010",
"11" WHEN OTHERS ;
muxes: --eight 4-to-1 multiplexers
WITH S SELECT
BusWires <= Data WHEN "00",
R1 WHEN "01",
R2 WHEN "10",
R3 WHEN OTHERS ;
END Behavior ;
60
Código simplificado para descrever um barramento
(ENTITY declaration not shown)
ARCHITECTURE Behavior OF swapmux IS
SIGNAL Rin, Q : STD_LOGIC_VECTOR(1 TO 3) ;
SIGNAL R1, R2, R3 : STD_LOGIC_VECTOR(7 DOWNTO 0) ;
BEGIN
control: shiftr GENERIC MAP ( K => 3 )
PORT MAP ( Resetn, Clock, w, Q ) ;
Rin(1) <= RinExt(1) OR Q(3) ;
Rin(2) <= RinExt(2) OR Q(2) ;
Rin(3) <= RinExt(3) OR Q(1) ;
reg1: regn PORT MAP ( BusWires, Rin(1), Clock, R1 ) ;
reg2: regn PORT MAP ( BusWires, Rin(2), Clock, R2 ) ;
reg3: regn PORT MAP ( BusWires, Rin(3), Clock, R3 ) ;
muxes:
WITH Q SELECT
BusWires <= Data
R2
R1
R3
END Behavior ;
WHEN "000",
WHEN "100",
WHEN "010",
WHEN OTHERS ;
61
Sistema digital implementa um processador simples
Data
Bus
Clock
R0
R3
B
A
G
R 0in
R 0out
R 3in
R 3out
Ain Gin
Gout
AddSub
w
Function
Extern
Control circuit
Done
62
Operacões executadas pelo processador
63
Circuito de controle do porcessador
T0 T1 T2 T3
y0 y1 y2 y3
2-to-4 decoder
w1
w0
En
1
Clock
Clear
Q1
Q0
Up-counter
Reset
64
Registrador de função e os decodificadores
I0
I1
X
I2 I3
X1 X 2 X3
Y 0 Y1 Y2 Y3
y0 y1 y2 y3
y0 y1 y2 y3
y0 y1 y2 y3
2-to-4 decoder
w1 w0
En
2-to-4 decoder
w1 w0
En
0
1
1
Clock
FRin
2-to-4 decoder
w1 w0
En
1
Function Register
f1
f 0 Rx1 Rx0 Ry1 Ry0
Function
65
Valores dos sinais de controle para cada operação/time step
66
Código para two-bit up-counter reset assíncrono
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
USE ieee.std_logic_unsigned.all ;
ENTITY upcount IS
PORT ( Clear, Clock : IN
STD_LOGIC ;
Q
: BUFFER STD_LOGIC_VECTOR(1 DOWNTO 0) ) ;
END upcount ;
ARCHITECTURE Behavior OF upcount IS
BEGIN
upcount: PROCESS ( Clock )
BEGIN
IF (Clock'EVENT AND Clock = '1') THEN
IF Clear = '1' THEN
Q <= "00" ;
ELSE
Q <= Q + '1' ;
END IF ;
END IF;
END PROCESS;
END Behavior ;
67
Código para o processador
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
USE ieee.std_logic_signed.all ;
USE work.subccts.all ;
ENTITY proc IS
PORT ( Data
Reset, w
Clock
F, Rx, Ry
Done
BusWires
END proc ;
: IN
: IN
: IN
: IN
: BUFFER
: INOUT
STD_LOGIC_VECTOR(7 DOWNTO 0) ;
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC_VECTOR(1 DOWNTO 0) ;
STD_LOGIC ;
STD_LOGIC_VECTOR(7 DOWNTO 0) ) ;
ARCHITECTURE Behavior OF proc IS
SIGNAL Rin, Rout : STD_LOGIC_VECTOR(0 TO 3) ;
SIGNAL Clear, High, AddSub : STD_LOGIC ;
SIGNAL Extern, Ain, Gin, Gout, FRin : STD_LOGIC ;
SIGNAL Count, Zero : STD_LOGIC_VECTOR(1 DOWNTO 0) ;
SIGNAL T, I, X, Y : STD_LOGIC_VECTOR(0 TO 3) ;
SIGNAL R0, R1, R2, R3 : STD_LOGIC_VECTOR(7 DOWNTO 0) ;
SIGNAL A, Sum, G : STD_LOGIC_VECTOR(7 DOWNTO 0) ;
SIGNAL Func, FuncReg : STD_LOGIC_VECTOR(1 TO 6) ;
… con’t
68
Código para o processador - continuação
BEGIN
Zero <= "00" ; High <= '1' ;
Clear <= Reset OR Done OR (NOT w AND T(0)) ;
counter: upcount PORT MAP (
Clear, Clock, Count ) ;
decT: dec2to4 PORT MAP ( Count, High, T );
Func <= F & Rx & Ry ;
FRin <= w AND T(0) ;
functionreg: regn GENERIC MAP ( N => 6 )
PORT MAP ( Func, FRin, Clock, FuncReg ) ;
decI: dec2to4 PORT MAP ( FuncReg(1 TO 2), High, I ) ;
decX: dec2to4 PORT MAP ( FuncReg(3 TO 4), High, X ) ;
decY: dec2to4 PORT MAP ( FuncReg(5 TO 6), High, Y ) ;
Extern <= I(0) AND T(1) ;
Done <= ((I(0) OR I(1)) AND T(1)) OR ((I(2) OR I(3)) AND T(3)) ;
Ain <= (I(2) OR I(3)) AND T(1) ;
Gin <= (I(2) OR I(3)) AND T(2) ;
Gout <= (I(2) OR I(3)) AND T(3) ;
AddSub <= I(3) ;
… con’t
69
Código para o processador - continuação
RegCntl:
FOR k IN 0 TO 3 GENERATE
Rin(k) <= ((I(0) OR I(1)) AND T(1) AND X(k)) OR
((I(2) OR I(3)) AND T(3) AND X(k)) ;
Rout(k) <= (I(1) AND T(1) AND Y(k)) OR
((I(2) OR I(3)) AND ((T(1) AND X(k)) OR (T(2) AND Y(k)))) ;
END GENERATE RegCntl ;
tri_extern: trin PORT MAP ( Data, Extern, BusWires ) ;
reg0: regn PORT MAP ( BusWires, Rin(0), Clock, R0 ) ;
reg1: regn PORT MAP ( BusWires, Rin(1), Clock, R1 ) ;
reg2: regn PORT MAP ( BusWires, Rin(2), Clock, R2 ) ;
reg3: regn PORT MAP ( BusWires, Rin(3), Clock, R3 ) ;
tri0: trin PORT MAP ( R0, Rout(0), BusWires ) ;
tri1: trin PORT MAP ( R1, Rout(1), BusWires ) ;
tri2: trin PORT MAP ( R2, Rout(2), BusWires ) ;
tri3: trin PORT MAP ( R3, Rout(3), BusWires ) ;
regA: regn PORT MAP ( BusWires, Ain, Clock, A ) ;
alu:
WITH AddSub SELECT
Sum <= A + BusWires WHEN '0',
A - BusWires WHEN OTHERS ;
regG: regn PORT MAP ( Sum, Gin, Clock, G ) ;
triG: trin PORT MAP ( G, Gout, BusWires ) ;
END Behavior ;
70
Alternativa para o código do processador
… (ENTITY declaration not shown)
ARCHITECTURE Behavior OF proc IS
SIGNAL X, Y, Rin, Rout : STD_LOGIC_VECTOR(0 TO 3) ;
SIGNAL Clear, High, AddSub : STD_LOGIC ;
SIGNAL Extern, Ain, Gin, Gout, FRin : STD_LOGIC ;
SIGNAL Count, Zero, T, I : STD_LOGIC_VECTOR(1 DOWNTO 0) ;
SIGNAL R0, R1, R2, R3 : STD_LOGIC_VECTOR(7 DOWNTO 0) ;
SIGNAL A, Sum, G : STD_LOGIC_VECTOR(7 DOWNTO 0) ;
SIGNAL Func, FuncReg, Sel : STD_LOGIC_VECTOR(1 TO 6) ;
BEGIN
Zero <= "00" ; High <= '1' ;
Clear <= Reset OR Done OR (NOT w AND NOT T(1) AND NOT T(0)) ;
counter: upcount PORT MAP (
Clear, Clock, Count ) ;
T <= Count ;
Func <= F & Rx & Ry ;
FRin <= w AND NOT T(1) AND NOT T(0) ;
functionreg: regn GENERIC MAP ( N => 6 )
PORT MAP ( Func, FRin, Clock, FuncReg ) ;
I <= FuncReg(1 TO 2) ;
decX: dec2to4 PORT MAP ( FuncReg(3 TO 4), High, X ) ;
decY: dec2to4 PORT MAP ( FuncReg(5 TO 6), High, Y ) ;
controlsignals: PROCESS ( T, I, X, Y )
BEGIN
… con’t
71
Alternativa para o código do processador - continuação
Extern <= '0' ; Done <= '0' ; Ain <= '0' ; Gin <= '0' ;
Gout <= '0' ; AddSub <= '0' ; Rin <= "0000" ; Rout <= "0000" ;
CASE T IS
WHEN "00" => -- no signals asserted in time step T0
WHEN "01" => -- define signals asserted in time step T1
CASE I IS
WHEN "00" => -- Load
Extern <= '1' ; Rin <= X ; Done <= '1' ;
WHEN "01" => -- Move
Rout <= Y ; Rin <= X ; Done <= '1' ;
WHEN OTHERS => -- Add, Sub
Rout <= X ; Ain <= '1' ;
END CASE ;
WHEN "10" => -- define signals asserted in time step T2
CASE I IS
WHEN "10" => -- Add
Rout <= Y ; Gin <= '1' ;
WHEN "11" => -- Sub
Rout <= Y ; AddSub <= '1' ; Gin <= '1' ;
WHEN OTHERS => -- Load, Move
END CASE ;
WHEN OTHERS => -- define signals asserted in time step T3
CASE I IS
72
Alternativa para o código do processador - continuação
WHEN "00" => -- Load
WHEN "01" => -- Move
WHEN OTHERS => -- Add, Sub
Gout <= '1' ; Rin <= X ; Done <= '1' ;
END CASE ;
END CASE ;
END PROCESS ;
reg0: regn PORT MAP ( BusWires, Rin(0), Clock, R0 ) ;
reg1: regn PORT MAP ( BusWires, Rin(1), Clock, R1 ) ;
reg2: regn PORT MAP ( BusWires, Rin(2), Clock, R2 ) ;
reg3: regn PORT MAP ( BusWires, Rin(3), Clock, R3 ) ;
regA: regn PORT MAP ( BusWires, Ain, Clock, A ) ;
alu: WITH AddSub SELECT
Sum <= A + BusWires WHEN '0',
A - BusWires WHEN OTHERS ;
regG: regn PORT MAP ( Sum, Gin, Clock, G ) ;
Sel <= Rout & Gout & Extern ;
WITH Sel SELECT
BusWires <= R0 WHEN "100000",
R1 WHEN "010000",
R2 WHEN "001000",
R3 WHEN "000100",
G
WHEN "000010",
Data WHEN OTHERS ;
END Behavior ;
73
Um circuito reaction-timer
DD
c9
DD
c1 c0
RL
Clock
10-bit counter
(a) Clock divider
V LED
(b) LED circuit
74
Um circuito reaction-timer
VDD
VDD
RL
R
a b
w
0
1
c9
1
D
g a b
g
Converter
Converter
w0 w1 w2 w3
w0 w1 w2 w3
BCD1
BCD0
Q
Q
E
Two-digit BCD counter
Reset
Clear
(c) Push-button switch, LED, and 7-segment displays
75
Código para contador BCD de dois dígitos
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
USE ieee.std_logic_unsigned.all ;
ENTITY BCDcount IS
PORT ( Clock
: IN
STD_LOGIC ;
Clear, E
: IN
STD_LOGIC ;
BCD1, BCD0 : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
END BCDcount ;
ARCHITECTURE Behavior OF BCDcount IS
BEGIN
PROCESS ( Clock )
BEGIN
IF Clock'EVENT AND Clock = '1' THEN
IF Clear = '1' THEN
BCD1 <= "0000" ; BCD0 <= "0000" ;
… con’t
76
Código para contador BCD de dois dígitos
ELSIF E = '1' THEN
IF BCD0 = "1001" THEN
BCD0 <= "0000" ;
IF BCD1 = "1001" THEN
BCD1 <= "0000";
ELSE
BCD1 <= BCD1 + '1' ;
END IF ;
ELSE
BCD0 <= BCD0 + '1' ;
END IF ;
END IF ;
END IF;
END PROCESS;
END Behavior ;
77
Código para o reaction timer
LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
ENTITY reaction IS
PORT ( c9, Reset
w, Pushn
LEDn
Digit1, Digit0
END reaction ;
: IN
: IN
: OUT
: BUFFER
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC ;
STD_LOGIC_VECTOR(1 TO 7) ) ;
ARCHITECTURE Behavior OF reaction IS
COMPONENT BCDcount
PORT ( Clock
: IN
STD_LOGIC ;
Clear, E
: IN
STD_LOGIC ;
BCD1, BCD0 : BUFFER
STD_LOGIC_VECTOR(3 DOWNTO 0) ) ;
END COMPONENT ;
COMPONENT seg7
PORT ( bcd
: IN
STD_LOGIC_VECTOR(3 DOWNTO 0) ;
leds : OUT STD_LOGIC_VECTOR(1 TO 7) ) ;
END COMPONENT ;
SIGNAL LED : STD_LOGIC ;
SIGNAL BCD1, BCD0 : STD_LOGIC_VECTOR(3 DOWNTO 0) ;
… con’t
78
Código para o reaction timer (continuação)
BEGIN
flipflop: PROCESS
BEGIN
WAIT UNTIL c9'EVENT AND c9 = '1' ;
IF Pushn = '0' THEN
LED <= '0' ;
ELSIF w = '1' THEN
LED <= '1' ;
END IF ;
END PROCESS ;
LEDn <= NOT LED ;
counter: BCDcount PORT MAP ( c9, Reset, LED, BCD1, BCD0 ) ;
seg1 : seg7 PORT MAP ( BCD1, Digit1 ) ;
seg0 : seg7 PORT MAP ( BCD0, Digit0 ) ;
END Behavior ;
79
Download

D - cesarkallas.net