VHDL - Неопределенное поведение при обнаружении моего ключа - PullRequest
1 голос
/ 20 октября 2011

Я занимаюсь разработкой детектора клавиш переключения регистра. Я написал тестовый стенд.Тест показал, что моя реализация была неправильной.

Вот симуляция в ModelSim.

enter image description here

Красная линия указывает НЕ УКАЗАНА.Такое поведение происходило только дважды.

Что меня озадачило: почему такой большой разрыв между этими двумя ценностями?Если вы посмотрите на испытательный стенд, в 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 являются сигналами, а не переменными.Таким образом, они должны иметь значение в любом случае.Если один из них изменится, соединение с сигналом сдвига будет обновлено автоматически.

Может кто-нибудь помочь мне?Спасибо.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

Я ожидаю, что вы получаете вывод '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'

Есть несколько проблем с вашим кодом, которые мне нравятся

  1. В настоящий момент left_pressed и right_pressed являются защелками, поскольку они переносят свое значение от одного цикла к следующему в некоторых условиях, но они не находятся в синхронизированном процессе. Если вы хотите, чтобы они были простыми сигналами, то вам нужно дать им значения по умолчанию в начале процесса. Если вы хотите, чтобы они были регистрами, они должны быть в синхронизированном процессе.

    Это также верно для next_state. Он должен иметь значение по умолчанию.

    next_state <= current_state;
    
  2. current_state должно быть в списке чувствительности асинхронного процесса.

  3. Используйте отдельный процесс для генерации ваших часов на тестовом стенде. В данный момент это смешано со стимулом, который портит ваши часы. Это также затрудняет чтение.

    process p_clkgen
    begin
        repeat begin
            clk <= NOT clk;
            wait for 50 ns;
        end;
    end process;
    

    Тогда другой процесс имеет дело только тогда, когда ввод переходит. (Я не могу вспомнить, является ли повторение допустимым ключевым словом в VHDL, но вы поняли)

  4. Я подозреваю, что ваши мысли о вашем состоянии смешались. Вероятно, состояние должно состоять в том, что нажата левая или правая клавиша Shift, а пробой или разрыв на каждом из них является переходом между состояниями. Я думаю, что это смешение является одной из причин того, почему left_pressed и right_pressed в настоящее время являются защелками.

2 голосов
/ 20 октября 2011

Ваш комбинационный процесс управляет left_pressed и right_pressed.Однако вы не присваиваете значение при каждом возможном выполнении процесса.В оборудовании это создаст защелку.При моделировании у вас остаются исходные значения ('U').

Либо присвойте этим сигналам значение по умолчанию в начале вашего процесса, либо создайте для них регистры.

...