Pernyataan Case-When akan menyebabkan program mengambil satu dari beberapa jalur yang berbeda, tergantung pada nilai sinyal, variabel, atau ekspresi. Ini adalah alternatif yang lebih elegan untuk pernyataan If-then-Elsif-Else dengan beberapa Elsif.
Bahasa pemrograman lain memiliki konstruksi serupa, menggunakan kata kunci seperti switch , kasus , atau pilih . Antara lain, pernyataan Case-When biasanya digunakan untuk mengimplementasikan multiplexer di VHDL. Lanjutkan membaca, atau tonton videonya untuk mengetahui caranya!
Pos blog ini adalah bagian dari seri Tutorial VHDL Dasar.
Sintaks dasar untuk pernyataan Case-When adalah: case <expression> is
when <choice> =>
code for this branch
when <choice> =>
code for this branch
...
end case;
<expression> biasanya berupa variabel atau sinyal. Pernyataan Kasus dapat berisi beberapa when pilihan, tetapi hanya satu pilihan yang akan dipilih.
<choice> mungkin nilai unik seperti "11" : when "11" =>
Atau dapat berupa rentang seperti 5 to 10 : when 5 to 10 =>
Itu dapat berisi beberapa nilai seperti 1|3|5 : when 1|3|5 =>
Dan yang paling penting, others pilihan. Itu dipilih setiap kali tidak ada pilihan lain yang cocok: when others =>
others pilihan setara dengan Else cabang dalam pernyataan If-then-Elsif-Else.
Olahraga
Dalam tutorial video ini kita akan belajar cara membuat multiplexer menggunakan pernyataan Case-When di VHDL:
Kode terakhir yang kita buat dalam tutorial ini:
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 -- 'U', 'X', '-' etc.
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 => -- 'U', 'X', '-', etc.
Output2 <= (others => 'X');
end case;
end process;
end architecture;
Jendela bentuk gelombang di ModelSim setelah kami menekan run, dan memperbesar timeline:
Output ke konsol simulator saat kita menekan tombol run di ModelSim:
Pertama, kami membuat proses menggunakan If-then-Elsif-Else yang akan meneruskan salah satu sinyal Sig1 , Sig2 , Sig3 , atau Sig4 , berdasarkan nilai sinyal pemilih Sel .
Kemudian kami membuat proses yang melakukan hal yang persis sama, menggunakan pernyataan Case-When. Kita dapat melihat dari bentuk gelombang bahwa sinyal keluaran dari kedua proses, Output1 dan Output2 , berperilaku persis sama.
Dalam contoh kita, Sel sinyal hanya memiliki empat nilai hukum. Tetapi jika ada lebih banyak kemungkinan, kita dapat dengan mudah melihat bahwa pernyataan Case-When dapat membantu membuat kode lebih mudah dibaca. Ini adalah cara yang disukai untuk membuat komponen seperti itu oleh sebagian besar desainer VHDL.
Memahami multiplexer adalah poin bonus dari latihan ini. Multiplexer, atau singkatnya MUX, adalah komponen utama dalam desain digital. Ini hanyalah sebuah saklar yang memilih salah satu dari beberapa input, dan meneruskannya ke output.
Ini adalah ilustrasi bagaimana MUX meneruskan sinyal input yang dipilih:
Kami menggunakan others klausa untuk menangkap semua nilai Sel yang bukan satu atau nol. Seperti yang kita pelajari dalam tutorial std_logic, sinyal ini dapat memiliki sejumlah nilai yang bukan '0' atau '1' . Ini adalah praktik desain yang baik untuk menangani nilai-nilai ini dengan mengeluarkan 'X' . Ini menunjukkan nilai yang tidak diketahui pada sinyal ini, dan juga akan terlihat di logika hilir.
Kita dapat melihat dari bentuk gelombang bahwa ketika Sel sinyal berubah menjadi merah, Output1 dan Output2 juga diubah menjadi "XX" . Ini when others => sedang beraksi.
Selain itu, output konsol di ModelSim menunjukkan peringatan karena Sel sinyal disetel ke "UU" . Pesan “** Warning:NUMERIC_STD.”=”:metavalue detect, return FALSE” muncul pada waktu simulasi 50 ns, tepatnya saat sinyal berubah menjadi merah.
Bawa Pulang
Case-When dapat digunakan sebagai ganti beberapa pernyataan If-then-Elsif
when others => dapat digunakan untuk mengimplementasikan pilihan default
Multiplexer sebaiknya dibuat menggunakan pernyataan Case-When