Реверс-инжиниринг DS1302

Mar 06, 2023 02:14

Исходя из того, как эта микросхемка часов реального времени (RTC) реагирует на запись в неё некорректных данных, я прихожу к заключению: непосредственно для счёта времени там используется чуть ли не в точности вот такое, разработанное минимум в 1974 году:




Это рисунок из даташитов к микросхемам 7490 и 74LS90. Понятно, в RTC вместо ТТЛ будет КМОП, оптимизированная под малое потребление, но логика, очень похоже, та же самая!

По крайней мере, сейчас громко подумал над этой схемой, как она отреагирует, если инициализировать её "недопустимыми" значениями от 0xA до 0xF. ОНА ОТРЕАГИРУЕТ ТОЧНО ТАК ЖЕ: 0xA превратится в 0xB и оттуда в 0x4, 0xC превратится в 0xD и оттуда тоже в 0x4. А 0xE превратится в 0xF и в 0x8.


Чтобы громко подумать, пришлось порисовать в тетрадке:






На схеме выше надо соединить выход QA со входом CKB.

Самый младший разряд ведёт себя проще всего: переключается с нуля в единицу, из единицы в ноль, и так всё время. Обычный "делитель на 2".

Выход QA используется в качестве тактовой частоты для двух других триггеров, выходы которых QB и QD.

Как поясняется в даташите, если входы J и K никуда не подключены, надо это интерпретировать как подачу на них лог "1". И логика этих триггеров такова:
- если J=K=1, то по СПАДУ тактовой частоты происходит переключение,
- если J=1, K=0, то по спаду тактовой частоты происходит установка "1",
- если J=0, K=1, то по спаду тактовой частоты происходит сброс, т.е на выходе появляется "0",
- если J=K=0, то в триггере хранится текущее состояние.

Итого, второй триггер (выход которого QB) переключается туда-сюда, до тех пор, пока на QD не возникнет единичка. Как только там станет единичка, на вход J придёт ноль, поэтому по очередному спаду произойдёт сброс. Это объясняет, почему в разряде двоек мы неизменно получаем ноль.

Третий триггер использует выход второго (QB) в качестве тактовой частоты. Никакая другая логика ему не нужна! До этого мы тоже додумались, что из 1001 "естественным образом" получалось 1010, т.е третий разряд, разряд четвёрок, можно не усложнять.

И наконец, четвёртый триггер здесь изображён как RS, а не как JK. И да, установка в "1" произойдёт, когда все младшие разряды: единицы. Точнее, с помощью элемента "И" проверяется равенство единицы двух разрядов, но поскольку младший разряд используется в тактовой частоты, с реакцией на СПАД, то и там должно произойти переключение из ЕДИНИЦЫ в НОЛЬ.

Сброс произойдёт по спаду младшего разряда, если в старшем разряде уже стояла единица.

Если мы инициализируем триггеры в состояние 0xF (единицы на всех), то этот RS-триггер попадёт в "запрещённое состояние". Тут приведённой схемы уже не хватает, чтобы предсказать, как она на это отреагирует. У нас вышло, будто бы в входа S имеется "приоритет" перед входом R. По идее, если есть некоторая уверенность в длительности фронтов и спадов тактовой частоты, идущей на вход, то попросту введя разные временнЫе характеристики внутри этого триггера, можно заставить его надёжно отдавать приоритет одному из входов, т.е усложнения по количеству логических элементов тут не происходит.

Во всём этом есть определённый смысл! Чтобы данная RTC потребляла ток, измеряемый в наноамперах, хочешь-не хочешь, а надо уменьшить число задействованных транзисторов! Тут даже улучшение техпроцесса не особо способствует: как известно, утечки с некоторых пор начинают расти. Поэтому нужно что-то самое простое: АСИНХРОННЫЕ СЧЁТЧИКИ. Синхронизировать будем отдельно, но только если дадут "основное питание" и запросят у нас эти данные! А именно в 70-е - 80-е годы (если не раньше), когда каждый транзистор был на счету, очень заморачивались, как бы всё это сделать настолько простым, насколько это вообще возможно!

Хотя есть прецеденты, когда некоторые схемы удалось упростить сильно позже, с появлением компьютерных мощностей, позволяющих "прямым перебором" найти оптимальные решения. Я знаю только одну историю, про дешифратор для 7-сегментного индикатора. Было ли это дело воплощено "в железе" - понятия не имею.

PS. В Шиле, увы, схема приведена с несколькими ошибками:



Третий триггер тактовую частоту получает не оттуда, и логика асинхронной установки изображена так, будто бы поставит 1111 = 0xF, а не 1001 = 9, как обещается. Эх, в своё время по Шилу это дело осваивал, но начав изучать эту конкретную схему счётчика, быстро "сдался" - "не понимаю, почему оно считает до 10, хоть убейте!". Ладно, хоть сейчас разобрался...

странные девайсы, безумный MAX3032, ПЛИС

Previous post Next post
Up