в тестовом стенде терминала SRFF с ошибкой "; вместо идентификатора ожидается - PullRequest
0 голосов
/ 06 сентября 2018

Я нашел эту ошибку в этом тестовом стенде для SR FF.
Пока я компилирую его, используя GHDL в терминале, он показывает ошибку

; ожидается вместо ''

Я только начинающий, поэтому не могу найти ошибку.
Может кто-нибудь, пожалуйста, помогите мне?

library ieee;
use ieee.std_logic_1164.all;

entity SR_tb is
end SR_tb;

architecture behavioral of SR_FF is
    component SR_FF is
        port  (S,R,CLOCK:in std_logic;
        Q,QBAR:out std_logic);  
    end component;
signal clock,s,r,q,qbar: std_logic;
constant clock_period : time := 10 ns;
begin
    port_map:SR_FF port map (clock=>CLOCK,s=>S,r=>R,q=>Q,qbar=>QBAR);

clock_process:process
 begin
      clock <='0';
      wait for clock_period/2;
      clock <= '1';
      wait for clock period/2;
end process;
stim_proc:process
begin 
       s<= '0';
        r<= '0';
        wait for 50 ns;   
        s<= '0';
        r<= '1';
        wait for 50 ns;
        s<= '1';
        r<= '0';
        wait for 50 ns;
        s<= '1';
        r<= '1';
        wait for 50 ns;
assert false report "reached end of test";
wait;
end process;

end behavioral;

1 Ответ

0 голосов
/ 07 сентября 2018

В вашем коде есть две исходные ошибки, они возникают во время синтаксического анализа:

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).

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

...