Está en la página 1de 25

Cap.4 – VHDL: Diseño Lógico Secuencial ¿Qué es el Diseño Lógico Secuencial?

Estructura
Estructura de
de un
un Sistema
Sistema Lógico
Lógico Secuencial
Secuencial

Clasificación
Clasificación
Entradas Salidas
Asíncronos
Lógica Entradas Salidas

de Memoria

de Memoria
Elementos

Elementos
Combinatoria Síncronos
Lógica
Combinatoria
Señal de Señal de
Reloj Elementos Reloj
de Memoria

Señal de
Mixtos Reloj
Entradas Salidas
de Memoria

de Memoria
Elementos

Elementos
Lógica
Combinatoria

Señal de Elementos Señal de


Reloj de Memoria Reloj

Señal de
Reloj
Cap.4 – VHDL: Diseño Lógico Secuencial Elementos de Memoria: flip-flops

Elementos de Memoria: Flip-Flops

S Q J Q D Q T Q

R Q K Q Q Q

clk clk clk clk

S R Qt Qt+1 J K Qt Qt+1
0 0 0 0 0 0 0 0 D Qt Qt+1 T Qt Qt+1
0 0 1 1 0 0 1 1 0 0 0 0 0 0
0 1 0 0 0 1 0 0 0 1 0 0 1 1
0 1 1 0 0 1 1 0 1 0 1 1 0 1
1 0 0 1 1 0 0 1 1 1 1 1 1 0
1 0 1 1 1 0 1 1
1 1 0 X 1 1 0 1
1 1 1 X 1 1 1 0
Cap.4 – VHDL: Diseño Lógico Secuencial Elementos de Memoria: flip-flops

En
En el
el Diseño
Diseño Secuencial
Secuencial con
con VHDL,
VHDL, las
las construcciones:
construcciones:
if-then-else
if-then-else // if-then-elsif-then
if-then-elsif-then son
son las
las más
más utilizadas.
utilizadas.

D Q Ejemplo Nº 1 – Flip-Flop tipo D


library ieee;
use ieee.std_logic_1164.all;
entity ffd is
clk
port (D, clk: in std_logic;
D Qt Qt+1 Q: out std_logic);
0 0 0 end ffd;
0 1 0 architecture arq_ffd of ffd is
1 0 1 begin
1 1 1 process (clk)
begin
Instrucciones equivalentes:
if (clk’event and clk=‘1’) then
if rising_edge(clk) – verdadero con el flanco de subida
Q <= D;
if ( clk’event and clk= ’1’ and clk’last_value= ’0’ )
end if;
if falling_edge(clk) – verdadero con el flanco de bajada end process;
if ( clk’event and clk= ’0’ and clk’last_value= ’1’ ) end arq_ffd;
Cap.4 – VHDL: Diseño Lógico Secuencial Elementos de Memoria: flip-flops

S R Qt Qt+1
0 0 0 0 S Q
0 0 1 1
0 1 0 0
0 1 1 0 R Qn
1 0 0 1 clk
1 0 1 1
1 1 0 X
if (S = ‘0’ and R = ‘1’) then
1 1 1 X
Q <= ‘0’;
Qn <= ‘1’;
Ejemplo Nº 2 – Flip-Flop tipo RS elsif (S = ‘1’ and R = ‘0’) then
library ieee; Q <= ‘1’;
use ieee.std_logic_1164.all; Qn <= ‘0’;
entity ffsr is elsif (S = ‘0’ and R = ‘0’) then
port (S, R, clk: in std_logic; Q <= Q;
Q, Qn: inout std_logic); Qn <= Qn;
end ffsr; else
architecture a_ffsr of ffsr is Q <= ‘-’;
begin Qn <= ‘-’;
end if;
process (clk, S, R)
end if;
begin
end process;
if (clk’event and clk=‘1’) then
end a_ffsr;
Cap.4 – VHDL: Diseño Lógico Secuencial Registros

Ejemplo Nº 3 – Registro Paralelo de 8-Bits


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 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=‘1’) then
Q <= D;
end if;
end process;
end arqreg;
Cap.4 – VHDL: Diseño Lógico Secuencial Registros

Ejemplo Nº 4 – Registro Paralelo de 4-Bits con ‘Clear’


library ieee;
use ieee.std_logic_1164.all;
entity reg4 is
CLK Q0
port (D: in std_logic_vector (3 downto 0);
CLR Q0
CLK, CLR: in std_logic;
Q1
Q, Qn: out std_logic_vector (3 downto 0));
Q1
D0 end reg4;
Q2
D1 architecture a_reg4 of reg4 is
Q2
D2 begin
Q3
D3 process (CLK, CLR) begin
Q3
if (CLK’event and CLK=‘1’) then
if (CLR = ‘1’) then
Q <= D;
CLR D Q Qn Qn <= not D;
else
0 ‘-’ 0 1
Q <= “0000”;
1 D D Dn Qn <= “1111”;
end if;
end if;
end process;
end a_reg4;
Cap.4 – VHDL: Diseño Lógico Secuencial Contadores

clk Contador
Q3 Q2 Q1 Q0

clk

Q0

Q1

Q2

Q3

Diagrama
Diagrama de
de tiempo
tiempo del
del contador
contador de
de 44 bits
bits
Cap.4 – VHDL: Diseño Lógico Secuencial Contadores

Ejemplo Nº 5 – Contador de 4-Bits


library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity cont4 is
port (clk: in std_logic;
Q: inout std_logic_vector (3 downto 0));
end cont4;
architecture arqcont of cont4 is
begin
Es verdadera con el flanco de bajada de clk
process (clk)
begin
if (clk’event and clk = ‘0’) then
Q <= Q +1;
end if;
end process;
end arqcont;
Cap.4 – VHDL: Diseño Lógico Secuencial Contadores

Ejemplo Nº 6 – Contador Ascendente/Descendente de 4-Bits


library ieee;
use ieee.std_logic_1164.all;
clk use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
UD Q3 Q2 Q1 Q0 entity contador is
port (clk: in std_logic;
UD: in std_logic;
Q: inout std_logic_vector (3 downto 0));
end contador;
architecture a_contador of contador is
begin
process (UD, clk) begin
UD Acción
if (clk’event and clk = ‘1’) then
0 Cuenta Ascendente if (UD = ‘0’) then
1 Cuenta Descendente Q <= Q +1;
else
Q <= Q -1;
end if;
end if;
end process;
end a_contador;
Cap.4 – VHDL: Diseño Lógico Secuencial Contadores

Ejemplo Nº 7 – Contador de 4-bits con reset y carga en paralelo


library ieee;
P3 P2 P1 P0 use ieee.std_logic_1164.all;
Reset use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;
clk entity cont is
port (P: in std_logic_vector (3 downto 0);
Q3 Q2 Q1 Q0 clk, Load, Enp, Reset: in std_logic;
Enp Load
Q: inout std_logic_vector (3 downto 0));
end cont;
architecture arq_cont of cont is
begin
process (clk, Reset, Load, Enp) begin
if (Reset = ‘1’) then
Operación Asíncrona
Q <= “0000”;
Enp Load Acción
elsif (clk’event and clk = ‘1’) then
0 0 Carga if (Load = ‘0’ and Enp = ‘-’) then
0 1 Mantiene Estado Q <= P;
elsif (Load = ‘1’ and Enp = ‘0’) then
1 0 Carga Q <= Q;
1 1 Cuenta elsif (Load = ‘1’ and Enp = ‘1’) then
Q <= Q + 1;
end if;
end if;
end process;
end arq_cont;
Cap.4 – VHDL: Diseño Lógico Secuencial Máquinas Secuenciales

Salidas
Entradas Lógica Lógica
Registros
Combinatoria Combinatoria

Máquina
Máquina de
de Mealy
Mealy con
con Salidas
Salidas
Asíncronas
Asíncronas

Salidas
Entradas Lógica Lógica
Registros Registros
Combinatoria Combinatoria

Máquina
Máquina de
de Mealy
Mealy con
con Salidas
Salidas
Síncronas
Síncronas
Cap.4 – VHDL: Diseño Lógico Secuencial Máquinas Secuenciales

Ejemplo
Ejemplo Nº
Nº 88

Representación
Representación de
de una
una Máquina
Máquina de
de Mealy
Mealy

0/0

Estado Entrada X
B Presente 0 1
0/1
A B/1 C/0
1/1
B B/0 A/1
C A/0 C/0
1/0
A C 1/0

0/0 Próximo Estado / Salida Y


Cap.4 – VHDL: Diseño Lógico Secuencial Máquinas Secuenciales

Entradas
Salidas
Lógica Lógica
Registros
Combinatoria Combinatoria

Máquina
Máquina de
de Moore
Moore con
con Salidas
Salidas
Asíncronas
Asíncronas

Salidas
Entradas Lógica
Registros
Combinatoria

Máquina
Máquina de
de Moore
Moore con
con Salidas
Salidas
Síncronas
Síncronas
Cap.4 – VHDL: Diseño Lógico Secuencial Máquinas Secuenciales

Ejemplo
Ejemplo Nº
Nº 99

Representación
Representación de
de una
una Máquina
Máquina de
de Moore
Moore

B/0

0 1 Estado Entrada X Salida Y


0 Presente (Para el Estado

1 0 1 Presente)

A B C 0
B C A 0
A/0 C/1
1 C C B 1
0

Próximo Estado
Cap.4 – VHDL: Diseño Lógico Secuencial Diseño de Sistemas Secuenciales Síncronos

Flujo de Diseño de una Máquina de Estados Finitos (FSM)


1 Dibujar el Diagrama de Transiciones de Estados.
2 Verificación del Diagrama de Estados:
•Asegurarse que todos los estados están representados.
•La función OR de todas las transiciones que dejan un estado = 1 (TRUE)
–Esto permite determinar si existe una salida (por lo menos) de un estado dado, una vez que se ha llegado a él.

•La función XOR de todas las transiciones-salida de un estado = 1 (TRUE)


–Esto asegura que no existan condiciones en conflicto que conduzcan a tener más de una transición de salida activas en forma simultánea.

3 Asignación de Estados.
4 Descripción del Comportamiento: Uso de Lenguajes de Descripción de Hardware
(HDL) – VHDL y Verilog
5 Compilación / Síntesis del Diseño – Generación de Lógica (Ecuaciones Lógicas) /
Asignación de Estados
6 Simulación Funcional
7 Implementación / Realización del Diseño: Realización de la Lógica con una
Tecnología y/o Dispositivos predefinidos, p.ej. Biblioteca de Celdas CMOS,
Lógica Comercial, PLDs/CPLDs/FPGAs (para estos dispositivos, esta fase se le
conoce como: ‘Mapping, Place & Route’), Microcontroladores, etc.
8 Simulación Temporizada
Cap.4 – VHDL: Diseño Lógico Secuencial Diseño de Sistemas Secuenciales Síncronos

Ejemplo
Ejemplo Nº
Nº 10
10

Circuito
Circuito Secuencial
Secuencial que
que detecta
detecta 4-Unos
4-Unos (1’s)
(1’s) consecutivos
consecutivos

0/0 1/0
0/0

1/0 1/0 1/0 1/1


d0 d1 d2 d3 d4
0/0
0/0 0/0

Edo. Futuro z (Salida)


Edo. Presente
x=0 x=1 x=0 x=1
d0 d0 d1 0 0
d1 d0 d2 0 0
d2 d0 d3 0 0
d3 d0 d4 0 1
d4 d0 d1 0 0
Cap.4 – VHDL: Diseño Lógico Secuencial Diseño de Sistemas Secuenciales Síncronos

¿Cómo
¿Cómo describir
describir oo declarar
declarar los
los estados
estados (usando
(usando VHDL)
VHDL) aa partir
partir del
del Diagrama
Diagrama de
de Estados?
Estados?

Para
Para entender
entender el
el proceso
proceso de
de declaración
declaración de
de los
los estados,
estados, se
se comprenderá
comprenderá primeramente
primeramente el
el
siguiente
siguiente grupo
grupo de
de declaraciones
declaraciones

type std_logic is (‘0’,’1’,‘U’,‘X’,‘Z’,‘W’,‘L’,‘H’,’-’);


signal x: std_logic;
signal y: std_logic_vector (3 downto 0);

x puede tener cualquiera de los valores:


‘0’,’1’,‘U’,‘X’,‘Z’,‘W’,‘L’,‘H’,’-’

y está formado por 4-bits, cada uno de los


cuales puede tener cualquiera de los valores:
‘0’,’1’,‘U’,‘X’,‘Z’,‘W’,‘L’,‘H’,’-’
Cap.4 – VHDL: Diseño Lógico Secuencial Diseño de Sistemas Secuenciales Síncronos

Así, ¿Cómo
¿Cómo son
son codificados:
codificados: d0,
d0, d1,
d1, d2,
d2, d3,
d3, d4?
d4?
Así, para
para declarar
declarar los
los estados
estados de
de una
una Máquina
Máquina
de
de Estados
Estados Finitos
Finitos se
se realiza
realiza lo
lo siguiente:
siguiente:
Tipos de Codificación
Valores que pueden tener el edo.presente y utilizados:
el edo.futuro en el ejemplo Nº 10:
•One-Hot
edo_presente edo_futuro •Compact
d0 d0 •Secuencial

estados
d1 d1 •Gray
d2 d2 000 d0
•Johnson
•Definido por Usuario 001 d1
d3 d3
010 d2
d4 d4
011 d3
Declaración de Estados en una FSM
El Número de Bits 100 d4
utilizados en la 101 101
type estados is (d0, d1, d2, d3, d4); codificación está en
función del 110 110
signal edo_presente, edo_futuro: estados; Número de Estados 111 111
(Tarea realizada
Donde:
por el Compilador
estados es el nombre o identificador dado por el usuario al conjunto de datos conformado
por d0, d1,d2 d3, d4. A este tipo de datos se le conoce como Tipo de Datos Enumerados o Sintetizador)*
edo_presente, edo_futuro son señales (signal) que pueden adquirir cualquiera de los
valores (d0, d1, d2, d3, d4) que describen al tipo de dato enumerado identificado con el
nombre de estados, es decir, edo_presente y edo_futuro son también datos del tipo
enumerado
Cap.4 – VHDL: Diseño Lógico Secuencial Diseño de Sistemas Secuenciales Síncronos

Ejemplo Nº 10 – Detector de Secuencia when d2=>


library ieee; if x = ‘1’ then
use ieee.std_logic_1164.all; edo_futuro <= d3;
entity diagrama is z <= ‘0’;
port (clk, x: in std_logic; else
z: out std_logic); edo_futuro <= d0;
end diagrama; z <= ‘0’;
end if;
architecture arq_diagrama of diagrama is when d3 =>
type estados is (d0, d1, d2, d3, d4); if x = ‘1’ then
signal edo_presente, edo_futuro: estados; edo_futuro <= d4;
z <= ‘1’;
begin else
proceso1: process (edo_presente, x) begin edo_futuro <= d0;
case edo_presente is z <= ‘0’;
when d0 => end if;
if x = ‘1’ then when d4 =>
edo_futuro <= d1; if x = ‘1’ then
z <= ‘0’; edo_futuro <= d1;
else z <= ‘0’;
edo_futuro <= d0; else
z <= ‘0’; edo_futuro <= d0;
end if; z <= ‘0’;
when d1 => end if;
if x = ‘1’ then end case;
edo_futuro <= d2; end process proceso1;
z <= ‘0’; proceso2: process (clk) begin
else if (clk’event and clk = ‘1’) then
edo_futuro <= d0; edo_presente <= edo_futuro;
z <= ‘0’; end if;
end if; end process proceso2;
end arq_diagrama;
Cap.4 – VHDL: Diseño Lógico Secuencial Diseño de Sistemas Secuenciales Síncronos

Ejemplo
Ejemplo Nº
Nº 11
11
0
Máquina
Máquina de
de Moore
Moore
S0/0

0
1

1
S1/1 S2/1
0

1 1

S3/0
0
Cap.4 – VHDL: Diseño Lógico Secuencial Diseño de Sistemas Secuenciales Síncronos

Ejemplo Nº 11 – Máquina de Moore


library ieee;
use ieee.std_logic_1164.all;
entity MOORE is
port (X, CLK: in std_logic; when S2=> Z <= ‘1’;
Z: out std_logic); if X = ‘0’ then
end MOORE; Edo_Fut <= S2;
architecture ARQ_MOORE of MOORE is else
type Estados is (S0, S1, S2, S3); Edo_Fut <= S3;
signal Edo_Pres, Edo_Fut: Estados; end if;
begin when S3 => Z <= ‘0’;
proceso1: process (Edo_Pres, X) begin if X = ‘0’ then
case Edo_Pres is Edo_Fut <= S3;
when S0 => Z<= ‘0’; else
if X = ‘0’ then Edo_Fut <= S1;
Edo_Fut <= S0; end if;
else end case;
Edo_Fut <= S2; end process proceso1;
end if; proceso2: process (CLK) begin
when S1 => Z <= ‘1’; if (CLK’event and CLK = ‘1’)
then
if X = ‘0’ then
Edo_Pres <= Edo_Fut;
Edo_Fut <= S0;
end if;
else
end process proceso2;
Edo_Fut <= S2;
end ARQ_MOORE;
end if;
Cap.4 – VHDL: Diseño Lógico Secuencial Diseño de Sistemas Secuenciales Síncronos

Ejemplo
Ejemplo Nº
Nº 12
12

0/0
Máquina
Máquina de
de Mealy
Mealy

S0

0/0
1/1

1/0
S1 S2
0/1
1/1 1/0

S3
0/0
Cap.4 – VHDL: Diseño Lógico Secuencial Diseño de Sistemas Secuenciales Síncronos
Ejemplo Nº 12 – Máquina de Mealy when S2=>
library ieee; if x = ‘0’ then
use ieee.std_logic_1164.all; z <= ‘1’;
entity MEALY is Edo_Fut <= S2;
port (clk, x: in std_logic; else
z: out std_logic); z <= ‘0’;
end MEALY; Edo_Fut <= S3;
architecture ARQ_MEALY of MEALY is end if;
type Estados is (S0, S1, S2, S3); when S3 =>
signal Edo_Pres, Edo_Fut: Estados; if x = ‘0’ then
begin z <= ‘0’;
proceso1: process (Edo_Pres, x) begin Edo_Fut <= S3;
case Edo_Pres is else
when S0 => z <= ‘1’;
if x = ‘0’ then Edo_Fut <= S1;
z <= ‘0’; end if;
Edo_Fut <= S0; end case;
else end process proceso1;
z <= ‘1’; proceso2: process (clk) begin
Edo_Fut <= S2; if (clk’event and clk = ‘1’) then
end if; Edo_Pres <= Edo_Fut;
when S1 => end if;
if x = ‘0’ then end process proceso2;
z <= ‘0’; end ARQ_MEALY;
Edo_Fut <= S0;
else
z <= ‘0’;
Edo_Fut <= S2;
end if;
Cap.4 – VHDL: Diseño Lógico Secuencial Diseño de Sistemas Secuenciales Síncronos

Ejemplo
Ejemplo Nº
Nº 13
13

1 1 1/1
q0/0 q1/0 q2 q3/0

0 0/0 1
1
0
q4/0 0

¿Qué tipo de Máquina es?

¿Es correcta su Descripción en VHDL?

¿Cumple las Reglas de Verificación de un Diagrama de Estados?


Cap.4 – VHDL: Diseño Lógico Secuencial Diseño de Sistemas Secuenciales Síncronos
when q2=>
if x = ‘0’ then
Ejemplo Nº 13 - Máquina Mixta edo_fut <= q4;
library ieee; z <= ‘0’;
use ieee.std_logic_1164.all; else
entity diag is edo_fut <= q3;
port (clk, x: in std_logic; z <= ‘1’;
z: out std_logic); end if;
end diag; when q3 => z <= ‘0’;
architecture arq_diag of diag is if x = ‘0’ then
type estados is (q0, q1, q2, q3, q4); edo_fut <= q3;
signal edo_pres, edo_fut: estados; else
begin edo_fut <= q3;
proceso1: process (edo_pres, x) begin end if;
case edo_pres is when q4 => z <= ‘0’;
when q0 => z<= ‘0’; if x = ‘0’ then
if x = ‘0’ then edo_fut <= q4;
edo_fut <= q4; else
else edo_fut <= q1;
edo_fut <= q1; end if;
end if; end case;
when q1 => z <= ‘0’; end process proceso1;
if x = ‘0’ then proceso2: process (clk) begin
edo_fut <= q4; if (clk’event and clk = ‘1’) then
else edo_pres <= edo_fut;
edo_fut <= q2; end if;
end if; end process proceso2;
end arq_diag;

También podría gustarte