Ошибка (10028): невозможно разрешить несколько постоянных драйверов для net & hellip; в vhdl [дубликат]

Объявлено, но не определено переменная или функция.

Типичным объявлением переменной является

extern int x;

. Поскольку это только объявление, требуется одно определение. Соответствующим определением будет:

int x;

Например, следующее генерирует ошибку:

extern int x;
int main()
{
    x = 0;
}
//int x; // uncomment this line for successful definition

Аналогичные замечания относятся к функциям. Объявление функции без ее определения приводит к ошибке:

void foo(); // declaration only
int main()
{
   foo();
}
//void foo() {} //uncomment this line for successful definition

Будьте осторожны, чтобы выполняемая вами функция точно соответствовала той, которую вы объявили. Например, у вас могут быть несогласованные cv-квалификаторы:

void foo(int& x);
int main()
{
   int x;
   foo(x);
}
void foo(const int& x) {} //different function, doesn't provide a definition
                          //for void foo(int& x)

Другие примеры несоответствий включают

  • Функция / переменная, объявленная в одном пространстве имен, определенное в другом.
  • Функция / переменная, объявленная как член класса, определяемая как глобальная (или наоборот).
  • Тип возвращаемого значения функции, номер и типы параметров и соглашение о вызове не совсем точно согласуются.

Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.

2
задан user34920 11 January 2014 в 17:14
поделиться

2 ответа

Как вы, кажется, новичок в VHDL, помните об этом правиле:

Вы можете управлять только сигналом одного процесса.

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

Итак, в вашем случае вам нужно переместить часть «перезагрузки», которая приводит count в процесс который делает приращение count.


Теперь, когда вы накопили некоторый опыт, вы обнаружите, что есть моменты, когда вам нужно иметь несколько драйверов по одному сигналу. Это используется при моделировании вне чипов (шины I2C, шины с тристатной памятью и т. П.). Но не для кода «внутри чипа».

1
ответ дан Martin Thompson 25 August 2018 в 00:54
поделиться

У вас есть dout и count, назначенные в обоих процессах.

Из IEEE Std 1076-1993:

12.6.1 Драйверы

Каждая инструкция присваивания сигнала в операторе процесса определяет набор драйверов для определенных скалярных сигналов. Существует один драйвер для заданного скалярного сигнала S в инструкции процесса, при условии, что в этом заявлении есть хотя бы один оператор присваивания сигнала, и что самый длинный статический префикс целевого сигнала этого оператора присваивания сигнала обозначает S или обозначает из которых S является подэлементом. Каждый такой оператор присваивания сигнала считается связанным с этим драйвером. Выполнение оператора присваивания сигнала влияет только на соответствующий драйвер (ы).

Это по существу означает, что вы дублируете как count, так и dout.

Существует много способов моделирования поведения dout и count, которые вы желаете. Бифуркация их работы в двух процессах на основе начальных и конечных событий не является одним из них. Для этого потребуется три процесса: один для события, один для события прерывания и один для хранилища с тактовой частотой. Для работы count вам, вероятно, понадобятся отдельные события.

6
ответ дан user1155120 25 August 2018 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: