VHDL — неопределенное поведение при обнаружении моего ключа

#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’

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

  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;
      

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

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

Комментарии:

1. Спасибо!!! Куда мне вставить next_state <= current_state? Я делал другие вещи, но я думаю, что это меня смущает. Спасибо

2. Запуск процесса, который обновляет next_state. Это случай по умолчанию, поэтому, если ни одно из других назначений не выполнено, вы все равно определили, каким должно быть следующее состояние.

Ответ №2:

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

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