Introducción

Un flip-flop es un circuito lógico capaz de mantener los valores de sus salidas independientemente de los cambios en los valores de entrada, es decir, que comprende un estado de “memoria”. Este es el elemento que permite la transición de la lógica combinacional a la lógica secuencial.

Existen varios tipos de flip-flops: Astables, Biestables y Monoestables.

Astable: Es un flip-flop compuesto por 2 estados inestables y que conmuta de forma periódica (periodo T) y espontánea de un estado a otro.
al otro.

Biestable: Que tiene dos estados estables. En lógica, esto se traduce a los estados lógicos “1” o “0”.

Monoestable: Que tiene solo un estado estable, el otro estado es temporal.

Hay dos tipos de flip-flops: asíncronos y síncronos. Los flip-flops síncronos tienen una entrada de reloj, lo que no es el caso de los flip-flops asíncronos.

Flip-flops asíncronos
– El balancín RS
– El pestillo en forma de D
Chanclas sincrónicas
– El rockero D
– El interruptor JK

¿Cuál es la diferencia entre un flip-flop y una puerta lógica?

Un flip-flop es un circuito lógico capaz de mantener los valores de sus salidas independientemente de los cambios en los valores de entrada, es decir, que comprende un estado de “memoria”. Este es el elemento que permite la transición de la lógica combinacional a la lógica secuencial.
Un flip-flop suele estar compuesto de varias puertas lógicas. He aquí un ejemplo con el flip-flop D:

¿Cuál es la diferencia entre un interruptor y un pestillo?

La principal diferencia entre un flip-flop y un latch es que el flip-flop verifica las entradas pero sólo cambia la salida en los momentos definidos por la señal de reloj o cualquier otra señal de control, mientras que el latch verifica las entradas continuamente y responde inmediatamente a los cambios de entrada.

Flip-flop D

Ahora veremos un flip-flop D con reinicio asincrónico. Para ello utilizaremos un input de datos con los datos que desea comunicar. Necesitamos un reloj (clk) porque es un flip-flop sincrónico. Por último la función de reinicio para pasar los datos de d a q o para reiniciar el flip-flop.

¿Cómo funciona el flip-flop D?

  • Si el reinicio es 1, entonces la salida q toma el valor de 0.
    Si el reinicio es 0, entonces transmitimos el valor proveniente de d con q en cada tic del reloj.
LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY bascule_D IS
PORT (d, clk, rst: IN STD_LOGIC;
q: OUT STD_LOGIC);
END bascule_D;

ARCHITECTURE comportement OF bascule_D IS
BEGIN
PROCESS (clk, rst)
BEGIN
IF (rst='1') THEN
q <= '0';
ELSIF (clk'EVENT AND clk='1') THEN
q <= d;
END IF;
END PROCESS;
END comportement;
Aquí está el resultado en simulación:
Primer tic del reloj: el reloj está alto, el reinicio también, por lo que la señal de entrada d no puede pasar a la señal de salida q.

Flip-flop JK

El flip-flop JK es un tipo de flip-flop biestable, lo que significa que tiene dos estados estables distintos. Su nombre, “JK”, proviene de las letras asociadas a sus principales puertos de entrada: J y K. Cuando J y K tienen valores diferentes, el flip-flop JK cambia de estado según una secuencia bien definida. Si J es alto (1) y K es bajo (0), el flip-flop tomará el estado “SET” (1). Si J es bajo (0) y K es alto (1), el flip-flop tomará el estado “RESET” (0). Si J y K son ambos altos (1), el flip-flop alternará entre estados con cada pulso de reloj.
library ieee;
use ieee.std_logic_1164.all;

entity Bascule is
	port(J,K,Clk,Set, Reset : in std_logic;
	Q, Q_bar : out std_logic);
end Bascule;

architecture bascule_JK of Bascule is 
	signal SIG : std_logic;
	signal JK : std_logic_vector (1 downto 0);
begin
	JK(1) <= J;
	JK(0) <= K;
	process(Clk, Set, Reset)
	begin
	if (Reset = '0'and Set = '0') then
	   SIG <= '0';
	elsif (Reset = '0' and Set = '1') then
	   Sig <= '0';
   elsif (Reset ='1' and Set ='0') then
	Sig <='1'; 
	elsif (Reset = '1' and Set ='1') then
	if (Clk'event and Clk ='0') then 
		case JK is 
			when "00" => SIG <= SIG;
			when "01" => SIG <= '0';
			when "10" => SIG <= '1';
			when "11" => SIG <= not SIG; 
			when others => SIG <= '-';
		end case; 
		else 
			SIG <= SIG;
		end if; 
	end if; 
	end process; 
	Q <= SIG; 
	Q_bar <= not SIG; 
end bascule_JK; 
	
Aquí está el resultado en simulación: