There are some differences between signal and variable, but we just need to keep in mind the following basic differences:
+ Variables can only be used inside processes
+ Variables are assigned using the := assignment symbol; signals are assigned using the <= assignment symbol.
+ variables immediately take the value of their assignment; but, signal is going to take the value at the next clock cycle.
Let's take a look below VHDL code and testing result. We can see that the signal o_output_1_sl is asserted at the 16th clock cycle, while the signal o_output_2_sl is asserted at the 15th clock cycle.
VHDL code
Testing Result:
+ variables immediately take the value of their assignment; but, signal is going to take the value at the next clock cycle.
Let's take a look below VHDL code and testing result. We can see that the signal o_output_1_sl is asserted at the 16th clock cycle, while the signal o_output_2_sl is asserted at the 15th clock cycle.
VHDL code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.std_logic_unsigned.all; entity signal_variable_test is port( --i_input_slv: in std_logic_vector(7 downto 0); i_clk_sl: in std_logic; o_output_1_sl: out std_logic; o_output_2_sl: out std_logic ); end signal_variable_test; architecture Behavioral of signal_variable_test is signal r_signal_tmp_slv: std_logic_vector(7 downto 0) := (others => '0'); begin PRO_SIGNAL_TEST: process(i_clk_sl) is variable r_variable_tmp_slv: std_logic_vector(7 downto 0) := (others => '0'); begin if rising_edge(i_clk_sl) then r_signal_tmp_slv <= r_signal_tmp_slv + 1; r_variable_tmp_slv := r_variable_tmp_slv + 1; -- signal is going to take the value at the next clock cycle if(r_signal_tmp_slv = X"0F") then -- 1111 o_output_1_sl <= '1'; else o_output_1_sl <= '0'; end if; -- variables immediately take the value of their assignment if(r_variable_tmp_slv= X"0F") then o_output_2_sl <= '1'; else o_output_2_sl <= '0'; end if; end if; end process PRO_SIGNAL_TEST; end Behavioral; |
Testing Result:
(Click the image to enlarge the view)
VHDL cơ bản.
ReplyDeleteSự khác nhau giữa signal và variable trong vhdl.
Trong VHDL:
+ Variable chỉ có thể được khai báo trong process ( trước từ khóa begin )
+ ký hiệu để gán giá trị cho variable <=
+ variable được gán dữ liệu ngay tức thì. Còn signal thì được cập nhật dữ liệu ở clock kế tiếp.
VHDL cơ bản.
ReplyDeleteSự khác nhau giữa signal và variable trong vhdl.
Trong VHDL:
+ Variable chỉ có thể được khai báo trong process ( trước từ khóa begin )
+ ký hiệu để gán giá trị cho variable <=
+ variable được gán dữ liệu ngay tức thì. Còn signal thì được cập nhật dữ liệu ở clock kế tiếp.