Pada tutorial sebelumnya kita telah belajar bagaimana mendeklarasikan sebuah variabel dalam sebuah proses. Variabel bagus untuk membuat algoritme dalam suatu proses, tetapi tidak dapat diakses oleh dunia luar. Jika ruang lingkup variabel hanya dalam satu proses, bagaimana ia dapat berinteraksi dengan logika lain? Solusi untuk ini adalah sinyal .
Sinyal dideklarasikan antara architecture <architecture_name> of <entity_name> is baris dan begin pernyataan dalam file VHDL. Ini disebut bagian deklaratif dari arsitektur.
Pos blog ini adalah bagian dari seri Tutorial VHDL Dasar.
Sintaks untuk mendeklarasikan sinyal adalah: signal <name> : <type>;
Sinyal opsional dapat dideklarasikan dengan nilai awal: signal <name> : <type> := <initial_value>;
Olahraga
Dalam video tutorial ini kita belajar cara mendeklarasikan sinyal. Kita juga akan mempelajari perbedaan utama antara variabel dan sinyal:
Kode terakhir yang kita buat dalam tutorial ini:
entity T06_SignalTb is
end entity;
architecture sim of T06_SignalTb is
signal MySignal : integer := 0;
begin
process is
variable MyVariable : integer := 0;
begin
report "*** Process begin ***";
MyVariable := MyVariable + 1;
MySignal <= MySignal + 1;
report "MyVariable=" & integer'image(MyVariable) &
", MySignal=" & integer'image(MySignal);
MyVariable := MyVariable + 1;
MySignal <= MySignal + 1;
report "MyVariable=" & integer'image(MyVariable) &
", MySignal=" & integer'image(MySignal);
wait for 10 ns;
report "MyVariable=" & integer'image(MyVariable) &
", MySignal=" & integer'image(MySignal);
end process;
end architecture;
Output ke konsol simulator saat kita menekan tombol run di ModelSim:
Kami membuat sinyal dan variabel dengan nilai awal yang sama yaitu 0. Dalam proses kami, kami memperlakukan mereka dengan cara yang sama persis, namun hasil cetakan menunjukkan bahwa mereka berperilaku berbeda. Pertama kita melihat bahwa penugasan ke variabel dan sinyal memiliki notasi yang berbeda dalam VHDL. Penugasan variabel menggunakan := operator sementara penugasan sinyal menggunakan <= operator.
MyVariable berperilaku seperti yang diharapkan variabel untuk berperilaku. Pada iterasi pertama dari loop itu bertambah menjadi 1, dan kemudian menjadi 2. Hasil cetak terakhir dari iterasi pertama menunjukkan bahwa nilainya masih 2, seperti yang kita harapkan.
MySignal berperilaku sedikit berbeda. Kenaikan +1 pertama tampaknya tidak berpengaruh. Hasil cetakan menunjukkan bahwa nilainya masih 0, nilai awal. Hal yang sama berlaku setelah kenaikan +1 kedua. Sekarang nilai MyVariable adalah 2, tetapi nilai MySignal masih 0. Setelah wait for 10 ns; hasil cetakan ketiga menunjukkan bahwa nilai MySignal sekarang 1. Cetakan berikutnya mengikuti pola ini juga.
Apa sihir ini? Saya akan memberi Anda petunjuk, wait for 10 ns; ada hubungannya dengan itu. Sinyal hanya diperbarui ketika suatu proses dijeda. Proses kami hanya menjeda satu tempat, di wait for 10 ns; . Oleh karena itu, nilai sinyal hanya berubah setiap kali garis ini dipukul. 10 nanodetik adalah nilai arbitrer, bisa apa saja, bahkan 0 nanodetik. Cobalah!
Pengamatan penting lainnya adalah bahwa peristiwa meskipun sinyal bertambah dua kali sebelum wait , nilainya hanya bertambah satu kali. Ini karena ketika menetapkan sinyal dalam suatu proses, tugas terakhir "menang". <= operator hanya menjadwalkan nilai baru ke sinyal, itu tidak berubah sampai wait . Oleh karena itu, pada kenaikan kedua MySignal , 1 ditambahkan ke lama its nilai. Ketika ditambahkan lagi, kenaikan pertama benar-benar hilang.
Bawa Pulang
Sebuah variabel dapat digunakan dalam satu proses sementara sinyal memiliki cakupan yang lebih luas
Penetapan variabel langsung efektif sementara sinyal diperbarui hanya saat proses dijeda
Jika sinyal ditetapkan beberapa kali tanpa wait , tugas terakhir “menang”