Código VHDL para Flipflop - D, JK, SR, T
Todos los flip-flops se pueden dividir en cuatro tipos básicos: SR, JK, D y T. Ellos difieren en el número de entradas y en la respuesta invocada por un valor diferente de señales de entrada.
VHDL Code for SR FlipFlop 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
library ieee; use ieee. std_logic_1164.all; use ieee. std_logic_arith.all; use ieee. std_logic_unsigned.all; entity SR_FF is PORT( S,R,CLOCK: in std_logic; Q, QBAR: out std_logic); end SR_FF; Architecture behavioral of SR_FF is begin PROCESS(CLOCK) variable tmp: std_logic; begin if(CLOCK='1' and CLOCK'EVENT) then if(S='0' and R='0')then tmp:=tmp; elsif(S='1' and R='1')then tmp:='Z'; elsif(S='0' and R='1')then tmp:='0'; else tmp:='1'; end if; end if; Q <= tmp; QBAR <= not tmp; end PROCESS; end behavioral;
D FlipFlop El flip-flop D mostrada en la figura es una modificación de la velocidad de reloj del flip-flop SR. La entrada D va directamente a la entrada S y el complemento de la entrada D va a la entrada R. La entrada D se muestrea durante la ocurrencia de un pulso de reloj. Si es 1, el flip-flop se cambia con el estado de ajuste (a menos que ya se creó). Si es 0, el flip-flop conmuta al estado
claro. VHDL Code for D FlipFlop 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
library ieee; use ieee. std_logic_1164.all; use ieee. std_logic_arith.all; use ieee. std_logic_unsigned.all; entity D_FF is PORT( D,CLOCK: in std_logic; Q: out std_logic); end D_FF; architecture behavioral of D_FF is begin process(CLOCK) begin if(CLOCK='1' and CLOCK'EVENT) then Q<=D; end if; end process; end behavioral;
JK FlipFlop Un flip-flop JK es un refinamiento del flip-flop SR en que el estado indeterminado del tipo SR se define en el tipo JK. Las entradas J y K se comportan como entradas S y R para ajustar y limpiar el flip-flop
(tenga en cuenta que en un flip-flop JK, la letra J es para el grupo y la letra K es de clara).
VHDL Code for JK FlipFlop 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
library ieee; use ieee. std_logic_1164.all; use ieee. std_logic_arith.all; use ieee. std_logic_unsigned.all; entity JK_FF is PORT( J,K,CLOCK: in std_logic; Q, QB: out std_logic); end JK_FF; Architecture behavioral of JK_FF is begin PROCESS(CLOCK) variable TMP: std_logic; begin if(CLOCK='1' and CLOCK'EVENT) then if(J='0' and K='0')then TMP:=TMP; elsif(J='1' and K='1')then TMP:= not TMP; elsif(J='0' and K='1')then TMP:='0'; else TMP:='1'; end if; end if; Q<=TMP; Q<=not TMP; end PROCESS; end behavioral;
T FlipFlop El flip-flop T es una sola versión de entrada del flip-flop JK. Como se muestra en la figura, el flip-flop T se obtiene a partir del tipo JK si ambas entradas están unidas entre sí. La salida del flip-flop T "alterna" con cada pulso de reloj. Código VHDL para T FlipFlop
VHDL Code for T FlipFlop 1 2 3 4 5 6 7 8 9 10 11 12 13 14
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity T_FF is port( T: in std_logic; Clock: in std_logic; Q: out std_logic); end T_FF; architecture Behavioral of T_FF is signal tmp: std_logic; begin process (Clock) begin if Clock'event and Clock='1' then
15 16 17 18 19 20 21 22 23 24 25
if T='0' then tmp <= tmp; elsif T='1' then tmp <= not (tmp); end if; end if; end process; Q <= tmp; end Behavioral;
Un sencillo tutorial sobre circuitos lógicos en el que se programará un flip flop en VHDL utilizando un FPGA NEXYS 2
En
teoría
de
circuitos lógicos se da a conocer un dispositivo electrónico llamado flip flop, catalogado como un elemento de memoria conformado por compuertas lógicas. Donde éstas a través de una configuración específica, pueden de cierta manera almacenar información. Una de las características principales de un flip flop es su sensibilidad a ciertas entradas prioritarias; es decir, si estas entradas se activan, no importa
lo que haya en las demás entradas, se producirá un cambio en la salida dependiendo de lo que se requiera.
Diagrama de un flip-flop tipo JK
Explicando un poco el funcionamiento de estos dispositivos, podremos programar un flip flop en VHDL, del tipo tipo JK. En la industria, existen muchos flips flops: tipo D, tipo JK, tipo SR, entre otros. El flip flop JK se dice así en memoria del señor Jack Kilby el creador de
los
circuitos
integrados.
En
este
caso
explicaremos
el
funcionamiento básico: El dispositivo poseé tres entradas: J, K, reloj. La entrada de reloj es porque en circuitos lógicos, muchos dispositivos se manejan a través de pulso de reloj que le indicarán cuándo debe determinar una acción. Además de esto, se tienen dos salidas clásicas: Q y Q’; estas salidas son complementarias, ya que una es la inversa de la otra. Recuerden que estos dispositivos generalmente trabajan con valores binarios (0 ó 1). En los sistemas síncronos, los tiempos exactos en los que cualquier entrada cambia de estado se determina en base a la señal de reloj. Las señales de reloj por lo general suelen ser un tren de pulsos rectangulares o una onda cuadrada, que tienen una propiedad llamada transición, esto es cuando se cambia de un valor a otro (0 ó 1). Bien, para los flip flops sincronizados por reloj como el JK, se
necesita saber cómo lo vamos a trabajar en base a la transición de la señal de pulso de reloj, es decir si el flip flop cambiará de valor cuando haya una transición de pendiente positiva o negativa. La transición de pendiente positiva es aquella donde el cambio se da de 0 para 1, mientras que la transición de pendiente negativa es cuando el cambio se da de 1 para 0. En base a esta información se deduce que el flip flop para cambiar lo que hay en su salida necesita de la transición de pulso que envia el reloj ya que esto indica CUÁNDO cambiar de valor la salida, mientras que las entradas de control J y K nos indicará a QUÉ estado cambiará la salida. Presentamos entonces la tabla de verdad del flip flop JK: J 0 1 0 1
K 0 0 1 1
CLK FPN FPN FPN FPN
Q Q (sin cambio) 1 0 Q’ (conmuta)
FPN = Flancos por Pendiente Negativa. Esto quiere decir que el flip flop a programar trabajará siendo bajo activo. Como mencionamos, el flip flop responde a ciertas entradas prioritarias en este caso usaremos CLEAR y PRESET. Donde CLEAR es una entrada que pone a la salida del flip flop un 0, mientras que PRESET es una entrada que pone a la salida del flip flop un 1. En flip flop programables y comerciales estas entradas pueden ser bajo o alto activo, nuestro caso como es programable podemos indicar de qué tipo será. Ahora que hemos terminamo de explicar un poquito sobre el funcionamiento del flip flop JK, expondré el código en VHDL. Este código lo creé hace unos meses cuando trabajé con un FPGA NEXYS 2, estaba trabajando específicamente en un contador binario de 4 bits. Pueden tomar como referencia el código y hacerle modificaciones. Se agradece comentarios =)
Shell
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2
entity FF is Port ( clk,j,k,prn,clrn: in bit; q: out bit); end FF; architecture sintaxis1 of FF is SIGNAL qestado: bit; begin PROCESS (clk,prn,clrn) --Responde a cualquiera de estas entradas BEGIN IF prn = '1' THEN QESTADO <= '1'; ELSIF clrn = '1' THEN QESTADO <= '0'; ELSIF CLK = '0' AND CLK'EVENT THEN --Bajo activo IF J = '1' AND K = '1' THEN QESTADO <= NOT QESTADO; ELSIF J = '1' AND K = '0' THEN QESTADO <= '1'; ELSIF J = '0' AND K = '1' THEN QESTADO <= '0'; ELSIF J = '0' AND K = '0' THEN QESTADO <= QESTADO; END IF; END IF; END PROCESS; Q <= QESTADO; --Guarda el valor de la señal en la salida de los leds end sintaxis1;