Está en la página 1de 10

DISEÑO DIGITAL

ESTILO ALGORÍTMICO PARA EL DISEÑO E


IMPLEMENTACIÓN DE CIRCUITOS
COMBINACIONALES Y SECUENCIALES

S. Zarate

ESTILO ALGORITMICO

El estilo algorítmico describe el diseño del circuito o sistema digital de acuerdo a su


comportamiento. Se basa en una sentencia concurrente llamada Process. La sentencia
process permite describir secuencialmente el modo en que se calculan un conjunto de
señales.
UNFV – FIEI S. Digital

Tiene las siguientes características:


 El código de un proceso se ejecuta en tiempo de simulación 0.
 Es el método de descripción de conductas más versátil.
 Es el método de descripción más cercano al modelo de simulación y más lejano del
modelo de hardware.
 Conceptualmente es muy importante ya que el proceso de análisis convierte el
resto de sentencias concurrentes a un conjunto de procesos equivalentes.
 El número de procesos es fijo, sólo cambia su estado: activo o suspendido.
 Inicialmente todos los procesos están activos, conforme su código se ejecuta se
suspende, conforme la simulación avanza alterna su estado entre activo o
suspendido.

Sintácticamente existen dos tipos:


 Procesos con lista de sensibilidad (cuyo cuerpo no puede contener sentencias wait)
- Cada vez que hay un evento en cualquiera de las señales de la lista, el proceso
se activa.
- Se ejecuta (en tiempo de simulación 0) todo el código contenido en el cuerpo
del proceso.
- El proceso se suspende.

Sintaxis:
[etiqueta:]
process (lista de sensibilidad)
[declaraciones]
begin
[sentencias secuenciales;]
end process [etiqueta];

 Procesos sin lista de sensibilidad (cuyo cuerpo puede contener sentencias wait).
- Se ejecuta (en tiempo de simulación 0) hasta que se encuentre una sentencia
wait
- El proceso se suspende.
- El proceso se vuelve a activar cuando la condición de espera se satisfaga.
- Cuando la ejecución alcanza el final del cuerpo del proceso, se continúa
ejecutando el código por el principio.
- Un proceso sin lista de sensibilidad que no contenga sentencias wait, bloquea el
simulador.

Sintaxis:
[etiqueta:] process
[declaraciones]
begin
[sentencias secuenciales;]
wait on lista de sensibilidad;
end process [etiqueta];

 Los procesos con lista de sensibilidad se usan comúnmente para modelar HW


a nivel de RT y lógico:

Cátedra: SZJ 2
UNFV – FIEI S. Digital

- Con listas de sensibilidad completas para modelar hardware combinacional.


- Con listas de sensibilidad parciales para modelar hardware secuencial.

 Los procesos sin listas de sensibilidad se usan comúnmente para crear procesos de
estímulo y de análisis de respuesta de otras sentencias que si modelan HW.
- Si se restringe el tipo de sentencias wait usadas, pueden utilizarse para modelar
hardware a nivel algorítmico.

 Para todo proceso con lista de sensibilidad existe un proceso sin ella equivalente

 Lo contrario no siempre es cierto.

IMPLEMENTACION DE CIRCUITOS SECUENCIALES

Los elementos de memoria se implementan con la sentencia if, aprovechando el efecto


memoria que tiene debido al no uso de la condición else. Analicemos el siguiente código
VHDL:

Process(A,B)
begin
If A=’1’ then
Q <= B;
else
Q <= ‘0’;
end if;
end process;

Es la implementación de una compuerta AND, se aprecia que si no se cumple la condición


de todas maneras debe haber una asignación a la señal de salida.

Cátedra: SZJ 3
UNFV – FIEI S. Digital

Ahora, volvamos a analizar el siguiente código VHDL:

Process(A,B)
begin
if A=’1’ then
Q <= B;
End if;
End process;

Es la implementación correspondiente a un latch donde A realiza la función del habilitador


y cuando se encuentre en nivel alto cualquier cambio de B hará que se refleje
directamente a la salida. Ahora, que pasa si A=’0’ y B cambia de valor, el Process se
dispara pero como la condición no se cumple no afecta a Q, memorizando de esta
manera el valor que tenía Q.

Es importante notar que las dos entradas del circuito están presentes en la lista sensible,
esto hará que cualquier cambio en A ó B hará que todo el proceso se dispare.

Ahora, analicemos el siguiente código VHDL:

Process(A)
begin
if A=’1’ then
Q <= B;
End if;
End process;

Es la implementación de un Flip – Flop que dispara por flanco de subida, donde la entrada
A hace la función de la señal de reloj y cada vez que A cambie de valor sólo en el flanco
de subida hará que Q tome el valor de B, memorizando el valor de Q bajo cualquier otra
condición. Note que las sentencias del proceso es igual a la implementación anterior
(latch), la diferencia está en las señales que aparecen en la lista sensible, que en el último
caso es sensible sólo a la señal A.

- Implementación de un flip-flop tipo D

Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;

Entity ff_d is
Port ( D: in std_logic;
Clk: in std_logic;
Q: out std_logic);
End ff_d;

Architecture algoritmo of ff_d is

Cátedra: SZJ 4
UNFV – FIEI S. Digital

Begin
Process(clk)
Begin
If clk=’1’ then
Q <= D;
End if;
End process;
End algoritmo;

- Implementación de un contador binario de 4 bits.

Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;

Entity contador is
Port ( clk: in std_logic;
q: buffer std_logic_vector (3 downto 0));
End contador;
Architecture of algoritmo of contador is
Begin
Process(clk)
begin
if clk=’1’ and clk’event then
q <= q + 1;
end if;
end process;
end algoritmo;

- Implementación de un contador binario de 4 bits con una señal clear asíncrona y


una señal up síncrona.

Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity contador is
Port ( clk: in std_logic;
q: buffer std_logic_vector (3 downto 0);
clear: in atd_logic;
up: in std_logic);
End contador;
Architecture of algoritmo of contador is
Begin
Process(clk,clear)
Begin
If clear = ‘1’ then
q <= “0000”;
elsif clk=’1’ and clk’event then
if up=’1’ then

Cátedra: SZJ 5
UNFV – FIEI S. Digital

q <= q + 1;
else
q <= q – 1;
end if;
end if;
end process;
end algoritmo;

Implemente, simule y explique el comportamiento de los siguientes circuitos en


el Max-Plus II (con cuenta a presentar en el informe final).

1. Latch
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity flip_flop is
Port ( d : in std_logic;
clk : in std_logic;
q : out std_logic);
end flip_flop;

architecture Behavioral of flip_flop is


begin
process(clk)
begin
if clk='1' then
q <= d;
end if;
end process;
end Behavioral;

2. Flip-Flop
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity flip_flop is
Port ( d : in std_logic;
clk : in std_logic;
q : out std_logic);
end flip_flop;

architecture Behavioral of flip_flop is


begin
process(clk)
begin
if clk='1' and clk'event then
q <= d;
end if;
end process;

Cátedra: SZJ 6
UNFV – FIEI S. Digital

end Behavioral;

3. Flip-Flop con clear y preset asíncronas.


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity flip_flop_cp is
Port ( clear : in std_logic;
preset : in std_logic;
clk : in std_logic;
d : in std_logic;
q : out std_logic);
end flip_flop_cp;

architecture Behavioral of flip_flop_cp is


begin
process(clk,clear,preset)
begin
if clear='1' then
q <='0';
elsif preset='1' then
q <='1';
elsif clk='1' and clk'event then
q <= d;
end if;
end process;
end Behavioral;

4. Registro de entrada/paralela-salida/paralela, carga y habilitador.


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

Cátedra: SZJ 7
UNFV – FIEI S. Digital

entity registro_pipo is
Port ( data : in std_logic_vector(7 downto 0);
load : in std_logic;
clk : in std_logic;
q : out std_logic_vector(7 downto 0));
end registro_pipo;

architecture Behavioral of registro_pipo is


begin
process(clk,load)
begin
if clk='1' and clk'event then
if load='1' then
q <= data;
end if;
end if;
end process;
end Behavioral;

5. Contador binario con señal


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity contador is
Port ( clk : in std_logic;
q : buffer std_logic_vector(3 downto 0));
end contador;

architecture Behavioral of contador is


begin
process(clk)
begin
if clk='1' and clk'event then
q <= q + 1;
end if;
end process;
end Behavioral;

Cátedra: SZJ 8
UNFV – FIEI S. Digital

Contador binario con variable


process(clk)
variable contador: std_logic_vector(3 downto 0);
begin
if clk='1' and clk'event then
contador := contador + 1;
q <= contador;
end if;
end process;

6. Contador binario con clear y carga de datos en paralelo.


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity contador_clear_load is
Port ( data : in std_logic_vector(3 downto 0);
load : in std_logic;
clear : in std_logic;
clk : in std_logic;
q : out std_logic_vector(3 downto 0));
end contador_clear_load;

architecture Behavioral of contador_clear_load is

begin
process(data,load,clear,clk)
variable contador: std_logic_vector(3 downto 0);
begin
if clear='1' then
contador := "0000";
elsif load ='1' then
contador := data;
elsif clk='1' and clk'event then
contador := contador + 1;
end if;
q <= contador;
end process;

end Behavioral;

7. Divisor de frecuencia de 50MHz a 1Hz


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity DIV_1HZ is
Port ( clk : in std_logic;
reloj : buffer std_logic);
end DIV_1HZ;

architecture Behavioral of DIV_1HZ is


begin
process(clk)
variable cuenta: std_logic_vector(24 downto 0);

Cátedra: SZJ 9
UNFV – FIEI S. Digital

begin
if clk='1' and clk'event then
cuenta:= cuenta+1;
if cuenta = 25000000 then
reloj <= not reloj;
end if;
end if;
end process;
end Behavioral;

Prolemas propuestos:

8. Implemente un contador con ENABLE y CLEAR que cuente de 0 a 5.

9. Implemente un contador con ENABLE y CLEAR que cuente de 4,7,0,1,5,


4,7,0,1,5,…….

10. Implemente un divisor de frecuencia programable:


Selector Fo
00  Fi / 2
01  Fi / 4
10  Fi / 8
11  Fi / 32
Donde:
Fi: frecuencia de entrada.
Fo: frecuencia de salida.

11. Implemente un contador con control de cuenta UP/DOWN de módulo 8.

12. Implemente el siguiente circuito:

Donde: f
Donde la señal Y varia de frecuencia de manera periódica. Así tenemos
que durante 100ms genera una señal de 100KHz y durante el otro
100ms genera otra frecuencia de 300KHz, repitiéndose de esta manera.

 Se debe presentar el código y las simulaciones correspondientes a los


problemas propuestos.

Cátedra: SZJ 10