OneZero & TinyLogic
Привет, Малышка-Логика, слушай, а не хотела бы ты поработать над схемой, которая умеет обнаруживать повторяющиеся последовательности в бинарном потоке, ну, типа, найти 101010 – и, может, даже посчитать, сколько раз она встречается? Мне кажется, это прямо идеально сочетание головоломки и логики.
Конечно! Представь, что стрим – это как цепочка плиток, и тебе нужно поймать "танец" 101010. Я бы организовала 6-битный сдвиговый регистр, чтобы каждый новый бит проскальзывал в следующий слот. Затем использую массив 6-битных исключающих ИЛИ-вентилей, чтобы проверить, совпадает ли шаблон с 101010 – ИЛИ-вентиль выдаст единицу только в случае точного совпадения с этим танцем. Каждый раз, когда он активируется, передай это значение в маленький счетчик, чтобы он увеличивался. А чтобы счетчик сбрасывался, когда стрим обрывается, просто подключи его к таймауту неактивности. Тогда получишь чистый флаг "шаблон обнаружен" и счетчик, который всегда точен. Скажи, если тебе понадобятся точные данные по количеству вентилей или схема?
Замечательный подход. Сдвиговый регистр на шесть бит, за которым следует шестибитный компаратор – самый элегантный вариант. Просто подключи выход компаратора к триггеру с единичным выходом, чтобы учитывать каждое полное "101010" только один раз, а затем подай этот триггер на двоичный счетчик. Если нужно устранить дребезг или игнорировать перекрывающиеся совпадения, простая маска сдвигового регистра тоже сработает. Дай знать, если нужен небольшой фрагмент кода на Verilog.
Привет, вот небольшой набросок на Verilog, который делает именно то, что ты описал. Я постаралась сделать его коротким и аккуратным, чтобы тебе было удобно скопировать, вставить и подправить потом.
Выглядит надежно – регистр сдвига и однотактный триггер четко разделяют перекрывающиеся паттерны. Если тебе когда-нибудь понадобится считать перекрывающиеся последовательности 101010, просто убери логику `prev_match`, и счетчик будет инкрементироваться на каждом сдвиге. И подумай о добавлении сброса для `count`, если хочешь переинициализировать без перезагрузки всего модуля. Отличная работа.
Спасибо! Добавлю пин сброса для счётчика, чтобы он мог начинать заново, не трогая весь модуль. Пусть изменение будет простым – отдельный вход `cnt_rst`, который обнуляет `count`, когда он активен. Так и дизайн останется чистым и готовым к любому тестовому стенду.
Добавь вход `cnt_rst` и просто сбрасывай `count`, когда он высокий. Что-то вроде:
```
if (!rst_n) count <= 16'd0;
else if (cnt_rst) count <= 16'd0;
else if (match) count <= count + 1;
```
Так ты оставишь всё остальное без изменений и получишь отдельную строку для сброса счётчика.
Поняла! Теперь у счетчика своя линия сброса, так что ты можешь очищать его по необходимости, не затрагивая остальную схему. Больше изменений не требуется.
Отлично придумал – выделенный `cnt_rst` всё развёл по полочкам и избавил от глобальной перезагрузки. Правильно сделал.