Арифметическая булева алгебра с несколькими входами - PullRequest
0 голосов
/ 06 сентября 2018

Я работал с полубайтовым регистром с четырьмя полубайтами W, X, Y и Z; для семисегментного светодиодного дисплея, который я пытаюсь воспроизвести в CSS ... Естественно, все кусочки получат 0 или 1 импульс; и затем я обрабатываю каждый из импульсов с помощью булевых уравнений, которые у меня есть, что затем приводит к включению (1) или выключению (0) каждого сегмента на основе результата, полученного из каждого из семи уравнений ...

Я обнаружил, что могу облегчить эту задачу для себя, преобразовав каждое булево уравнение в математическое уравнение, используя следующие эквиваленты (ссылка: https://en.wikipedia.org/wiki/Boolean_algebra#Basic_operations)

A AND B = A * B
A OR B = A + B - (A * B)
NOT A = 1 - A

где A и B могут равняться только 0 или 1 ... Этот процесс достаточно прост при работе с двумя входами ... но что делать с четырьмя входами, такими как W, X, Y и Z?

Например, мое логическое уравнение для сегмента A (верхняя часть светодиодного дисплея):

(W AND NOT(X) AND NOT(Y)) OR (W AND NOT(Z)) OR (NOT(W) AND X AND Z) OR (NOT(W) AND Y) OR (X AND Y) OR (NOT(X) AND NOT(Z))

, где W - самый старший бит, а Z - младший бит ... Каковы правила работы с несколькими входами в этом случае? Может кто-нибудь подсказать мне, как поступить?

Заранее спасибо ...

1 Ответ

0 голосов
/ 07 сентября 2018

Я как бы ломал голову, пытаясь найти способ сделать это ... Представления AND в булевых уравнениях были достаточно легкими, как и представления NOT, но процессы OR убивали меня ...

Сначала я не осознавал, что эти булевы уравнения могут быть решены, чтобы исключить ссылки ИЛИ на формат, который было легче перевести арифметически ...

Процесс

  1. Мы берем наше логическое уравнение: (w AND NOT(x) AND NOT(y)) OR (w AND NOT(z)) OR (NOT(w) AND x AND z) OR (NOT(w) AND y) OR (x AND y) OR (NOT(x) AND NOT(z))
  2. Затем мы вставляем его в движок WolframAlpha.com ... Я не осознавал, пока не проверил, что WolframAlpha способен переписывать логические уравнения ... И он также мог переписывать их с уважение только к воротам AND и NOT ... В результате мое уравнение было переписано как ¬(w ∧ x ∧ ¬y ∧ z) ∧ ¬(w ∧ ¬x ∧ y ∧ z) ∧ ¬(¬w ∧ x ∧ ¬y ∧ ¬z) ∧ ¬(¬w ∧ ¬x ∧ ¬y ∧ z)
  3. Теперь, когда мое булево уравнение было переписано относительно логических элементов И, а НЕ, я преобразовал символы обратно в английские эквиваленты, чтобы у меня не было мигрени, читающей его: NOT(w AND x AND NOT(y) AND z) AND NOT(w AND NOT(x) AND y AND z) AND NOT(NOT(w) AND x AND NOT(y) AND NOT(z)) AND NOT(NOT(w) AND NOT(x) AND NOT(y) AND z)
  4. Теперь, используя арифметические правила, о которых я упоминал в своем первоначальном посте, выписал арифметический эквивалент:

(1-(w*x*(1-y)*z))*(1-(w*(1-x)*y*z))*(1-((1-w)*x*(1-y)*(1-z)))*(1-((1-w)*(1-x)*(1-y)*z)) 5. Затем я сунул это обратно в WolframAlpha и стал ждать ...

То, что получилось, было немного ... неожиданно:

enter image description here

Я знал, что это займет некоторое время, чтобы упростить ...

К счастью, у WolframAlpha есть возможность экспортировать определенные ответы в простой текст ... Я воспользовался этим, скопировал и вставил его в текстовый редактор ...

x^4y^4z^4w^4-2x^3y^4z^4w^4+x^2y^4z^4w^4-3x^4y^3z^4w^4+6x^3y^3z^4w^4
-3x^2y^3z^4w^4+3x^4y^2z^4w^4-6x^3y^2z^4w^4+3x^2y^2z^4w^4-x^4yz^4w^4
+2x^3yz^4w^4-x^2yz^4w^4-x^4y^4z^3w^4+2x^3y^4z^3w^4-x^2y^4z^3w^4
+3x^4y^3z^3w^4-6x^3y^3z^3w^4+3x^2y^3z^3w^4-3x^4y^2z^3w^4+6x^3y^2z^3w^4
-3x^2y^2z^3w^4+x^4yz^3w^4-2x^3yz^3w^4+x^2yz^3w^4-2x^4y^4z^4w^3+4x^3y^4z^4w^3
-2x^2y^4z^4w^3+6x^4y^3z^4w^3-12x^3y^3z^4w^3+6x^2y^3z^4w^3-6x^4y^2z^4w^3
+12x^3y^2z^4w^3-6x^2y^2z^4w^3+2x^4yz^4w^3-4x^3yz^4w^3+2x^2yz^4w^3+2x^4y^4z^3w^3
-4x^3y^4z^3w^3+2x^2y^4z^3w^3-x^3z^3w^3-6x^4y^3z^3w^3+16x^3y^3z^3w^3
-12x^2y^3z^3w^3+2xy^3z^3w^3+x^2z^3w^3+6x^4y^2z^3w^3-21x^3y^2z^3w^3
+19x^2y^2z^3w^3-4xy^2z^3w^3-2x^4yz^3w^3+10x^3yz^3w^3-10x^2yz^3w^3+2xyz^3w^3
+x^3z^2w^3-3x^3y^3z^2w^3+4x^2y^3z^2w^3-xy^3z^2w^3-x^2z^2w^3+7x^3y^2z^2w^3
-9x^2y^2z^2w^3+2xy^2z^2w^3-5x^3yz^2w^3+6x^2yz^2w^3-xyz^2w^3+x^4y^4z^4w^2
-2x^3y^4z^4w^2+x^2y^4z^4w^2-3x^4y^3z^4w^2+6x^3y^3z^4w^2-3x^2y^3z^4w^2
+3x^4y^2z^4w^2-6x^3y^2z^4w^2+3x^2y^2z^4w^2-x^4yz^4w^2+2x^3yz^4w^2-x^2yz^4w^2
-x^4y^4z^3w^2+2x^3y^4z^3w^2-x^2y^4z^3w^2+2x^3z^3w^2+3x^4y^3z^3w^2
-12x^3y^3z^3w^2+12x^2y^3z^3w^2-3xy^3z^3w^2-2x^2z^3w^2-3x^4y^2z^3w^2
+20x^3y^2z^3w^2-23x^2y^2z^3w^2+6xy^2z^3w^2+x^4yz^3w^2-12x^3yz^3w^2
+14x^2yz^3w^2-3xyz^3w^2-2x^3z^2w^2+5x^3y^3z^2w^2-7x^2y^3z^2w^2+2xy^3z^2w^2
+5x^2z^2w^2-12x^3y^2z^2w^2+22x^2y^2z^2w^2-10xy^2z^2w^2+y^2z^2w^2-2xz^2w^2
+9x^3yz^2w^2-20x^2yz^2w^2+10xyz^2w^2-yz^2w^2-2x^2zw^2-3x^2y^2zw^2+2xy^2zw^2
+xzw^2+5x^2yzw^2-3xyzw^2-x^3z^3w+2x^3y^3z^3w-3x^2y^3z^3w+xy^3z^3w+x^2z^3w
-5x^3y^2z^3w+7x^2y^2z^3w-2xy^2z^3w+4x^3yz^3w-5x^2yz^3w+xyz^3w+x^3z^2w
-2x^3y^3z^2w+3x^2y^3z^2w-xy^3z^2w-5x^2z^2w+5x^3y^2z^2w-13x^2y^2z^2w
+8xy^2z^2w-y^2z^2w+3xz^2w-4x^3yz^2w+15x^2yz^2w-10xyz^2w+yz^2w+xw-xyw
+3x^2zw+4x^2y^2zw-3xy^2zw-5xzw-7x^2yzw+9xyzw-2yzw+zw+x^2z^2+x^2y^2z^2
-xy^2z^2-xz^2-2x^2yz^2+2xyz^2-x+xy-x^2z-x^2y^2z+xy^2z+3xz+2x^2yz-4xyz+yz-z+1

Упрощать это на лету было бы болезненно ... и тогда мне пришло в голову, что есть способ значительно уменьшить это, особенно учитывая, что я сейчас имею дело с квартичным полиномом.

  1. Поскольку w, x, y и z были по существу импульсами со значением 0 или 1, w^4 или x^3 или y^2 и т. Д. собирались сводиться к w, x, y или z; просто потому что 1^n = 1 и 0^n = 0 для n>0; так проще говоря ...

enter image description here

Несколько глобальных замен позже, это "уменьшило" мое уравнение до следующего:

xyzw-2xyzw+xyzw-3xyzw+6xyzw-3xyzw+3xyzw-6xyzw+3xyzw-xyzw+2xyzw-xyzw-xyzw+2xyzw
-xyzw+3xyzw-6xyzw+3xyzw-3xyzw+6xyzw-3xyzw+xyzw-2xyzw+xyzw-2xyzw+4xyzw-2xyzw
+6xyzw-12xyzw+6xyzw-6xyzw+12xyzw-6xyzw+2xyzw-4xyzw+2xyzw+2xyzw-4xyzw+2xyzw-xzw
-6xyzw+16xyzw-12xyzw+2xyzw+xzw+6xyzw-21xyzw+19xyzw-4xyzw-2xyzw+10xyzw-10xyzw
+2xyzw+xzw-3xyzw+4xyzw-xyzw-xzw+7xyzw-9xyzw+2xyzw-5xyzw+6xyzw-xyzw+xyzw-2xyzw
+xyzw-3xyzw+6xyzw-3xyzw+3xyzw-6xyzw+3xyzw-xyzw+2xyzw-xyzw-xyzw+2xyzw-xyzw+2xzw
+3xyzw-12xyzw+12xyzw-3xyzw-2xzw-3xyzw+20xyzw-23xyzw+6xyzw+xyzw-12xyzw+14xyzw
-3xyzw-2xzw+5xyzw-7xyzw+2xyzw+5xzw-12xyzw+22xyzw-10xyzw+yzw-2xzw+9xyzw-20xyzw
+10xyzw-yzw-2xzw-3xyzw+2xyzw+xzw+5xyzw-3xyzw-xzw+2xyzw-3xyzw+xyzw+xzw-5xyzw
+7xyzw-2xyzw+4xyzw-5xyzw+xyzw+xzw-2xyzw+3xyzw-xyzw-5xzw+5xyzw-13xyzw+8xyzw
-yzw+3xzw-4xyzw+15xyzw-10xyzw+yzw+xw-xyw+3xzw+4xyzw-3xyzw-5xzw-7xyzw+9xyzw
-2yzw+zw+xz+xyz-xyz-xz-2xyz+2xyz-x+xy-xz-xyz+xyz+3xz+2xyz-4xyz+yz-z+1
  1. Наконец, после переписывания терминов обратно в алфавитном порядке, я разбил уравнение на более мелкие части, которые можно было бы ввести в WolframAlpha, чтобы получить упрощенные фрагменты, которые были в основном склеены обратно вместе ... В конце концов мой арифметический эквивалент (w AND NOT(x) AND NOT(y)) OR (w AND NOT(z)) OR (NOT(w) AND x AND z) OR (NOT(w) AND y) OR (x AND y) OR (NOT(x) AND NOT(z)) привело к 4wxyz-wxy-3wxz+wx-2wyz+wz-2xyz+xy+2xz-x+yz-z+1; который, когда я проверил его по моей исходной таблице истинности для сегмента А, добавив значения 0 или 1 для шестнадцати различных возможностей от 0000 до 1111, дал точные результаты, которые я определил ...

Теперь мне просто нужно повторить этот процесс с другими шестью сегментами ... [вздох]

Надеюсь, это поможет кому-нибудь еще, если подумать о математическом сокращении булевого уравнения ...

...