Как стать автором
Обновить

Комментарии 70

Это почти гениально! %)

Спасибо, конечно, но вынужден не согласиться))

Нового ничего я не открыл — про необходимость рассматривать нули наравне с единицами указано практически в любой литературе, так или иначе затрагивающей тему минимизации логических функций при проектировании дискретных устройств (специально взял таймаут до вечера, чтобы перелистать некоторые книги в домашней библиотеке).

Статья создавалась в таком формате не для того, чтобы продемонстрировать очевидность логических тождеств, скорее чтобы показать интересующимся один из примеров того, как современный цифровой мир устроен изнутри — в этом смысле я рассматриваю свою статью как практическую иллюстрацию к ретроспективному обзору, упомянутому в конце статьи.

Ведь мало кто, к примеру, реально понимает как работает даже самый простой процессор — ну считал он из памяти код какой-нить команды, а дальше-то что за таинство с этим кодом происходит внутри процессора? Как получаются какие-то результаты?

Многие ли люди, которые имеют дело с высокоуровневым проектированием (неважно на каком языке — VHDL/Verilog/etc), смогут залить в современную FPGA реализацию 8-битного процессора z80?
Многие.
А многие ли могут сами придумать и написать реализацию 8-битного микропроцессора, который уместится не то что в FPGA, а в 32 макроячейки древней CPLD типа Xilinx 9536? Сомневаюсь.

Вот и мне захотелось показать интересующимся как оно там изнутри устроено, малюсенький кусочек того, для понимания чего и нужны некоторые предметы, преподаваемые на первом-втором курсах технических ВУЗов.
Вот и я удивился в своё время, когда не обнаружил в сети упоминаний о подобной («на нулях») реализации дешифратора на базе GAL-ов :)
Если были бы доступны дешёвые, многократно (и электрически) программируемые ПЗУ в малых (меньше, чем DIP-28) корпусах — можно было бы. Сейчас раздобыть EEPROM меньше, чем 2Kx8 сложно.
не то — входов только 5, а для двух цифр в мультиплексе нужно минимум 9 (т.е. не 32x8, а 512x8).

4 цифры — шина адреса z80, 2 цифры — шина данных. Это 6 (шесть) DIP-16 корпусов SN74188 (К155РЕ3).

А так — только 3 DIP-20 корпуса GAL16V8 (ATF16V8).
А в чём сверхценность обработки именно двух разрядов одним корпусом?
Почему бы не обрабатывать каждый разряд отдельной микросхемой?

Ведь в качестве мотивации использовать одну GAL16V8 было указано «расточительность». А РЕ3 — штуки копеечные, так что никакой расточительностью их удваивание не пахнет. Собственно, посмотрев цены, я и для GAL16V8 не очень понимаю, в чём расточительность, если они на алиэкспрессе стоят 25-36 р за штуку при покупке 10 или 5 шт.

4 цифры — шина адреса z80, 2 цифры — шина данных.
А это вообще какие-то дополнительные вводные. Для примера, приведенного в статье (показ двух цифр hex-значения по входному 8-битному двоичному) хватит двух РЕ3. По цене получается приблизительно те же деньги, что одна GAL, но РЕ3 доступнее.

Ну ок, примем эти дополнительные условия. 3 GAL обойдутся в 3*36 р (при покупке лота 5 шт) = 108 р; 6 РЕ3 *18 р = те же 108 р. Опять же, при большей доступности. Единственный минус — места чуток побольше займут, да. Но при недостатке места логично использовать SMD-корпуса, и аналоги РЕ3 в таком варианте точно есть, а вот про GAL не уверен.

Не примите это за обесценивание вашей статьи. Решение поставленной проблемы вполне интересно. Другое дело, что сама проблема выглядит несколько надуманной.

Да, с точки зрения экономики вы правы, конечно.

И да, для меня в своё время это было именно интересной задачей — можно или нельзя?

Другой вопрос в «практическом» применении в ретрокомпьютинге.
С точки зрения «аутентичности» применение GAL/ATF (в силу их полной совместимости с почившими PAL-ами) можно считать допустимым.
И тут уже экономия на количестве корпусов играет роль. Зачем мне N корпусов, если можно обойтись N/2?

P.S. Про «расточительность» в смысле денег изначально мысли не было, внёс коррекцию в статью в соответствии с тем, что имел в виду. Спасибо за замечание!
Ну, первый абзац не выглядит постановкой задачи, только неким предисловием. Хотя по списку процессоров — да, все они имеют такую разрядность шин, это я как-то упустил.

Добавленное пояснение действительно добавляет ясности :).
Согласен, возможность переиспользования под другие задачи вполне весома для индивидуальных проектов.

И повторюсь, если статья строилась как «подобрать наглядную задачу чтоб показать интересный подход в решении» — вам это удалось.
Вообще, для ПЛИС маленьких размеров сложно найти подходящую задачу, чтобы раскрыть их полностью. Я вот для 64х ячеек придумал только часы. А тут еще меньше. Но тут проблема именно в задаче, что она требует только комбинаторики. Ее действительно проще сделать на ПЗУ. Если же задача требовала бы стейта/регистров, которые есть в PAL, то на ПЗУ это было бы не решить без внешней микросхемы-регистра.
Добавил свою позицию в начало статьи.
Вопрос на засыпку: когда я был молодой, можно было просто пойти и купить готовую микросхему управления семисегментным индикатором, например, 564ИК2 до пяти разрядов поддерживала. Сейчас так нельзя?
Можно конечно)
Только её (и деньги на неё) сильно искать надо (если найдётся веская причина её покупать), а буржуйских аналогов у неё (насколько я помню) не было.

MAX7219 например, умеет управлять группой из 8 индикаторов, китайские копии с али даже работают.
ну, если в таком смысле, то можно и на HD44780 или там SSD1306 кивнуть.

если уж про последовательный интерфейс упоминать, то тогда уж типа как у drWhy ниже
habr.com/ru/post/548288/#comment_22835430

я-то думал, что вопрос был, мол, есть ли что-нить что не требует действий по передаче данных, но при этом многозначное…

Возник вопрос. В современном мире. Что народ использует вместо GAL? Это я к тому, что GAL больше не производится.

Вместо GAL можно взять разные ice40, они поддерживаются опенсорсным тулчейном для плис yosys и бывают разной наполненности.
Это уже не ретрокомпьютинг, это читерство)))

Вся прелесть в DIP корпусе :) у ice40 такого нет.

Ну, именно GAL-ы не производятся, но Microchip вроде как до сих пор производит ATF-ки.
Если б была у меня в наличии ATF16V8C (https://www.microchip.com/wwwproducts/en/ATF16V8C), то та же самая конфигурация так же работала бы и в ней.
В чип-и-дипе самый дешевый GAL16V8D-10LP стоит 680 рублей.
DIP-овые ATF22V10C и ATF16V8C стоят уже ± 300 рублей.
И за те же 300 рублей можно взять Altera MAX II EPM240T100C5N в TQFP-100 корпусе.

Так, думаю я, интересно.
Потом смотрю стоимость программатора MiniPro TL866A… и тут я решил, что oldschool и ламповые технологии не для меня.
???

Не, ну в конкурсе на тему «Кто и где сможет купить это дороже всего?» я участвовать не буду.

GAL16V8D ~ 35 руб/шт.

Altera EPM7032SLC44 ~ 50 руб/шт.
EPM7064SLC44 ~ 100 руб/шт.
Обе две во вполне «ламповых» PLCC-44 корпусах.
Altera EPM240T100C5N ~ 75 руб/шт.
ну, т.е. если не ходить в ЧипДип, то всё более чем доступно.

TL866ii Plus (там же) ~ 4000 руб., список поддерживаемых им микросхем здесь:
www.xgecu.com/MiniPro/TL866II_List.txt

Если существует ещё более лучший универсальный программатор с такими возможностями за меньшие деньги — дайте знать.
Сам-то я пользуюсь старым TL866A.
Да, вы правы.

Похоже aliexpress единственный, кто продает устаревшие чипы адекватно их стоимости.
Смотрел еще на digikey и mouser. Там цены «non stock» и «obsolete».

TL866 — вещь! На него пока только облизываюсь, сейчас хватает прошивать ATtiny и через ардуино. А экономические обстоятельсва заставляют экономить на хобби.
У меня в планах собрать программатор GalBlast 1.6 — дёшево и сердито ;)
Он хорош тем, что кроме стандартного набора 16V8/20V8/22V10 позволяет прошивать и GAL18V10, GAL26CV12 и GAL6001/6002, которые не поддерживает TL866.

Есть ещё вариант Владимира Мисячного, сделанный на базе GalBlast 1.2.
где же вы нынче LPT-то берёте?
А в чём проблема? С включенными фильтрами «от 305 до 400 руб» и «478» выбирайте ближайшую. А если убрать упоминание 478 сокета, то выбор ещё больше. Про расширение ценового диапазона вообще молчу.

+ Процессор — любой подходящий ~0-50 руб.
+ Память — 1-2 GB (~50-350 руб).
+ Старый винт — у каждого где-нить валяется.
+ Windows XP (и даже 3.11 или 95) — есть в сети.

Делов-то! :)
Ну вот, надеялся что будет всё же что то другое, хотя бы USB->LPT, но увы…
так это ж фактически составная часть программатора получается ;)

у меня тоже в своё время была мысль портировать софт GalBlast-а на STM32, но пропала — использование GalBlast-а преполагается сильно эпизодическое, поэтому остановился на варианте «программатор+материнка».
Нужно — достал из шкафа, не нужно — убрал обратно. А сама материнка в microATX формфакторе в вертикальном положении в шкафу много места не занимает.
поэтому остановился на варианте «программатор+материнка».
Нужно — достал из шкафа, не нужно — убрал обратно.

У меня почти также, что и вызывает боль. На самом деле правда немного в другом конечно… Чуть оффтопик, но раз уж коммент под руку пришёл)

image

Очередной аппаратный патч для готового устройства, их там уже несколько в таком форм-факторе микроплаток-заплаток. Очень и очень хотелось обойтись жесткой логикой. Справа вариант на логике, слева (не распаян), на stm32 — не смотря что там еще и большой корпус LDO и преобразование 5/3V (cамо устройство 5V-овое), размер получился всё равно меньше, не говоря уже о гибкости если что-то пойдёт не так, туда сразу можно докинуть еще 100500 функций. Но… золотую ТМ2 не поставить :)
ps крышечка от ЛР на месте stm32 tssop-20 для антуража:)
Судя по наличию микросхем с 5-й приёмкой, можно предположить, что заплатки для некоего устройства используются на производстве. Если предположение верное, то вряд ли проблема с местом размещения древней материнской платы имеет место быть.
А если дело в мобильности (т.е. штоб таскать программатор с собой и перепрошивать GAL-ы на местах), тогда — да… ((

Ну так и взялись бы за портирование на STM32 — ничто так не стимулирует, как реальная необходимость.

А благодарный народ веками бы про вас былины складывал и баллады пел ;)))
Судя по наличию микросхем с 5-й приёмкой, можно предположить
… я его слепила, из того что было:)
74HC74 закончились, а эти остатки 564 сдавать жалко смысла нет, да и нравится металл когда-то рождённый при взрыве сверхновой или слиянии нейтронных звёзд:)
Ну так и взялись бы за портирование на STM32 — ничто так не стимулирует, как реальная необходимость.
был бы их пакет хотя бы, да я и только ныть в комментах:)

Так через ардуино-isp можно прошивать уже очень многое. У меня программатор на ней линейки attiny13, линейки attiny84, линейки atmega8, линейки atmega16 - хватает на все случаи жизни.

EPROM можно, наверное. Есть даже в дипе. 16 входов, 8 выходов.
Когда-то применил К176ИЕ4, имевшиеся в избытке, для подключения копеечного семисегментного ЖК индикатора на четыре разряда, т.к. ЖК дисплеи с контроллерами не помещались в бюджет. Показания выгружались с ноги МК на последовательно соединённые счётчики. Для экономии пространства индикатор и кнопки были смонтированы на обратной стороне платы.

ЖК
Проприетарный протокол последовательного интерфейса получился)))
А вот не помню — в той серии, кроме десятичных счётчиков-дешифраторов, двоичные счётчики-дешифраторы были?
Наверно в 561-ой.
Спасибо автору за ностальгию по цифровой схемотехнике!
Так увлекательная же штука-то! )))

Тут вот надоело мне проводочками монтаж делать паять и захотелось самому платы печатные травить. Ну и решил наконец-то УФ-светильник для засветки фоторезиста сделать.
Смотрю на али варианты что дешевле — 3-4м УФ-светодиодной ленты или пара сотен 5мм УФ-светодиодов со стабилизаторами тока…
Подобное устройство (декодер на два индикактора с минимальной динамической индикацией)
www.instructables.com/Dual-BCD-to-Hex-7-Segment-Driver
sourceforge.net/projects/dual-bcd-to-hex-7-seg-driver
Только на GAL22V10
Это ни в коем случае не критика, просто забавно, что техническая мысль ходит одинаковыми маршрутами.
О, спасибо!

The biggest problem I encountered was that the internal Macro Cells just didn't have enough room for the combinational logic equations that I wrote using OpalJr. Figuring that it was quite outdated, I decided to learn another descriptive language and tried my hand at WinCUPL

Любопытно, что он так и не смог понять «фокуса» с минимизацией по нулям и получил желаемый результат только путем использования табличного способа описания желаемого преобразования входных данных в выходные. WINCupl сделал всю работу по преобразованию таблиц в ДНФ и минимизацию за него ;)

Да, в наше время получают результат, не понимая как он был получен. Магия! )))
Я потому в статье и расписывал подробно теоретическую часть — попытался развенчать маленький кусочек «магии».
I had been thinking about this project for several months, but I had a hard time figuring out how to go about the software design process. I understood combinational logic equations. But all my efforts were simply kicked back by the compiler with an error saying I had exceeded the available space in the OLMC.

Оставил ему в каментах линк на сюда — мож разберется… :)
Если уж развенчивать магию, то нужно идти до конца :)
Древняя забытая теория гласит, что кроме ДНФ существует еще КНФ (конъюктивная нормальная форма), по функции эквивалентная ДНФ (как минимум, через теорему де Моргана). Та же теория утверждает, что если функция имеет «редкие» единицы, то ее более короткий вид получается в ДНФ, а иначе — в КНФ. В статье про «ретро» есть упоминание старых книжек. Вероятно, производители компиляторов это всё знают, а рядовые инженеры — давно забыли (или никогда и не знали :) ).
Та же теория утверждает, что если

Рискну усомниться в том, что теория это именно «утверждает» и утверждает именно «это».
Про рекомендации проводить минимизацию либо по единицам, либо по нулям в зависимости от того, чего меньше — это да, это в книжках есть ;)

В случае данного кейса (прошу прощения за каламбур) весь «фокус» и заключается в том, что по нулям ДНФ получаются минимальнее, чем по единицам.

А вот особого смысла в упоминании КНФ применительно к рассматриваемой аппаратной архитектуре не вижу — только перегрузило бы материал.
Посмотрите книжку про синтез ЭВМ, там «открываются бездны» :). Авторы рассматривают так называемые МДНФ и МКНФ (минимальные дизъюнктивные формы) критерием в которых служит именно длина выражения «в буквах». Понятно откуда это происходит — раньше «буква» — это был реальный проводок или радиолампа.
В PAL точно так же приходится экономить аппаратуру, поэтому теория снова актуальна.

А так, конечно, лучше уж взять какую-нибудь старенькую Altera EPM7064S/7032S. Программировать не сильно сложно, среда удобная, компилятор умный, ресурсов намного больше. Если вставить в панельку PLCC «ноги вниз» то и паять не сильно сложнее DIP. У меня была статья про MAX 7000
habr.com/ru/post/277947
))))))))

У меня хорошее советское техническое образование — я прекрасно понимаю о чём вы говорите ;)
Сравнивать в рамках данной статьи степени синтаксической «короткости» выражений ДНФ и КНФ применительно к аппаратной ДНФ-реализации GAL16V8 продолжаю считать излишним.

В статье просто проиллюстрирован пример, когда к минимизации ДНФ нужно подходить с обеих сторон.

Полагаю, что дублировать горы теоретических сведений в рамках одной статьи, уводя читателя от её сути — бессмысленно, если не вредно.

И да — Altera EPM7032/EPM7064 в PLCC-корпусах у меня есть. Так же, как и Xilinx XC9636/XC9572/XC95108.
А в DIP-ах есть и ATF750C и GAL18V10/GAL26CV12/GAL6001/GAL6002 ;)
Согласен. Есть такая специальная дисциплина — методология. Всегда надо вовремя остановиться, а то можно докатиться до разъяснений, что такое «0» и «1» :)

Вот тут образовалась дискуссия по теме:
www.phantom.sannata.org/viewtopic.php?f=20&t=38574
Показывает точку зрения «простого читателя».
Ага, спасибо!
CodeMaster: ИМХО, кто изучал всё это, знают и так, а кто нет, нужен бы какой-то более наглядный пример. Возможно, более простой, применительно конкретно к PAL/GAL, а не вообще про матлогику. Суть карты Карно я понял только на примере уже про семигментник. Суть ДНФ я так и не понял, подсознательно конечно понимаю, но мне интересен был бы какой-то пример «на пальцах».

Ну вот приблизительно с такой целью я свой «пример на пальцах» и делал. И когда обнаружил вашу статью, то обрадовался — получался хороший конкретный пример к хорошей ретроспективной статье. ;)

Как алаверды к этой ветке комментариев — цитата из поста KbRadar:
"Если необходимо получить минимальную ДНФ, то в Карте [Карно] рассматриваем только те клетки которые содержат единицы, если нужна КНФ, то рассматриваем те клетки которые содержат нули."
https://m.habr.com/ru/post/93296/, правда — без ссылок на литературу.

Можно подойти проще — покрасить клеточки таблицы и посмотреть. Если таблица «редкая» т.е. закрашенных клеточек («1») меньше — то оптимизируем как есть. Если таблица почти вся закрашена (много «1») — делаем инверсию таблицы и оптимизируем.

В полной карте 7SEG примерно на 70% больше единичек (на глаз), так что инверсия даст некоторую экономию. Что собственно автор статьи и сделал.
цитата из поста KbRadar: Если необходимо получить минимальную ДНФ, то в Карте [Карно] рассматриваем только те клетки которые содержат единицы

Вы, видимо, привыкли всем верить на слово)
Я статью эту делал в т.ч. и в качестве примера того, что слово «только» в приведенной вами цитате излишне категорично))

Эм-м-м… так я написал, что рекомендация не содержит ссылок на литературу. Или нет?

Своего личного отношения к приведённой вами цитате вы в явном виде не выразили, что и дало мне повод трактовать это как ваше с ней согласие.
Дополнил статью, спасибо за ссылку)
Хорошая тема для отдельной статьи.

ЕМНИП, дело в том, что XC9500 позволяет использовать комбинационную логику и выходной триггер по отдельности, а MAX7000 — только вместе.

И что 514ИД4? Определённо не вариант «пошёл и купил».
По функциям как уже прошитая К155РЕ3, только хуже:
— практически недоступна для приобретения любителями;
— неудобный для макетирования корпус;
— собственный ток потребления 60мА;
— рекомендовалось использовать с радиатором.

В её пользу можно отметить наличие входных триггеров-защёлок. Были бы эти микросхемы общедоступны и недороги — смогли бы сделать конкуренцию TIL311. Возможность подбора к ней индикатора на свой вкус было бы даже плюсом.
Забавные микрухи. Печально, что больше не выпускаются. Не смог найти их в магазинах, где обычно закупаюсь.

Чудной язык) Как отличаются входы от выходов при декларировании? Непонятно. habrastorage.org/getpro/habr/upload_files/be1/846/862/be18468625870f015d0c932338554fa0.jpg

С экономической точки зрения — то же самое можно было реализовать и на какой-нибудь ATTiny2313 (и тактовый генератор не потребовался бы). И я бы лучше держал горсть тинек…
Печально, что больше не выпускаются. Не смог найти их в магазинах, где обычно закупаюсь

В магазине под названием Aliexpress, в котором обычно закупаются множество людей, эти забавные микрухи есть в большом количестве (на слово «количество» надо тыкнуть мышой).
Что касается «больше не выпускаются», то это не так.

Чудной язык) Как отличаются входы от выходов при декларировании? Непонятно.

Синтаксически никак не отличаются. Компилятор сам понимает что является входом, что выходом, а что выходом-входом из (а) заявленной в начале микросхемы и режиме её работы «Device: G16V8AS» и (б) контекста, в котором используются выводы.
Синтаксис используемого в данном случае языка CUPL очень схож с синтаксисами других подобных языков — ABEL и PalAsm (тоже тыкабельно мышой).

С экономической точки зрения — то же самое можно было реализовать и на какой-нибудь ATTiny2313 (и тактовый генератор не потребовался бы). И я бы лучше держал горсть тинек…

Если мне сейчас надо что-то вывести на экранчик, скажем, SSD1306 из, к примеру, STM32, то мне уже не надо никаких «тинек». А в 80-х годах ещё не было никаких «тинек».
Речь-то о ретрокомпьютинге идёт. Какой вообще смысл прикручивать к Z80 тиньку?

А вообще-то, микросхемы PLD предназначены для использования там, где можно (и/или нужно) заменить несколько корпусов дискретной логики одной микросхемой PAL/GAL.
Задержка сигнала от входа до выхода составляет от 5-7 до 15-20 наносекунд. И куда тут с «горстью тинек»?

у GAL16 есть аналог - ATF16V8B, от старой доброй фирмы Atmel.

Судя по тому, что я вижу на сайте - они до сих пор выпускаются (Status: In Production.)

О, даже в наличии в магазине есть. Прикольно, спасибо)

Я конечно понимаю, писать коммент спустя почти три года, но всё-таки попробую.

Глядя на то, что в Segm_G есть ещё свободные термы и плюс есть один свободный вход — можно сделать функцию отображения прочерков.

Что-то вроде:
pin 11 = Dashes
Затем ко всем термам Segm_* кроме _G приписать & !Dashes, а в Segm_G добавить в конец:

# Dashes

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории