Digitaalipiirit/Kiikut eli flipflopit

Kiikut eli Flip-flopit muokkaa

Asynkronisena salpa (Latch) / synkronisena kiikku (flip-flop).

Sekvenssipiirit voidaan koota pelkästään porteista, mutta niiden rakenneosina käytetään usein salpoja (latch) ja kiikkuja (flip-flop), jotka ovat yksinkertaisia sekvenssipiirejä. Salvat ja kiikut on koottu porteista. Useimmat sekvenssipiirit sisältävät osina salpojen ja kiikkujen lisäksi kombinaatiopiirejä.

Salvoilla ja kiikuilla on muutama tulo ja yksi lähtö. Salvoissa ja kiikuissa käytetään toisinaan yleisnimitystä kiikut. Mikäli sekvenssipiirien rakenneosina salpoja tai kiikkuja, piirien suunnitelu ja niiden toiminnan ymmärtäminen helpottuu.
Salvoilla ja kiikuilla on kaksi tilaa, joita niiden lähtö esittää. Jokaisella salvalla ja kiikulla on olemassa vähintään yksi tulojen kombinaatio, jolla sen tila pysyy vakiona. Tilan vaihtumistavat eli tilan vaihtamiseen tarvittavat tulojen arvot riippuvat salvan tai kiikun tyypistä.

Kiikku eli Flip-Flop on esimerkki bistabiilista multivibraattorista, jolla on kaksi vakaata tilaa. Näitä tiloja ovat, luonnollisesti, 0 ja 1. Kiikku on "muistikomponentti" ja sen tallentama tieto säilyy niin kauan kuin piirissä on virta päällä. Joskus kiikut rinnastetaan myös "lukkopiireihin", koska ne pystyvät lukittumaan tietoon.

Kiikkuja on useita erilaisia, kuhunkin tarpeeseen omansa, omine ominaisuuksineen. Neljä (4) päätyypin kiikkua ovat: SR, JK, D ja T, joista jäljempänä tarkemmin.

Salpojen ja kiikkujen tulot muokkaa

Salpojen ja kiikkujen tulot voidaan ryhmitellä seuraavilla tavoilla:

  1. Dynaamiset ja staattiset tulot
  2. Pakko-, valmistelu- ja kellotulot

Dynaamiset ja staattiset tulot muokkaa

Dynaamisia (dynamic) tuloja on vain kiikuilla. Ne vaikuttavat kiikun tilaan vain muuttuessaan tietyllä tavalla, esimerkiksi nollasta ykköseen. Dynaamisen tulon vakioarvoilla ei ole vaikutusta tilaan. Mikäli tulo vaikuttaa muilla tavoilla kuin muuttuessaan tietyllä tavalla, se on staattinen (static). Sitä staattiseen tuloon kytketyn signaalin vakioarvoa tai dynaamiseen tuloon kytketyn signaalin muutosta, joka vaikuttaa slvan tai kiikun käyttäytymiseen, kutsutaan aktiiviseksi arvoksi (active value).

Pakko-, valmistelu- ja kellotulot muokkaa

Salvan tai kiikun tuloihin tuodut signaalit määräävät sekä sen, mihin tilaan piiri seuraavaksi siirtyy tai missä tilassa se pysyy, että sen, milloin tilanmuutos tapahtuu. Pakkotulot (Asynkronous input) määräävät sekä salvan tai kiikun seuraavan tilan että tilanmuutoksen ajankohdan. Pakkotuloon tuotava signaali vaikuttaa välittömästi piirin tilaan.

Valmistelu- ja kellotuloja on vain kiikuilla. Valmistelutulot määräävät kiikun seuraavan tilan ja kellotulo muutoksen ajankohdan. Kellotuloon liittyy tämän vuoksi aina yksi tai kaksi valmistelutuloa.

Kiikut ovat sekvenssipiirejä, joiden tila vaihtuu kellotulon aktiivisella reunalla. Kellotulon reuna liipaisee kiikun tilanmuutoksen eli kiikku on reunaliipaistava (edge triggered).

SR -kiikut eli SR -flip-flop muokkaa

SR (Set/Reset) -kiikku, toimii ohjaussignaaleilla ja asettuu tiloihin vain S ja R tulojen mukaan kellon tahdissa. Kuvasta havaitaan, että SR-kiikku voidaan toteuttaa kahdella EITAI-portilla ristikkäisten paluukytkentöjen avulla. Joskus käytetään myös nimitystä RS-kiikku, jossa R-tulo on ns.dominoivampi tulo.

 
SR-kiikku toteutettuna NOR-porteilla.

Käytännössä SR-kiikussa on kaksi komplementoitua lähtöä, Q ja käänteinen Q. Kun S=1 ja R=0, salpalähtö Q menee tilaan 1 (Q' = 0) nykyisestä tilasta riippumatta. Tulon S (=Set) palatessa 0, lähdön tila jää voimaan, toteuttaen näin "muistitoiminnan". Vastaavast, kun S=0 ja R=1, salpalähtö Q menee tilaan 0 eli tyhjentää muistin. Kun molemmat tulot ovat ykkösiä, SR-salvan toimintaa ei ole määritelty.

SRQ(t+1)
00X
101
010
11Q(t)

Kuten huomaat, tällä kiikulla on määrittelemätön tila, kun molemmat S ja R tulo ovat ylhäällä, tai molemmat lähdöt ovat alhaalla. Molempien tulosignaalien ollessa alhaalla, lähtö on lukittu (latchätty), ja se 'muistaa' viimeksi asetetun tilan, ennen molempien tulojen alas vientiä.

Jotkut ehkä huomaavat, että kytkettäessä piiriin virta päälle, molemmat lähdöt ovat aluksi alhaalla (0-tilassa), mikä vaikuttaa mahdottomalta alkutilana.

 
SR-kiikun piirrosmerkki

Tämä on oikeastaan totta, kuitenkin tämä epävakaa virhetila, jossa S ja R ovat alhaalla johtaa piirin vakavoitumiseen joko asetustilaan tai nollaustilaan, nopeasti. Vakautuminen johtuu siitä että on käytetyt EITAI-portteja ja niiden tekemiseen käytetty valmistusprosessi. Lyhyesti sanottuna, yksi portti reagoi nopeammin, vakauttaen siten koko piirin.

Tätä kutsutaan myös hasarditilaksi, joka kuitenkin tasaantuu aina stabiiliksi tilaksi nopeasti.

SR-kiikun VHDL-toteutus muokkaa

--Design Name: SR_kiikku
--Device: aspartan3e
--Purpose:
--    This vhdl netlist is translated from an ECS schematic. It can be 
--    synthesis and simulted, but it should not be modified. 
--

library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.Vcomponents.ALL;

entity SR_kiikku is
   port ( Reset : in    std_logic; 
          Set   : in    std_logic; 
          NQ    : out   std_logic; 
          Q     : out   std_logic);
end SR_kiikku;

architecture BEHAVIORAL of SR_kiikku is
   attribute BOX_TYPE   : string ;
   signal Q_DUMMY  : std_logic;
   signal NQ_DUMMY : std_logic;
   component NOR2
      port ( I0 : in    std_logic; 
             I1 : in    std_logic; 
             O  : out   std_logic);
   end component;
   attribute BOX_TYPE of NOR2 : component is "BLACK_BOX";
   
begin
   NQ <= NQ_DUMMY;
   Q <= Q_DUMMY;
   XLXI_14 : NOR2
      port map (I0=>NQ_DUMMY,
                I1=>Reset,
                O=>Q_DUMMY);
   
   XLXI_15 : NOR2
      port map (I0=>Set,
                I1=>Q_DUMMY,
                O=>NQ_DUMMY);
   
end BEHAVIORAL;

Portitettu SR -kiikku muokkaa

 
Portitettu SR -kiikku toteutettuna EITAI-porteilla (NOR) ja kahdella JA-portilla(AND).
ESRQ(t+1)
000X
010X
001X
011X
100X
1101
1010
111Q(t)

Joskus on tarvetta määrätä, milloin kiikku lukittuu tilaan ja milloin ei. Tässä yksinkertainen SR-kiikun laajennus, joka periaatteessa tarjoaa sallintasignaalin, jolla lukitsee lehdön tilan, silloin kun se on ylhäällä ennen dataa. Koska tämä kontrollilinja on käytössä, muuttuu SR-kiikku synkroniseksi.

Kuten kaaviosta selviää, sallintasignaalin ollessa alhaalla, JA-porttien lähdöt pitää myös olla alhaalla, kuitenkin Q säilyttää tilansa lukittuna aiemman tulo-ohjauksen mukaan.

Toisaalta vain kun sallintatulo on ylhäällä, kiikku voi muuttaa tilaansa, kuten totuustaulusta ilmenee.


Sallintasignaalisen SR-kiikun VHDL-toteutus muokkaa

--Design Name: SR_kiikku sallintasignaalilla
--Device: aspartan3e
--Purpose:
--    This vhdl netlist is translated from an ECS schematic. It can be 
--    synthesis and simulted, but it should not be modified. 
--

library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.Vcomponents.ALL;

entity SR_kiikku_port is
   port ( Enable : in    std_logic; 
          Reset  : in    std_logic; 
          Set    : in    std_logic; 
          NQ     : out   std_logic; 
          Q      : out   std_logic);
end SR_kiikku_port;

architecture BEHAVIORAL of SR_kiikku_port is
   attribute BOX_TYPE   : string ;
   signal XLXN_10  : std_logic;
   signal XLXN_11  : std_logic;
   signal Q_DUMMY  : std_logic;
   signal NQ_DUMMY : std_logic;
   component NOR2
      port ( I0 : in    std_logic; 
             I1 : in    std_logic; 
             O  : out   std_logic);
   end component;
   attribute BOX_TYPE of NOR2 : component is "BLACK_BOX";
   
   component AND2
      port ( I0 : in    std_logic; 
             I1 : in    std_logic; 
             O  : out   std_logic);
   end component;
   attribute BOX_TYPE of AND2 : component is "BLACK_BOX";
   
begin
   NQ <= NQ_DUMMY;
   Q <= Q_DUMMY;
   XLXI_14 : NOR2
      port map (I0=>NQ_DUMMY,
                I1=>XLXN_10,
                O=>Q_DUMMY);
   
   XLXI_15 : NOR2
      port map (I0=>XLXN_11,
                I1=>Q_DUMMY,
                O=>NQ_DUMMY);
   
   XLXI_16 : AND2
      port map (I0=>Enable,
                I1=>Reset,
                O=>XLXN_10);
   
   XLXI_17 : AND2
      port map (I0=>Set,
                I1=>Enable,
                O=>XLXN_11);
   
end BEHAVIORAL;

D-kiikku muokkaa

 
D flip-flop: Portitettu SR-kiikku laajennettuna, lähtöjen ei-toivottujen tilojen estämiseksi

D-kiikku on yksinkertainen SR-kiikun laajennus, jossa mahdolliset virheelliset tilat on poistettu.

Koska portitetun SR-kiikun tila voidaan lukita (latch) tuloista riippumatta, voimme poistaa yhden tulon ja ohjata sekä S-tuloa että R-tuloa komplementtiohjauksella.

Yksinkertaisesti invertoinmme toisen tulon ensimmäisen käänteisarvoksi.


T-kiikun tilakonekuvaus muokkaa

Tilakoneen avulla kuvattuna T-kiikun toiminta on seuraava:

 
D-kiikun toiminta tilakone-esityksenä.


D -kiikun VHDL -toteutus muokkaa

--Design Name: D_kiikku
--Device: aspartan3e
--Purpose:
-- VHDL code created by Xilinx's StateCAD 9.2i
-- Fri Apr 11 11:24:02 2008

-- This VHDL code (for use with Xilinx XST) was generated using: 
-- one-hot state assignment with boolean code format.


LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY KIIKKU IS
	PORT (CLK,D,RESET: IN std_logic;
		Q : OUT std_logic);
END;

ARCHITECTURE BEHAVIOR OF KIIKKU IS
--	State variables for machine sreg
	SIGNAL STATE0, next_STATE0, STATE1, next_STATE1 : std_logic;
BEGIN
	PROCESS (CLK, RESET, next_STATE0, next_STATE1)
	BEGIN
		IF ( RESET='1' ) THEN
			STATE0 <= '1';
			STATE1 <= '0';
		ELSIF CLK='1' AND CLK'event THEN
			STATE0 <= next_STATE0;
			STATE1 <= next_STATE1;
		END IF;
	END PROCESS;

	PROCESS (D,STATE0,STATE1)
	BEGIN

		IF (( D='0' AND  (STATE0='1')) OR ( D='0' AND  (STATE1='1'))) THEN 
			next_STATE0<='1';
		ELSE next_STATE0<='0';
		END IF;

		IF (( D='1' AND  (STATE0='1')) OR ( D='1' AND  (STATE1='1'))) THEN 
			next_STATE1<='1';
		ELSE next_STATE1<='0';
		END IF;


		IF ((  (STATE1='1'))) THEN Q<='1';
		ELSE Q<='0';
		END IF;
	END PROCESS;
END BEHAVIOR;


D -kiikun simuloinnin tulos muokkaa

 
D-kiikun simuloinnin tulos.


JK -kiikku muokkaa

JK-kiikku on yksinkertainen parannettu versio SR-kiikusta, missä tila J=K=1 ei ole kielletty. SE toimii kuten SR -kiikku, jossa J toimii asetustulona ja K nollaustulona. Ainoa ero on että aiemmin kielletty yhdistelmä J=K=1 toteuttaa toiminnon, jossa tila invertoituu. JK-kiikun käyttäytyminen on täysin ennustettavissa kaikissa olosuhteissa, ja siksi tämän tyypin kiikku on loogisissa kytkennöissä käytetyin.

 
JK-kiikun sähköinen rakenne
 
JK-kiikun piirrosmerkki



JK-kiikun VHDL-toteutus muokkaa

----------------------------------------------------------------------------------
-- Company: 	   HAMK University of Applied Sciences
-- Engineer: 	   E.Virta	
-- 
-- Create Date:    13:32:53 04/22/2008 
-- Module Name:    JK_kiikkuvhdl - Behavioral 
-- Project Name:   WIKI Books - Digital circuits
-- Target Devices: Spartan 3E

-- Revision 0.01 - File Created
----------------------------------------------------------------------------------

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity JK_kiikkuvhdl is
    Port ( J : in  STD_LOGIC;
           K : in  STD_LOGIC;
           CLK : in  STD_LOGIC;
           reset : in  STD_LOGIC;
           Q : out  STD_LOGIC);
end JK_kiikkuvhdl;

architecture Behavioral of JK_kiikkuvhdl is
signal temp, T : STD_LOGIC;
begin

	process (CLK, reset)
	begin
		if reset='1' then   
			temp <= '0';
		elsif (CLK'event and CLK='1') then 
			if T = '1' then 
				temp <= not(temp);
			end if; 
		end if;
	end process;
	
	T <= (temp and J) or (not temp and K);
	Q <= temp;

end Behavioral;

T -kiikku (Toggle Flip-Flop) muokkaa

 
T-kiikun piirrosmerkki.

T -kiikku on JK -kiikku, jossa tulot on kytketty yhteen. Siksi se voi liipaista tai pitää tilansa. Liipaisutoimintoon tulee järkeä sallintatulolla, muutoin se vain vaihtaa jatkuvasti tilaansa ja toimii pulssigeneraattorina, mutta ei oikeana kiikkuna. Huomaa, että synkronisessa kytkennässä T-tulo on kytketty J- ja K-tuloihin, vaikka T-tulo toimii jos kiikku vaihtaa tilaansa kellon tahdissa.

Asynkronisessa kytkennässä T-tulo on kytketty kellolinjaan ja JK-kiikun tulot on kytketty 1:een.



T-kiikun VHDL-toteutus muokkaa

----------------------------------------------------------------------------------
-- Company: 		HAMK University of Applied Sciences
-- Engineer: 		Esa Virta

-- Create Date:    	09:11:52 02/19/2008 
-- Module Name:    	T_kiikku - Behavioral 
-- Project Name: 	Digital Circuits Wiki library

-- Revision 0.01 - File Created

----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity T_kiikku is
    Port ( T : in  STD_LOGIC;
           CLK : in  STD_LOGIC;
           R : in  STD_LOGIC;
           Q : out  STD_LOGIC);
end T_kiikku;

architecture Behavioral of T_kiikku is

signal reg_Q : STD_LOGIC;

begin
	process (CLK, R)
	begin
		if R='1' then
			reg_Q <= '0';
		elsif (CLK'event and CLK='1') then
			if T='1' then
				reg_Q <= not reg_Q;
			end if;
		end if;
	end process;
	Q <= reg_Q;
end Behavioral;

T-kiikun simuoinnin tulos muokkaa

Ja tästä mallikoodista testauksen tulos:

 
T-kiikun simuloinnin tulos.


Toimintojen yhdistäminen muokkaa

Edellä kuvattuja kiikkuja yhdistelemällä voidaan toteuttaa hyvinkin monimutkaisia logiikkaohjauksia. Eri kiikkujen yhdistaminen voidaan tehdä myös piirin sisällä, ja lopputuotokseen, esim. FPGA-piirille, yhdistämisen tekeminen suoraan VHDL-koodiin on nopea ja tehokas tapa logiikan optimointiin.

Esimerkkinä yhdistelmäkiikusta FDRSE-kiikku, jossa D-kiikun ominaisuuksiin on lisätty sallinta (Enable) ja asetus (S) sekä nollaus (R) -toiminnot.

 
FDRSE-kiikun piirrosmerkki.