Переменная или сигнал в vhdl для общего значения между разными процессами

Мне нужно разделить значение (real) между двумя процессами, но когда я пытаюсь запустить свой код, quartus выдает ошибку.

library IEEE;
USE ieee.std_logic_1164.all; 
USE ieee.std_logic_arith.all; 
USE ieee.std_logic_unsigned.all; 
use IEEE.MATH_REAL.ALL;

entity de0nano is
port (
 CLOCK_50      : in  std_logic;
KEY           : in  std_logic_vector(1 downto 0);
 SW            : in  std_logic_vector(3 downto 0);
 LED           : out std_logic_vector(7 downto 0);
 GPIO           : inout std_logic_vector(35 downto 0)


  );
end de0nano;

architecture struct of de0nano is
--declarations
signal   PN                 :  real :=0.0 ;
signal   PR                 :  real :=0.0 ;
signal   RC             :  integer :=1;
signal   NC             :  integer :=1;
signal   BET                :  integer :=1;


begin
count : process (CLOCK_50, GPIO)
begin 
 --A <= KEY(0);
 GPIO(24) <= '1';
--functional coding
LED <= "00011000";
 if (pn > pr) then
GPIO(26) <= '1';
LED <= "00000001";
else
GPIO(26) <= '0';                    
    end if;
 if (pn = pr) then
GPIO(26) <= '1';
LED <= "00000010";
else
GPIO(26) <= '0';                    
end if;
 if (pn < pr) then
GPIO(26) <= '1';
LED <= "00000011";
else
GPIO(26) <= '0';                    
end if;

end process;

probabilityController : process (CLOCK_50, KEY)
begin
--stato iniziale
if((RC + NC + BET)=1) then
pr <= 0.5;
pn <= 0.5;
end if;
--sequenza rossi consecutivi
if(RC>0) then
pr <= (5)**RC;
pn <= 1- (5)**RC;
end if;
--sequenza neri consecutivi
if(NC>0) then
pr <= (5)**NC;
pn <= 1- (5)**NC;
end if;

end process;

betController : process (CLOCK_50)
begin

end process;

colorController : process (CLOCK_50, KEY)
begin
if(KEY(0)='1') then
NC<=0;
RC <= RC+1;
end if;

if(KEY(1)='1') then
RC<=0;
NC <= NC+1;
end if;


end process;

end str

Как я могу работать с одним и тем же сигналом/переменной из двух разных процессов?


person Federico Ponti    schedule 01.09.2015    source источник
comment
Легко: Объявления сигналов принадлежат до архитектуры begin. (Это также не поддается синтезу, но в моделировании он будет делать именно то, что вы ожидаете: при условии, что вы понимаете семантику назначения сигналов.) Для синтеза избегайте записи одного и того же сигнала в двух процессах... Кроме того, вы не можете добавлять целое число к числу с плавающей запятой. , но это тривиально исправить.   -  person user_1818839    schedule 01.09.2015
comment
Прежде чем начать архитектуру?   -  person Federico Ponti    schedule 01.09.2015
comment
architecture ... объявления сигналов begin назначения end architecture. Итак, ваша строка Signal foobar : real := 0.0; должна быть перемещена на 2 строки вверх.   -  person Paebbels    schedule 02.09.2015
comment
Какая собственно ошибка? Вы должны отредактировать это в своем вопросе.   -  person ryanyuyu    schedule 02.09.2015
comment
Foobar не объявлен как разрешаемый подтип (для типа real невозможна функция разрешения), и его назначение в двух разных процессах приведет к ошибке времени выполнения. Обозначение для назначения сигнала использует <=, а не :=. Числовой литерал для вещественного числа должен быть 1.0. Использование общей переменной вызывает проблемы уровня версии IEEE Std 1076, переносимости и зависимости от реализации (процессы являются параллельными операторами и могут фактически выполняться одновременно, до -2002 монопольный доступ к общим переменным не гарантируется). В -2002/2008 общие переменные являются защищенными типами.   -  person    schedule 02.09.2015


Ответы (1)


VHDL — это язык описания оборудования. Описание VHDL может быть смоделировано (выполнено подобно большинству языков программирования) или синтезировано (преобразовано в сети взаимосвязанных простых аппаратных элементов). Некоторые инструменты являются чистыми симуляторами (Mentor Graphics Modelsim, Cadence ncsim...), другие - чистыми синтезаторами (Mentor Graphics Precision RTL, компилятор Cadence RTL...), а третьи могут выполнять и то, и другое. Quartus относится к последней категории. Итак, первое, что нужно сделать, это решить, хотите ли вы моделировать, синтезировать или и то, и другое.

Если вы хотите смоделировать, вы должны исправить три ошибки:

  • позиция вашего объявления сигнала,
  • то, как вы его назначаете (:=), который является оператором присваивания переменной, а не присваиванием сигнала (<=)
  • а то что вы его гоните из двух процессов пока он неразрешенного типа (real). См. этот другой ответ для разрешенных/неразрешенных типов VHDL.

Тогда ваш код может выглядеть так (но поскольку я не знаю, что вы пытаетесь сделать, вероятно, это не то, что вы хотите):

architecture V1 of AOI is
    Signal foobar : real := 0.0;
begin
    OneTwo : process (clk)
    Begin
         Foobar <= foobar + 2.0;
    End process;
end V1;

Если вы хотите синтезировать, вам придется решить еще несколько проблем:

  • Вы используете тип real, который является типом VHDL с плавающей запятой. Это не синтезируется синтезаторами, которые я знаю. Действительно, чего вы ожидаете от синтезатора? Создать полный блок с плавающей запятой? Какой бренд? Итак, вам придется заменить real на какой-то другой тип (целые числа, битовые векторы...).
  • Вы назначаете свой сигнал на обоих краях того, что я считаю вашими часами (clk). Это, вероятно, не то, что вы хотите.
  • Вы инициализируете сигнал во время объявления. Это обычно не синтезируется синтезаторами, которые я знаю. На самом деле это initialization time имеет ясное значение для симуляции: это начало симуляции. Но как насчет оборудования? Что такое beginning аппаратного обеспечения? Производство? Включить? Итак, если вы хотите, чтобы сигнал инициализировался в какой-то момент, вам придется добавить аппаратный сброс, управляемый входом reset.

В общем, у вас может быть что-то вроде:

architecture V1 of AOI is
    Signal foobar : natural range 0 to 255;
begin
    OneTwo : process (clk)
    Begin
         if rising_edge(clk) then
              if reset = '1' then
                  foobar <= 0;
              else
                  foobar <= foobar + 2;
              end if;
         end if;
    End process;
end V1;

Заметки:

  • VHDL нечувствителен к регистру, но вы должны стараться быть последовательными, это поможет вам.
  • Вам, вероятно, следует пройти курс VHDL или прочитать учебник по VHDL, прежде чем пытаться использовать этот язык. Он радикально отличается от языков программирования, которые вы уже знаете. Аппаратное и программное обеспечение — довольно разные миры, даже если в конце концов они сильно связаны.
person Renaud Pacalet    schedule 02.09.2015
comment
благодарю за разъяснение. Я хочу синтезировать, но мне нужен сигнал или переменная с десятичной/действительной/плавающей запятой для управления значением вероятности (от 0 до 1). Я обновил свой код, но есть решение этой проблемы? - person Federico Ponti; 02.09.2015
comment
@FedericoPonti, извините, вы не можете использовать real. Работайте с точностью с фиксированной запятой, а не с плавающей запятой. Но, глядя на ваш код, я настаиваю на том, чтобы вы прошли курс VHDL или прочитали учебник по VHDL. Stackoverflow не сможет вам помочь, если вы не овладеете основами VHDL: сигналы и переменные, списки чувствительности, семантика моделирования и синтеза... - person Renaud Pacalet; 02.09.2015