2016-06-04 2 views
2

это, вероятно, из-за меня, что я новичок. В любом случае, я хочу определить некоторые переменные для использования в нескольких функциях (например, глобальных переменных в C). Я решил пойти с общими переменными, но это дает мне ошибку Cannot reference shared variable "x" inside pure function "y". Если я определяю переменную в процессе, тогда она инициализирует (стирает значение) каждую активацию процесса.Использование переменной в нескольких функциях?

Architecture SV_example of example is 

shared variable temp:std_logic_vector(18 downto 0):= "0000000000000000000"; 
SIGNAL gct: STD_LOGIC_VECTOR(18 DOWNTO 0); 

    function register_adder(load_value:std_logic) return std_logic_vector is  
    begin 
     for i in size downto 0 loop 
      temp(i) := load_value; 
     end loop; 
    return temp;    
    end register_adder; 


    p1 : process (CLK) 
    begin 
     if rising_edge(CLK) then 
     gct <= register_loader('1'); 
    end if; 
    end process; 
end SV_example; 
+0

Я поставил ответ на вопрос, как избавиться от ошибки. Но я не уверен в вашей цели. В приведенном выше примере не требуется 'temp', так как вы используете возвращаемое значение из функции. Отправьте более полный пример, и мы сможем лучше проанализировать ваш вариант использования. – PlayDough

+0

Вы правы. Пример выше не ясен, чтобы указать мое требование. Мне просто нужна глобальная переменная, доступная для каждой функции в архитектуре. – ismylhakkituran

+3

Что вам нужно для переменной архитектуры, в отличие от «сигнала»? Что вы пытаетесь выполнить, обмениваясь информацией с помощью «общей переменной». Если вам нужна какая-то информация о состоянии, я предлагаю посмотреть типы 'protected' в VHDL-2002 и более поздних версиях. – PlayDough

ответ

2

В VHDL (по крайней мере, с VHDL '93 и более поздних версий), функции pure по умолчанию. Функция pure - это функция, которая не имеет побочных эффектов. Это зависит только от его входов, без зависимости от (нестатической) внешней информации.

Итак, ваше исправление заключается в объявлении функции impure. Мне пришлось сделать некоторые изменения в вашем примере, чтобы сделать его MCVE. Фиксация:

library ieee; 
use ieee.std_logic_1164.all; 

entity example is 
    port 
    (
    CLK : in std_logic 
); 
end entity example; 

Architecture SV_example of example is 

shared variable temp:std_logic_vector(18 downto 0):= "0000000000000000000"; 
SIGNAL gct: STD_LOGIC_VECTOR(18 DOWNTO 0); 

    impure function register_adder(load_value:std_logic) return std_logic_vector is 
    begin 
     for i in temp'length-1 downto 0 loop 
      temp(i) := load_value; 
     end loop; 
    return temp; 
    end register_adder; 
begin 


    p1 : process (CLK) 
    begin 
     if rising_edge(CLK) then 
     gct <= register_adder('1'); 
    end if; 
    end process; 
end SV_example; 

Обратите внимание, что это работает только в VHDL '93. Использование shared variable значительно меняется в VHDL'02 и более поздних версиях.

В заключение. Общие переменные обычно не синтезируются (единственным примером, который я могу представить, является модель вывода для ОЗУ). Общие переменные обычно используются только для общего использования в аппаратном или тестовом тестировании.

1

Общая переменная часто идет с защищенными типами, которые могут обрабатывать инкапсуляцию данных. Пример с использованием защищенного типа показан ниже:

architecture SV_example of example is 

    signal gct   : std_logic_vector(18 downto 0); 

    type temp_t is protected 
    impure function register_adder(load_value : std_logic) return std_logic_vector; 
    end protected; 

    type temp_t is protected body 
    variable temp : std_logic_vector(18 downto 0) := (others => '0'); 
    impure function register_adder(load_value : std_logic) return std_logic_vector is 
    begin 
     for i in temp'range loop 
     temp(i) := load_value; 
     end loop; 
     return temp; 
    end function; 
    end protected body; 

    shared variable temp_sv : temp_t; 

begin 

    p1 : process (CLK) 
    begin 
    if rising_edge(CLK) then 
     gct <= temp_sv.register_adder('1'); 
    end if; 
    end process; 

end SV_example; 

Для получения доступа к внутренним данным temp, функция get_temp может быть записан, если это необходимо.

 Смежные вопросы

  • Нет связанных вопросов^_^