Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> VHDL

Переменные — пример VHDL

Переменные в VHDL действуют аналогично переменным в C. Их значение действительно в том месте кода, где переменная изменяется. Следовательно, если сигнал использует значение переменной before присвоение, оно будет иметь старое значение переменной. Если сигнал использует значение переменной after присваивание будет иметь новое значение переменной.

Правила переменных:

Самое важное, что нужно понять, это то, что переменные сразу же принимают значение своего назначения. Вот пример, показывающий один полезный способ использования переменных:хранение данных для временного использования . Он использует оператор 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

  1. Оператор процедуры — пример VHDL
  2. Записи — пример VHDL
  3. Параметры анализа
  4. Переменные C# и (примитивные) типы данных
  5. Переменные C++, литералы и константы
  6. C Переменные, константы и литералы
  7. Класс хранения C
  8. Строки в C:как объявить переменную, инициализировать, распечатать, пример
  9. Java — типы переменных
  10. С — переменные