📅  最后修改于: 2023-12-03 15:39:13.413000             🧑  作者: Mango
在逻辑电路设计中,可以使用两种形式来描述电路的逻辑功能:标准式和正则式。其中,多数情况下,我们使用标准式来描述逻辑电路。但是,标准式使用起来比较麻烦,所以我们通常会将其转换为正则式。这里我们讲解一下怎样将 SOP 转换为 POS。
SOP 即“和积表达式”,它是由多个项按照或运算相加所得到的表达式。POS 即“或积表达式”,它是由多个项按照与运算相乘所得到的表达式。
例如,我们有如下 SOP 表达式:
f(a,b,c) = Σm(2,3,5,6)
我们的目标是将它转换为 POS 表达式,即:
f(a,b,c) = ΠM(0,1,4,7)
如何实现这个功能呢?我们可以依次进行如下步骤:
构造一个包含所有输入变量的真值表。
在真值表中标注出每一个 minterm 在输出中的取值。
根据 2 中的 minterm 和真值表,构造一个包含所有输入变量的表达式,并对它进行化简。
将化简后的表达式通过德摩根定理转换为 POS 表达式。
接下来,我们将详细介绍怎样实现这些步骤,具体的 Python 代码如下:
def sop_to_pos(sop_expression):
# 将 SOP 表达式转换为 minterm 列表
minterms = [int(m) for m in sop_expression.split('(')[-1].split(')')[0].split(',')]
# 每个输入变量的取值
inputs = sorted(list(set([int(i) for i in ''.join([c for c in sop_expression.split('=')[0] if c.isalpha()])])))
# 构造包含所有输入变量的真值表
truth_table = []
for i in range(2 ** len(inputs)):
row = [int(x) for x in list(format(i, f'0{len(inputs)}b'))]
row.append(int(i in minterms))
truth_table.append(row)
# 构造包含所有输入变量的表达式
pos_expression = ''
for m in minterms:
for i, t in enumerate(truth_table):
if t[-1] == 1 and i == m:
product_term = ''
for j in range(len(inputs)):
if t[j] == 0:
product_term += f'{chr(97 + j)}\''
else:
product_term += f'{chr(97 + j)}'
if pos_expression != '':
pos_expression += '+'
pos_expression += f'({product_term})'
# 化简表达式
simple_expression = simplify_logic(pos_expression)
# 将表达式进行 De Morgan 转换
pos_expression = demorgan(simple_expression).replace('(', '').replace(')', '')
return f'f({", ".join([chr(97 + i) for i in range(len(inputs))])}) = ΠM({", ".join([str(x) for x in [i for i, t in enumerate(truth_table) if t[-1] == 0]])})'
# 示例
print(sop_to_pos('f(a,b,c) = Σm(2,3,5,6)'))
# Output: f(a, b, c) = ΠM(0, 1, 4, 7)
以上是将 SOP 转换为 POS 的 Python 代码。它依次实现了如下几个步骤:
将 SOP 表达式转换为 minterm 列表。
这一步中,我们使用了字符串分割和列表生成式等技巧。
构造包含所有输入变量的真值表。
这一步中,我们使用了 Python 的二进制转换、列表生成式等技巧。
构造包含所有输入变量的表达式并进行化简。
这一步中,我们使用了 Python 的字符串处理和化简表达式方法。
将表达式进行 De Morgan 转换。
这一步中,我们使用了 simplify_logic
和 demorgan
等方法。
最终,我们将结果以 markdown 的形式输出。