Как‑то так cлучилось, что я вышел сначала на одну статью, а потом и на другие [1, 2, 3], в которых активно рекламировалась книга (ссылка на ее скачивание можно найти в [1]), посвященная проектированию цифровых схем [4]. Редкий по нынешним временам случай, когда реклама уделяет внимание совсем другим вещам. Так что со всех точек зрения все это, можно сказать, было делом случая. Ну, и конечно то, что в силу определенных обстоятельств мне эта тема интересна и, если как‑то себя обозначает, то меня это «цепляет» автоматически. Ну а дальше... как зайдет. Зашло. Однако, ближе к теме... Со временем технологии проектирования цифровых схем и архитектур процессоров изменяются, совершенствуются, но базовая «арифметика» всех этих дел остается фактически неизменной. А это главное, т.к. всегда интересно — что же там новенького? И вот, скачав бесплатную версию книги, я в который раз убедился, что как оно было этак 40–50 лет тому назад, так оно фактически и осталось. Но больше убило другое. В научном плане стало даже хуже. Теорию, судя по содержанию книги, нынче пролетают «по диагонали», что влечет за собой элементарные ошибки, характерные больше для студентов техникума, чем «вышки», на которых, судя по рекламе, эта книга рассчитана.  Нижеследующий разбор примеров из книги, надеюсь, это подтвердит. Но, если в чем‑то я не прав, то, как говаривали когда‑то, старшие товарищи меня поправят. Итак, начнем... Авторы книги (далее — H&H) об этом рассуждают в подразделе 3.5 главы 3. Здесь вводится понятие апертурного времени (aperture) — времени, в течении которого входной сигнал должен быть неизменным. Речь идет о поведении схемы до и после переднего фронта тактового сигнала в пределах так называемого времени предустановки (setup time), т. е. времени до переднего фронта, и времени удержания (hold time) — времени после фронта. Сумма этих времен как раз и составляет апертурное время.  Для программных автоматов эти понятия приобретают несколько иное содержание. Но дискретное время и моменты его фиксации актуальны и здесь. При этом на моменты изменения входных сигналов, если не определить протокол взаимодействия с ними, повлиять сложно. Та же «обезьяна» (см. п.3.5.4 H&H), оперируя ими, готова сделать любую пакость в любой момент времени. И договориться с ней достаточно сложно: она должна быть послушной хотя бы в пределах апертурного времени, но такое вряд ли возможно — на то она и обезьяна.  Но адаптироваться к ее поведению при программной реализации автоматов не так уж сложно. Во‑первых, нужно считывать входной сигнал только один раз и строго после переднего фронта тактового сигнала, а, во‑вторых, выходной сигнал, как реакция на входной, устанавливать также один раз и до наступления очередного фронта тактового сигнала. Так мы исключим весьма вероятную метастабильность поведения автомата в пределах одного такта.  А если все будет так, как это представлено выше, то при частоте тактового сигнала более чем в два раза превышающей максимальную частоту входного сигнала (формально дискретный такт может иметь любое не равное нулю значение, т. е. по частоте увеличиваться до бесконечности) мы сможем распознать любой входной сигнал (принцип Котельникова). И пусть обезьяна жмет на входную кнопку, как ей заблагорассудится, основное в этом процессе, чтобы частота «давления» была минимум в два раза меньше тактовой частоты синхросигнала. Тогда такой автомат сможет повторить на выходе любой входной сигнал со сдвигом по времени на величину, равную времени между соседними передними фронтами тактового сигнала, т. е. aperture (см. рис. 3.50 в [4]). Или, если уж совсем по‑простому, то на величину присущей объекту задержки. Сначала несколько слов про диаграммы сигналов, отображающих поведение сигналов логических схем. Поскольку мы договорились, что оперируем идеальными сигналами в двоичной форме, то наклонный вид их фронтов вызывает, прошу прощения, неуклонное возражение. То, как это хотелось бы видеть, мы покажем на примере из H&H, демонстрирующем импульсные помехи. В книге он представлен схемой на рис. 2.75, а временная диаграмма его работы на рис. 2.76. Ниже пример с диаграммой сигналов повторен на рис. 1, а на рис. 2 приведена диаграмма его работы в желаемой форме, полученной при моделировании схемы в ВКПа[5].                                                   Поговорим о метастабильности. В рамках данного ей определения в [4] — это некое промежуточное/неопределенное значение выходного сигнала. Довольно расплывчато, т.к. не ясно, каким видится H&H «неопределенное значение» в двоичной кодировки. Кроме того, нужно отличать метастабильность в пределах одного дискретного такта от метастабильности в течение нескольких. Первая ситуация устраняется описанным выше путем (см. поведение программы в пределах переднего фронта тактового импульса). Вторая предполагает фактически генерацию выходного двоичного сигнала, принимающего периодически значение 0 или 1. И именно подобное поведение логично было бы назвать метастабильным, хотя для этого есть и другое определение — генерация. В подобное метастабильное поведение/состояние, например, способен входить RS‑триггер (модель триггера и доказательство его свойств см. в [5]). В такое же метастабильное состояние входят или могут войти и примеры схем, о которых далее пойдет речь. В H&H, если о таком поведении и говорится, то диаграммы сигналов, которые могли бы прояснить определение метастабильности, почему‑то не приводятся. Формальное доказательство бистабильного поведения RS‑триггера приведено в [5]. Аналогично можно доказать поведение бистабильной ячейки на инверторах. Схема бистабильной ячейки приведена на рис. 3 (см. также рис. 3.1. в [4]).     Модель бистабильной ячейки в форме автоматной сети приведена на рис. 4, а результирующий автомат для данной сети показан на рис. 5. Даже не зная про операцию умножения автоматов (см. [5]), получить его можно совсем просто — буквально «на пальцах». Для этого необходимо фиксировать, хоть теми же пальцами, различные комбинации состояний сетевой модели и определить возможные переходы из этих состояний, исходя из переходов компонентных автоматов сети.    Полученный результирующий автомат показывает наличие у бистабильной ячейки двух изолированных состояний и наличие метастабильного поведения. Попав в любое из изолированных состояний, бистабильная ячейка уже не способна будет его покинуть. Это и есть ее устойчивые состояния. Но нас больше привлекает метастабильное поведение ячейки, которое заключается в циклических переходами между состояниями 00 и 11. Поведение бистабильной ячейки, смоделированное в ВКПа, показано на рис. 6. Действительно, — генерит. При запуске модель попадает сразу в одно из устойчивых состояний, а затем путем сброса ее можно ввести в метастабильный режим (режим генерации). Сбрасывая отдельные элементы схемы (в ВКПа это тоже можно делать) мы также можем перевести модель в режим генерации. Перевести модель в одно из устойчивых состояний можно, например, меняя свойства элементов ячейки. В нашем случае, изменяя тип задержек у элементов с транспортного типа на инерционный и обратно (о типах задержек см. также в [5]). Рассмотрим более сложные схемы — последовательностные, которые отличаются достаточно неожиданным поведением. Собственно это будут отражать примеры из [4], демонстрирующие метастабильное или неустойчивое поведение.  Сначала — кольцо из трех инверторов. Схема и временная диаграмма подобной схемы приведены на рис. 7. В [4] это, соответственно, рис. 3.16 и рис. 3.17. Кстати, в классической теории такое соединение инверторов будет считаться противоречивым, но практика, как ни странно, такое допускает (об этом см. [5]) Если собрать схему, состоящую из трех инверторов, в ВКПа, то получим такую же диаграмму, но имеющую иной вид сигналов (см. рис.8). Можно также заметить, что любая схема из нечетного числа инверторов представляет собой генератор прямоугольных импульсов. В том числе состоящая из одного инвертора.  Гонки сигналов в цифровых схемах могут привести к достаточно неожиданным эффектам. Рассмотрим это на примере D‑защелки, представленной на рис. 9. В [4] она приведена, соответственно, на рис. 3.18 (подробнее см. пример 3.4 в [4]), а диаграмма ее сигналов на рис. 3.19.    На рис. 10 приведены результаты моделирования схемы в ВКПа, когда задержка инвертора ровно в два раза больше задержки остальных элементов схемы. При этом задержки всех элементов имеют транспортный тип. Заметим, что в [4], в отличие, например, от [6], типы задержек почему‑то не рассматриваются вовсе (подробное описание типов задержек см. в разделе «Временное моделирование» в [6]).  По сравнению с результатами моделирования аналогичной схемы в H&H имеем явно другое поведение: среда ВКПа выявляет метастабильное поведение сигнала Q. В первоисточнике это лишь небольшой «пупырышек» сигнала N2 (см. рис. 9), которому почему‑то не хватило сил проскользнуть на выход схемы. Совсем другое поведение будет у схемы, элементы которой имеют инерционный тип задержек (рис. 11). Здесь инерционный элемент, на выходе у которого должен появиться сигнал N2, не пропустит кратковременное единичное значение сигналов ^CLK и Q на его входах (видимо, он и представлен упомянутым выше «пупырышком»). В то же время для элемента с транспортным типом задержки этого времени оказалось вполне достаточно, чтобы на выходе появился импульс, который и спровоцировал последующее метастабильное поведение схемы. Однако, если сдвинуть фронт спада сигнала Q по отношению к единичному фронту сигнала ^CLK влево, то это исключит установку сигнала N2, что в свою очередь сорвет процесс генерации. Это можно сделать, уменьшив задержку выходного элемента ИЛИ. Диаграмма сигналов подобного эксперимента приведена на рис. 12. Но при этом, уже при установке сигнала CLK, появится кратковременный импульс. Но его легко подавить. Для это достаточно, чтобы элемент И (см. сигнал N2), порождающий данный импульс, имел инерционный тип задержек.   Таким образом, устойчивость рассматриваемой D‑защелки определяется соотношением задержек инвертора и выходного элемента ИЛИ. Если оно будет подобно представленному на рис.10, то существует реальная опасность возникновения метастабильного состояния или, попросту, генерации. Правда, она, скорее всего, будет подавлена инерционным характером нижнего элемента И (см. рис. 11), т.к. реальные элементы по своей сути инерционны. Но, чтобы генерацию исключить совсем, нужно гарантированно увеличить задержку инвертора. Правда, как схема при этом будет воспринимать информационный сигнал D (тут могут быть проблемы) пусть все же лучше объяснит Бен Бидтидл — автор данной схемы (см. [4]). Выше мы рассмотрели некоторые проблемы поведения цифровых схем. В случае комбинационных схем это могут быть импульсные помехи, которые с течением времени, т. е. при переходе их в установившийся режим, исчезают. Для схем последовательностного типа гонки сигналов могут привести к метастабильному поведению схемы (самовозбуждению схемы). И действительно «подобные ошибки весьма сложно выявлять» (см. стр. 298–299 в [4]). И здесь нам в помощь будут конечные автоматы и приемы их аппаратной реализации. Хотя это уже тема для отдельного разговора. Опять же это можно сделать на основе анализа примера из [4] — модели светофора. А там, к счастью, а для кого‑то, думаю, и к сожалению, тоже есть о чем поговорить.  Однако, интерес продолжить такой разговор для автора выражается, как минимум, количеством «плюсов» за данную статью. Из чего я исхожу. Например, что там скрывать, количество «минусов» за мою предыдущую статью [7], которая выявила явные проблемы с анализом работы даже элементарных параллельных процессов, слабо мотивирует на работу. Пусть, например, такой границей будет 40+. Ведь, нашлось же 38 человек, поставивших «плюсы» статье [8], содержащей так и не разрешенную проблему использования общего ресурса в форме переменной‑счетчика? И, что примечательно, ее автор так и не соизволил подключиться к обсуждению проблемы. А кому, как не ему, озвучить, что он ожидал, и согласен ли он с результатами обсуждения данной проблемы. Описанная ситуация, как мне представляется, довольно странная: мы с большим желанием хотим видеть только лишь то, что мы хотим видеть, и с усердием, достойным лучшего применения, минусуем тех, кто пытается разрушить подобные иллюзии.  Думаю, что и этот мой критический взгляд на столь разрекламированную книгу, которую, если опять же верить рекламе, собираются срочно внедрить в учебный процесс чуть ли не все ведущие высшие учебные заведения США и России (а за ними, видимо, подтянутся и другие) вызовет оценку, выраженную соответствующим числом «минусов». Но я тут бессилен что‑то сделать и хоть как‑то изменить свое мнение, т.к. передо мной лежит книга для техникумов железнодорожного транспорта 70-х годов времен СССР [9], которая в научном плане гораздо полнее раскрывает темы, затронутые в рамках обсуждаемой книги.  Конечно, в 70-х годах в CCCP не подозревали, что скоро появится VHDL и новые технологии проектирования цифровых схем, а потому не включили в упомянутый выше учебник соответствующие главы. Тем не менее, базовые — научные основы остались теми же. А потому скатываться на уровень ниже, чем уровень техникумов в CCCP, представляется не очень правильным, если не сказать — опасным. Пусть об этом не подозревают американцы, но россияне могут купить за совсем символическую цену вторую версию упомянутого учебника на том же WILDBERRIES, как это сделал автор, приобретя его более расширенный вариант [10], и оценить куда же мы катимся в научном плане. Да и ценность книги и понимание затронутых в ней тем студентами определяется совсем не ее объемом, а содержанием. А то, что я в своих статьях часто ссылаюсь на труды наших ученых — В.М. Глушкова, С.И. Баранова, А.Н. Мелихова, Д.А. Поспелова и, касаясь текущей темы, С.А. Майорова и Г.И. Новикова и прочая и прочая... не счесть просто, не похоже, чтобы кого‑то убеждало. При этом не столь часто, как они того заслуживают, упоминаю А. Тьюринга, Дж. фон Неймана, М. Минского и многих других «заморских» ученых и исследователей, из которых, кстати, в H&H удостоились чести быть упомянутыми лишь Ч. Беббидж, да Дж. Буль. Может здесь «собака порылась»? Но неужели сонм помощников и рецензентов, упомянутых в разделе «Признательность за поддержку» или ведущих специалистов, участвовавших в переводе данной книги, не заметили очевидных недостатков книги H&H? Это, безусловно, не перечеркивает тех положительных качеств, которые, несмотря ни на что, имеет данная книга. А это тоже есть, т.к. иначе она была бы мне просто неинтересной. Но все же студенты высших учебных заведений должны глубже вникать в тему, чем учащиеся техникумов времен СССР. Ну, или хотя быть на их уровне... Иначе совсем беда — будем говорить на разных языках. Как я убеждал блондинку Машу перейти с программирования RTOS в проектирование железа (а также Coq, Lisp и Haskell). [Электронный ресурс], Режим  доступа: https://habr.com/ru/articles/732700/ свободный. Яз. рус. (дата обращения 21.11.2023). Избранные места из популярного учебника микроэлектроники на русском, который наконец-то выходит на бумаге.. [Электронный ресурс], Режим  доступа: https://habr.com/ru/articles/317558/ свободный. Яз. рус. (дата обращения 21.11.2023). Самый по-человечески написанный учебник компьютерной архитектуры наконец-то выходит на русском языке и для RISC-V. [Электронный ресурс], Режим  доступа: https://habr.com/ru/articles/597603/ свободный. Яз. рус. (дата обращения 21.11.2023). Хэррис Д.М., Хэррис С.М. Цифровая схемотехника и архитектура компьютера. - 2-е изд.  Автоматное программирование: определение, модель, реализация. [Электронный ресурс], Режим  доступа: https://habr.com/ru/articles/682422/ свободный. Яз. рус. (дата обращения 21.11.2023). Армстронг Дж.Р. Моделирование цифровых систем на языке VHDL: Пер с англ./М.: Мир, 1992. – 175 с. Параллелизм без потоков: очевидно и вероятно. [Электронный ресурс], Режим  доступа: https://habr.com/ru/articles/765676/ свободный. Яз. рус. (дата обращения 21.11.2023). Многопоточность в Python: очевидное и невероятное. [Электронный ресурс], Режим  доступа: https://habr.com/ru/articles/764420/ свободный. Яз. рус. (дата обращения 21.11.2023). Грицевский П.М., Мамченко А.Е. Основы импульсной и вычислительной техники. Учебник для техникумов. – М.: "Сов радио". 1974. – 296 с. Грицевский П.М., Мамченко А.Е., Степенский Б.М. Основы импульсной и вычислительной техники. Учебник для техникумов. – М.: "Сов радио". 1979. – 392.  Программист