Почему процедура не видит переменную?

Я использую Xilinx ISE для создания проекта VHDL.
Я пытаюсь добавить значения в целочисленную переменную.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity vending2_mod is
Port ( button1 : in  STD_LOGIC;
       button2 : in  STD_LOGIC;
       button3 : in  STD_LOGIC;
       button4 : in  STD_LOGIC;
       coin : in integer;
       disp : out string(1 to 16);
       prodOut : out integer);

    shared variable credits : integer := 0;

    procedure addCredits ( c : in integer ) is
        begin
                credits := credits + c; -- Signal is not defined : 'credits'.
        end addCredits;
-- additional code
end vending2_mod;

architecture Behavioral of vending2_mod is
    begin

acceptCredit: process (coin)
    begin
            addCredits(coin);
    end process;

end Behavioral;

Тем не менее, когда я пытаюсь синтезировать (XST) проект, я получаю сообщение об ошибке в строке, которую я написал в качестве комментария. credits — это не сигнал, это переменная; что выдает ошибку?
Сохранение не выдает ошибок, так как синтаксис вроде правильный.


person Exec    schedule 09.12.2017    source источник
comment
Покажите минимальный, полный и проверяемый пример. Это недопустимое объявление объекта, mod — зарезервированное слово. Это действительный VHDL, если вы измените имя объекта на modu в обоих местах. Ваша версия Synplify не поддерживает объявление (или использование) этой общей переменной. credits должен быть инициализирован.   -  person    schedule 10.12.2017
comment
@user1155120 user1155120 Я упростил имена при публикации вопроса, я не знал, что это зарезервированное слово. Я обновил его с собственными именами и дополнительными деталями.   -  person Exec    schedule 10.12.2017
comment
Каково точное сообщение об ошибке?   -  person Paebbels    schedule 10.12.2017
comment
Я был бы очень удивлен, увидев такой старый инструмент синтеза, как XST, поддерживающий общие переменные. (Однако с целочисленными портами должно быть все в порядке). Почему вы не используете здесь сигнал, чтобы получить четко определенную (и синтезируемую) семантику обновления сигнала? (Подсказка: вы действительно хотите обновить свой сигнал в синхронизированном процессе)   -  person user_1818839    schedule 10.12.2017
comment
Вы не можете ожидать, что программное обеспечение для синтеза правильно реализует любой случайный код, который вы пишете. Вам необходимо следовать определенным правилам кодирования, указанным производителем инструмента. Стиль кодирования, которому вы, похоже, следуете, выглядит как основанный на C. Это не будет работать на FPGA.   -  person JHBonarius    schedule 10.12.2017
comment
Где часы в вашем коде? Также: синхронизация ввода, отключение кнопок, обнаружение нарастающего фронта и т. д. Прочтите это.   -  person JHBonarius    schedule 10.12.2017


Ответы (1)


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

  • Не используйте общие переменные.
  • При моделировании переменные обновляются сразу после назначения, в отличие от сигналов, которые обновляются только в конце цикла моделирования. В комбинационном коде сигналы сразу принимают значение своего присвоения. В последовательном коде сигналы используются для создания триггеров, которые по своей сути не сразу принимают значение своего назначения.
  • вместо этого лучше использовать сигнал+часы.

Попробуй это:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity vending2_mod is
   port(  
      Clock: in std_logic;
      Reset: in std_logic;
      coin : in integer; 
      prod_out : out integer
      );
end vending2_mod;

architecture Behavioral of vending2_mod is
    signal credits : integer := 0; 
begin   
    process(Clock,Reset)
    begin
        if Reset='1' then
            credits <= 0;
        elsif(rising_edge(Clock)) then 
            credits <= credits + coin;  
        end if;
    end process;
    prod_out <= credits;
end Behavioral;

Посмотреть разработанный дизайн: введите здесь описание изображения


Не пытайтесь это сделать (синтез в порядке, примечание: вам нужно clock):

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity vending2_mod is
Port ( 
     coin : in integer; 
     prod_out : out integer);
end vending2_mod;

architecture Behavioral of vending2_mod is
    signal credits : integer := 0; 
begin
    credits <= credits + coin;  
    prod_out <= credits; 
end Behavioral;

См. разработанный дизайн: введите здесь описание изображения

person wasmup    schedule 10.12.2017
comment
Я удалил объявление начального значения непосредственно перед публикацией вопроса, чтобы попробовать его, если это проблема, но ни одна из версий не работает. - person Exec; 10.12.2017
comment
Пожалуйста, не поощряйте использование общих переменных. Они могут привести к большим проблемам. - person JHBonarius; 10.12.2017
comment
@Exec: надеюсь, это поможет. - person wasmup; 10.12.2017
comment
Извините, это мало помогает. Мне нужно значение «кредиты» позже после нажатия кнопки, но сначала нужно ввести из порта «монеты». «prod_out» используется позже, после нажатия кнопки — я намеренно не записал логику для кнопок, потому что у меня была проблема только с увеличением «кредитов». Изменить: это действительно помогает некоторым, вместо этого настраивая события, управляемые часами классических программных триггеров. буду пробовать кое-что - person Exec; 11.12.2017