Przerzutnik to układ logiczny zdolny do utrzymywania wartości swoich wyjść niezależnie od zmian wartości wejściowych, czyli zawierający stan „pamięci”. Jest to element umożliwiający przejście z logiki kombinacyjnej do logiki sekwencyjnej.
Istnieją różne rodzaje przerzutników: astabilne, bistabilne i monostabilne.
Astabilny: Jest to przerzutnik składający się z 2 niestabilnych stanów, który okresowo (okres T) i spontanicznie przełącza się z jednego stanu
do drugiego.
Bistabilny: Posiadający dwa stabilne stany. W logice oznacza to stany logiczne „1” lub „0”.
Monostabilny: mający tylko jeden stan stabilny, a drugi stan jest tymczasowy.
Istnieją dwa rodzaje przerzutników: asynchroniczne i synchroniczne. Przerzutniki synchroniczne mają wejście zegarowe, czego nie ma w przypadku przerzutników asynchronicznych.
Przerzutniki asynchroniczne
– Wahadło RS
– Zatrzask D
Przerzutniki synchroniczne
– Rocker D
– Przełącznik JK
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;
Oto wynik symulacji:
1. tyk zegara: zegar jest wysoki, reset również, więc sygnał wejściowy d nie może przejść do sygnału wyjściowego q.
Przerzutnik JK jest rodzajem przerzutnika bistabilnego, co oznacza, że posiada dwa odrębne stany stabilne. Nazwa „JK” pochodzi od liter oznaczających główne porty wjazdowe: J i K.
Jeżeli J i K mają różne wartości, przerzutnik JK zmienia stan zgodnie z dobrze zdefiniowaną sekwencją. Jeżeli J jest wysokie (1), a K jest niskie (0), przerzutnik przyjmie stan „SET” (1). Jeżeli J jest niskie (0), a K jest wysokie (1), przerzutnik przyjmie stan „RESET” (0). Jeżeli oba stany J i K są wysokie (1), przerzutnik będzie się przełączał, zmieniając stany z każdym impulsem zegara.
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;
Oto wynik symulacji: