Сначала вводим задержку, причем говорит что она имеет смысл [только] на нулевом такте.
Потом ее учитывам на всех тактах (?).
Потом говорим, что она равна нулю (??).
В результате я как читатель запутался.
IMHO не стоит пытаться описать всё, Вы поставили другую цель - описать "удивительный мир", и надо его описывать как можно проще, но не теряя сути. Усложнить можно и потом, а пока читатель не понял о чем тут вообще речь (а он еще не понял), грузить его излишними деталями не нужно.
P.S. В целом это всё мелочи. Сейчас, думаю, Вы стремитесь скорее в черновом виде написать все главы книги, чтобы книга сложилась. И тогда будет лучше видно, что нужно сказать вначале, а что стоит отложить на потом. Вы делаете большую работу!
Гм, меня это не смущает. Вы же при построении ассоциированного направленного графа регистры разбиваете на два, а другие - почему-то нет ;).
Кстати, по поводу этого графа. Вы построили граф портов, а потом приходится на часть ребер ставить веса, а на часть - нет. Т.е. всё равно ребра оказались разного типа. Может не стоит так дробить граф только для того, чтобы посчитать задержку. Я бы предложил оставить схему как есть, только регистр разбить на два: регистр-выход и резистор-вход. Тогда времена будут приписаны вершинам, а не ребрам, но всё считаться аналогично. Такой граф будет минимально отличаться от графа-схемы, но при его построении мы делаем более просто объяснимую вещь: рвем те связи, по которым данные текут через границу такта. Остаются только чисто комбинационные/функциональные стрелки, по которым считаем задержку.
P.S. Да и для констант задержка точна нужна? Вы написали, что в нулевой такт выход станет нужным через Δtc, но в остальные такты (гм, мы же для них на самом деле считаем) выход сразу будет правильный.
Про минимальность. Про произвольные булевы функции - понятно. Тогда предлагаю сократить до AND, OR, NOT - пусть тоже излишнего, но всё же достаточно фундаментального. И будет правильная ассоциация с булевыми формулами в алгебре высказываний. И, наверное, какие-нибудь теоремы/факты из этой алгебры будут красиво перекликаться с Вашими рассуждениями.
Оценка площади будет тоже плюс-минус адекватна. Например, площадь одного MUX - как два элемента AND/OR. Да, не три, но в одном порядке. Для оценки тоже сгодится.
Для регистров - аналогично.
Просто мне (наверное испорченному математическим образованием ;)) понятно, когда берется минимальный набор. Когда нет, то возникает вопрос: почему именно этот, а не какой-то другой. И может надо что-то еще добавить? А что будет если убрать? И критерий выбора мне надо понять как можно раньше (даже до аксиом). Минимальность - понятный критерий. Взять все схемы с двумя входами и одним выходом - понятный. А взять мультиплексор и не взять трехвходовой OR - мне не понятно.
P.S. Можно зайти в объяснении со стороны транзисторов и построении элементарных схем из них, тогда за основу придется взять NOT, NAND, NOR (они и раза в 2 меньше, чем AND/OR). Но, это, видимо, совсем в сторону.
А нужно ли так детально погружаться? Например, точно ли нужны времена Δtsʀ и Δtdʀ? Как Вы пишите в другом комментарии, можно считать что клок приходит во все регистры практически одновременно, так что эти времена - это всего лишь какая-то общая константа, которая на смысл дальнейших рассуждений не сильно влияет, но усложняет понимание.
Если хочется быть физически точным, то надо и длину путей (а это значит разводить схему на плоскости) учитывать. У меня часто критический путь - этот тот, у которого 80% - это провода, а только 20% - логика.
А если огрублять, то IMHO это то место, которое вполне можно отложить, считая что регистры срабатывают мгновенно и одновременно. А ближе к концу, если захочется рассмотреть поближе к реальности, то добавить дополнительные времена (и регистров, и проводов).
С точки зрения науки сразу ввести полный набор аксиом и с ним продираться через трудности - это правильно.
Но с точки зрения обучения - это перебор. Например, нам на курсе логики на 1 курсе сначала дали логику высказываний, прошли полный путь, а потом добавили кванторы - дали логику первого порядка, и прошли тот же путь, но на следующем уровне сложности.
Может и тут, сначала ограничиться функциональными схемами (без регистров), с ними пройти нужный путь. А потом ввести регистры и с ними повторить всё еще раз? И запомнится легче, и перегруза понятий не будет.
А может тогда вместо линий и черный и белых полукужков, мнемоника которых может быть прочитана по-разному, использовать линии со стрелочками? Тогда сразу видно куда "текут" данные. И в зависимости от ситуации можно будет нарисовать и так, и так, и читатель сможет прочитать.
Более сложные блоки (например, FIFO с, скажем, valid/ready интерфейсом для симметричности (или любое другое устройство с AXI-подобным интерфейсом)) мне приходится рисовать так, что у него входы и выходы с двух стороны, и группировать сигналы не по направлению, а по смыслу: с одной стороны вход FIFO (входные данные и валидности и выходной сигнал готовности), с другой - выход FIFO (выходные данные и валидность и входной - готовность).
Добрый день! Пропустил статью, поэтому комментирую с опозданием.
В целом фундамент заложен, но IMHO частично перегружен. Не уверен, что можно короче, если всё формально описывать. Но главное, чтобы хочется чтобы за этим обилием аксиом увидеть главные места и теорию.
В частности, зачем так много аксиом E*? Вполне можно обойтись E1 (константы), E2 (элементарные функции) и E8 (простой регистры). Если про остальные хочется упомянуть, то можно в качестве примера простых схем, которые можно построить из этих трех. Или (если встать на подготовленный математический фундамент) вместо E1-7 сказать, что внутри блока может быть любая булева функция (даже функция [0,1]ⁿ → [0,1]ᵐ). Аналогично более сложные регистры с синхронным сбросом/установкой/enable'ом описываются через простой (элементарный?). Тогда будет две аксиомы, каждая из которых свой краеугольный камень схем.
Конечно жизнь сложнее, и в библиотеках стандартных элементов любой фабрики сотни чуть отличающихся элементов. Но не думаю что эту сложность надо переносить в теорию / математическое описание. А достаточно двух базисных, из которых в качестве упражнений построить чуть более сложные.
P.S. И несколько пожеланий, возникших после прочтения оглавления:
Присоединюсь к пожеланию korean_pilot и включить описание конечных автоматов в 1ую главу. Вы планируете подробно описать логическую (комбинационную) часть, но без регистров и автоматов не получится полноценного фундамента.
IMHO функции (комбинационные схемы) и автоматы - два важнейших фундамента этой области. И первое время было тяжело научиться всё разлагать на эти два понятия. А как научился - легко всё пошло ;).
Да, еще стоит дать подробное описание "стоимости" реализации: площади и времени/частоты, задержки (в тактах) и пропускной способности конвейеров (вернее как часто можно подавать новые данные в конвейер). Эти метрики очень необычны для "обычного" программирования, поэтому стоит ясно и подробно о них поговорить.
А на сколько анализатор влияет на линию, не вносит ли сильные помехи? Не проводили ли такие измерения?
И другой аспект. У меня есть два устройства, соедиенные длинным (под 1м) проводом. Иногда при включении они начинают работать в Gen1, хотя поддерживают Gen2. Хотя если подергать линк (через регистры с помощью setpci), то переключаются на Gen2 и скорость больше не сбрасывают. Можно ли с помощью анализатора понять, почему так происходит? И вообще, перехватить процедуру поднятия линка, договаривания о скорости и остальную начальную инициализацию?
Вдруг будет полезно. Есть повербанки с USB PD с напряжением до 12 или даже до 20В (надо смотреть спецификацию повербанка на максимальные напряжения и токи). И китайские переходники с USB-C на нужный разъем питания с нужным напряжением.
Добавлю. Чтобы образ нельзя было испортить, можно делать «слоеную» файловую систему на Pi: нижний ro-слой — образ системы; верхний rw-слой — ram диск, на котором можно резвиться как душе угодно, а после выключения он благополучно забывается.
А МТППК (ОктЖД, Москва-Тверь) подключать не планируете?
Так же очень интересно сравнение подходов, используемых там и там.
P.S. Живу в Зелике, покупаю билет через их приложение (коих уже два), записываю на Тройку через NFC.
Зависит от нагрузки и ее продолжительности. Конский ценник это сколько? Seasonic Fanless + Thermalright Macho — это много?
У меня такая связка работает в настольном компе без вентиляторов в режиме 24/7. При очень продолжительной нагрузке i5-9500 разогревается хорошо, но такой режим у меня бывает редко. До этого i3-2120 отпахал на тех же комплектующих лет 7-8. Его перегреть вообще шансов не было.
Поддержу DX168B. В будущих статьях хочется перейти от теории к практике. Какие проблемы бывают и как с ними с помощью констрейнтов можно справиться.
Еще можно было бы описать и интерфейсы с двунаправленными линиями связи. С одной стороны формулы можно выписать по приведенным примерам. С другой, из-за взаимного влияния (типа выкручиваешь в одном месте — загибается в другом) приходится искать неописанные тут решения, типа, использовать разные фазы на двух устройствах (как опять написал предыдущий комментатор). Хотя я опять перешел к практике! ;)
Да, а тариф на электроэнергию какой используете? 1-2-3 зонный? У себя считал (центральное городское отопление; если местная газовая котельная, то тарифы могут быть другие), что ночью выгодней греть электричеством воду самому, чем пользоваться горячей водой ;). Так что интересно посчитать экономию от перехода воду.
В квартире есть другое отопление? Радиаторы отопления? В первом и втором режиме они как были настроены? А то:
На выходе из решеток температура около 21 С.
На выходе из решеток температура около 40 С.
предполагает, что в первом случае кто-то догревает еще квартиру.
Есть ли возможность управления коэффициентом смешения наружнего или внутреннего воздуха перед кондиционером? Что будет, если летом брать только наружний воздух?
P.S. Поправьте, пожалуйста, единицы измерения: «10 кВт в сутки» — это кВт·ч за сутки?, «613 кВт/ч» — кВт·ч? и Т.п.
Про константы. В итоге я понял так:
Сначала вводим задержку, причем говорит что она имеет смысл [только] на нулевом такте.
Потом ее учитывам на всех тактах (?).
Потом говорим, что она равна нулю (??).
В результате я как читатель запутался.
IMHO не стоит пытаться описать всё, Вы поставили другую цель - описать "удивительный мир", и надо его описывать как можно проще, но не теряя сути. Усложнить можно и потом, а пока читатель не понял о чем тут вообще речь (а он еще не понял), грузить его излишними деталями не нужно.
P.S. В целом это всё мелочи. Сейчас, думаю, Вы стремитесь скорее в черновом виде написать все главы книги, чтобы книга сложилась. И тогда будет лучше видно, что нужно сказать вначале, а что стоит отложить на потом. Вы делаете большую работу!
Гм, меня это не смущает. Вы же при построении ассоциированного направленного графа регистры разбиваете на два, а другие - почему-то нет ;).
Кстати, по поводу этого графа. Вы построили граф портов, а потом приходится на часть ребер ставить веса, а на часть - нет. Т.е. всё равно ребра оказались разного типа. Может не стоит так дробить граф только для того, чтобы посчитать задержку. Я бы предложил оставить схему как есть, только регистр разбить на два: регистр-выход и резистор-вход. Тогда времена будут приписаны вершинам, а не ребрам, но всё считаться аналогично. Такой граф будет минимально отличаться от графа-схемы, но при его построении мы делаем более просто объяснимую вещь: рвем те связи, по которым данные текут через границу такта. Остаются только чисто комбинационные/функциональные стрелки, по которым считаем задержку.
P.S. Да и для констант задержка точна нужна? Вы написали, что в нулевой такт выход станет нужным через Δtc, но в остальные такты (гм, мы же для них на самом деле считаем) выход сразу будет правильный.
Про минимальность. Про произвольные булевы функции - понятно. Тогда предлагаю сократить до AND, OR, NOT - пусть тоже излишнего, но всё же достаточно фундаментального. И будет правильная ассоциация с булевыми формулами в алгебре высказываний. И, наверное, какие-нибудь теоремы/факты из этой алгебры будут красиво перекликаться с Вашими рассуждениями.
Оценка площади будет тоже плюс-минус адекватна. Например, площадь одного MUX - как два элемента AND/OR. Да, не три, но в одном порядке. Для оценки тоже сгодится.
Для регистров - аналогично.
Просто мне (наверное испорченному математическим образованием ;)) понятно, когда берется минимальный набор. Когда нет, то возникает вопрос: почему именно этот, а не какой-то другой. И может надо что-то еще добавить? А что будет если убрать? И критерий выбора мне надо понять как можно раньше (даже до аксиом). Минимальность - понятный критерий. Взять все схемы с двумя входами и одним выходом - понятный. А взять мультиплексор и не взять трехвходовой OR - мне не понятно.
P.S. Можно зайти в объяснении со стороны транзисторов и построении элементарных схем из них, тогда за основу придется взять NOT, NAND, NOR (они и раза в 2 меньше, чем AND/OR). Но, это, видимо, совсем в сторону.
А нужно ли так детально погружаться? Например, точно ли нужны времена Δtsʀ и Δtdʀ? Как Вы пишите в другом комментарии, можно считать что клок приходит во все регистры практически одновременно, так что эти времена - это всего лишь какая-то общая константа, которая на смысл дальнейших рассуждений не сильно влияет, но усложняет понимание.
Если хочется быть физически точным, то надо и длину путей (а это значит разводить схему на плоскости) учитывать. У меня часто критический путь - этот тот, у которого 80% - это провода, а только 20% - логика.
А если огрублять, то IMHO это то место, которое вполне можно отложить, считая что регистры срабатывают мгновенно и одновременно. А ближе к концу, если захочется рассмотреть поближе к реальности, то добавить дополнительные времена (и регистров, и проводов).
А на схеме (Граф, ассоциированный с «пульсаром») должна быть стрелка из reg.in и reg.out?
Еще комментарий.
С точки зрения науки сразу ввести полный набор аксиом и с ним продираться через трудности - это правильно.
Но с точки зрения обучения - это перебор. Например, нам на курсе логики на 1 курсе сначала дали логику высказываний, прошли полный путь, а потом добавили кванторы - дали логику первого порядка, и прошли тот же путь, но на следующем уровне сложности.
Может и тут, сначала ограничиться функциональными схемами (без регистров), с ними пройти нужный путь. А потом ввести регистры и с ними повторить всё еще раз? И запомнится легче, и перегруза понятий не будет.
А может тогда вместо линий и черный и белых полукужков, мнемоника которых может быть прочитана по-разному, использовать линии со стрелочками? Тогда сразу видно куда "текут" данные. И в зависимости от ситуации можно будет нарисовать и так, и так, и читатель сможет прочитать.
Более сложные блоки (например, FIFO с, скажем, valid/ready интерфейсом для симметричности (или любое другое устройство с AXI-подобным интерфейсом)) мне приходится рисовать так, что у него входы и выходы с двух стороны, и группировать сигналы не по направлению, а по смыслу: с одной стороны вход FIFO (входные данные и валидности и выходной сигнал готовности), с другой - выход FIFO (выходные данные и валидность и входной - готовность).
Добрый день! Пропустил статью, поэтому комментирую с опозданием.
В целом фундамент заложен, но IMHO частично перегружен. Не уверен, что можно короче, если всё формально описывать. Но главное, чтобы хочется чтобы за этим обилием аксиом увидеть главные места и теорию.
В частности, зачем так много аксиом E*? Вполне можно обойтись E1 (константы), E2 (элементарные функции) и E8 (простой регистры). Если про остальные хочется упомянуть, то можно в качестве примера простых схем, которые можно построить из этих трех. Или (если встать на подготовленный математический фундамент) вместо E1-7 сказать, что внутри блока может быть любая булева функция (даже функция [0,1]ⁿ → [0,1]ᵐ). Аналогично более сложные регистры с синхронным сбросом/установкой/enable'ом описываются через простой (элементарный?). Тогда будет две аксиомы, каждая из которых свой краеугольный камень схем.
Конечно жизнь сложнее, и в библиотеках стандартных элементов любой фабрики сотни чуть отличающихся элементов. Но не думаю что эту сложность надо переносить в теорию / математическое описание. А достаточно двух базисных, из которых в качестве упражнений построить чуть более сложные.
P.S. Разработчик микросхем.
Интересно! Желаю не потонуть в объеме информации!
P.S. И несколько пожеланий, возникших после прочтения оглавления:
Присоединюсь к пожеланию korean_pilot и включить описание конечных автоматов в 1ую главу. Вы планируете подробно описать логическую (комбинационную) часть, но без регистров и автоматов не получится полноценного фундамента.
IMHO функции (комбинационные схемы) и автоматы - два важнейших фундамента этой области. И первое время было тяжело научиться всё разлагать на эти два понятия. А как научился - легко всё пошло ;).
Да, еще стоит дать подробное описание "стоимости" реализации: площади и времени/частоты, задержки (в тактах) и пропускной способности конвейеров (вернее как часто можно подавать новые данные в конвейер). Эти метрики очень необычны для "обычного" программирования, поэтому стоит ясно и подробно о них поговорить.
Успехов!
Здорово!
А на сколько анализатор влияет на линию, не вносит ли сильные помехи? Не проводили ли такие измерения?
И другой аспект. У меня есть два устройства, соедиенные длинным (под 1м) проводом. Иногда при включении они начинают работать в Gen1, хотя поддерживают Gen2. Хотя если подергать линк (через регистры с помощью setpci), то переключаются на Gen2 и скорость больше не сбрасывают. Можно ли с помощью анализатора понять, почему так происходит? И вообще, перехватить процедуру поднятия линка, договаривания о скорости и остальную начальную инициализацию?
Так же очень интересно сравнение подходов, используемых там и там.
P.S. Живу в Зелике, покупаю билет через их приложение (коих уже два), записываю на Тройку через NFC.
У меня такая связка работает в настольном компе без вентиляторов в режиме 24/7. При очень продолжительной нагрузке i5-9500 разогревается хорошо, но такой режим у меня бывает редко. До этого i3-2120 отпахал на тех же комплектующих лет 7-8. Его перегреть вообще шансов не было.
Еще можно было бы описать и интерфейсы с двунаправленными линиями связи. С одной стороны формулы можно выписать по приведенным примерам. С другой, из-за взаимного влияния (типа выкручиваешь в одном месте — загибается в другом) приходится искать неописанные тут решения, типа, использовать разные фазы на двух устройствах (как опять написал предыдущий комментатор). Хотя я опять перешел к практике! ;)
Из пожеланий: Вы начали с констрейнт-файлов, а далее про них ни слова: ни что в них описывается, ни примеров…
Опечатка:
// other.cpp
struct Local {
static void foo() {
std::cout << "main "; // надо other
}
};
В квартире есть другое отопление? Радиаторы отопления? В первом и втором режиме они как были настроены? А то:
Есть ли возможность управления коэффициентом смешения наружнего или внутреннего воздуха перед кондиционером? Что будет, если летом брать только наружний воздух?
P.S. Поправьте, пожалуйста, единицы измерения: «10 кВт в сутки» — это кВт·ч за сутки?, «613 кВт/ч» — кВт·ч? и Т.п.