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

Cara menggunakan instantiasi Port Map di VHDL

Modul adalah unit mandiri dari kode VHDL. Modul berkomunikasi dengan dunia luar melalui entitas . Peta pelabuhan adalah bagian dari instantiasi modul tempat Anda mendeklarasikan sinyal lokal mana yang akan dihubungkan dengan input dan output modul.

Dalam tutorial sebelumnya dalam seri ini kami telah menulis semua kode kami di file VHDL utama, tetapi biasanya kami tidak akan melakukannya. Kami membuat logika dengan tujuan menggunakannya dalam desain FPGA atau ASIC, bukan untuk simulator.

Modul VHDL yang dibuat untuk dijalankan dalam simulator biasanya tidak memiliki sinyal input atau output. Itu sepenuhnya mandiri. Itu sebabnya entitas desain kami kosong. Tidak ada apa-apa di antara entity tag dan end entity; tag.

Pos blog ini adalah bagian dari seri Tutorial VHDL Dasar.

Modul tanpa sinyal input atau output tidak dapat digunakan dalam desain nyata. Satu-satunya tujuannya adalah untuk memungkinkan kita menjalankan kode VHDL dalam simulator. Oleh karena itu disebut sebagai testbench . Untuk mensimulasikan modul dengan sinyal input dan output, kita harus membuat instance itu di bangku ujian.

Modul dan testbenches sering berpasangan, dan disimpan dalam file yang berbeda. Skema penamaan yang umum adalah memanggil testbench nama modul dengan "Tb" ditambahkan, dan menamai arsitektur "sim". Jika modul disebut "MyModule", testbench akan disebut "MyModuleTb". Akibatnya, nama file menjadi “MyModuleTb.vhd” dan “MyModule.vhd”.

Dengan bantuan kode testbench kami dapat memverifikasi bahwa modul bekerja dengan benar di lingkungan simulasi. Modul yang sedang diuji biasanya disebut sebagai perangkat yang sedang diuji (DUT).

Modul juga dapat dipakai dalam modul lain. Mempartisi kode ke dalam modul memungkinkannya untuk dipakai beberapa kali. Anda dapat membuat beberapa contoh modul dalam desain yang sama, dan dapat digunakan kembali di banyak desain.

Sintaks untuk entitas dengan port di VHDL adalah:
entity <entity_name> is
port(
    <entity_signal_name> : in|out|inout <signal_type>;
    ...
);
end entity;

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

<label> bisa berupa nama apa saja, dan itu akan muncul di jendela hierarki di ModelSim. <library_name> untuk modul diatur dalam simulator, bukan dalam kode VHDL. Secara default setiap modul dikompilasi ke dalam work Perpustakaan. <entity_name> dan <architecture_name> harus cocok dengan modul yang sedang kita buat turunannya. Terakhir, setiap sinyal entitas harus dipetakan ke nama sinyal lokal.

Ada cara lain untuk membuat instance modul di VHDL, tetapi ini adalah sintaks dasar untuk instantiasi eksplisit.

Olahraga

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

Kode terakhir untuk MUX testbench :

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

entity T15_PortMapTb is
end entity;

architecture sim of T15_PortMapTb 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 Output : unsigned(7 downto 0);

begin

    -- An instance of T15_Mux with architecture rtl
    i_Mux1 : entity work.T15_Mux(rtl) 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 :

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

entity T15_Mux is
port(
    -- Inputs
    Sig1 : in unsigned(7 downto 0);
    Sig2 : in unsigned(7 downto 0);
    Sig3 : in unsigned(7 downto 0);
    Sig4 : in unsigned(7 downto 0);

    Sel  : in unsigned(1 downto 0);

    -- Outputs
    Output : out unsigned(7 downto 0));
end entity;

architecture rtl of T15_Mux 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

Seperti yang bisa kita lihat dari bentuk gelombang, modul multiplexer (MUX) bekerja seperti yang diharapkan. Bentuk gelombangnya identik dengan yang dari tutorial sebelumnya yang kita buat tanpa menggunakan modul.

Sekarang ada pemisahan yang jelas antara modul desain dan testbench. Modul yang berisi MUX adalah apa yang ingin kami gunakan dalam desain, dan satu-satunya tujuan testbench adalah untuk memungkinkan kami menjalankannya dalam simulator. Ada proses di testbench yang menggunakan wait pernyataan untuk membuat penundaan waktu buatan dalam simulasi. Modul desain tidak mengenal waktu, hanya bereaksi terhadap rangsangan eksternal.

Kami menamai arsitektur testbench sim , untuk simulasi. Arsitektur modul desain bernama rtl , yang merupakan singkatan dari register-transfer level. Ini hanya konvensi penamaan. Saat Anda melihat file dengan nama seperti itu, Anda langsung tahu apakah itu testbench atau modul desain. Perusahaan yang berbeda mungkin memiliki konvensi penamaan yang berbeda.

Bawa Pulang

Pergi ke tutorial berikutnya »


VHDL

  1. Bagaimana Kami Menggunakan Molibdenum?
  2. Cara membuat daftar string di VHDL
  3. Cara membuat testbench berbasis Tcl untuk modul kunci kode 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