Menguasai Pernyataan Case-When dalam VHDL: Desain Multiplexer Efisien
Pernyataan Case-When mengarahkan program VHDL di sepanjang salah satu dari beberapa jalur berdasarkan sinyal, variabel, atau ekspresi. Ini menawarkan alternatif yang lebih bersih dan lebih mudah dibaca daripada rantai if-then-elsif-else yang panjang, terutama saat menangani banyak nilai diskrit.
Banyak bahasa pemrograman menggunakan konstruksi seperti switch atau case; dalam VHDL, konstruksi case adalah dasar untuk membangun multiplexer dan logika seleksi lainnya.
Artikel ini adalah bagian dari seri Tutorial VHDL Dasar kami.
Sintaks Dasar
Struktur kanonis dari pernyataan case adalah:
case <expression> is when <choice> => -- code for this branch when <choice> => -- code for this branch ... end case;
<expression> biasanya adalah sinyal atau variabel. Meskipun case dapat berisi banyak cabang when, hanya satu yang akan dieksekusi selama simulasi.
Setiap <choice> dapat berupa:
- Satu nilai, misalnya,
when "11" => - Rentang, misalnya,
when 5 to 10 => - Daftar nilai, misalnya,
when 1|3|5 => - Kata kunci
others, yang cocok dengan nilai apa pun yang tidak tercantum secara eksplisit.
Latihan Praktis: Membangun Multiplexer 4-ke-1
Di bawah ini adalah kode VHDL lengkap yang menunjukkan multiplexer 4-ke-1 yang diimplementasikan dengan pendekatan if-then-elsif dan case.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T14_CaseWhenTb is end entity; architecture sim of T14_CaseWhenTb is signal Sig1 : unsigned(7 downto 0) := x"AA"; signal Sig2 : unsigned(7 downto 0) := x"BB"; signal Sig3 : unsigned(7 downto 0) := x"CC"; signal Sig4 : unsigned(7 downto 0) := x"DD"; signal Sel : unsigned(1 downto 0) := (others => '0'); signal Output1 : unsigned(7 downto 0); signal Output2 : unsigned(7 downto 0); begin -- Stimuli for the selector signal process is begin wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= "UU"; wait; end process; -- MUX using if-then-else process(Sel, Sig1, Sig2, Sig3, Sig4) is begin if Sel = "00" then Output1 <= Sig1; elsif Sel = "01" then Output1 <= Sig2; elsif Sel = "10" then Output1 <= Sig3; elsif Sel = "11" then Output1 <= Sig4; else Output1 <= (others => 'X'); end if; end process; -- Equivalent MUX using a case statement process(Sel, Sig1, Sig2, Sig3, Sig4) is begin case Sel is when "00" => Output2 <= Sig1; when "01" => Output2 <= Sig2; when "10" => Output2 <= Sig3; when "11" => Output2 <= Sig4; when others => Output2 <= (others => 'X'); end case; end process; end architecture;
Setelah menjalankan simulasi di ModelSim, gelombang menunjukkan perilaku yang identik untuk Output1 dan Output2. Ketika selector Sel mengambil nilai yang tidak terdefinisi (misalnya, "UU"), klausa when others => mengeluarkan 'X', yang menandakan status tidak diketahui.
Keluaran konsol berisi peringatan berikut pada 50 ns, yang menunjukkan perbandingan metanilai:
VSIM 2> run # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb # ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE # Time: 50 ns Iteration: 1 Instance: /t14_casewhentb
Hal Utama yang Perlu Diingat
- Gunakan pernyataan
case untuk menggantikan rantai if-then-elsif yang panjang untuk keterbacaan yang lebih baik. - Implementasikan jalur default dengan
when others => untuk menangani nilai yang tidak terduga. - Multiplexer paling rapi diekspresikan dengan konstruksi
case dalam VHDL.
Lanjutkan ke tutorial berikutnya untuk konsep VHDL yang lebih lanjut.