《数字逻辑设计与计算机组成》一 2.5 逻辑化简算法

简介: 本节书摘来自华章出版社《数字逻辑设计与计算机组成》一 书中的第2章,第2.5节,作者:[美]尼克罗斯·法拉菲,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.5 逻辑化简算法

K图化简是一种图形的方式,只能适用于很小数目的变量,例如4个变量的表达式中。当变量数大于4时,在20世纪50年代中期发明的叫作奎因-麦克拉斯基算法的数学方式更合适于表达式化简。这个算法使用比K图更少的步骤来寻找最小逻辑表达式。最小项被划分成不同的集合,每一个集合都只包含一个在二进制表达中有特殊个1的个数的最小项。考虑例2-5中的表达式f (w, x, y, z) = Σ (0, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13)。在二进制中,最小项为0000, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1010, 1100和1101。这些最小项可以分组成下列4个集合:
image

每一次比较一对最小项,集合1中的一个最小项与集合2中的一个最小项比较。在每一对最小项比较中,一位数字的改变意味着一个蕴含。改变位可以用一条横杠(-)表示,从而省略对应的变量。
例如,集合1中的最小项0000与集合2中的0010比较,可以生成蕴含00 - 0,变量y被省略。最小项0000可以再与最小项0100比较,生成蕴含0 - 00,变量x被省略,等等。这个过程(每一次比较一对最小项)可以用于所有最小项。集合2和集合3,集合3和集合4可以生成用于结果的一个蕴含的集合。初始集合1到集合4标记为表2-4列Ⅰ中的Ⅰ.1到Ⅰ.4。
使用集合Ⅰ.1到Ⅰ.4生成的蕴含列表标记为集合Ⅱ.1到Ⅱ.3,写在表2-4的列Ⅱ中。接下来,对于集合Ⅰ.1到Ⅰ.4中的最小项,如果在列Ⅱ的最小项可以生成一个蕴含,就用一个“x”标记;否则,就用星号(*)标记,识别出一个素蕴含(在这个例子中没有)。当列Ⅱ中的蕴含生成之后,重复之前的步骤;每一次比较一对集合Ⅱ.1和集合Ⅱ.2中的一对蕴含。在这个例子中,在每一对蕴含之间的横杠必须排列起来。
例如,集合Ⅱ.1中的蕴含00 - 0与集合Ⅱ.2中的蕴含10 - 0比较。生成的蕴含写在表中的列Ⅲ下的集合Ⅲ.1和Ⅲ.2。同样,如果列Ⅱ中的蕴含对生成的不是素蕴含,用“x”标记;否则,用星号()标记,在这个例子中没有素蕴含。这个过程在列Ⅲ中重复一次,但是这次,没有更多的步骤可以走了,因为集合Ⅲ.1和集合Ⅲ.2中的蕴含一一比较之后,不能再生成新的蕴含;这样,所有从集合Ⅲ.2和集合Ⅲ.3中产生的蕴含都标记为星号(),与其对应的逻辑项在图2-17中列出。
image
image

程序的下一步是要在素蕴含列表a到f用一个最小集合算法来选择基本蕴含。图2-17是素蕴含和它们对应最小项的组织图。如果一个素蕴含包含一个最小项,则在方格中用“x”标记。例如,有两个横杠的素蕴含0 -- 0包含了最小项0 = (0000)2,2 = (0010)2,4 = (0100)2和6 = (0110)2,这些最小项方格中在行1中标记为“x”,如表格所示。
image

最小集合算法也是一个迭代的过程,最开始在任意列中选择只有一个有“x”标记的素蕴含,这样可以生成一个EPI。在这个例子中,最小项3、10和13相关的列中只有一个“x”标记;这些类似的例子在表格中用粗体和下划线表示出来。
假设在表2-5中从左往右处理最小项。在迭代1中,最小项3相关的列只包含一个“x”,这样对应的素蕴含0 - 1 -可以作为一个EPI,因为其只包含最小项3。它也可以包含最小项2、3、6和7,这样相关的列和行被标记为删除(D),如表格中所示。这个过程可以有效地消掉下一个迭代中表格的规模。在迭代2中,素蕴含- 0 - 0在最小项10相关的列中只有一个“x”标记,我们选择其为下一个EPI。这样,列0、8和10,行2标记为D。最后,在迭代3中,与最小项13相关的素蕴含- 10 -,被选作为下一个EPI,这样则需要删掉表中所有的剩余列,以及EPI = - 10 -对应的行。
image

当所有与最小项有关的列都删除之后,算法结束。在这个例子中,经过三轮迭代后算法结束,并产生三个EPI,- 0 - 0、0 - 1 -和- 10 -,“迭代”部分对应的行标记为D。EPI生成了最小SOP表达式,在例2-6中,我们使用K图的方法也得到了这个表达式。
如果在最小集合算法过程中,没有发现有一列只有一个“x”标记,以下的规则可以用来选择下一个候选的素蕴含:
1)找到至少有一个“x”标记的列,然后选择其对应的素蕴含作为候选项。
2)在第1)步素蕴含列表中选择那些在剩下的最多最小项的素蕴含(不包括有D标记的列)。
3)如果在第2)步中得到多个素蕴含,选择那个包含横杠最多的素蕴含;其对应的逻辑项应该包含较少变量。
4)如果在第3)步中得到多个素蕴含,则可得到两个或以上的等价最小表达式。
除了在表2-4和表2-5中需要用最大项来替换最小项求最小POS表达式的算法过程也是相似的。
如果一个逻辑电路有多个输出,每个输出的最小表达式通常不会独立地确定。相反,此时化简的目标是选择在不同表达式之间相同的素蕴含,从而可以减少实现多个表达式电路中所需的逻辑门数目。一些逻辑门的输出信号可以被共享和连接为其他逻辑门的输入。Espresso优化软件[1]可以解决需要同时化简多个逻辑表达式的情况。逻辑设计的CAD工具通常包含这个软件和其他化简软件。
化简软件
例2-9展示了用函数f (w, x, y, z) = Σ (0, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13)最小项来进行Espresso操作的输入和输出文件。第一列中的点(•)代表一个参数。例如,“.i 4”表示输入的个数,在这个例子中为4,“.o 1”表示输出的位数,这个例子中为1。标记“.ilb w x y z”列出输入的变量,这个例子中为4个变量;“.ob f”列出输出变量,在这个例子中为1个变量;“.e”表示输入文件的结尾。符号“#”表示一行注释。在输出文件中,“.p”表示EPI的数目。
例2-9 用Espresso化简函数f (w, x, y, z) = Σ (0, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13)。
解:
a)输入文件
image

b)输出文件:所有注释行首先打印
image

输出文件列出了3个EPI:- 10 -、- 0 - 0和0 - 1 -。这3个EPI与之前手工步骤求出的相同,在表2-4和表2-5中列出。
下列的Espresso输出列出了两个输出信号f和g的EPI。“11”、“11”和“10”打印在EPI之后,这三个EPI都是属于输出信号f的,而前两个(- 10 -和-0 - 0)是共享的并属于输出变量g。
image

表2-6展示了表达式f (w, x, y, z) = Σ (1, 9, 14) + Σd (3, 7, 11),运用化简算法后的结果,这个表达式也在2.4.2小节中化简过。在列Ⅰ中,每一个无关项都标记为“d”。之前讨论过的化简算法也是一样的,只是在一对最小项中只能有一个无关项;两个无关项不能进行比较。例如,集合Ⅰ.2中最小项(0011)2和集合Ⅰ.3中的最小项(0111)2,两个都为无关项,不能进行比较来产生素蕴含0 - 11。
算法产生三个素蕴含(以星号为标记),每一个在一行中。表2-7是表2-6运用最小集合算法之后的素蕴含组织表。集合Ⅰ.3素蕴含(1110)2是一个EPI。在剩下的两个素蕴含- 0 - 1和- 001中都包含最小项1和9,由于- 0 - 1有比- 001更多的横杠,所以选择- 0 - 1。这些EPI也可以在例2-10中用Espresso算法实现,输入文件中的横杠(-)代表无关的候选项。
image

image

例2-10 用Espresso算法化简f (w, x, y, z) = Σ (1, 9, 14) + Σd (3, 7, 11)。
(a)输入文件
image
image

(b)输出文件
image

相关文章
|
23天前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
32 9
|
2月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【8月更文挑战第2天】决策树算法以其直观性和解释性在机器学习领域中独具魅力,尤其擅长处理非线性关系。相较于复杂模型,决策树通过简单的分支逻辑实现数据分类,易于理解和应用。本示例通过Python的scikit-learn库演示了使用决策树对鸢尾花数据集进行分类的过程,并计算了预测准确性。虽然决策树优势明显,但也存在过拟合等问题。即便如此,无论是初学者还是专家都能借助决策树的力量提升数据分析能力。
35 4
|
3月前
|
算法 搜索推荐 测试技术
python中算法逻辑错误(Logic Errors)
【7月更文挑战第18天】
76 2
|
3月前
|
算法 PHP
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
26 1
|
3月前
|
人工智能 算法
代码库经过神经算法提纯可以做人工智能的逻辑工具
代码库经过神经算法提纯可以做人工智能的逻辑工具
|
5月前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
78 0
|
5月前
|
人工智能 算法
【算法】深入理解 Prolog:逻辑编程的奇妙世界
【算法】深入理解 Prolog:逻辑编程的奇妙世界
125 0
|
机器学习/深度学习 传感器 算法
【航迹】基于MN逻辑算法实现航迹关联和卡尔曼滤波外推附matlab代码
【航迹】基于MN逻辑算法实现航迹关联和卡尔曼滤波外推附matlab代码
|
12月前
|
存储 算法 C语言
《信任的进化》游戏简易版逻辑算法的实现(C语言)
《信任的进化》游戏简易版逻辑算法的实现(C语言)
|
12月前
|
算法
增强能力:提升专业知识、熟练职业技能、持续总结面试题、英语词汇、学习数据结构和算法(提升逻辑思维)
增强能力:提升专业知识、熟练职业技能、持续总结面试题、英语词汇、学习数据结构和算法(提升逻辑思维)
下一篇
无影云桌面