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

Cara menggunakan Konstanta dan Peta Generik di VHDL

Membuat modul adalah cara yang bagus untuk menggunakan kembali kode, tetapi seringkali Anda memerlukan modul yang sama dengan variasi yang lebih kecil di seluruh desain Anda. Inilah gunanya generik dan peta generik. Ini memungkinkan Anda untuk membuat bagian-bagian tertentu dari modul dapat dikonfigurasi pada waktu kompilasi.

Konstanta digunakan ketika kita ingin menghindari pengetikan nilai yang sama berulang-ulang. Mereka dapat digunakan untuk mendefinisikan lebar bit vektor sinyal pada waktu kompilasi, dan mereka bahkan dapat dipetakan ke konstanta generik juga. Konstanta dapat digunakan sebagai pengganti sinyal dan variabel di mana pun dalam kode, tetapi nilainya tidak dapat diubah setelah waktu kompilasi.

Pos blog ini adalah bagian dari seri Tutorial VHDL Dasar.

Pada tutorial sebelumnya, kita telah membuat modul multiplexer 4 input dengan lebar bus 8 bit. Tetapi bagaimana jika kita juga membutuhkan MUX serupa dengan lebar bus yang berbeda? Apakah satu-satunya solusi untuk menyalin-menempelkan kode ke modul baru, dan mengubah nomornya?

Untungnya, tidak.

Dimungkinkan untuk membuat konstanta dalam VHDL menggunakan sintaks ini:
constant <constant_name> : <type> := <value>;

Konstanta dapat dideklarasikan bersama dengan sinyal di bagian deklaratif dari file VHDL, atau dapat dideklarasikan bersama dengan variabel dalam suatu proses.

Konstanta dapat diteruskan ke modul melalui entitas dengan menggunakan generic kata kunci. Sintaks untuk membuat entitas untuk modul yang menerima konstanta generik adalah:
entity <entity_name> is
generic(
    <entity_constant_name> : <type> [:= default_value];
    ...
);
port(
    <entity_signal_name> : in|out|inout <type>;
    ...
);
end entity;

Sintaks untuk membuat instance modul generik di file VHDL lain adalah:
<label> : entity <library_name>.<entity_name>(<architecture_name>)
generic map(
    <entity_constant_name> => <value_or_constant>,
    ...
)
port map(
    <entity_signal_name> => <local_signal_name>,
    ...
);

Olahraga

Dalam tutorial video ini kita akan belajar cara membuat dan membuat instance modul dengan konstanta generik di VHDL:

Kode terakhir untuk MUX testbench generic :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T16_GenericMapTb is
end entity;

architecture sim of T16_GenericMapTb is

    constant DataWidth : integer := 8;

    signal Sig1 : signed(DataWidth-1 downto 0) := x"AA";
    signal Sig2 : signed(DataWidth-1 downto 0) := x"BB";
    signal Sig3 : signed(DataWidth-1 downto 0) := x"CC";
    signal Sig4 : signed(DataWidth-1 downto 0) := x"DD";

    signal Sel : signed(1 downto 0) := (others => '0');

    signal Output : signed(DataWidth-1 downto 0);

begin

    -- An Instance of T16_GenericMux with architecture rtl
    i_Mux1 : entity work.T16_GenericMux(rtl)
    generic map(DataWidth => DataWidth)
    port map(
        Sel    => Sel,
        Sig1   => Sig1,
        Sig2   => Sig2,
        Sig3   => Sig3,
        Sig4   => Sig4,
        Output => Output);

    -- Testbench process
    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;

end architecture;

Kode terakhir untuk modul MUX generik :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity T16_GenericMux is
generic(DataWidth : integer);
port(
    -- Inputs
    Sig1 : in signed(DataWidth-1 downto 0);
    Sig2 : in signed(DataWidth-1 downto 0);
    Sig3 : in signed(DataWidth-1 downto 0);
    Sig4 : in signed(DataWidth-1 downto 0);

    Sel  : in signed(1 downto 0);

    -- Outputs
    Output : out signed(DataWidth-1 downto 0));
end entity;

architecture rtl of T16_GenericMux is
begin

    process(Sel, Sig1, Sig2, Sig3, Sig4) is
    begin

        case Sel is
            when "00" =>
                Output <= Sig1;
            when "01" =>
                Output <= Sig2;
            when "10" =>
                Output <= Sig3;
            when "11" =>
                Output <= Sig4;
            when others => -- 'U', 'X', '-', etc.
                Output <= (others => 'X');
        end case;

    end process;

end architecture;

Jendela bentuk gelombang di ModelSim setelah kami menekan run, dan memperbesar timeline:

Analisis

Kami membuat modul MUX dengan lebar bus yang dapat dikonfigurasi. Sekarang, lebar bus ditentukan hanya di satu tempat, di file testbench. Kita dapat dengan mudah mengubahnya untuk membuat MUX dengan lebar bus yang berbeda.

Jika kita membandingkan bentuk gelombang dengan yang dari tutorial sebelumnya, kita dapat melihat bahwa perilakunya identik. Ini karena kami tidak mengubah perilaku kode sama sekali.

Bawa Pulang

Pergi ke tutorial berikutnya »


VHDL

  1. Cara menggunakan Prosedur dalam Proses di VHDL
  2. Cara menggunakan Fungsi Tidak Murni di VHDL
  3. Cara menggunakan Fungsi di VHDL
  4. Cara menggunakan Prosedur di VHDL
  5. Cara menggunakan Konstanta dan Peta Generik di VHDL
  6. Cara menggunakan instantiasi Port Map di VHDL
  7. Cara menggunakan pernyataan Case-When di VHDL
  8. Cara menggunakan Signed dan Unsigned di VHDL
  9. Cara memasang simulator dan editor VHDL secara gratis
  10. Mikrokontroler PIC18:Apa Itu dan Bagaimana Cara Menggunakannya