Een klokgetriggerd proces in VHDL bouwen: een praktische gids
De meerderheid van VHDL-ontwerpen gebruikt geclockte logica – vaak aangeduid als synchrone of sequentiële logica. Een geclockt proces activeert uitsluitend op de flank van de masterklok, ongeacht veranderingen in andere invoersignalen.
Het fundamentele element van geclockte logica is de flip-flop. In deze tutorial richten we ons op de positief-flank-getriggerde flip-flop met een negatieve reset. Zie het schema hieronder:
Als een sample-and-hold-apparaat, vangt de flip-flop de invoerwaarde op de stijgende klokflank en behoudt die waarde tot de volgende stijgende flank of totdat het reset-signaal geactiveerd wordt.
Let op: Dit bericht is onderdeel van de Basic VHDL Tutorials-reeks.
Alle geclockte processen triggeren in unisono en samplen hun inputs gelijktijdig. De klok stelt discrete tijdstappen in, waardoor ontwerpers complexe logica in duidelijke, cyclus-voor-cyclus gebeurtenissen kunnen partitioneren.
Flip-flops, of arrays daarvan, worden ook registers genoemd.
De gevoeligheidslijst van een geclockt proces bevat meestal alleen het kloksignaal, omdat het proces uitsluitend op een klokflank ontwaakt. Additionele inputs worden voor triggerdoeleinden genegeerd.
Hieronder staat een herbruikbare sjabloon voor een geclockt proces met een synchrone reset:
process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then <reset all output signals here> else <main logic here> end if; end if; end process;
Oefening
In de bijbehorende videotutorial lopen we door de creatie van een geclockt proces in VHDL.
Testbench-code
De definitieve testbench voor de flip-flop:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T17_ClockedProcessTb is end entity; architecture sim of T17_ClockedProcessTb is constant ClockFrequency : integer := 100e6; -- 100 MHz constant ClockPeriod : time := 1000 ms / ClockFrequency; signal Clk : std_logic := '1'; signal nRst : std_logic := '0'; signal Input : std_logic := '0'; signal Output : std_logic; begin -- The Device Under Test (DUT) i_FlipFlop : entity work.T17_FlipFlop(rtl) port map( Clk => Clk, nRst => nRst, Input => Input, Output => Output); -- Clock generation Clk <= not Clk after ClockPeriod / 2; -- Testbench sequence process is begin -- Release the DUT from reset nRst <= '1'; wait for 20 ns; Input <= '1'; wait for 22 ns; Input <= '0'; wait for 6 ns; Input <= '1'; wait for 20 ns; -- Apply reset nRst <= '0'; wait; end process; end architecture;
Flip-flop-module
Implementatie van de positief-flank flip-flop met een negatieve reset:
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T17_FlipFlop is port( Clk : in std_logic; nRst : in std_logic; -- Negative reset Input : in std_logic; Output : out std_logic); end entity; architecture rtl of T17_FlipFlop is begin -- Flip-flop met gesynchroniseerde reset process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then Output <= '0'; else Output <= Input; end if; end if; end process; end architecture;
Golfform-observatie
Na het draaien van de simulatie in ModelSim en inzoomen op de tijdlijn, toont de golfform duidelijk dat de output alleen op stijgende klokflanken update:

Analyse
De output verandert uitsluitend op stijgende klokflanken. Elke inputovergang die zich voordoet tussen twee stijgende flanken – zoals de negatieve dip die begint rond 45 ns – wordt niet gevangen, omdat de flip-flop alleen samplet op de flank.
Hieronder is een animatie die de relatie tussen input, klok en output visualiseert:

Belangrijke observaties:
- De één-klokperiode inputpuls op 20 ns is synchroon met de klok en produceert een vertraagde reactie in de output.
- Tijdens simulatie vinden gebeurtenissen plaats in nul-tijdstappen (delta-cycli). Omdat de flip-flop de input leest en de output in dezelfde delta-cyclus update, vangt het de pre-flank inputwaarde.
In de praktijk vereist een flip-flop een stabiele input voor een korte periode voor en na de klokflank – bekend als setup en hold tijden. Deze constraints worden automatisch afgehandeld door synthetiseringstools bij het converteren van VHDL naar een netlist.
Voor een diepere duik in simulatiетijdstappen, zie Delta cycles explained.
Kernpunten
- Geclockte processen met synchrone reset bevatten alleen de klok in de gevoeligheidslijst.
- Het gebruik van
if rising_edge(Clk)garandeert activering strikt op de stijgende flank van de klok. - In een synchroon ontwerp vinden alle toestandsveranderingen plaats op de actieve klokflank.
Klaar om je kennis te testen? Doe de Basic VHDL Quiz – deel 3 of ga door naar de volgende tutorial.
VHDL
- Dynamische string-lijsten in VHDL: Best Practices & Voorbeeld
- Een Tcl-gedreven testbench maken voor een VHDL code-lock module
- Een VHDL-testbench netjes beëindigen: methoden en best practices
- Een PWM-controller implementeren in VHDL: Ontwerp, Simulatie en FPGA-demo
- Willekeurige getallen genereren in VHDL: Van Uniform naar OSVVM
- Ontwerpen van een robuuste VHDL-ringbuffer FIFO in blok-RAM
- Een self-checking testbench in VHDL bouwen – Een praktische gids
- Een dynamische gelinkte lijst in VHDL implementeren met protected types en access pointers
- In-process procedures benutten voor schonere VHDL FSM-ontwerpen
- Impure functies in VHDL gebruiken: FSM-leesbaarheid en onderhoudbaarheid verbeteren
- VHDL-functies onder de knie krijgen: een praktische gids voor efficiënt ontwerp