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

Cara membuat vektor sinyal di VHDL:std_logic_vector

std_logic_vector type dapat digunakan untuk membuat bus sinyal di VHDL. std_logic adalah jenis yang paling umum digunakan dalam VHDL, dan std_logic_vector adalah versi lariknya.

Sedangkan std_logic sangat bagus untuk memodelkan nilai yang dapat dibawa oleh satu kabel, sangat tidak praktis untuk menerapkan kumpulan kabel yang menuju atau dari komponen. std_logic_vector adalah tipe komposit, yang berarti kumpulan subelemen. Sinyal atau variabel dari std_logic_vector type dapat berisi sejumlah std_logic elemen.

Pos blog ini adalah bagian dari seri Tutorial VHDL Dasar.

Sintaks untuk mendeklarasikan std_logic_vector sinyalnya adalah:
signal <name> : std_logic_vector(<lsb> to <msb>) := <initial_value>;
atau
signal <name> : std_logic_vector(<msb> downto <lsb>) := <initial_value>;
di mana <name> adalah nama sembarang untuk sinyal dan <initial_value> adalah nilai awal opsional. <lsb> adalah indeks dari bit yang paling tidak signifikan, dan <msb> adalah indeks dari bit yang paling signifikan.

to atau downto menentukan arah jangkauan bus, pada dasarnya endianess-nya. Meskipun keduanya bekerja sama baiknya, biasanya desainer VHDL mendeklarasikan vektor menggunakan downto . Oleh karena itu, saya sarankan Anda selalu menggunakan downto saat Anda mendeklarasikan vektor bit untuk menghindari kebingungan.

Kode VHDL untuk mendeklarasikan sinyal vektor yang dapat menampung satu byte:
signal MySlv : std_logic_vector(7 downto 0);

Kode VHDL untuk mendeklarasikan sinyal vektor yang dapat menampung satu bit:
signal MySlv : std_logic_vector(0 downto 0);

Kode VHDL untuk mendeklarasikan sinyal vektor yang dapat menampung bit nol (rentang kosong ):
signal MySlv : std_logic_vector(-1 downto 0);

Olahraga

Dalam video tutorial ini kita akan belajar bagaimana mendeklarasikan std_logic_vector sinyal dan memberi mereka nilai awal. Kami juga mempelajari cara mengulangi bit dalam vektor menggunakan For-Loop untuk membuat register geser :

Kode terakhir yang kita buat dalam tutorial ini:

library ieee;
use ieee.std_logic_1164.all;

entity T11_StdLogicVectorTb is
end entity;

architecture sim of T11_StdLogicVectorTb is

    signal Slv1 : std_logic_vector(7 downto 0);
    signal Slv2 : std_logic_vector(7 downto 0) := (others => '0');
    signal Slv3 : std_logic_vector(7 downto 0) := (others => '1');
    signal Slv4 : std_logic_vector(7 downto 0) := x"AA";
    signal Slv5 : std_logic_vector(0 to 7)     := "10101010";
    signal Slv6 : std_logic_vector(7 downto 0) := "00000001";

begin

    -- Shift register
    process is
    begin

        wait for 10 ns;

        for i in Slv6'left downto Slv6'right + 1 loop
            Slv6(i) <= Slv6(i-1);
        end loop;

        Slv6(Slv6'right) <= Slv6(Slv6'left);

    end process;

end architecture;

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

Analisis

Dalam latihan ini kami mendeklarasikan enam std_logic_vector bus, masing-masing panjangnya delapan bit (satu byte).

Sinyal Slv1 dideklarasikan tanpa nilai awal. Bus terlihat memiliki nilai XX pada tangkapan layar bentuk gelombang. Ini karena nilai yang ditampilkan di bus dalam heksadesimal, dan XX menunjukkan nilai non-heksa. Tetapi ketika kami memperluas bus dalam bentuk gelombang, kami dapat melihat bahwa bit individu memang milik U.

Sinyal Slv2 dideklarasikan menggunakan nilai awal semua 0. Alih-alih menentukan nilai yang tepat untuk setiap bit, kami menggunakan (other => '0') menggantikan nilai awal. Ini dikenal sebagai agregat penugasan. Bagian yang penting adalah ia akan mengatur semua bit dalam vektor ke apa pun yang Anda tentukan, tidak peduli berapa lama.

Sinyal Slv3 dideklarasikan menggunakan penugasan agregat untuk memberikan semua bit nilai awal 1. Kita dapat melihat FF ditampilkan pada sinyal ini dalam bentuk gelombang, yang merupakan hex untuk delapan 1.

Sinyal Slv4 dideklarasikan dengan nilai awal yang ditentukan dalam hex, AA. Setiap digit hex panjangnya 4 bit, oleh karena itu kita harus menyediakan dua digit (AA) untuk vektor kita yang panjangnya 8 bit.

Sinyal Slv5 mendeklarasikan nilai awal yang sama persis dengan Slv4 , tapi sekarang kita tentukan sebagai nilai biner 10101010. Kita dapat melihat dari bentuk gelombang bahwa kedua sinyal memiliki nilai hex AA.

Sinyal Slv6 dideklarasikan dengan nilai awal semua nol, kecuali bit paling kanan yaitu '1' . Kami menggunakan proses untuk membuat register geser dari sinyal ini. Register geser, seperti namanya, menggeser isi vektor satu tempat ke kiri setiap 10 nanodetik.

Proses kami bangun setiap 10 ns, dan For-Loop menggeser semua bit dalam vektor satu tempat ke kiri. Bit terakhir digeser kembali ke indeks pertama dengan Slv6(Slv6'right) <= Slv6(Slv6'left); penyataan. Dalam bentuk gelombang kita dapat melihat '1' beriak melalui vektor.

Ini adalah visualisasi bagaimana '1' menyebar melalui register geser kami:

Dengan menggunakan 'left' dan 'right atribut, kami membuat kode kami lebih umum. Jika kita mengubah lebar Sig6 , proses akan tetap berjalan. Ini adalah praktik desain yang baik untuk menggunakan atribut di mana Anda bisa, bukan nilai hardcoding.

Anda mungkin bertanya-tanya apakah ada lebih banyak atribut yang dapat Anda gunakan, dan memang ada. Saya tidak akan membicarakannya lebih lanjut dalam seri tutorial ini, karena saya menganggapnya sebagai fitur VHDL tingkat lanjut.

Bawa Pulang

Ikuti Kuis Dasar VHDL – bagian 2 »
atau
Lanjut ke tutorial selanjutnya »


VHDL

  1. Contoh Konversi VHDL
  2. Ditandatangani vs. Tidak Ditandatangani di VHDL
  3. Cara membuat daftar string di VHDL
  4. Cara membuat testbench berbasis Tcl untuk modul kunci kode VHDL
  5. Bagaimana menghentikan simulasi di testbench VHDL
  6. Cara membuat pengontrol PWM di VHDL
  7. Cara menghasilkan angka acak di VHDL
  8. Cara membuat penyangga cincin FIFO di VHDL
  9. Cara membuat testbench pemeriksaan mandiri
  10. Cara membuat Daftar Tertaut di VHDL