#keyboard #vhdl #circuit
#клавиатура #vhdl #схема
Вопрос:
Я разрабатываю детектор клавиш Shift.Я написал тестовый стенд. Тест показал, что моя реализация была неверной.
Вот моделирование в ModelSim.
Красная строка указывала на НЕОПРЕДЕЛЕННЫЙ. Такое поведение возникло только дважды.
Что меня озадачило: почему между этими двумя значениями такой большой разрыв? Если вы посмотрите на тестовый стенд, 3-я и 4-я процедуры используют формат, используемый для 1-й и 2-й.
Тестовый стенд здесь: http://pastebin.com/BJVFFgGr
Код детектора находится здесь: http://pastebin.com/di42FLqT
Как вы можете видеть. В моем дизайне есть два состояния. Приемник PS2 будет фильтровать и генерировать чистый 8-битный код make при нажатии (или отпускании) клавиши. Код прерывания — это просто F0, за которым следует код make только что выпущенного ключа. Мой конечный автомат использует два дополнительных бита, чтобы отслеживать, какая клавиша Shift была нажата.
Я прошел отладку, и когда мы ввели 3-е тестовые значения, SHIFT = U вместо 1 от предыдущего значения.
-- release left shift
hex <= "11110000";
wait for 5 ns;
clk <= NOT clk;
wait for 50 ns;
clk <= NOT clk;
wait for 50 ns;
hex <= "00010010"; <----- when I am here shift is already U
wait for 5 ns;
clk <= NOT clk;
wait for 50 ns;
clk <= NOT clk;
wait for 50 ns;
if (shift /= '0')then
error <= '1';
end if;
left_pressed и right_pressed — это сигналы, а не переменные. Таким образом, они должны иметь значение a в любом экземпляре. Если один из них изменится, соединение с сигналом сдвига будет обновлено автоматически.
Может кто-нибудь, пожалуйста, помогите мне? Спасибо.
Спасибо.
Ответ №1:
Я ожидаю, что вы получаете вывод «U», потому что
shift <= left_pressed or right_pressed;
и right_pressed не определено, поэтому, когда left_pressed становится «0», отображается «U» в right_pressed .
Помните, что
1 or x == 1
0 or x == x
где x может быть ‘0’, ‘1’, ‘U’, ‘X’, ‘Z’, ‘-‘, ‘H’, ‘L’
В вашем коде есть несколько проблем, которые мне бросаются в глаза
-
На данный момент left_pressed и right_pressed являются защелками, поскольку в некоторых условиях они будут переносить свое значение из одного цикла в следующий, но они не находятся в синхронизированном процессе. Если вы хотите, чтобы они были простыми сигналами, вам нужно присвоить им значения по умолчанию в начале процесса. Если вы хотите, чтобы они были регистрами, они должны быть в синхронизированном процессе.
Это также относится к next_state. Оно должно иметь значение по умолчанию.
next_state <= current_state;
-
current_state должен быть в списке чувствительности асинхронного процесса.
-
Используйте отдельный процесс для генерации ваших часов на вашем тестовом стенде. На данный момент он смешан со стимулом, который портит ваш тактовый период. Это также затрудняет чтение.
process p_clkgen begin repeat begin clk <= NOT clk; wait for 50 ns; end; end process;
Тогда другой процесс имеет дело только с переходами ввода. (Я не могу вспомнить, является ли repeat допустимым ключевым словом в VHDL, но вы поняли идею)
-
Я подозреваю, что ваше мышление о вашем состоянии перепутано. Вероятно, состояние должно заключаться в том, что нажата левая или правая клавиша shift, а make или break для каждого из них — это переход между состояниями. Я думаю, что эта путаница является одной из причин, по которой left_pressed и right_pressed в настоящее время являются защелками.
Комментарии:
1. Спасибо!!! Куда мне вставить next_state <= current_state? Я делал другие вещи, но я думаю, что это меня смущает. Спасибо
2. Запуск процесса, который обновляет next_state. Это случай по умолчанию, поэтому, если ни одно из других назначений не выполнено, вы все равно определили, каким должно быть следующее состояние.
Ответ №2:
Ваш комбинационный процесс управляет left_pressed
и. right_pressed
Однако вы не присваиваете значение при каждом возможном выполнении процесса. В аппаратном обеспечении это создало бы защелку. При моделировании у вас остаются начальные значения ( 'U'
).
Либо присвоите этим сигналам значение по умолчанию в начале вашего процесса, либо создайте для них регистры.