В вашем коде есть две исходные ошибки, они возникают во время синтаксического анализа:
ghdl -a sr_tb.vhdl
sr_tb.vhdl: 22: 22: ошибка: отсутствует ";" в конце выписки
sr_tb.vhdl: 22: 28: ошибка: "<=" или ": =" ожидается вместо '/' <br>
ghdl: ошибка: ошибка компиляции
Строка 22 - это последний оператор ожидания в вашем процессе clock_process:
wait for clock period/2;
Константа объявлена как clock_period
, где вы разбили ее на два отдельных идентификатора, clock
и period
. В синтаксисе оператора ожидания не ожидается последовательных идентификаторов (обратите внимание на разницу в операторах ошибок, это предварительная версия ghdl-0.36, когда синтаксические ошибки могут возникать по нескольким причинам, которые они, как правило, обобщают, если не не охватывать все случаи). Предполагается, что пропущена точка с запятой, завершающая оператор ожидания после clock
. period
синтаксически будет частью следующего утверждения.
Исправление последнего оператора ожидания:
wait for clock_period/2; -- WAS clock period/2;
раскрывает дополнительную семантическую проблему:
ghdl -a sr_tb.vhdl
sr_tb.vhdl: 7: 14: ошибка: сущность 'sr_ff' не была проанализирована
Эта ошибка появляется, потому что вы не указали свой sr_ff
объект. Если бы он уже был проанализирован в целевой библиотеке, ошибки были бы более масштабными из-за неправильного имени объекта в архитектуре:
architecture behavioral of SR_FF is
Ошибки:
ghdl -a sr_tb.vhdl
sr_tb.vhdl: 12: 8: ошибка: идентификатор "часы", уже использованный для объявления
sr_ff.vhdl: 5: 16: ошибка: предыдущее объявление: порт "часы"
sr_tb.vhdl: 12: 14: ошибка: идентификатор "s" уже используется для объявления
sr_ff.vhdl: 5: 12: ошибка: предыдущее объявление: порт "s"
sr_tb.vhdl: 12: 16: ошибка: идентификатор «r» уже используется для объявления
sr_ff.vhdl: 5: 14: ошибка: предыдущее объявление: порт "r"
sr_tb.vhdl: 12: 18: ошибка: идентификатор "q" уже используется для объявления
sr_ff.vhdl: 6: 5: ошибка: предыдущее объявление: порт "q"
sr_tb.vhdl: 12: 20: ошибка: идентификатор "qbar", уже использованный для объявления
sr_ff.vhdl: 6: 7: ошибка: предыдущее объявление: порт "qbar"
sr_tb.vhdl: 19: 7: ошибка: порт "clock" не может быть назначен
sr_tb.vhdl: 21: 7: ошибка: порт "clock" не может быть назначен
sr_tb.vhdl: 26: 8: ошибка: порт "s" не может быть назначен
sr_tb.vhdl: 27: 9: ошибка: порт "r" не может быть назначен
sr_tb.vhdl: 29: 9: ошибка: порт "s" не может быть назначен
sr_tb.vhdl: 30: 9: ошибка: порт "r" не может быть назначен
sr_tb.vhdl: 32: 9: ошибка: порт "s" не может быть назначен
sr_tb.vhdl: 33: 9: ошибка: порт "r" не может быть назначен
sr_tb.vhdl: 35: 9: ошибка: порт "s" не может быть назначен
sr_tb.vhdl: 36: 9: ошибка: порт "r" не может быть назначен
ghdl: ошибка: ошибка компиляции
Все они вызваны (пере) анализом архитектуры behavioral
из SR_FF
и поиском уже объявленных идентификаторов. Объявления объекта и архитектуры занимают одну и ту же декларативную область, и эти имена сигналов уже объявлены как порты в (неправильном) объекте.
В обоих случаях лечение одинаковое. В вашей спецификации testbench вы должны ссылаться на имя сущности testbench:
architecture behavioral of SR_tb is -- WAS SR_FF is
Итак, все это из пробела, который должен был быть подчеркиванием ('_'
) и неправильным именем объекта в спецификации архитектуры. Исправьте и то и другое, и ghdl не выдаст ошибок анализа. С помощью объявления сущности и архитектуры для sr_ff
проанализированного тестового стенда также разрабатывается и моделируется (отмечая, что вы сигнализируете об окончании стимулов с помощью утверждения, но не останавливаете моделирование, которое можно выполнить с помощью оператора if, оценивающего текущее время моделирования с помощью функция now
в clock_process
или для -2008 с использованием функции stop
в пакете std.env
).
Примечательно, что при использовании именованной ассоциации в списках интерфейсов (здесь карта портов) формалы находятся в левой части составного разделителя =>
, а фактические значения перечислены в правой части. Использование заглавных букв предполагает, что вы пытаетесь сделать это иначе, что может создать проблемы в будущем, когда формальные и фактические имена не совпадают.