29 / 37 · Теория
Итоговый проект: детектор перекрывающейся последовательности 101
Объедините минимизацию состояний, действительность входа, зарегистрированный выход и независимую эталонную проверку.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Сначала зафиксируйте требования
На положительном фронтеПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее с valid=1 принимается один bit_in. Если конец принятых битов — 101, hit становится 1 на цикл после этого фронта. Перекрытия разрешены: у 10101 hit должен появиться на третьем и пятом битах. При valid=0 состояние хранится, hit=0; reset инициализирует состояние и hit.
Храните только необходимую историю
S0 означает отсутствие совпадающего префикса, S1 — окончание на 1, S10 — окончание на 10. После завершения 101 последняя 1 может начать следующий шаблон, поэтому возвращаемся в S1.
| Текущее состояние | Принят бит 0 | Принят бит 1 |
|---|---|---|
| S0 | S0, hit=0 | S1, hit=0 |
| S1 | S10, hit=0 | S1, hit=0 |
| S10 | S0, hit=0 | S1, hit=1 |
Каждый столбец — запись наблюдения одного положительного фронтаПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Входы показаны непосредственно перед фронтом, состояния со словом «после» в имени — сразу после обновления. Выравнивание столбцов обозначает порядок выборок, а не физическую задержку распространенияЗадержка распространения — время от изменения входа до установления правильного выхода. Логическая эквивалентность выражений и их временные характеристики — разные вопросы. Подробнее.
После reset начинаем в S0, valid=1 во всех столбцах. Обнаружение на третьем бите оставляет S1, позволяя обнаружить и пятый.
Показать данные диаграммы
| Сигнал | Диаграмма | Значения шины |
|---|---|---|
| принятый бит | 10101 | |
| state после | 23452 | S1 → S10 → S1 → S10 → S1 |
| hit после | 0.101 |
Реализация зарегистрированного обнаружения
module pattern_101 (
input logic clk, rst, valid, bit_in,
output logic hit
);
typedef enum logic [1:0] {S0, S1, S10} state_t;
state_t state;
always_ff @(posedge clk) begin
if (rst) begin
state <= S0;
hit <= 1'b0;
end else begin
hit <= 1'b0;
if (valid) begin
case (state)
S0: state <= bit_in ? S1 : S0;
S1: state <= bit_in ? S1 : S10;
S10: begin
state <= bit_in ? S1 : S0;
hit <= bit_in;
end
default: state <= S0;
endcase
end
end
end
endmoduleHit сохраняет в регистреРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее результат, вычисленный из состояния и принятого на этом фронте входа. В отличие от чисто комбинационного выхода Мили он не реагирует немедленно на bit_in между фронтами. Это пример общего SystemVerilog; поддержку синтаксиса и доказательство выполнения в предоставленном однотактовом учебном движке нужно проверять отдельно.
Независимый расчёт критериев приёмки
Собирайте в строку только принятые биты; при длине минимум три сравнивайте последние три символа с 101. Для такого эталона не нужно копировать кодировку состояния FSMКонечный автомат определяет следующее состояние и выходы по сохранённому состоянию и входам. Правила переходов, выходов и сброса задают совместно. Подробнее.
- 101 → hit на позиции 3.
- 10101 → hit на позициях 3, 5.
- 11101 → hit на позиции 5.
- 1001 → без обнаружения.
- 1,0, затем reset и 1 → без обнаружения.
- Вставка valid=0 между или после 1,0 → тот же результат по номерам принятых входов.
Интерактивное упражнение с битовой строкой ниже проверяет функцию для непрерывных действительных входов. Не считайте это проверкой reset, остановок valid или физического времени.
Измените входы
Попробуйте сами
Если после обнаружения 101 возвращать код в S0, какая самая короткая входная последовательность отличит его от исходной спецификации?
Прочитать объяснение
- Правильная схема обнаруживает 3-й и 5-й входы. Возврат в S0 не позволяет использовать последнюю 1 первого совпадения как начало следующего, поэтому обнаружение на 5-м пропускается.