#vhdl #flip-flop
#vhdl #триггер
Вопрос:
Я пытаюсь смоделировать T-триггер с использованием VHDL.
library ieee;
use ieee.std_logic_1164.all;
entity tff is
port (
clk: std_logic;
t: in bit;
q: out bit;
qbar: out bit);
end tff;
architecture tff_arch of tff is
begin
process(clk)
begin
if (clk = '1' and t = '1')
then
q <= not q;
qbar <= not qbar;
end if;
end process;
end tff_arch;
Но ошибка, которую я получаю, такова
Error: CSVHDL0168: tff.vhdl: (line 17): Identifier 'q' is not readable
Error: CSVHDL0168: tff.vhdl: (line 18): Identifier 'qbar' is not readable
Причина ошибки, я думаю, в том, что я использую «не q», когда q не был инициализирован. Поправьте меня здесь, если я ошибаюсь.
И что делать, чтобы обойти эту проблему? Я правильно смоделировал D-триггер и его тестовую форму сигнала, используя бесплатную версию Symphony EDA.
Ответ №1:
В старые времена вы не могли прочитать вывод, поэтому вам приходилось либо:
- сделайте это
inout
(что немного неприятно, поскольку вы искажаете направление, которое вы действительно имеете в виду, просто чтобы вы могли его прочитать) — это работает, но не широко используется в промышленности (насколько я знаю) - сделайте его a
buffer
, но у него были недостатки (до VHDL-2002) в том, что вам нужно сделать всю остальную иерархию этого сигнала управляемойbuffer
s . По моему опыту, почти никогда не использовался. - используйте и промежуточный
signal
(который вы можете прочитать), а затем используйте присваивание, чтобы установить на выходе значение этого сигнала. Это идиоматический способ сделать это среди практикующих инженеров.
Начиная с VHDL-2008, вы можете считывать выходные порты (хотя заявленное намерение состоит в том, чтобы использовать его только для целей проверки). Вероятно, вам понадобится инструментальный переключатель для включения режима VHDL-2008. (И может случиться так, что ваш конкретный симулятор / синтезатор все еще не поддерживает VHDL-2008, что показывает ошеломляющие темпы развития в мире инструментов EDA!)
Комментарии:
1. разве inout не должен быть естественным выбором, по крайней мере, для триггеров?
2. Проблема в том, что использование inout, как правило, подразумевает для синтезаторов, что они должны быть драйвером трех состояний. Вы не хотите или не нуждаетесь в этом . inout работает, но кажется взломанным. Промежуточные сигналы — это пуристский способ (который очень широко используется в промышленности). Я немного обновлю ответ
Ответ №2:
q
является результатом объекта.
Вы не можете прочитать вывод. Это так просто.
Вам нужна внутренняя версия, которую вы используете для цикла обратной связи, а затем q <= local_q
;
Комментарии:
1. о! правильно, q должен быть битом ввода. это решило проблему.
2. Нет, это не вход, потому что вы не можете отправить значение на этот порт. Это вывод. Если вы измените его на inout, вы измените способ просмотра этого порта другими блоками в проекте. Вам просто нужен локальный промежуточный сигнал.
Ответ №3:
Не могу хорошо запомнить VHDL, но это может дать вам подсказку:
Проблема в том, что q
это всего лишь сигнал от вашей сущности, поэтому при попытке его прочитать доступ не к чему.
Итак, чтобы не решать свою домашнюю работу, подумайте об этом так:
Либо вам нужно иметь q
в качестве входных данных для доступа к нему (возможно, не то, что вы хотите), либо вам нужно сохранить q
(или, по крайней мере, следующее значение q
) внутренне. Это можно сделать, указав q
(или q_next
) как a signal
в architecture
части. Например:
architecture tff_arch of tff is
signal q_next: std_logic;
begin
и так далее. То же самое относится и к вашему qbar
сигналу.