logic_functions (Лабы)
Описание файла
Файл "logic_functions" внутри архива находится в папке "Лабы". PDF-файл из архива "Лабы", который расположен в категории "". Всё это находится в предмете "схемотехника" из 2 семестр, которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Простейшие логические функцииИтак, мы выяснили, что логические сигналы объединяются друг с другом при помощилогических функций. На самом деле, я уже упоминал это в статье про ПЛИС о том, чтовсё делается совершенно аналогично программированию. Давайте глянем ещё раз:Провод = Переменная типа BOOLЛогическая функция = Функция языка, применимая к переменным типа BOOLПоэтому ничего не боимся и читаем совершенно спокойно. Ничего нового небудет, будет просто чуть другое представление уже известного.
Но всё-таки я буду даватьчуть более расширенные пояснения, чем просто аналогичные функции языка Си.Элемент ИЛИИтак, начнём с элемента ИЛИ. Он эквивалентен оператору «||» языка Cи. Навыходе элемента ИЛИ будет логическая единица в случае, если хотя бы на одном входеимеется логическая единица. Если на всех входах логические нули – на выходе будеттакже логический ноль. При работе с логическими элементами, принято пользоватьсятаблицами истинности. Не будем нарушать это правило, и нарисуем несколько такихтаблиц.
Функция ИЛИ с двумя входами называется 2ИЛИ и описывается таблицейистинности:X10011X20101Y0111Страшно? По-моему, нет Давайте для пущей храбрости нарисуем таблицуистинности для функции 3ИЛИX100001111X200110011X301010101Y01111111Чтобы суть элемента ИЛИ лучше запомнилась, давайте рассмотрим аналогию:Охранные системы. Какой бы из датчиков (датчиков движения, пожарных датчиков,прочих датчиков) ни сработал бы, всё равно надо поднимать шум и будить охранника. Вотэто как раз и выполняется по правилам функции ИЛИ.
Количество входов – столько,сколько датчиков. Выход – один. Собственно, в функциях языка C выход тоже один, и онназывается результатом функции.А как такие функции обозначаются на схемах? По ГОСТ – так:1112ИЛИ3ИЛИ4ИЛИПо стандарту ANSI – примерно так (извините за корявость, но я не рисую по ANSI,но на схемах могут встречаться, не надо пугаться):2ИЛИ3ИЛИВходы ВСЕГДА рисуют слева, выходы – справа. Некоторые считают, что иногдабудет красивее нарисовать наоборот, входы справа, выход – слева (это если разъёмы накартинке так расположены). Так вот.
Это неправильно. Без этого ВСЕГДА можно красивообойтись, если чуть-чуть подумать (равно как в языке Си можно обойтись без меток).Элемент ИЭлемент И эквивалентен оператору «&&» языка Си. То есть, на выходе будетлогическая единица тогда и только тогда, когда на ВСЕХ входах имеется логическаяединица. Нарисуем таблицы истинности для элементов 2И и 3ИX10011X20101Y0001X100001111X200110011X301010101Y00000001Жизненная аналогия – поезд.
Пока проводники всех вагонов не дадут добро,машинист не начнёт движение состава.Теперь обозначение по ГОСТ:&&&2И3И4ИНу, и в меру корявое обозначение по ANSI:3И2ИЭлемент НЕА вот с элементом НЕ мы уже познакомились ранее. Его аналог на Си: «!», таблицаистинности у него проста до ужаса:X101Y10Обозначение же у него такое (признак инверсии – кружочек, он нам ещё много гдевстретится):1ГОСТANSIКомбинированные функцииВообще, перечень функций при классическом подходе жёстко лимитирован тем,что продаётся в магазине. Какие бывают типы микросхем – смотрим в справочниках (вдоинтернетовское время – страшный дефицит, обладание справочником Шило было чемто вроде… Вроде… Вроде обладания футболкой «АстроСофт», не всем это было подсилу).
Если мы откроем справочник, то увидим элементы 2И, 3И, 4И, 8И, 2ИЛИ, 4ИЛИ,8ИЛИ… А также всякие там 2И-НЕ, 4ИЛИ-НЕ и т.п. Что это такое? Это чтобы намсэкономить число микросхем на плате, сделали микросхемы, где объединены двефункции. Какая-либо с функцией НЕ.Все уже догадались, как работают подобные функции, но традиции требуют привеститаблицы истинности. Без них при описании логических функций никуда. Поэтомуприведём парочку:Для функции 2И-НЕ таблица истинности будет такая:X10011X20101Y1110А, скажем, для 3ИЛИ-НЕ – такая:X100001111X200110011X301010101Y10000000В обозначении же, просто добавляется уже знакомый нам кружок:1&3ИЛИ-НЕ2И-НЕТеорема Де МорганаПосле того, как лекторы рассказывают о функциях 2что_нибудь-НЕ, они всегдарассказывают и теорему Де Моргана.
Давайте не будем нарушать традиций, тем более,что она поможет нам закрепить навыки работы с таблицами истинности, а эти навыки намещё пригодятся.Классическая запись теоремы выглядит так:X1 &X2=X1 |Y2Где надчёркивание – это обозначение инверсииНА языке Си это будет выглядеть так:!((!x1) && (!x2)) == (x1 || x2);А в виде схемы – так:1&11Давайте докажем эту теорему. Построим таблицу истинности для левой части:100111010&11101&110&110110&11101Итого получаем:X10011X20101Y0111Ну, а таблицу для правой части мы уже строили, она точно такая же, что и требовалосьдоказать.Это правило было чрезвычайно важно при работе с классическими микросхемами, когданарисуешь простыню и думаешь: «Мам моя, где ж я столько накуплю».
И вдруг видишь,что если здесь добавить инвертор (который случайно остался в составе неполностьюиспользуемой микросхемы), то можно поменять тип элемента и выкинуть целуюмикросхему (у меня реально были такие ситуации). Во времена ПЛИС, за нас всё этосделает оптимизатор, но доказывая теорему, мы попрактиковались с построением таблицистинности, уже хлеб.
А на закуску, предлагаю вам самостоятельно доказать вторуютеорему Де Моргана, которая на языке Си записывается так: !((!x1) || (!x2)) == (x1 && x2);Практический пример – кодовый замокКлассическая реализацияНу что. И напоследок разбавим наше сухое повествование каким-нибудь примером,который использовал бы описанные логические элементы. В ЦО раньше на дверях былмеханический кодовый замок, в Новгородском филиале такие до сих пор используются.Там надо нажать сразу несколько кнопок, тогда он откроется.
Если хоть одна кнопканеверна, он не откроется. Давайте сделаем такой же, но электронный.Сначала я спроектирую его в таком базисе, какой можно сделать на реально имеющихсямикросхемах.Пусть наш замок открывается, если одновременно нажаты кнопки 2, 4, 6 и 8. Я не будурассуждать о том, как правильно выбирать логические элементы по справочнику (почему– объясню в следующем разделе), я просто выберу их на основании своего опыта.Что такое замок? Это функция, на входе которой имеется десять переменных типа BOOL– b0, b1, b2, …, b9. Каждая переменная равна 0 (FALSE), если кнопка не нажата и 1(TRUE), если нажата.
И из функции есть выход, который содержит 0, если комбинация неверна и 1 – если верна. С точки зрения электроники, если на выходе появилась единица, тосработал электромагнит и всё нам открыл.Сначала запишем это на привычном нам языке Си:BOOL lock (BOOL b0,BOOL b1, BOOL b2, BOOL b3,…, BOOL b9){// Если нажаты правильные кнопкиBOOL right = b2 && b4 && b6 && b8;// Если нажата хоть одна неправильная кнопкаBOOL wrong = b0 || b1 || b3 || B5 || b7 || b9;return (right && (!wrong));}Вроде так? А теперь барабанная дробь, рисуем то же самое в виде схемы иудивляемся, насколько всё аналогично…b0b1b3b5b7b91&b2b4b6b8OUTИ, собственно, всё. Кнопки я не нарисовал для простоты… А так – схема готова.Если уж кто хочет совсем реальную схему, то она будет выглядеть так:«Правильные»«Неправильные»кнопкикнопкиVcc1&OUTНа реальной схеме мы видим два отличия от прошлой.
Во-первых, почему-тофункции стали восьмивходовыми. Всё просто – в реальной жизни не выпускаетсямикросхем 6ИЛИ-НЕ и 5И. Поэтому пришлось взять такие, какие выпускаются, а вселишние выводы соединить так, чтобы не мешались. Ну, и резисторы. Помните смывнойбачок? Я его во всех лекциях буду вспоминать, очень полезная штука.
Эти резисторыобеспечивают подтяжку входов к общему проводу. В общем, если заряд случайно откудато взялся – он стечёт в канализацию. Но если кнопка нажата – логическая единицапобедит, так как кнопка – это широкая труба, а резистор – всё-таки тонкая трубочка. Нокогда кнопку отпустят – остатки заряда вновь стекут через резистор, и на линии сновавоцарится логический ноль…Реализация на базе ПЛИСУра! Ура! Теперь я с чистой совестью могу повторить один из аргументов, которыеприводил в статье про ПЛИС, но на этот раз те, кто читал статьи внимательно, уже всёпоймут.
Итак. Давайте запишем функцию замка на языке Си чуть иначе:BOOL lock (BOOL b0,BOOL b1, BOOL b2, BOOL b3,…, BOOL b9){return (!b0) && (!b1) && (b2) && (!b3) && (b4) && (!b5) && (b6) && (!b7) && (b8)&& (!b9);}Имеем право? Не вижу причин, почему нет. То есть, мы в самой функции указали,какие кнопки правильные, а какие – нет. Зарисуем это в виде схемыb0b1b2b3b4b5b6b7b8b9&OUTБудет работать такая схема? Если мы построим таблицы истинности для прошлой идля этой, то они совпадут. Значит будет. А почему мы сразу не нарисовали её? А потомучто максимальная микросхема, какая бывает – это 8И. 10 входов пришлось быкаскадировать, а ещё и входные инверторы пришлось бы брать внешние – уже тримикросхемы (против двух в прошлой схеме) и три шага обработки (а значит – низкоебыстродействие).
В общем, при классическом подходе – неприемлемо… Но то приклассическом.Откройте статью про ПЛИС и посмотрите структуру простейшей ПЛМ. Что мывидим? Правильно, опциональные инверторы на входе, потом – элемент И (скажу, чтодаже в самой вшивой ПЛМ он 16-входовой). То есть, мы реализуем наш замоквоспользовавшись одним элементом ПЛМ. А этих элементов там много. Так что ещё иостанется.
Я молчу про CPLD, где их ещё больше!Что же до FPGA, то я тоже уже говорил, там компилятор рассчитывает таблицуистинности функций и кладёт её в ОЗУшки. Так что там всё тоже получится просто исимпатично. И займёт это – хорошо если 1% от ёмкости, а то и меньше.Вот и получается, что в классическом случае, нам пришлось подгонять логикуработы замка под имеющуюся комплектацию (хорошо, если она есть в магазине, а топотом ещё переделывать придётся), затем – купить эти две микросхемы (а у микросхемболее 70% стоимости составляет корпус, так что чем их больше, тем дороже, ПЛИСможет оказаться дешевле этой парочки), затем – как-то разместить их на плате и развестисвязи между ними… А в случае с ПЛИС, мы взяли самую понятную для нас функцию, авсё остальное за нас сделал компилятор.
И не просто поместил всё в одну микросхему, аещё и оставил в ней место для других функций. Как говорится, почувствуйте разницу. Изабудьте о классическом подходе, как о страшном сне.Функции для обработки данных (из которых потом соберём процессор )рассмотрим чуть позже, а пока давайте изучим такую полезную вещь, как триггер. Носделаем мы это уже в следующей лекции..