De D-flip-flop is het basiselement van synchrone logica. De data bit wordt opgenomen in het geheugenelement op de stijgende of dalende flank van de klok. De data bit blijft in het geheugenelement aanwezig tot de volgende stijgende of dalende flank van de klok.
Engelse benamingen:
Proces met enkel de klok in de sensitivity list. Klok event komt overeen met de flank. Enkel if, geen else.
library ieee;
use ieee.std_logic_1164.all;
entity pos_dff is
port( d, clk: in std_logic;
q: out std_logic);
end pos_dff;
architecture arch_pos_dff of pos_dff is
begin
p_pos_dff: process(clk)
begin
if clk'event and clk = '1' then
q <= d;
end if;
end process;
end arch_pos_dff;
library ieee;
use ieee.std_logic_1164.all;
entity pos_dff is
port( d, clk: in std_logic;
q: out std_logic);
end pos_dff;
architecture arch_pos_dff of pos_dff is
begin
p_pos_dff: process(clk)
begin
if clk'event and clk = '0' then
q <= d;
end if;
end process;
end arch_pos_dff;
In std_logic_1164 zijn de volgende functies gedefinieerd:
Beide kolommen doen lijken funtioneel hetzelfde te doen, maar er is een subtiel verschil. Wanneer er gebruikt gemaakt wordt van het xxxx’event keyword, wilt dat zeggen er is een verandering in de waarde van xxxx. Als dit gevolgd wordt door de test clk = ‘1’, wilt dat zeggen dat deze conditie waar is voor elke overgang naar ‘1’ (bv: ‘0’ -> ‘1’, maar ook ‘X’ -> ‘1’ en ‘-’ -> ‘1’)
if rising_edge(clk) then
if falling_edge(clk) then
if clk'event and clk = '1' then
if clk'event and clk = '0' then
Voor de twee voorbeelden die gebruik maken van functies uit STD_LOGIC_1164, wordt een bepaalde “uitgangspositie” verwacht.
Bij een D-latch worden de data binnengenomen gedurende de hele periode dat de klok hoog is. Een ontwerp met D-flip-flops is veel makkelijker te analyseren en managen dan een ontwerp met D-latches.
library ieee;
use ieee.std_logic_1164.all;
entity dlatch is
port( d, clk: in std_logic;
q: out std_logic);
end dlatch;
architecture arch_dlatch of dlatch is
begin
p_dlatch: process(clk, d)
begin
if clk = '1' then
q <= d;
end if;
end process;
end arch_dlatch;
Als niet alle mogelijkheden voorzien zijn, kan een combinatorisch circuit zich gedragen als een latch. Dit moet steeds vermeden worden.
library ieee;
use ieee.std_logic_1164.all;
entity fout is
port( a, b: in std_logic;
s: in std_logic_vector(1 downto 0);
z: out std_logic);
end fout;
architecture arch_fout of fout is
begin
p_fout: process(a, b, s)
begin
if s = "00" then
z <= a;
elsif s = "01" then --er is geen beschrijving voor s is 10 of 11
z <= b;
end if;
end process;
end arch_fout;
Indien we voor een bepaald signaal geen register willen implementeren, moet dat signaal buiten het proces geplaatst worden.
seq: process(clk)
begin
if clk'event and clk = '1' then
j <= a and b; --register voor j
i <= j xor k;
end if;
end process;
seq: process(clk)
begin
if clk'event and clk = '1' then
i <= j xor k;
end if;
end process;
j <= a and b; --geen register voor j