Вы закодировали это как конечный автомат, где вместо этого у вас должно быть постоянное назначение для вашего селектора дел.Присвойте 3 бита, чтобы получить вектор с одним горячим вектором.
У вас есть неблокирующие назначения в этой логике - вам нужно использовать блокировку для комбинаторной логики.
Вам не хватает явного хранилищадля пиковых высоких / низких значений.Возможно, вы могли бы вывести некоторые защелки в этом стиле, но не совсем понятно, что вы имели в виду.
Определите некоторые флопы, синхронизированные с помощью clk, с неблокирующими назначениями.Сохраняйте обновленные результаты в каждом цикле.
Помните, что verilog выполняет все операторы параллельно, вам не следует думать о порядке выполнения.Вместо этого подумайте о явном захвате ваших результатов и вычислении «следующих» значений для этих результатов.
Вы можете просмотреть свой код следующим образом:
- Проверить обновление максимума или минимума
- Рассчитать новые значения
- Записать новые значения
Вы сделали (1) неправильно и пропустили (3) в целом.Возможно, имеет смысл кодировать (1) и (2) вместе, но это зависит от того, как вы хотите выразить функции.
assign new_level = (in > level) ? in : level;