Sebagian besar desain VHDL menggunakan logika clock , juga dikenal sebagai logika sinkron atau logika sekuensial . Proses clock hanya dipicu oleh sinyal master clock, bukan saat sinyal input lainnya berubah.
Blok bangunan dasar logika clock adalah komponen yang disebut flip-flop . Ada varian yang berbeda, dan dalam tutorial ini kita akan fokus pada flip-flop yang dipicu sisi positif dengan reset negatif:
Flip-flop adalah rangkaian sampel-dan-tahan, yang berarti bahwa ia menyalin nilai dari input ke output ketika tepi naik dari sinyal clock tiba. Outputnya kemudian dipertahankan stabil pada nilai sampel sampai tepi naik berikutnya dari jam, atau sampai sinyal reset berdenyut.
Pos blog ini adalah bagian dari seri Tutorial VHDL Dasar.
Semua proses clock dipicu secara bersamaan dan akan membaca inputnya sekaligus. Pada saat yang sama, mereka akan menampilkan hasil dari iterasi terakhir. Sinyal jam secara efektif menciptakan langkah waktu dalam aliran data. Ini membuatnya mudah dikelola bagi desainer untuk membuat logika yang kompleks dan mendalam. Dia dapat memecah tindakan algoritme menjadi peristiwa yang terjadi pada siklus jam.
Flip-flop atau array flip-flop kadang-kadang disebut sebagai register , itu adalah hal yang sama.
Daftar sensitivitas untuk proses clock biasanya hanya berisi sinyal clock. Ini karena proses clock hanya dipicu oleh sisi sinyal clock, sinyal input lainnya tidak akan membuatnya aktif sama sekali.
Ini adalah template untuk membuat proses clock 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;
Olahraga
Dalam tutorial video ini kita akan belajar cara membuat proses clock di VHDL:
Kode terakhir untuk flip-flop testbench :
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);
-- Process for generating the clock
Clk <= not Clk after ClockPeriod / 2;
-- Testbench sequence
process is
begin
-- Take the DUT out of 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;
-- Reset the DUT
nRst <= '0';
wait;
end process;
end architecture;
Kode terakhir untuk modul flip-flop :
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;
Jendela bentuk gelombang di ModelSim setelah kami menekan run, dan memperbesar timeline:
Analisis
Kita dapat melihat dari bentuk gelombang bahwa sinyal keluaran hanya diperbarui pada setiap tepi naik dari sinyal clock. Sinyal input disampel hanya ketika sinyal clock berubah dari '0' menjadi '1'. Penurunan negatif dari sinyal input mulai sekitar 45 ns benar-benar hilang. Itu tidak disalin ke output karena berada di antara dua sisi naik jam, dan karena itu diabaikan.
Animasi ini mengilustrasikan bagaimana output bereaksi terhadap sinyal input dan clock yang berubah:
Garis vertikal menunjukkan bagaimana sinyal input relatif terhadap tepi naik jam.
Berikan perhatian khusus pada satu pulsa positif pada sinyal input mulai dari 20 ns. Ini sinkron dengan jam dan tepat satu periode jam. Outputnya tidak langsung bereaksi, itu tertunda satu periode clock.
Ketika saya belajar VHDL, saya menemukan ini sangat sulit untuk dipahami. Tepi naik jam sinkron dengan tepi naik input, jadi bagaimana flip-flop dapat memilih satu nilai atau yang lain?
Simulator menggunakan langkah waktu untuk memodelkan peristiwa dengan cara yang dapat diprediksi, dan sinyal menyebar dalam waktu nol. Karena flip-flop membaca input dalam langkah waktu yang sama persis saat memperbarui output, flip-flop melihat nilai input lama dan menyalinnya ke output.
Baca selengkapnya tentang langkah waktu VHDL di sini:Penjelasan siklus Delta
Saya harus menambahkan jawaban ini bahwa ini tidak benar-benar bagaimana itu bekerja. Di dunia fisik, sinyal membutuhkan waktu untuk menyebar, kita tidak tahu persis kapan tiba di flip-flop. Penundaan propagasi ini diperkirakan secara otomatis oleh proses perangkat lunak (tempat dan rute) yang mengubah kode VHDL menjadi netlist.
Pada kenyataannya, input harus tetap stabil selama beberapa nanodetik sebelum dan sesudah naiknya tepi jam:
Periode waktu kritis ini dikenal sebagai setup dan hold time. Untungnya, ini bukan sesuatu yang biasanya harus Anda pertimbangkan. Ketika bekerja murni dengan logika clock, masalah ini ditangani oleh perangkat lunak yang mengubah kode VHDL menjadi netlist.
Bawa Pulang
Proses yang dikunci dengan penyetelan ulang yang disinkronkan hanya memiliki sinyal jam pada daftar sensitivitas
if rising_edge(Clk) memastikan bahwa proses hanya bangun di tepi jam yang naik
Dalam desain sinkron, hal-hal hanya terjadi saat tepi jam aktif
Ikuti Kuis Dasar VHDL – bagian 3 » atau Lanjut ke tutorial selanjutnya »