Membuat Proses Terpicu Jam dalam VHDL: Panduan Praktis
Mayoritas desain VHDL menggunakan logika terpicu jam—biasa disebut logika sinkron atau sekuensial. Proses terpicu aktif secara eksklusif pada tepi jam master, terlepas dari perubahan pada sinyal input lainnya.
Elemen dasar dari logika terpicu jam adalah flip-flop. Dalam tutorial ini kita fokus pada flip-flop yang terpicu tepi naik dengan reset negatif. Lihat skematika di bawah ini:
Sebagai perangkat contoh-dan-tahan, flip-flop menangkap nilai input pada tepi jam naik dan mempertahankan nilai tersebut hingga tepi jam naik berikutnya atau hingga sinyal reset diaktifkan.
Catatan: Pos ini adalah bagian dari seri Tutorial VHDL Dasar.
Semua proses terpicu aktif secara bersamaan dan mencoba input mereka pada saat yang sama. Jam menetapkan langkah waktu diskrit, memungkinkan desainer mempartisi logika kompleks menjadi peristiwa siklus demi siklus yang jelas.
Flip-flop, atau rangkaiannya, juga disebut register.
Daftar sensitivitas dari proses terpicu biasanya hanya berisi sinyal jam, karena proses bangun secara eksklusif pada tepi jam. Input tambahan diabaikan untuk tujuan pemicu.
Di bawah ini adalah template yang dapat digunakan kembali untuk proses terpicu jam dengan reset sinkron:
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;
Latihan
Dalam tutorial video yang menyertai kita melalui pembuatan proses terpicu jam dalam VHDL.
Kode Testbench
Testbench akhir untuk 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;
Modul Flip-Flop
Implementasi flip-flop tepi naik dengan reset negatif:
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 with synchronized 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;
Pengamatan Gelombang
Setelah menjalankan simulasi di ModelSim dan memperbesar timeline, gelombang dengan jelas menunjukkan output hanya diperbarui pada tepi jam naik:
Analisis
Output hanya berubah pada tepi jam naik. Transisi input apa pun yang terjadi di antara dua tepi jam naik—seperti cengkerang negatif yang dimulai sekitar 45 ns—tidak tertangkap, karena flip-flop hanya mencoba pada tepi.
Di bawah ini adalah animasi yang memvisualisasikan hubungan antara input, jam, dan output:
Pengamatan utama:
Satu pulsa input periode jam pada 20 ns sinkron dengan jam dan menghasilkan respons tertunda dalam output.
Selama simulasi, peristiwa terjadi dalam langkah waktu nol (delta cycles). Karena flip-flop membaca input dan memperbarui output dalam delta cycle yang sama, ia menangkap nilai input sebelum tepi.
Dalam praktiknya, flip-flop memerlukan input stabil untuk waktu singkat sebelum dan setelah tepi jam—disebut setup dan hold times. Batasan ini ditangani secara otomatis oleh alat sintesis saat mengonversi VHDL ke netlist.