对于给定的输出定义为四个变量u、v、w和z的函数f:
f(u,v,w,z) = ∑(0,1,2,3,6,7,8,9,10,13,15)
也可以用下面的真值表表示(其中 s 是卡诺图中当前状态和匹配单元格的索引,o 是输出值):
s | u v w z | o
----|---------|---
0 | 0 0 0 0 | 1
1 | 0 0 0 1 | 1
2 | 0 0 1 0 | 1
3 | 0 0 1 1 | 1
4 | 0 1 0 0 | 0
5 | 0 1 0 1 | 0
6 | 0 1 1 0 | 1
7 | 0 1 1 1 | 1
8 | 1 0 0 0 | 1
9 | 1 0 0 1 | 1
10 | 1 0 1 0 | 1
11 | 1 0 1 1 | 0
12 | 1 1 0 0 | 0
13 | 1 1 0 1 | 1
14 | 1 1 1 0 | 0
15 | 1 1 1 1 | 1
是你的答案:
f(u,v,w,z) = ¬u⋅v⋅w + u⋅¬v⋅¬w + u⋅v⋅z + u⋅¬v⋅¬z + ¬u⋅¬v
一个完全有效的布尔表达式等价于原始函数好吧,但是!
如果必须在逻辑电路设计中实现,您可能会考虑实际使用多少变量作为逻辑门的输入,每个变量有多少输入,或者所选类型的成本是多少,以及从时间点(以及可能的延迟和危险),金钱或表面上获取的逻辑门数量。某些给定变量甚至可能作为设计中使用的某些逻辑门的输入并不重要。
出于这个原因,您通常会尝试将表达式最小化为尽可能小的变量集群不影响所需的输出值。
最小化——无论是在minimal CNF还是minimal DNF中得到一个表达式——是通过在你的K-map中找到最大可能的组来完成的。
您不关心找到的组的轻微(不完全)重叠,因为组越大,您实际上可能需要包含在设计中的变量就越少。您只需要注意仅包含所需的最小值并覆盖所需的输出值,这样如果您必须删除其中一组,它会更改输出值 one/some/所有的州。
用简单的语言,我认为方法是:圈出所有 one,而不是单个 zero(zeros,但不是一个单独的 one)可以找到最大的 气泡,并且每个气泡都必须紧紧抓住其他任何气泡都无法拥有的东西并且还没有更好。
所以我认为,您的老师所说的“先四边形,然后再配对”的意思正是如此。
在下面的图片中(使用乳胶生成)您的解决方案旁边是等效的最小 DNF(~ 圈出了 ones)。
您还可以检查,通过将您的解插入在线工具 Wolfram Alpha 并检查它的 DNF 和 CNF,下一个方程是否有效。
¬u⋅v⋅w + u⋅¬v⋅¬w + u⋅v⋅z + u⋅¬v⋅¬z + ¬u⋅¬v = ¬u⋅w + ¬v⋅¬w + ¬v⋅¬z + u⋅v⋅z