Типичным объявлением переменной является
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)
Другие примеры несоответствий включают
Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.
Как вы, кажется, новичок в VHDL, помните об этом правиле:
Вы можете управлять только сигналом одного процесса.
blockquote>Вам нужно перестроить свою логику так, чтобы данный сигнал управлялся только одним процессом. Не пытайтесь обойти это. Используйте тип
std_ulogic
, и компилятор скажет вам, когда вы ошибетесь очень рано.Итак, в вашем случае вам нужно переместить часть «перезагрузки», которая приводит
count
в процесс который делает приращениеcount
.
Теперь, когда вы накопили некоторый опыт, вы обнаружите, что есть моменты, когда вам нужно иметь несколько драйверов по одному сигналу. Это используется при моделировании вне чипов (шины I2C, шины с тристатной памятью и т. П.). Но не для кода «внутри чипа».
У вас есть dout
и count
, назначенные в обоих процессах.
Из IEEE Std 1076-1993:
12.6.1 Драйверы
Каждая инструкция присваивания сигнала в операторе процесса определяет набор драйверов для определенных скалярных сигналов. Существует один драйвер для заданного скалярного сигнала S в инструкции процесса, при условии, что в этом заявлении есть хотя бы один оператор присваивания сигнала, и что самый длинный статический префикс целевого сигнала этого оператора присваивания сигнала обозначает S или обозначает из которых S является подэлементом. Каждый такой оператор присваивания сигнала считается связанным с этим драйвером. Выполнение оператора присваивания сигнала влияет только на соответствующий драйвер (ы).
blockquote>Это по существу означает, что вы дублируете как
count
, так иdout
.Существует много способов моделирования поведения
dout
иcount
, которые вы желаете. Бифуркация их работы в двух процессах на основе начальных и конечных событий не является одним из них. Для этого потребуется три процесса: один для события, один для события прерывания и один для хранилища с тактовой частотой. Для работыcount
вам, вероятно, понадобятся отдельные события.