Flip-flop on logiikkapiiri, joka pystyy ylläpitämään lähtönsä arvot tuloarvojen muutoksista riippumatta, eli joka käsittää ”muistitilan”. Tämä on elementti, joka mahdollistaa siirtymisen yhdistelmälogiikasta peräkkäiseen logiikkaan.
Varvastossuja on useita tyyppejä: Astable, Bstabiili ja Monostable.
Vakaa: Se on flip-flop, jossa on 2 epävakaata tilaa ja joka vaihtaa ajoittain (jakso T) ja spontaanisti yhdestä tilasta
toiselle.
Bstabiili: Kaksi vakaata tilaa. Logiikassa tämä tarkoittaa loogisia tiloja ”1” tai ”0”.
Monostabiili: Kun on vain yksi vakaa tila, toinen tila on väliaikainen.
Flip-flopseja on kahta tyyppiä: asynkroniset ja synkroniset. Synkronisissa kiikkuissa on kellotulo, mikä ei päde asynkronisiin kiikkuihin.
Asynkroniset varvastossut
– RS-rokkari
– D-salpa
Synkroniset varvastossut
– rokkari D
– JK-kytkin
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;
JK-flip-flop on eräänlainen bistabiili flip-flop, mikä tarkoittaa, että sillä on kaksi erillistä vakaata tilaa. Sen nimi ”JK” tulee kirjaimista, jotka liittyvät sen tärkeimpiin tuloportteihin: J ja K.
Kun J:llä ja K:llä on eri arvot, JK-kiikku muuttaa tilaa tarkasti määritellyn sekvenssin mukaisesti. Jos J on korkea (1) ja K on alhainen (0), flip-flop siirtyy ”SET” (1) -tilaan. Jos J on alhainen (0) ja K on korkea (1), flip-flop siirtyy ”RESET” (0) -tilaan. Jos J ja K ovat molemmat korkeita (1), flip-flop vaihtuu vuorotellen tilojen välillä jokaisen kellopulssin kanssa.
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;