VHDL «Объявление не разделяемой переменной здесь запрещено» - PullRequest
0 голосов
/ 17 июня 2020

У меня есть этот код, который, по сути, вычисляет модификатор двух чисел

library IEEE;

use ieee.numeric_bit.all;

entity resto is
    port (clock , reset : in bit ;
        inicio : in bit ;
        fim : out bit ;
        dividendo , divisor : in bit_vector (15 downto 0) ;
        resto : out bit_vector (15 downto 0)
    ) ;
    end resto;

architecture processo of resto is
    variable    dividendovar : integer range 0 to  15;
    begin

    process(clock, reset) is
    begin
        if reset = '1' then
            fim <= '0';
            resto <= "0000000000000000";
        elsif clock'event and clock = '1' and inicio = '1' then
            dividendovar <= to_integer(unsigned(dividendo));
                if (divisor = "0000000000000000") then
                    -- report "zero"; 
                    resto <= dividendo;
                    fim <= '1';
                elsif (dividendovar = to_integer(unsigned(divisor))) then
                    -- report "menor"; 
                    -- report "dividendoaux vale "& integer'image(to_integer(unsigned(dividendoaux))) ; 
                    resto <= "0000000000000000";
                    fim <= '1';
                elsif (to_integer(unsigned(dividendo)) < to_integer(unsigned(divisor))) then
                    resto <= dividendo;
                    fim <= '1';
                else -- comeca a subtrair
                    while (dividendovar > to_integer(unsigned(divisor))) loop
                        dividendovar := dividendovar - to_integer(unsigned(divisor));
                    end loop ;
                    resto <= bit_vector(to_unsigned(dividendovar, resto'length));
                    fim <= '1';
                end if;
            end if;
            end process;
end architecture;

Но в строке

variable    dividendovar : integer range 0 to  15;

Я получаю эту ошибку "Не общий объявление переменной здесь запрещено ".

Есть какие-нибудь подсказки о том, что я делаю неправильно или упускаю?

Заранее спасибо!

1 Ответ

1 голос
/ 17 июня 2020

Переменные должны быть объявлены внутри process и, следовательно, иметь ограниченную область действия.

library IEEE;

use ieee.numeric_bit.all;

entity resto is
    port (clock , reset : in bit ;
        inicio : in bit ;
        fim : out bit ;
        dividendo , divisor : in bit_vector (15 downto 0) ;
        resto : out bit_vector (15 downto 0)
    ) ;
    end resto;

architecture processo of resto is
    begin

    process(clock, reset) is
    variable    dividendovar : integer range 0 to  15;
    begin
        if reset = '1' then
            fim <= '0';
            resto <= "0000000000000000";
        elsif clock'event and clock = '1' and inicio = '1' then
            dividendovar <= to_integer(unsigned(dividendo));
                if (divisor = "0000000000000000") then
                    -- report "zero"; 
                    resto <= dividendo;
                    fim <= '1';
                elsif (dividendovar = to_integer(unsigned(divisor))) then
                    -- report "menor"; 
                    -- report "dividendoaux vale "& integer'image(to_integer(unsigned(dividendoaux))) ; 
                    resto <= "0000000000000000";
                    fim <= '1';
                elsif (to_integer(unsigned(dividendo)) < to_integer(unsigned(divisor))) then
                    resto <= dividendo;
                    fim <= '1';
                else -- comeca a subtrair
                    while (dividendovar > to_integer(unsigned(divisor))) loop
                        dividendovar := dividendovar - to_integer(unsigned(divisor));
                    end loop ;
                    resto <= bit_vector(to_unsigned(dividendovar, resto'length));
                    fim <= '1';
                end if;
            end if;
            end process;
end architecture;

Как упоминалось в комментариях, глобальные общие переменные были доступны до стандарта VHDL2002. Я думаю, что если они все еще нужны, их следует защитить сейчас. Но до сих пор я, новичок, сталкивался с вариантом использования, в котором требовалась переменная.

В любом случае я бы предпочел signals вместо variables во всех моих проектах, когда это возможно.

...