Reloj Digital y Flip-Flops en VHDL
Reloj Digital y Flip-Flops en VHDL
ARQUITECTURA
RELOJ DIGITAL EN
VHDL
CATEDRÁTICO: Ing. Salvador German
INSTRUCTOR: Juan Albiñana
PRESENTADO POR:
Cruz Pérez, Francisco Javier CP09042
Segovia Salazar, Mario Alejandro SS12008
Hasta el momento, las actividades que se han venido presentado durante este tiempo,
han sido la aplicación de los sistemas digitales combinacionales. Se entiende lo anterior
como un dispositivo que reacciona solamente a sus puertas de entrada, hemos realizado
diversos circuitos que involucran los mismos; por ejemplo los clásicos de convertidores
BCD, los multiplexores, demultiplexores, codificadores, mostrar en un display de 7
segmentos el numero decimal correspondiente a su binario natural; entre otros. Todos los
anteriores se han analizado en función de sus salidas y solamente de esa forman se
pueden analizar. Ahora, introducimos un nuevo tipo de circuito, el cual lleva un análisis
muy diferente; que son los circuitos secuenciales. Estos, dependen no solo de sus entradas
de datos; sino que también de las salidas de ellos mismos o de otros sub elementos que
integra un circuito determinado. La aplicación de ellos son diversos, no bastara tan solo
ejemplificar los circuitos básicos en este reporte; basta con decir que los circuitos
secuenciales lo rodean los flip-flops. Por la naturaleza humana y su variedad de ideas, se
han creado diversos tipos de flip flops, para poder dar abasto a la creatividad del
diseñador de sistemas digitales. Y es obvio aceptar la idea que la aplicación tiene como
límite la imaginación humana. Aquí se presentan simulaciones de distintos flip-flops;
también se introducen los contadores y un ejercicio de aplicación diversa; que es la
creación de un reloj digital; basándonos en esta idea y aplicando los funcionamientos de
estos dispositivos para poder dar solución a los problemas planteados.
4
Objetivos
Simular los distintos circuitos secuenciales base en TINA, nos referimos a los tipos
de flip flops más importantes.
Analizar los flip flops y dar conclusiones sobre su funcionamiento.
Utilizar de una manera eficiente las particularidades de cada flip flop y usar sus
fortalezas de funcionamiento para dar solución a los problemas planteados.
Responder de una manera deductiva y basándonos en las experimentaciones de la
simulación de los circuitos planteados; preguntas de razonamiento que nos
ayudara a comprender de manera eficiente las cualidades de estos dispositivos,
Saber diferenciar los tipos de circuitos vistos hasta ahora (combinacional,
secuencial) y saber responder cuando se ocupara cada uno y en que circunstancia.
5
Marco Teórico
Contador
Registros
FLIP FLOPS
Un biestable (flip-flop en inglés), es un multivibrador capaz de permanecer en uno de dos
estados posibles durante un tiempo indefinido en ausencia de perturbaciones.1 Esta
característica es ampliamente utilizada en electrónica digital para memorizar información.
El paso de un estado a otro se realiza variando sus entradas. Dependiendo del tipo de
dichas entradas los biestables se dividen en:
6
Un biestable puede usarse para almacenar un bit. La información contenida en muchos
biestables puede representar el estado de un secuenciador, el valor de un contador, un
carácter ASCII en la memoria de un ordenador, o cualquier otra clase de información. Un
uso corriente es el diseño de máquinas de estado finitas electrónicas. Los biestables
almacenan el estado previo de la máquina que se usa para calcular el siguiente.
El T es útil para contar. Una señal repetitiva en la entrada de reloj hace que el biestable
cambie de estado por cada transición alto-bajo si su entrada T está a nivel 1. La salida de
un biestable puede conectarse a la entrada de reloj de la siguiente y así sucesivamente. La
salida final del conjunto considerado como una cadena de salidas de todos los biestables
es el conteo en código binario del número de ciclos en la primera entrada de reloj hasta
un máximo de 2n-1, donde n es el número de biestables usados. Uno de los problemas
con esta configuración de contador (ripple counter en inglés) es que la salida es
momentáneamente inválida mientras los cambios se propagan por la cadena justo
después de un flanco de reloj. Hay dos soluciones a este problema. La primera es
muestrear la salida sólo cuando se sabe que esta es válida. La segunda, más compleja y
ampliamente usada, es utilizar un tipo diferente de contador síncrono, que tiene una
lógica más compleja para asegurar que todas las salidas cambian en el mismo momento
predeterminado, aunque el precio a pagar es la reducción de la frecuencia máxima a la
que puede funcionar.
Una cadena de biestables T como la descrita anteriormente también sirve para la división
de la frecuencia de entrada entre 2n, donde n es el número de biestables entre la entrada
y la última salida. Los biestables síncronos son propensos a sufrir un problema
denominado metaestabilidad, que ocurre cuando una entrada de datos o de control está
cambiando en el momento en el que llega un flanco de reloj. El resultado es que la salida
puede comportarse de forma imprevista, tardando muchas veces más de lo normal en
estabilizarse al estado correcto, o incluso podría oscilar repetidas veces hasta terminar en
su estado estable. En un ordenador esto puede suponer la corrupción de datos o causar
un fallo de programa.
7
Desarrollo de Circuitos
Antes de empezar el desarrollo de los circuitos propuestos, cabe mencionar que hasta
este punto, sería un poco redundante explicar los pasos específicos a realizarse en el
software TINA. Tres tareas han sido suficientes y hemos comprendido los aspectos
básicos, por lo que para este último reporte que concierne a la materia Sistemas Digitales
solo haremos mención de lo que se hará y lo que se ocupara, damos como versado al
lector el conocimiento del manejo de TINA por lo que le será de fácil entendimiento los
pasos intermedios que no se presentaran aquí.
Para este circuito, tomaremos como referencia el documento entregado en clases, con las
diferentes tablas de excitación y entrada. Específicamente hablando, a continuación
presentamos las tablas que describen el comportamiento del flip flop JK:
1
Son las mencionadas en el documento de indicaciones de esta tarea.
8
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity jk is
port (
clear: in bit;
set: in bit;
J: in bit;
K: in bit;
CLK: in bit;
Q: out bit;
Q_negado: out bit );
end jk;
architecture arch_1 of jk is
signal estado: bit;
begin
process (CLK,clear,set)
begin
if (set='0' and clear='1') then estado <='0';
elsif (set='1' and clear='0') then estado <='1';
elsif CLK='1' then
if (J='0' and K='1') then estado <='0';
elsif (J='1' and K='0') then estado <='1';
elsif (J='1' and K='1') then estado <= not estado;
end if;
end if;
end process;
Q <= estado;
Q_negado <= not estado;
end arch_1;
Hecho esto, simulamos el macro utilizando este código para observar el funcionamiento.
Este FF es uno de los más usados en los circuitos digitales, y de hecho es parte
fundamental de muchos circuitos avanzados como contadores y registros de corrimiento,
que ya vienen integrados en un chip. Este FF cuenta con dos entradas de datos J y K, su
función es en principio la misma que el Registro básico NAND o NOR, pero con la
diferencia que la condición en las entradas J = 1, K = 1, a diferencia del Registro NAND, que
generaría una salida errónea o no deseada, en un FF J-K, obliga a las salidas a conmutar su
estado al opuesto (Toggle) a cada pulso del reloj. Esto lo convierte en un tipo de FF muy
versátil.
9
Hecho eso, mostramos la correcta conexión del circuito en TINA:
Anteriormente se mencionó el funcionamiento una breve aplicación de este flip flop, por
lo que ahora mostramos los resultados que se obtienen.
10
Estos resultados, son los esperados.
11
Flip-flop RS con entradas adicionales SET y RESET.
Tomando en consideración las tablas respectivas a este flip flop:, que mostramos a
continuación:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity sr is
PORT (
clear: in bit;
set: in bit;
S: in bit;
R: in bit;
CLK: in bit;
Q: out bit;
Q_negado: out bit );--esto es Q negado
12
end sr;
architecture arch_1 of sr is
signal estado: bit;
BEGIN
process (CLK,clear,set)
begin
if (set='0' and clear='1') then estado <='0';
elsif (set='1' and clear='0') then estado <='1';
elsif CLK='1' then
if (S='0' and R='1') then estado <='0';
elsif (S='1' and R='0') then estado <='1';
elsif (S='1' and R='1') then estado <= not estado;
end if;
end if;
end process;
Q <= estado;
Q_negado <= not estado;
end arch_1;
Es de notar que las condiciones if-else facilitan la programación, puesto que solo se le ha
dicho al dispositivo que reaccione cuando las condiciones de las sentencias mismas se
cumplan, de lo contrario el no reaccionara, esto es muy indispensable ya que no es
necesario programar todas las combinaciones posibles y determinar cuál de ellas es la que
necesitamos. Rápidamente, creamos nuestro nuevo Macro Wizard en TINA, y mostramos
la forma correcta de conexión:
Paso siguiente, iniciamos la simulación de nuestro dispositivo y estos son los resultados
que obtuvimos:
13
14
15
Es un poco difícil mostrar el cambio en solo tres imágenes, para dar solución a esto;
mostramos a continuación los gráficos de pulso de este dispositivo; que nos dará una
mejor visión de lo que está sucediendo:
Usando lo anterior, procedemos a crear nuestro código en VHDL, usando las librerías
aprendidas en la guía de información proporcionada para la realización de esta tarea:
16
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity d is
port (
clear: in bit;
set: in bit;
D: in bit;
CLK: in bit;
Q: out bit;
Q_negado: out bit );
end d;
architecture arch_1 of d is
signal estado: bit;
begin
process (CLK,clear,set)
begin
if (set='0' and clear='1') then estado <='0';
elsif (set='1' and clear='0') then estado <='1';
elsif CLK='1' then
Q <= D;
end if;
end process;
Q <= estado;
Q_negado <= not estado;
end arch_1;
17
Es bueno señalar una pequeño detalle, si ponemos atención a la conexión; las entradas
clear, set y d, varían muy diferente en el tiempo; si estas tres entradas tienen la misma
frecuencia, no se lograra apreciar su comportamiento mientras esté conectado; por lo que
sus frecuencias fueron establecidas de esa forma. Sin más que agregar, mostramos los
resultados de nuestra simulación:
18
Nuevamente, es demasiado difícil mostrar el comportamiento ya que va variando en el
tiempo, por lo que resulta mas fácil mostrarlo en una grafico de onda cuadrada: que
presentamos a continuación:
19
Contador síncrono UP/DOWN MOD 10
Hasta el momento, hemos nada más simulado lo que son los flip flops en si, pero ahora
mostramos una aplicación de los mismos, que son los contadores. Estos dispositivos, valga
la redundancia, cuentan en diferentes secuencias que el diseñador establezca para su
beneficio. En este caso específico, un contador UP and DOWN MOD 10, nos indica lo
siguiente:
20
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity mod10 is port(
clr, clk, ctrl: in std_logic;
QD, QC, QB, QA: out std_logic);
end mod10;
architecture arch_1 of mod10 is
signal pre_q: unsigned(3 downto 0);
begin
process (clk, clr)
begin
if ctrl = '0' then
if clr = '1' then pre_q <= "0000";
elsif clk = '1' then
if (pre_q = "1001") then
pre_q <= "0000";
else pre_q <= pre_q + 1;
end if;
end if;
else
if clr = '1' then pre_q <= "1001";
elsif clk = '1' then
if (pre_q = "0000") then
pre_q <= "1001";
else pre_q <= pre_q - 1;
end if;
end if;
end if;
end process;
QA <= pre_q(0);
QB <= pre_q(1);
QC <= pre_q(2);
QD <= pre_q(3);
end arch_1;
21
Creamos nuestro elemento en TINA usando el código anterior y a continuación mostramos
su correcta conexión:
22
23
Flip-flop T con entradas SET y RESET
No hay otra forma de realizar nuestro código para simular el funcionamiento de este flip
flop, que el uso de las tablas de excitación y de entrada para comprender y analizarlo de
manera eficiente para poder programarlo virtualmente, nos basamos en esto y las
mostramos a continuación:
FLIP - FLOP "T"
Tabla de
Tabla de excitación entrada
CLK T Q* Q Q* T
0 X Q 0 0 0
1 0 Q 0 1 1
1 1 Q́ 1 0 1
1 1 0
24
begin
process (CLK,clear,set)
begin
if (set='0' and clear='1') then estado <='0';
elsif (set='1' and clear='0') then estado <='1';
elsif CLK='1' then
if (CLK='1' and T='1') then estado <= not estado;
end if;
end if;
end process;
Q <= estado;
Q_negado <= not estado;
end arch_1;
Luego de esto, de nuevo simulamos nuestro circuito utilizando los micros de TINA. Hecho
eso, mostramos la forma correcta de conectarlo:
Cabe mencionar lo siguiente, las entradas clear set y T, poseen una frecuencia de pulso
diferentes, con el propósito de apreciar el comportamiento correcto de este flip flop. Es
muy importante este paso ya que si no se hace y se deja constante la frecuencia en ambos
casos, no se verá ningún de los funcionamientos que dicta las tablas de excitación y
entrada y el trabajo será de por gusto. Insistimos en realizar ese pequeño paso para poder
dar conclusiones verdades y argumentadas.
Por lo tanto, hecho todo lo anterior y asegurarnos de que nuestro código este correcto y
la conexión bien realizada, mostramos a continuación los resultados del comportamiento
del FLIP FLOP T:
25
26
Reloj Digital
El siguiente circuito, se nos solicitar programar y simular un reloj de 24 horas, que muestre
también los minutos, segundos; utilizando los flip flops descritos en este reporte. Para
poder empezar, es necesario tener cuenta que ocuparemos y como lo haremos; los pasos
básicos se muestran a continuación.
ENTITY segundos IS
PORT( clear, click :IN std_logic;
QA, QB, QC, QD :OUT std_logic);
END segundos;
27
QN <= QN + 1;
END IF;
IF(QN = "1010")THEN
QN <= "0000";
END IF;
END PROCESS;
QA <= QN(3);
QB <= QN(2);
QC <= QN(1);
QD <= QN(0);
END arch_1;
28
CONTADOR MOD 3 (CONTADOR DECENAS PARA 24 HORAS)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
ENTITY horas IS
PORT( clear, click :IN std_logic;
QA, QB, QC, QD :OUT std_logic);
END horas;
ARCHITECTURE arch_1 OF horas IS
SIGNAL QN : UNSIGNED(3 DOWNTO 0 );
BEGIN
PROCESS(click,clear)
BEGIN
IF clear='1' THEN
QN <= "0000";
ELSIF(click = '0' AND click'event)THEN
QN <= QN + 1 ;
END IF;
IF(QN = "0011")THEN
QN <= "0000";
END IF;
END PROCESS;
QA <= QN(3);
QB <= QN(2);
QC <= QN(1);
QD <= QN(0);
END arch_1;
Para lograr cambiar y establecer la hora y los minutos, es necesario tener interruptores
High and Low. El proceso para esto es ir accionando repetidas veces los mismos hasta
llegar a la hora deseada. Esto se aplica tanto para los minutos y segundos. Las conexiones
correctas se muestran a continuación. La argumentación del porque ese uso de
compuertas básicas es la guía suministrada para el desarrollo de este reporte. Se utilizaron
en función de lo que queremos obtener.
29
30
Investigación
31
asume que todos los pulsos de RF en un tren de pulsos tienen la misma amplitud. Los
pulsos en un intervalo fijo de tiempo llegan a un ritmo o frecuencia referida como la
frecuencia de repetición de impulsos (PRF) de tantos impulsos por segundo. Intervalo de
repetición de impulsos (PRI) y PRF son recíprocos entre sí.
El valor promedio se define como ese nivel en el que el área de pulso por encima de la
media es igual a la zona de debajo de la media entre los pulsos. Si los impulsos son
igualados en una manera tal como para rellenar el área entre pulsos, el nivel obtenido es
el valor medio, donde se utiliza el área sombreada del pulso para llenar en la zona entre
los pulsos. El área del pulso es el ancho de pulso multiplicado por la potencia de cresta del
impulso. La zona media es igual al valor promedio de potencia multiplicado por el período
de pulso.
32
Investigue las librerías de ALTERA, que permiten usar flip-flop ya diseñados,
escriba el código necesario para usar estos componentes.
lpm_ff Megafunction.
Nota: Puede utilizar el editor de misiones para añadir, cambiar o eliminar las asignaciones
y los valores de asignación de megafunctions.
component LPM_FF
generic (LPM_WIDTH : natural; -- MUST be greater than 0
LPM_AVALUE : string := "UNUSED";
LPM_SVALUE : string := "UNUSED";
LPM_PVALUE : string := "UNUSED";
LPM_FFTYPE: string := "DFF";
LPM_TYPE: string := L_FF;
LPM_HINT : string := "UNUSED");
port (DATA : in std_logic_vector(LPM_WIDTH-1 downto 0);
CLOCK : in std_logic;
ENABLE : in std_logic := '1';
SLOAD : in std_logic := '0';
SCLR : in std_logic := '0';
SSET : in std_logic := '0';
ALOAD : in std_logic := '0';
ACLR : in std_logic := '0';
ASET : in std_logic := '0';
Q : out std_logic_vector(LPM_WIDTH-1 downto 0));
33
end component;
El VHDL BIBLIOTECA DE USO declaración no es necesaria si se utiliza la Declaración de
componentes VHDL.
LIBRARY altera_mf;
USE lpm.lpm_components.all;
Un tren de pulsos podemos decir que es una señal de reloj con cada uno de sus pulsos
retrasados entre si por una unidad de tiempo. VHDL permite especificar un retardo de
tiempo utilizando la palabra clave after en cualquier instrucción de asignación de señal.
Z<=’1’ after 4 ns when X=’1’ and Y=’0’ else ‘0’ after 3 ns;
process
begin
if clk=´1´then clk<=´0´after 10 ns;
else clk<=´1´ after 15 ns;
end if;
end process;
process (clk)
begin
if clk=´1´then clk<=´0´after 10 ns;
else clk<=´1´ after 15 ns;
end if;
end process;
34
--EJEMPLO3 IDEM UTLIZANDO WAIT
--El proceso se suspende al llegar al WAIT
--Se reactiva cuando hay un evento en la señal CLK y
--comienza la ejecución a partir de la primera sentencia
process
begin
if clk=´1´then clk<=´0´after 10 ns;
else clk<=´1´ after 15 ns;
end if;
wait on clk;
end process;
¿Es posible generar con un 555 un tren de pulsos con Duty-Cicle de 50%?
35
Conclusiones
36
Bibliografía
http://es.wikipedia.org/wiki/Sistema_secuencial
http://es.wikipedia.org/wiki/Biestable
http://www.forosdeelectronica.com/tutoriales/flip-flops.htm
http://www.tscm.com/dutycy.pdf
http://en.wikipedia.org/wiki/Duty_cycle
37