Variabel VHDL Dijelaskan: Contoh Praktis & Aturan untuk Desain Terpercaya
Dalam VHDL, variabel berperilaku mirip dengan variabel dalam C: nilainya tersedia segera setelah penugasan dan tetap tidak berubah hingga penugasan berikutnya. Ini menjadikannya ideal untuk penyimpanan sementara dan perhitungan prosedural dalam sebuah proses.
Aturan Utama untuk Menggunakan Variabel dalam VHDL
- Variabel terbatas pada proses di mana mereka dideklarasikan.
- Setiap proses memiliki variabel sendiri; mereka tidak dapat dibagikan di antara proses.
- Deklarasikan variabel di antara kata kunci
process dan kata kunci begin. - Penugasan menggunakan operator
:=. - Setelah ditugaskan, variabel segera menahan nilai baru untuk pernyataan berikutnya dalam proses yang sama.
Poin terakhir—penugasan instan—sering kali menjadi sumber kebingungan. Di bawah ini adalah contoh ringkas yang menunjukkan bagaimana variabel dapat digunakan untuk menggabungkan dua sinyal dan mendorong pernyataan case.
VAR_CASE : process (i_clk) variable v_Choices : std_logic_vector(1 downto 0); begin v_Choices := i_select_1 & i_select_2; -- concatenation case v_Choices is when "00" => o_data <= "0001"; when "01" => o_data <= "0010"; -- kasus tambahan dihilangkan untuk kependekan end case; end process VAR_CASE;
Dalam cuplikan ini, v_Choices tersedia untuk pernyataan case segera setelah penggabungan, mengilustrasikan pembaruan instan variabel.
Untuk ilustrasi yang lebih dalam, pertimbangkan arsitektur berikut yang melacak counter dengan dua salinan sinyal. Meskipun kedua sinyal tampak identik, hanya r_Var_Copy1 yang mencapai nilai 5 sebelum reset karena r_Var_Copy2 ditugaskan setelah counter sudah direset dalam siklus clock yang sama.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity variable_ex is port ( i_clk : in std_logic; o_done : out std_logic ); end variable_ex; architecture rtl of variable_ex is signal r_Done : std_logic := '0'; signal r_Var_Copy1 : natural range 0 to 5 := 0; signal r_Var_Copy2 : natural range 0 to 5 := 0; begin EX_VAR : process (i_clk) variable v_Count : natural range 0 to 5 := 0; begin if rising_edge(i_clk) then v_Count := v_Count + 1; r_Var_Copy1 <= v_Count; if v_Count = 5 then r_Done <= '1'; v_Count := 0; else r_Done <= '0'; end if; r_Var_Copy2 <= v_Count; end if; end process EX_VAR; o_done <= r_Done; end rtl;
Untuk mengamati perilaku ini dalam simulasi, testbench sederhana disediakan. Ini mengubah clock dan memantau output o_done. Saat menggunakan ModelSim, ingat bahwa variabel muncul di jendela waveform hanya jika opsi tampilan variabel simulator diaktifkan.
library ieee; use ieee.std_logic_1164.all; entity variable_ex_tb is end variable_ex_tb; architecture behave of variable_ex_tb is component variable_ex port ( i_clk : in std_logic; o_done : out std_logic ); end component variable_ex; constant c_CLK_PERIOD : time := 10 ns; signal r_CLK : std_logic := '0'; signal w_DONE : std_logic; begin UUT : variable_ex port map ( i_clk => r_CLK, o_done => w_DONE ); r_CLK <= not r_CLK after c_CLK_PERIOD/2; end behave;

Contoh ini menyoroti perilaku yang berbeda antara variabel dan sinyal: sementara r_Var_Copy1 mencapai 5, r_Var_Copy2 tidak pernah melakukannya karena variabel direset sebelum penugasan sinyal.