Diseno Secuencial
Diseno Secuencial
Diseno Secuencial
4
Diseo lgico secuencial
con VHDL
Introduccin
Los circuitos digitales que hemos manejado con anterioridad han sido de
tipo combinacional; es decir, son circuitos que dependen por completo de los
valores que se encuentran en sus entradas, en determinado tiempo. Si bien
un sistema secuencial puede tener tambin uno o ms elementos combinacionales, la mayora de los sistemas que se encuentran en la prctica incluyen elementos de memoria, los cuales requieren que el sistema se describa en
trminos de lgica secuencial.
En este captulo se describen algunos de los circuitos secuenciales ms
utilizados en la prctica, como flip-flops, contadores, registros, etc., adems
se desarrollan ejercicios para aprender la programacin de circuitos secuenciales en los que se integran los conceptos adquiridos en los captulos anteriores.
94
Bsicamente hay dos tipos de sistemas secuenciales: sncronos y asincronos; el comportamiento de los primeros se encuentra sincronizado mediante el pulso de reloj del sistema, mientras que el funcionamiento de los
sistemas asincronos depende del orden y momento en el cual se aplican sus
seales de entrada, por lo que no requieren un pulso de reloj para sincronizar sus acciones.
4.2 Flip-flops
El elemento de memoria utilizado indistintamente en el diseo de los sistemas sncronos o asincronos se conoce como flip-flop o celda binaria.
La caracterstica principal de un flip-flop es mantener o almacenar un bit
de manera indefinida hasta que a travs de un pulso o una seal cambie de estado. Los flip-flops ms conocidos son los tipos SR, JK, T y D. En la figura 4.2
se presenta cada uno de estos elementos y la tabla de verdad que describe su
comportamiento.
S
0
0
0
0
1
1
1
1
R Q Qt+i
0 0
0
1
0 1
1 0
0
11
0
1
0 0
1
0 1
1 0
11
*
a)
Figura 4.2
J
0
0
0
0
1
1
1
1
K Q Qt+1
0 0
0
1
0 1
1 0
0
11
0
1
0 0
1
0 1
1
1 0
11
0
b)
D
0
0
1
1
Q Qt+1
0 0
1 0
0
1
1 1
c)
T
0
0
1
1
Q Qt+1
0 0
1 1
1
0
1 0
d)
D
0
0
1
1
clk
Q
0
1
0
1
Q(t+i)
0
0
1
1
a)
clk
b)
Figura 4.3 a) Diagrama y tabla de verdad del flip-flop D, b) Flujo de informacin en el dispositivo.
96
library ieee;
use ieee.std_logic_1164.all ;
entity f fd is port (
D,clk: in std_logic;
Q:
out std_logic) ;
end ffd;
architecture arq_ffd of ffd is
begin
process (clk) begin
if (clk'event and clk='l') then
Q <= D;
end if ;
end process ;
end arq_ffd;
Listado 4.1 Descripcin de un flip-flop disparado por flanco positivo.
clk
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
Q
0
1
0
1
0
1
0
1
Qt+i
0
1
0
0
1
1
X
X
Solucin
La tabla de verdad del flip-flop SR muestra que cuando la entrada S es
igual a 1 y la entrada R es igual a 0, la salida Q t + i toma valores lgicos de
1. Por otro lado, cuando S = 0 y R = l , la salida Q t + i = 0; en el caso
de que S y R sean ambas igual a 1 lgico, la salida Q t + j queda indeterminada; es decir, no es posible precisar su valor y ste puede adoptar el 0
o 1 lgico.
Por ltimo, cuando no existe cambio en las entradas S y R es decir, son
igual a 0, el valor de Q t + i mantiene su estado actual Q.
Con base en el anlisis anterior, el programa en VHDL puede realizarse
utilizando instrucciones condicionales y un nuevo tipo de datos: valores no
importa ('-'), los cuales permiten adoptar un valor de 0 o 1 lgico de manera indistinta (Listado 4-2).
98
1 library ieee;
2 use ieee.std_logic_1164.all ;
3 entity ffsr is port (
4
S,R,clk: in std_logic;
5
Q, Qn: inout std_logic);
6 end ffsr;
7 architecture a_ffsr of ffsr is
8 begin
9 process (elk, S, R)
11 begin
10
if (elk'event and elk = '1') then
11
if (S = ' 0'and R = '1') then
12
Q <= '0';
13
Qn <= '1' ;
14
elsif (S = '1' and R = '0') then
15
Q <= '1';
16
Qn <= '0';
17
elsif (S - '0' and R = '0') then
18
Q <= Q;
19
Qn <= Qn;
20
else
21
Q <=
;
22
Qn <= '-';
23
end if;
24
end if;
25
end process;
26 end a_ffsr;
Listado 4.2 Cdigo VHDL de un registro de 8 bits.
4.3 Registros
En la figura 4.5 se presenta la estructura de un registro de 8 bits con entrada
y salida de datos en paralelo. El diseo es muy similar al flip-flop anterior, la
diferencia radica en la utilizacin de vectores de bits en lugar de un solo bit,
como se observa en el listado 4.2.
D[0:7]
-Q[0:7]
library ieee;
use ieee.std_logic_1164.all;
entity reg is port (
D:
in std_logic_vector(0 to 7);
clk: in std_logic;
Q:
out std_logic_vector(0 to 7));
end reg ;
architecture arqreg of reg is
begin
process (clk) begin
if (clk'event and clk='l') then
Q <= D;
end if;
end process;
end arqreg;
Listado 4 . 2
Ejemplo 4.2
Figura E 4 . 2
Solucin
Como puede observarse en la tabla que describe el comportamiento del circuito, si CLR = 0, las salidas Q adoptan el valor de 0; pero si CLR 1, toman el valor de las entradas DO, DI, D2 y D3.
100
CLR
QN
Dn
Dn
Dn
1 library ieee;
2 use ieee.std_logic_1164.all;
3 entity reg4 is port(
4
D: in std_logic_vector(3 downto 0);
5 CLK,CLR: in std_logic;
6
Q/Qn: inout std_logic_vector(3 downto 0));
7 end reg4 ;
8 architecture a_reg4 of reg4 is
9 begin
10
process (CLK,CLR) begin
11
if (CLK'event and CLK ='1') then
12
if (CLR = '1' )then
13
Q <=
14
Qn <=
15
else
16
Q <=
17
Qn <=
18
end if ;
19
end if ;
20
end process;
21 end a_reg4;
D;
not Q;
"0000";
"1111";
Listado E4.2
JQl
4.4 Contadores
Los contadores son entidades muy utilizadas en el diseo lgico. La forma
usual para describirlos en VHDL es mediante operaciones de incremento,
decremento de datos o ambas.
Como ejemplo veamos la figura 4.6 que representa un contador ascendente de 4 bits, as como el diagrama de tiempos que muestra su funcionamiento.
Cabe mencionar que la presentacin del diagrama de tiempos de este circuito tiene la finalidad de ilustrar el procedimiento que se sigue en la programacin, ya que puede observarse con claridad el incremento que presentan
las salidas cuando se aplica un pulso de reloj a la entrada (listado 4.3).
library ieee;
use ieee.std_logic_1164.all ;
use work.std_ari th.all ;
entity cont4 is port (
elk: in std_logic;
Q: inout std_logic_vector(3 downto 0));
end cont4;
architecture arqeont of cont4 is
begin
process (elk)
begin
If (elk'event and elk = '1') then
Q <= Q + 1;
end if;
end process ;
end arqeont;
Listado 4.3 Cdigo que describe un contador de 4 bits.
102
Ejemplo 4.3
UP/DOWN
ACCION
Cuenta ascendente
Cuenta descendente
Solucin
La seal de control Up/Down permite definir si el conteo se realiza en sentido ascendente o descendente. En nuestro caso, un cero aplicado a esta seal
determina una cuenta ascendente: del 0 al 15. De esta forma, el funcionamiento del circuito queda determinado por dos seales: el pulso de reloj (clk)
y la seal Up/Down, como se ve en el siguiente programa.
JQl
library ieee;
use ieee.std_logic_1164.all ;
use work.std_arith.all;
entity contador is port (
clk: in std_logic;
UP:in std_logic;
Q: inout std_logic_vector(3 downto 0));
end contador;
architecture a_contador of contador is
begin
process (UP, clk) begin
if (clk'event and clk = 'l')then
if (UP = '0') then
Q <= Q+l;
else
Q <= Q-l;
end if ;
end if ;
end process ;
end a_contador;
Listado E4.3.
b)
Figura 4.7 a) Contador binario de cuatro bits, b) Tabla de funcionamiento.
104
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use work.std_arith.all;
4 entity cont is port(
5
P: in std_logic_vector(3 downto 0) ;
6
Clk,LOAD,ENP,RESET: in std_logic;
7
Q: inout std_logic_vector(3 downto 0));
8 end cont;
9 architecture arq_cont of cont is
10 begin
11
process (elk, RESET,LOAD, ENP) begin
12
if (RESET = '1') then
13
Q <= "0000";
14
elsif (elk'event and elk = '1') then
15
if (LOAD = '0' and ENP = '-') then
16
Q <= P;
17
elsif (LOAD = '!' and ENP = '0') then
18
19
Q <= Q;
elsif (LOAD = '1' and ENP = '1') then
20
Q <= Q + 1;
21
end if;
22
end if;
23
end process;
24 end arq_cont;
Diseo
lgico
secuencial
con
VHDL
JQl
Salidas
106
Salidas
Un sistema secuencial se desarrolla a travs de una serie de pasos generalizados que comprenden el enunciado del problema, diagrama de estados, tabla
de estados, asignacin de estados, ecuaciones de entrada a los elementos de memoria y diagrama electrnico del circuito.
Como ejemplo consideremos el diseo del siguiente sistema secuencial
(Fig, 4.10), en el cual se emite un pulso de salida Z ( Z = l ) cuando en la lnea de entrada (X) se reciben cuatro unos en forma consecutiva; en caso
contrario, la salida Z es igual a cero.
Diseo
lgico
secuencial
con
VHDL
JQl
Diagramas de estado
El uso de diagramas de estados en la lgica programable facilita de manera
significativa la descripcin de un diseo secuencial, ya que no es necesario
seguir la metodologa tradicional de diseo. En VHDL se puede utilizar un
modelo funcional en que slo se indica la transicin que siguen los estados
y las condiciones que controlarn el proceso.
De acuerdo con nuestro ejemplo (Fig. 4.12), vemos que el sistema secuencial se puede representar por medio del diagrama de estados de la figura 4.12a): arquitectura Mealy. En este diagrama se advierte que el sistema
cuenta con una seal de entrada denominada X y una seal de salida Z. En
la figura 4.12b) se muestra la tabla de estados que describe el comportamiento del circuito.
Cuando se est en el estado dO y la seal de entrada X es igual a uno, se
avanza al estado di y la salida Z durante esta transicin es igual a cero; en
caso contrario, cuando la entrada X es igual a cero, el circuito se mantiene
en el estado dO y la salida tambin es cero (Fig. 4.11).
Edo. presente
dO
d1
d2
d3
Edo. futuro
X=0 X=1
dO
d1
d1
d2
d2
d3
dO
d3
Salida Z
X=0 X=1
0
0
0
0
0
0
0
1
b)
Figura 4.12 a) Diagrama de Estados, b) Tabla de estados.
108
2 Se llaman tipos enumerados porque en ellos se agrupan o enumeran elementos que pertenecen a un mismo
gnero.
Diseo
lgico
secuencial
con
VHDL
JQl
1 library ieee;
2 use ieee.std_logic_1164 . all;
3 entity diagrama is port(
4 clk,x: in std_logic;
5
z: out std_logic) ;
6 end diagrama;
7 architecture arq_diagrama of diagrama is
8
type estados is (dO, di, d2, d3);
9
signal edo_presente, edo_futuro: estados;
10
begin
11
procesol: process (edo_presente, x) begin
12
case edo__presente is
13
when dO => z <= '0';
14
if x =' 1' then
15
edo_futuro <= di;
16
else
17
edo_futuro <= dO;
18
end if;
19
when di => z <='0';
20
if x='l' then
21
edo_futuro <= d2;
22
else
23
edo_futuro <= di;
24
end if;
25
when d2 => z <='0';
26
if x='l' then
27
edo_futuro <= d3;
28
else
29
edo_futuro <= dO;
30
end if;
Contina
110
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
when d3 =>
if x='l' then
edo_futuro <= dO;
z <='1';
else
edo_futuro <= d3;
z <= '0';
end if;
end case;
end process procesol;
proceso2: process(clk) begin
if (clk'event and clk='l') then
edo_presente <= edo_futuro;
end if;
end process proceso2;
end arq_diagrama ;
Ejemplo 4 . 4
Solucin
Por ejemplo, en la figura E4-4 notamos que el circuito pasa al estado ql con el
primer 1 de entrada y al estado q2 con el segundo. Las salidas asociadas con estas dos entradas son 0, segn se seala. La tercera entrada consecutiva de 1 genera un 1 en la salida y hace que el circuito pase al estado q3. Una vez que se
encuentra en q3, el circuito permanecer en este estado, emitiendo salidas 0.
Diseo
lgico
secuencial
con
VHDL
JQl
library ieee;
use ieee.std_logic_1164.all;
entity diag is port (
clk,x: in std_logic;
z: out std_logic);
end diag;
architecture arq_diag of diag is
type estados is (q0,ql/q2,q3/q4);
signal edo_pres, edo_fut: estados;
begin
procesol: process (edo_pres,x) begin
case edo_pres is
when qO => z <= ' 0';
if x = '0' then
edo_fut <= q4;
else
edo_fut <= ql;
end if;
when ql => z <= '0';
if x = '0' then
edo_fut <= q4;
else
edo_fut <= q2;
end if;
when q2 =>
if x = '0' then
edo_fut <= q4;
z <= '0';
else
edo_fut <= q3;
z <= '1';
end if;
when q3 => z <= '0';
if x = '0' then
Contina
112
Listado E4.4.
Diseo
lgico
secuencial
con
VHDL
JQl
Ejercicios
Flip-Flop
4.1 Realice un programa en VHDL que describa el funcionamiento del flipflop tipo JK. Auxliese para su descripcin con la tabla caracterstica del
Flip-Flop.
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
Qt+i
0
1
0
0
1
1
1
0
4.2. Realice un programa en VHDL que describa el funcionamiento del flipflop tipo T. Auxliese para su descripcin con la tabla caracterstica del
Flip-Flop.
T
Qt+i
0
0
1
1
0
1
0
1
0
1
1
0
Registros
4.3. Disee un registro de 4 bits como el mostrado en la siguiente figura y
cuyo funcionamiento se encuentra regulado por las seales de control
SO y S I , tal y como se muestra en la siguiente tabla:
114
SO
0
0
1
1
CLK=
SO, S1 =
DO...03=
RST=
Q0...Q3 =
L=
R=
SI
0
1
0
1
ACCION
Hold (Reten)
Desplazamiento Izquierda SL
Load (Carga)
Desplazamiento Derecha SR
Reloj
Seales de control
Entradas de datos
Reset,
Salida de datos
Entrada serie desplazamiento a la izquierda
Entrada serie desplazamiento a la derecha.
4-4 En la figura siguiente se muestra el esquema lgico de un registro de desplazamiento con entrada serie/ paralelo y salida serie. Realice un programa en VHDL que realice la misma funcin.
Diseo
lgico
secuencial
con
VHDL
JQl
Contadores
4.6
Disee y programe un contador que realice la secuencia 0,1,3, 5 y repita el ciclo. El circuito debe contar con una seal de reset activo en bajo, que coloca las salidas Q en estado bajo.
4.7
J 116
4.8
4.9
4.10 En la siguiente figura se muestra el cronmetro digital configurado para contar del 0 al 99 mediante dos contadores SN 7493 conectados en
cascada. Realice un programa en V H D L que cuente del 0 al 99.
4-11
Diseo
Sistemas
lgico
secuencial
con
VHDL
JQl
secuenciales
4.13
J118
Los tiempos de duracin de las luces del semforo son: rojo 20 segundos, verde
20 segundos, mbar 5 segundos.
Proponga el diagrama de estados correspondiente y realice el programa
del sistema secuencial.
4.15 El semforo mostrado en la figura del ejercicio de la pgina 117 ha sido
modificado tal y como se muestra en la siguiente figura.
Se requiere agilizar la entrada y salida de vehculos por medio de sensores (S) que detectan la entrada o salida de ellos. Generalmente el semforo
EO siempre se encuentra en verde y en contraparte el semforo NS est en
Diseo
lgico
secuencial
con
VHDL
JQl
rojo; cuando alguno de los sensores detecta la entrada o salida del vehculo
enva una seal al sistema que gobierna el semforo para que ste realice la
secuencia siguiente:
110011.
4-17 Programe un detector de secuencia cuya salida Z= 11011111 cuando
aplicamos a la entrada la secuencia X= 01101010.
4.18 Realice el programa correspondiente al sistema secuencial especificado
en la siguiente tabla.
X=0
X=1
Futuro
Presente
A
B
C
D
E
B/0
A/1
B/0
C/0
D/l
E/0
C/l
C/l
E/0
A/0
B001
C010
D 011
E 100
J120
4.19 Realice el programa de un contador ascendente /descendente de nmeros seudo aleatorios de 3 bits. El circuito tiene una entrada de
control X .Cuando X = 0 , el contador cuenta ascendente , si X = 1 el
contador genera nmeros seudo aleatorios, tal y como se muestra en
la tabla.
Presente
0
1
2
3
4
5
6
7
X=0
X=1
Futuro
1
2
3
4
5
6
7
0
0
4
5
1
2
6
7
3
4.20 Programe el sistema secuencial correspondiente a una mquina despachadora de refrescos, el valor del refresco es de $ 5.00 pesos y la mquina acepta monedas de $5.00, $ 10.00 y $ 20.00. Cuando se introduce una
moneda de diez o veinte pesos, la mquina debe dar cambio en monedas
de $5.00 pesos hasta completar el cambio correspondiente.
Para realizar este programa no considere el sistema detector de monedas ni el sistema de servicio encargado de dar el refresco.
Programe exclusivamente el sistema secuencial encargado de controlar la secuencia descrita anteriormente.