Доступ к одной переменной в цикле for в процессе VHDL - PullRequest
0 голосов
/ 04 мая 2018

Я хочу увеличить переменную в цикле for, которая указывает мне, как часто условный оператор выполняется в векторе. Зная, что для циклов в VHDL создается n параллельных экземпляров, возможно ли, чтобы они «обращались» к одной переменной? Учитывая следующий сценарий, который отлично работает в симуляции, я сомневаюсь, что он также работает в реальности. Может кто-нибудь уточнить, как это работает на самом деле?

variable_p : process(clk)
 variable var : integer;
begin
  if rising_edge(clk) then
    var := 0;
    for i in 0 to 7 loop
      if some_vector(i) = '1' then
        var := var + 1;
        other_vector(var) <= '1';
      end if;
    end loop;
  end if;

Обновление

Я синтезировал следующий дизайн:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity var_p is
  Port (
    clk : in std_logic;
    some_vector : in std_logic_vector( 7 downto 0 );
    other_vector : out std_logic_vector( 7 downto 0 )
  );
end var_p;

architecture Behavioral of var_p is
begin
  var_p : process( clk )
    variable var : integer range 0 to 7;
  begin
    if rising_edge( clk ) then
      var := 0;
      for i in some_vector'range loop
        if some_vector(i) = '1' then
          var := var + 1;
          other_vector(var) <= '1';
        end if;
      end loop;
    end if;
  end process;
end Behavioral;

Это приводит к LUT для каждого элемента other_vector , который принимает в качестве входных данных несколько элементов some_vector [1]. Из этого я бы пришел к выводу, что действительно переменная «увеличивается» для каждого «1» в some_vector . Теперь я также лучше понимаю, что переменная - это просто вспомогательная конструкция для определения конфигурации LUT и ничего, что может быть синтезировано. Но, пожалуйста, поправьте меня, если я здесь не прав, потому что я все еще не уверен на сто процентов. Если у меня в руках будет доска, я постараюсь проверить мои наблюдения на самом деле.

[1] https://imgur.com/a/pBL0Diy

1 Ответ

0 голосов
/ 05 мая 2018

Когда я наконец нашел свою плату Basys3, я смог опробовать дизайн. Действительно, синтезированный и реализованный дизайн работает как нужно:

Число '1' в other_vector является точным числом '1' в some_vector .

В моем тесте я подключил входной вектор к переключателям, а выходной вектор - к светодиодам (см. Ниже).

Это подтверждает, что в каждой «итерации» цикла for переменная увеличивается для каждого элемента, равного «1».

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity var_p is
  Port (
    CLK100MHZ : in std_logic;
    sw : in std_logic_vector( 15 downto 0 );
    LED : out std_logic_vector( 15 downto 0 )
  );
end var_p;

architecture Behavioral of var_p is
begin
  var_p : process( CLK100MHZ )
    variable var : integer range 0 to 15;
  begin
    if rising_edge( CLK100MHZ ) then
      var := 0;
      LED <= ( others => '0' );
      for i in SW'range loop
        if sw( i ) = '1' then
          var := var + 1;
          LED( var ) <= '1';
        end if;
      end loop;
    end if;
  end process;
end Behavioral;
...