Переменные — пример VHDL
Переменные в VHDL действуют аналогично переменным в C. Их значение действительно в том месте кода, где переменная изменяется. Следовательно, если сигнал использует значение переменной before присвоение, оно будет иметь старое значение переменной. Если сигнал использует значение переменной after присваивание будет иметь новое значение переменной.
Правила переменных:
- Переменные можно использовать только внутри процессов.
- Любая переменная, созданная в одном процессе, не может использоваться в другом процессе.
- Переменные должны быть определены после ключевого слова process. но перед ключевым словом begin
- Переменные назначаются с помощью := символ присвоения
- Переменные, которым присвоено значение, немедленно принимают значение присвоенного значения.
Самое важное, что нужно понять, это то, что переменные сразу же принимают значение своего назначения. Вот пример, показывающий один полезный способ использования переменных:хранение данных для временного использования . Он использует оператор 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"; -- ETC
В предыдущем примере мы объединили два сигнала, чтобы их можно было использовать в операторе case. Переменная v_Choices была сразу же доступна для использования, как только она была назначена. Давайте посмотрим на другой пример. Приведенный ниже пример является более полным и демонстрирует, как переменные немедленно принимают значение своего присвоения. Сигналы r_Var_Copy1 и r_Var_Copy2 кажутся одинаковыми, но r_Var_Copy2 никогда не достигает значения 5 до сброса.
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;
Чтобы смоделировать наш дизайн, нам нужно создать тестовый стенд. Кроме того, переменные могут быть немного сложными для отображения в моделировании. Если вы используете Modelsim, узнайте больше о том, как увидеть ваши переменные в окне сигнала Modelsim.
Тестовый стенд:
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;
Переменные Пример формы сигнала тестового стенда
В приведенном выше примере показано, как переменные действуют иначе, чем сигналы. Сигналы r_Var_Copy1 и r_Var_Copy2 кажутся одинаковыми, но r_Var_Copy2 никогда не достигает значения 5 до сброса.
VHDL
- Оператор процедуры — пример VHDL
- Записи — пример VHDL
- Параметры анализа
- Переменные C# и (примитивные) типы данных
- Переменные C++, литералы и константы
- C Переменные, константы и литералы
- Класс хранения C
- Строки в C:как объявить переменную, инициализировать, распечатать, пример
- Java — типы переменных
- С — переменные