Я хочу увеличить переменную в цикле 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