Digitaalipiirit/Kiikut eli flipflopit
Kiikut eli Flip-flopit
muokkaaAsynkronisena 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
muokkaaSalpojen ja kiikkujen tulot voidaan ryhmitellä seuraavilla tavoilla:
- Dynaamiset ja staattiset tulot
- Pakko-, valmistelu- ja kellotulot
Dynaamiset ja staattiset tulot
muokkaaDynaamisia (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
muokkaaSalvan 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
muokkaaSR (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.
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.
S | R | Q(t+1) |
---|---|---|
0 | 0 | X |
1 | 0 | 1 |
0 | 1 | 0 |
1 | 1 | Q(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.
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
muokkaaE | S | R | Q(t+1) |
---|---|---|---|
0 | 0 | 0 | X |
0 | 1 | 0 | X |
0 | 0 | 1 | X |
0 | 1 | 1 | X |
1 | 0 | 0 | X |
1 | 1 | 0 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 1 | Q(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
muokkaaD-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
muokkaaTilakoneen avulla kuvattuna T-kiikun toiminta on seuraava:
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
JK -kiikku
muokkaaJK-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 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)
muokkaaT -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
muokkaaJa tästä mallikoodista testauksen tulos:
Toimintojen yhdistäminen
muokkaaEdellä 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.