Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> VHDL

Cara menggunakan pernyataan Case-When di VHDL

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:

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

Analisis

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

Pergi ke tutorial berikutnya »


VHDL

  1. Pernyataan Prosedur - Contoh VHDL
  2. Bagaimana Kami Menggunakan Molibdenum?
  3. Cara membuat daftar string di VHDL
  4. Bagaimana menghentikan simulasi di testbench VHDL
  5. Cara membuat pengontrol PWM di VHDL
  6. Cara menghasilkan angka acak di VHDL
  7. Cara menggunakan Prosedur dalam Proses di VHDL
  8. Cara menggunakan Fungsi Tidak Murni di VHDL
  9. Cara menggunakan Fungsi di VHDL
  10. Cara Menggunakan Penggiling Pemotong