Часть I Привет всем. Этим уроком я открываю цикл статей посвященных – логике, и самое главное логическим основам работы процессора. Вы поймете, как работает процессор на физическом и логическом уровнях. И возможно, захотите собрать эту не большую вещицу – своими руками! Но для начала нам нужно изучить формальную логику и начнем с основных логических операций: Всего может быть два возможных состояния – Сильный сигнал и Слабый, Истинна и Ложь, 1 и 0. Первая логическая операция. Логическое отрицание - ИНВЕРСИЯ - если исходное выражение истинно, то результат отрицания будет ложным, и наоборот, если исходное выражение ложно, то результат отрицания будет истинным. Например: A ____неА 1_____ 0 0_____1 С = A & B. Вторая логическая операция. Логическое умножение - КОНЪЮНКЦИЯ - это выражение будет истинно в одном случае, когда оба значения верны. Например, высказывание “Дождь будет утром и вечером”, верно только в одном случае если дождь будет и утром и вечером, а ложно, если дождь будет вечером, а утром не будет и наоборот. A & B = С 1__1= 1 1__0= 0 0__1= 0 0__0= 0 То есть Истинна и Истинна = Истинна Истинна и Ложь = Ложь Ложь и Истинна =Ложь Ложь и Ложь = Ложь Как и говорил, наше выражение будет истинным только в одном случае. Третья логическая операция. С = A + B Логическое сложение – ДИЗЪЮНКЦИЯ - это выражение будет истинно во всех случаях, кроме одного, когда оба значения ложны. Например, высказывание Дождь будет утром или вечером, означает следующее – Дождь будет только вечером, - Дождь будет только утром, - Дождь будет и утром и вечером. Но из-за характерных особенностей русского языка многие считают, что это высказывание означает, Дождь будет только вечером, либо Дождь будет только утром, а третьего в расчет не берут. A + B = С 1__1= 1 1__0= 1 0__1= 1 0__0= 0 То есть Истинна или Истинна = Истинна Истинна или Ложь = Истинна Ложь или Истинна = Истинна Ложь или Ложь = Ложь Как и говорил, наше выражение будет ложно только в одном случае. Четвертая логическая операция. Логическое следование: ИМПЛИКАЦИЯ - связывает два простых логических выражения, из которых первое является условием , а второе – следствием из условия. Это было научное определение так сказать, а сейчас объясню, что все это значит = короче представьте вам дали решить задачу, и условия к этой задачи тоже дали(исходные данные), вам осталась подумать над решением. Рассмотрим эту ситуацию: Вам дали правильные исходные данные к задаче – решали правильно, значит решили правильно(истинно). Вам дали правильные исходные данные к задаче – но решали не правильно, значит решили неправильно(ложь). Вам дали неправильные исходные данные к задаче – но решали вы все равно правильно(чудо), значит решили правильно(истинна). Вам дали неправильные исходные данные к задаче – решали неправильно, значит решили неправильно(истинна). Спросите почему Истинна? А как вы могли решить если исходные данные не верны, значит в итоге истинна. A B = С 1__1= 1 1__0 =0 0__1= 1 0__0= 1 Ложь тока в одном случае, когда думали не правильно. Пятая логическая операция. Логическая равнозначность: ЭКВИВАЛЕНТНОСТЬ - определяет результат сравнения двух простых логических выражений А и В. Результатом ЭКВИВАЛЕНТНОСТИ является новое логическое выражение, которое будет истинным тогда и только тогда, когда оба исходных выражения одновременно истинны или ложны. Короче истина ЭКВИВАЛЕНТНА истине. А ложь ЭКВИВАЛЕНТНА лжи. A B = С 1__1 = 1 1__0 = 0 0__1 = 0 0__0 =1 Э то основные логические операции, через них можно выразить все остальные. Хотя ели сказать по секрету, то основных операции всего три Логическое отрицание - ИНВЕРСИЯ Логическое умножение - КОНЪЮНКЦИЯ Логическое сложение – ДИЗЪЮНКЦИЯ Через них выражаются и ИМПЛИКАЦИЯ, и ЭКВИВАЛЕНЦИЯ и остальные. В последующих статьях мы это разберем - а пока усвойте этот материал. И если усвоите, то вы на шаг приблизитесь к пониманию работы процессора и всего остального. (c)Kerny
Часть II Привет всем – надеюсь вы хорошо усвоили материал прошлой статьи! сегодня мы изучим правила преобразования логических выражений…. Так для начала условимся – Логическое произведение (КОНЬЮНКЦИЯ) – записываем так A*B (логическое произведение А на В) или можно еще записывать так А&B. Логическое сложение (ДИЗЪЮНКЦИЯ) – записываем так А+В , можно еще записать по другому на клавиатура мне не позволяет…. Логическое отрицание (ИНВЕРСИЯ) – записывать будем, как неА. Закон непротиворечия Закон непротиворечия, означает следующее A не может быть равно своему отрицанию, неA *A=0 Например есть выражение A *неA+B, догадайтесь чему оно будет равно? Правильно A *неA+B=B. Закон исключения третьего Высказывание может быть либо истинным либо ложным, третьего не дано. Это означает, что результат логического сложения высказывания и его отрицания принимает значение истинна. А+неА=1 Да и незабываем , 1 - это истинна, 0 – это ложь. Что бы, было легче можно представлять , так «+», это «или», «*» - это «и», а инверсия – тут и так понятно…. Закон двойного отрицания Если выражение дважды отрицается, то в результате мы получим исходное высказывание. Например: ненеА=А Так же, как в Алгебре минус на минус - дает плюс. Закон тождества Всякое высказывание тождественно самому себе. Например А=А. Законы Моргана: Первый закон Де Моргана. не(А + В)= неА* неВ Отрицание выражения (А или В) равно неА и неБ, давайте проверим!? Для этого построим так называемую таблицу истинности: А______В_____неА____неВ__(А+В)__Не(А+В)___неА* неВ 0______0______1______1_____0______1_________1 0______1______1______0_____1______0_________0 1______0______0______1_____1______0_________0 1______1______0______0_____1______0_________0 Сначала, даем начальные значения А и Б, затем их инвертируем, после подвергаем значения А и В дизъюнкции (операция «или»), затем то, что получилось инвертируем и получаем – одну единицу и три нуля… Теперь берем значения неА и неВ и подвергаем коньюнкции(логическое умножение) и в результате получаем , единицу и три ноля… тоесть не(А + В)= неА* неВ, формула верна Второй закон Де Моргана. не(А*В)= неА + неВ А______В______неА___неВ__(А*В)___Не(А*В) ______неА+ неВ 0______0______ 1_____1______0______1_____________1 0______1______ 1_____0______0______1_____________1 1______0______ 0_____1______0______1_____________1 1______1______ 0_____0______1______0_____________0 Тоже самое здесь - формула верна. Мы сейчас строили таблицы истинности – вообще-то это проходится по информатике…. А теперь пару примеров: Не(А+В)*(А*неВ) Начнем, видим в первой части выражения не(А+В) – первый закон Де Моргана – преобразовываем: НеА*неВ*(А*неВ), раскроем скобки НеА*неВ*А*неВ, видим неА и А, - закон непротиворечия . Остается 0*НеВ*неВ Смотрим НеВ*неВ, ага это равно просто неВ, спросите почему? Допустим есть некое третье значение например, значение С. С*неВ*неВ=С*неВ, допустим С=0 А неВ равно 1, тогда 0*1*1=0, а это тоже самое что и 0*1. Вот и получается, что неВ*неВ, равно просто неВ. Так вернёмся к примеру: Получаем, 0*неВ=0, тут можно пойти двумя путями, первый я назвал его алгебраический – умножение на ноль всегда дает ноль, или второй логический: У нас операция конъюнкция(вспоминаем союз «и») а эта операция так сказать истинна только в одном случае, когда оба значения истинны, тоесть 1*1=1, смотрим на первый множитель нашего выражения он уже равен нолю… Значит чему бы небыло равно, значение неВ, хоть 1 хоть 0, всегда будет ложь(ноль). В принципе остальные примеры решаются также. Наверное, сейчас вы задаетесь мыслями, а зачем это? Хотел написать ответ в этой статье, но передумал, скажу лишь, что узнаете в последующих статьях. Это только начало! (c)Kerny
Часть III Привет всем! Итак, третья статья из цикла! Приступим! Помните, я вам говорил, что всего логических операции три, и что через них выражаются все остальные, так вот сегодня мы рассмотрим это. Значит, начнем с эквиваленции Как мы помним, она выглядит так A _________B ________С 1__________1________1 1__________0________0 0__________1________0 0__________0________1 Получается, что мы должны найти выражение, состоящее из простых логических операций (инверсия, конъюнкция, дизъюнкция), которое бы в результате давало см. таблицу. Ну что ж попробуем подобрать нужную нам формулу…. Будем брать тока первую строку из нашей таблицы: A _________B ________С 1__________1________1 Тоесть при значениях А=1, B=1, нужно получить значение С=1. В чем проблема? - спросите вы. Это же обычная конъюнкция 1*1=1, Да это конъюнкция, но она нам не подходит – не забываем, что мы должны решить задачу в общем виде – заменим выражение 1*1=1 формулой А*В=С, и попробуем, подставить другие значения например 0*0=0, и видим, что это не подходит т.к при эквиваленции 0*0=1, а теперь не большой секрет – то, что я только что вам втирал можно было опровергнуть иначе, просто подумав – это же одна логическая операция – конъюнкция, а конъюнкция не может быть равна эквиваленции, отсюда вывод в нашей формуле должно быть больше одной логической операции, и еще если вы хорошо усвоили предыдущий материал, то должны знать, что 1*1*1=1, тоже не подойдет, т. к после преобразования получиться 1*1=1, отсюда еще один вывод, наша формула не должна преобразовываться, найдем нашу формулу: Пробуем разные комбинации, ниже подставляем вместо букв значения и сравниваем их с таблицей эквиваленции … ________________ A*B+B=C 1*1+1=1 1*0+0=0 0*1+1=1 Уже не подходит. ____________________ A*B+А*B=C 1*1+1*1=1 1*0+1*0=0 0*0+0*0=0 не подходит ____________________ A*B+неА*неB=C 1*1+не1*не1=1 1*0+не1*не0=0 0*1+не0*не1=0 0*0+не0*не0=1 ____________________ Ура! Нашли нужную нам формулу! Итак, мы выяснили, что эквиваленцию можно выразить следующей формулой : A*B+неА*неB=C Импликацию мы не будем выражать, я показал вам лишь ход мыслей…. Формула импликации: неА+В A _________B ________С 1__________1________1 1__________0________0 0__________1________1 0__________0________1 А теперь, рассмотрим, как это все изображается – схемами. Люди знакомые с программированием знают, что алгоритм программы можно изображать в виде блок схем, так вот здесь это тоже имеет место быть…. И это называется это логическими схемами. Так как, основных логических операций всего три, то и логических элементов будет три… Смотрите рисунок: ____________________________ ____________________________ Итак, вы видите коньюнктор, у него всегда два входа и один выход, на вход подаются А и В (для отличия его от дизъюнктора добавляется символ & см. рисунок), в результате на выходе будет А*В, например: Подаются значения 1 и 0, в результате будет 0. Ниже дизъюнктор , у него всегда два входа и один выход, на вход подаются А и В (для отличия его от коньюнктора добавляется символ 1 см. рисунок), в результате на выходе будет А+В, например: Подаются значения 1 и 0, в результате будет 1. И последний элемент инвертор, у него один вход и один выход, если на вход подать 1 то результатом будет 0 и наоборот. Это так сказать промежуточная статья – так, что не ругайте…. Скоро будет еще интереснее. (c)Kerny
Часть IV Приступим, в предыдущей статье мы рассмотрели основные логические элементы, теперь разберемся с логическими схемами, попробуем построить схему для логического выражения B∙неА+неB∙A=C ______________________________ ______________________________ Надеюсь, принцип вы поняли. Теперь рассмотрим физическую реализацию логических элементов, Начнем с элемента “не”. ______________________________ ______________________________ Как видим на рисунке если подаем 0, то ничего не происходит…. Если 1, то канал закрывается и газ не проходит(может быть и жидкость). Надеюсь понятно. Логическое сложение: ______________________________ ______________________________ Как видим из рисунка, у нас получается: A _________B ________С 1__________1________0 1__________0________0 0__________1________0 0__________0________1 А, надо: A _________B ________С 1__________1________1 1__________0________1 0__________1________1 0__________0________0 Что ж - это не проблема, нам всего лишь нужно инвертировать полученный результат A _________B ________С________неС 1__________1________0________1 1__________0________0________1 0__________1________0________1 0__________0________1________0 А при физической реализации, добавить в схему инвертор. Логическое умножение: ______________________________ ______________________________ И тут тоже придется добавить инвертор. A _________B ________С________неС 1__________1________0________1 1__________0________1________0 0__________1________1________0 0__________0________1________0 Что ж вот основной принцип… А теперь займемся непосредственно формулами и логическими схемами, сегодня нам предстоит не много не мало, а придумать схему так называемого «полусумматора двоичных чисел», ведь мы знаем, что достаточно научить схему одному арифметическому действию – сложению, и получим какой ни какой, а процессор! Так, за помощь обратимся к двоичной системе счисления, попробуем сложить в двоичной системе, числа, имеется в виду не логическое сложение, а арифметическое. 1+1=10 1+0=1 0+1=1 0+0=0 Можете проверить с помощью калькулятора Windows. Что бы вам легче было понять, составим таблицу: (Арифметическое сложение, а не логическое, обратите внимание на знак «=», p s идут как одно число, это для того, что бы было видно разрядность числа ) A ____+____B ____=___P________S 1__________1________1________0 1__________0________0________1 0__________1________0________1 0__________0________0________0 A и В, числа которые складываем (в двоичной системе счисления), S – результат сложения (сумма), P – перенос из разряда, это нужно для случая 1+1=10, так как здесь, получается 10 (правильно говорить не десять, а один и ноль), то 1 пойдет в перенос (P) , а 0 в сумму (s), таким образом значение суммы(s) 0,1,1,0, значит мы должны найти такую формулу, при которой (Арифметическое сложение, а не логическое) A ____+____B _____=_____S 1__________1___________0 1__________0___________1 0__________1___________1 0__________0___________0 В одной из статей я показывал, как это делается – простым подбором. Вот искомая формула: S=(A+B)*не(A*B) Можете её проверить, вы это уже умеете. Для переноса (P) (Арифметическое сложение, а не логическое) A ____+____B _____=_____P 1__________1___________1 1__________0___________0 0__________1___________0 0__________0___________0 Тут и думать нечего, P=A*B, начертим логическую схему полусумматора двоичных чисел: ______________________________ ______________________________ Надеюсь, вы все поняли, в следующих статьях мы разберем, как данные логические схемы реализовывать радиотехнически, и тп. Если же здесь есть механик, то он может взять сварочный аппарат и сделать механический полусумматор двоичных чисел)) Желаю удачи! (c)Kerny
давайте начнем с таблицы умножения для целых чисел? сколько будет 45x69 если результат сохраняется в значении типа int?
VОт формул к процессору/@K Многоразрядный двоичный сумматор. Привет всем! Прошло около двух месяцев, после того, как я напечатал предыдущую статью, ну ничего, продолжим... Но в начале договоримся, т.к мы будем работать со системами счисления, то после чисел в двоичной системе я буду ставить букву "b", а после десятичных "d". В прошлой статье мы рассмотрели работу двоичного полусумматора, думаю самое время рассмотреть работу полного одноразрядного сумматора! Тоесть он будет считать числа только в пределах одного двоичного разряда: 1+1=10 1+0=1 0+1=1 0+0=0 Но тут вы можете возмутиться, и сказать,- "Ведь мы это рассматривали в предыдущей статье!" Да, действительно рассматривали. Так вот, идея состоит вот в следующем, нужно придумать два одноразрядных сумматора, которые при обьединение определенным образом, давали двуразрядный сумматор, а при объединение трех таких сумматоров, давали трехразрядный. Надеюсь все понимают что такое разрядность? Например число 777d: 777=7*10^2+7*10^1+7*10^0 3разрядно. Вот тоже самое число в двоичной: 1100001001b 1100001001b=1*2^9+1*2^8+0*2^7+0*2^6+0*2^7+0*2^6+1*2^5+0*2^4+0*2^3+1*2^2+1*2^1+1*2^0= =1*2^9+1*2^8+0+0+0+0+1*2^5+0+1*2^2+1*2^1+1*2^0=512+256+8+1=777d Число 9разрядно, тоесть получаем, Число 777d 3разрядно, а в двоичной системе 9разрядно 3*2=9 (2 - основание системы счисления) Тоесть чтобы складывать числа в пределах десяти(10d), нам нужен четырехразрядный сумматор (число 10d 2разрядно, значит 2*2=4), что значит в пределах десяти? Значит, что сумма A+B не должна превышать число 10d, или число 1010b. В прошлый раз мы рассмотрели такую ситуацию, для сумматора и нам удалось составить соответствующие формулы. A_+_B___=____P_S 0_+_0___=____0_0 0_+_1___=____0_1 1_+_0___=____0_1 1_+_1___=____1_0 Рассмотрим такой случай: 10b+1b=11b как мы это посчитали? сложили младший разряд первого числа + второе число (там 1разряд) 10b 01b 11b Тут все просто, а теперь давайте возьмем такой случай 11b+1b=100b 011b 001b 100b Суммируем, так берем младший разряд первого числа(1b), плюс второе число(1b) 1b+1b=10b, ноль пишем один в уме, поднимаемся на разряд, 1b+0b=1 Получаем 1b, но у нас еще 1b в уме, 1+1=10, снова ноль пишем 1b в уме, дальше разряды кончаются поэтому записываем единицу, в итоге получается:100b. Отсюда напрашивается один простой вывод, в наши старые формулы нужно добавить еще одну переменную, которая будет хранить перенос из младшего разряда в старший (то, что мы храним в уме), причем значение этого переноса может быть либо 0b либо 1b, назовем эту переменную p0, кто непомнит просто P - старший разряд. Нам нужно найти формулу при которой, будут выполняться следующее условие: A__+_B_____p0_____P______S 0__+_0_____1______0______1 0__+_1_____1______1______0 1__+_0_____1______1______0 1__+_1_____1______1______1 Заметьте, здесь перенос всегда активен (всегда равен 1b), например складываем 1b+0b, где - то в середине числа, и перенос из младшего разряда равен 1b(в предыдущем разряде скорее всего было суммирование 1b+1b или тоже был перенос из другого, более младшего разряда) Получается 1b+0b=1b да плюс перенос из младшего разряда 1b+1b=10b. 1__+_0_____1______1______0 Ну, что ж все вроде работает осталось найти формулу, благо все формулы уже найденны, и мы не будем заниматься нудной работой. P=(A*B)+(A*p0)+(B*p0) A____B_____p0____A*B_____A*p0___B*p0___(A*B)+(A*p0)_______P 0____0_____0______0________0______0__________0___________0 0____1_____0______0________0______0__________0___________0 1____0_____0______0________0______0__________0___________0 1____1_____0______1________0______0__________1___________1 ___________________При_ p0=1_______________________________ 0____0_____1______0________0______0__________0___________0 0____1_____1______0________0______1__________0___________1 1____0_____1______0________1______0__________1___________1 1____1_____1______1________1______1__________1___________1 S=(A+B+p0)*noP+(A*B*p0) A____B_____p0_____P_____A+B_____A+B+p0______noP___(A+B+p0)*noP_____A*B*p0_____S 0____0_____0______0______0________0____________1__________0____________0________0 0____1_____0______0______1________1____________1__________1____________0________1 1____0_____0______0______1________1____________1__________1____________0________1 1____1_____0______1______1________1____________0__________0____________0________0 ___________________________________При_ p0=1______________________________________ 0____0_____1______0______0________1____________1__________1____________0________1 0____1_____1______1______1________1____________0__________0____________0________0 1____0_____1______1______1________1____________0__________0____________0________0 1____1_____1______1______1________1____________0__________0____________1________1 Еще тут есть одно условие P, должно быть вычисленно раньше с S, так как noP (отрицание P учавствует во второй формуле), Думаю вам будет интересно взглянуть на логическую схему, логические элементы там изображены немного иначе, то там все обьяснено. Как вы поняли это схема все равно будет складывать числа в пределах 1разряда двоичного разряда. Нууу... скажете вы, и все это мы читали только ради этого? Нет, следующая схема суммирует числа в пределах 10d, 1010b, тоесть четырех разрядный сумматор. Итак, получаем следующий вывод, что любой многоразрядный сумматор можно сделать из нескольких одноразрядных, причем чем больше одноразрядных сумматоров обьединено, тем больше разрядность у сумматора. Продолжение следует.... (c)Kerny 22.01.09 18:41