逻辑门电路
非门 | 与门 | 或门 | 异或门 |
---|---|---|---|
输入1时出0,输入0时出1 | 输入的数均为1时出1,其他情况出0 | 输入的数均为0时出0,其他情况出1 | 输入的数不同时出1,相同时出0 |
组合形式
一、
这是与非的组合形式,输入输出参考
1&0=0,0∘=1
二、
这是两与加一或加一非的组合形式,输入输出参考
1&0=0,1&1=1,0|1=1(在书面上用|表示或),1∘=0
判断输出是0还是1
各步骤的推导如下
1&0=0,0&0=0,0|1=1,1|0=1,1&1=1,1∘=0
最终为0.
非门 | 与门 | 或门 | 异或门 |
---|---|---|---|
L=AB | L=A+B |
组合形式
一、
这是一个与非门的组合,其结果如下
A&B=AB,AB∘=
,故L=
二、
这是两与加一或加一非的组合形式,其结果如下
A&B=AB,C&D=CD,AB|CD=AB+CD,(AB+CD)∘=
,故L=
写出函数表达式
其结果如下
A&B=AB,B&C=BC,C|D=C+D,AB∘=
,
|BC=
+BC,
+BC&C+D=(
+BC)(C+D),(
+BC)(C+D)∘=
,故L=
。
已知函数表达式为L=AB+BC+
,请画出逻辑图
由表达式可知,它的最终一定是通过了一个或门,故初始图如下
AB和BC都是与门,故添加两个与门
最后的
是一个先与后非的组合
由于上图多次出现A、B、C,则将其化简
化简逻辑表达式
卡诺图(Karnaugh Map)是逻辑函数的一种图形表示方法。它是一种平面方格图,主要用于化简布尔代数(逻辑代数)表达式。在数字电路设计中,它能够帮助工程师和设计者以直观的方式简化逻辑电路,减少电路中门电路的数量,从而降低成本、提高电路的可靠性和工作速度。
上图是一个卡诺图,在卡诺图中有一系列的0和1,具体是0是1是不确定的。我们需要根据这些0和1写成逻辑表达式。解题步骤如下
;若部分在,则啥都不写,最后将写出的结果相与。
这里8个连续的1是指诸如
,
,
,
,
2个连续的1是指
,
等等,
它这里上下或者左右的边也属于邻边。
在本题中存在8个连续的1
根据第(2)步,我们可以判断这8个连续的1
有部分在A区域
有部分在B区域
全在C区域
有部分在D区域
根据第(3)步,我们可以写出全在的区域代号
C
根据第(4)步,我们找不出8个连续的1,可以找出4个连续的1
对应4个区域分别为
A区域:全不在;B区域:部分在;C区域:部分在;D区域:全不在
根据第(3)步,可以写出全不在的代号并相与
现在我们找不到4个连续的1了,只能找出2个连续的1
对应4个区域分别为
A区域:全在;B区域:全在;C区域:部分在;D区域:全在
根据第(3)步,可以写出全在的代号并相与
ABD
根据第(5)步,则有
以上是16格的卡诺图,现在我们来看一下8格的卡诺图
8格卡诺图跟16格卡诺图最大的不同在于它只有A、B、C三个区域,没有D区域。
根据解题步骤,该图中找不到8个连续的1和4个连续的1,可以找出3组2个连续的1,第一组
A区域:部分在;B区域:全在;C区域:全在,可以写出全在的代号并相与
BC
第二组
A区域:全在;B区域:部分在;C区域:全在,可以写出全在的代号并相与
AC
第三组
A区域:全在;B区域:全在;C区域:部分在,可以写出全在的代号并相与
AB
则最终的逻辑表达式为
L=BC+AC+AB
将
画进卡诺图
将
画进卡诺图
解题步骤如下
第一步,之前我们知道卡诺图分为16格和8格的,8格的没有D区域,则在上式中有D,故可以肯定为16格卡诺图。
第二步,该表达式一共有5个部分,其中第一部分为AC,则我们需要在空白卡诺图中找出A区和C区
第三步,在重合区域标1
第四步,表达式的第二部分为
,
指除A区域以外的区域,
指除D区域以外的区域
在重复区域标1
表达式的第三部分为
在重复区域标1
表达式的第四部分为
在重复区域标1
表达式的第五部分为ABD
AB重合的部分为第三行
第三行与D重合的部分为第三行中间两格
在重复区域标1
第五步,在剩下的格标0
第一步,上式中没有D,故相应的卡诺图肯定为8格
第二步,该表达式一共有4个部分,其中第一部分为
,则我们需要在空白卡诺图中找出相应区域
重合的区域为第一行后两格
第一行后两格与C重合的区域为第一行第三格
第三步,在重复区域标1
第四步,表达式的第二部分为
,在重合区域标1(此处节省区域查找,以下同)
表达式第三部分为
,在重合区域标1
表达式第四部分为ABC,在重合区域标1
第五步,在剩下的格标0
用卡诺图化简逻辑表达式其实就是先将表达式画入卡诺图,再从卡诺图里提取新的逻辑表达式,如
将其画入卡诺图是这个样子的
再重新提取的逻辑表达式为L=BC+AC+AB
直接使用Python化简
from sympy import symbols, Not, And, Or, simplify_logic
# 定义逻辑变量
A, B, C = symbols('A B C')
# 定义原始逻辑表达式
original_expression = Or(
And(Not(A), B, C),
And(A, Not(B), C),
And(A, B, Not(C)),
And(A, B, C)
)
# 化简逻辑表达式
simplified_expression = simplify_logic(original_expression)
print(simplified_expression)
运行结果
(A & B) | (A & C) | (B & C)
化简
名称 | 公式1 | 公式2 |
---|---|---|
0-1律 | A⋅1=A | A+0=A |
A⋅0=0 | A+1=1 | |
互补律 | ||
重叠律 | AA=A | A+A=A |
交换律 | AB=BA | A+B=B+A |
结合律 | A(BC)=(AB)C | A+(B+C)=(A+B)+C |
分配律 | (A+B)C=AC+BC | AB+C=(A+C)(B+C) |
反演律 | ||
吸收律 | A(A+B)=A | A+AB=A |
对合律 |
根据上表,我们来化简
根据重叠律的公式2,有
+ABC+ABC
根据交换律的公式2和结合律的公式2,有
L=(
+ABC)+(
+ABC)+(
+ABC)
根据交换律的公式1,有
L=(
+ABC)+(
+BAC)+(
+CAB)
根据分配律的公式1,有
L=(
+A)BC+(
+B)AC+(
+C)AB
根据互补律的公式2,有
L=BC+AC+AB
已知
,求其反函数
解题步骤
第一步
L A ⋅ B +
⋅ A + C +
第二步
不变
第三步
⋅
+ C ⋅
+
+ D
第四步
⋅
+ C ⋅
第五步
组合逻辑电路的分析与设计
组合逻辑电路如图所示,分析该电路的逻辑功能
解题步骤
第一步
我们先把各个电路门的输出表达出来
则有L=AP+BP+CP
AP=A&P=A
BP=B&P=B
CP=C&P=C
第二步
根据反演律公式1,有
L=
+
+
根据分配律公式1,有
L=
+
+
根据互补律公式1,有
L=
我们也可以直接使用Pyton来化简
from sympy import symbols, Not, And, Or, simplify_logic
# 定义逻辑变量
A, B, C = symbols('A B C')
# 定义原始逻辑表达式
original_expression = Or(
And(A, Not(And(A, B, C))),
And(B, Not(And(A, B, C))),
And(C, Not(And(A, B, C)))
)
# 化简逻辑表达式
simplified_expression = simplify_logic(original_expression)
print(simplified_expression)
运行结果
(A & ~B) | (A & ~C) | (B & ~A) | (B & ~C) | (C & ~A) | (C & ~B)
第三步
A | B | C | L |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
0 | 1 | 1 | 1 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 0 |
A、B、C全为0,有
L=
=0⋅1+0⋅1+0⋅1+0⋅1+0⋅1+0⋅1=0
A、B为0,C为1,有
L=
=0⋅1+0⋅0+0⋅1+0⋅0+1⋅1+1⋅1=1 (这里是逻辑运算0|1|1=1,不是0+1+1=2)
A、B、C全为1,有
L=
=1⋅0+1⋅0+1⋅0+1⋅0+1⋅0+1⋅0=0
用Python来生成真值表
from sympy import symbols, Not, And, Or, simplify_logic, true, false
# 定义逻辑变量
A, B, C = symbols('A B C')
# 定义原始逻辑表达式
original_expression = Or(
And(A, Not(And(A, B, C))),
And(B, Not(And(A, B, C))),
And(C, Not(And(A, B, C)))
)
# 化简逻辑表达式
simplified_expression = simplify_logic(original_expression)
# 使用简化后的表达式生成真值表
truth_table = []
for a in [false, true]:
for b in [false, true]:
for c in [false, true]:
# 计算表达式的值
result = simplified_expression.subs({A: a, B: b, C: c})
# 转换布尔值到整数,True -> 1, False -> 0
result_int = int(bool(result))
a = int(bool(a))
b = int(bool(b))
c = int(bool(c))
truth_table.append([a, b, c, result_int])
# 打印真值表表头
print("A\tB\tC\tF")
for row in truth_table:
print(f"{row[0]}\t{row[1]}\t{row[2]}\t{row[3]}")
运行结果
A B C F
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 1
1 1 1 0
第四步
由真值表可知,当A、B、C不一致时,电路输出为"1",所以,这个电路为"不一致电路"。
根据真值表的不同一般分为三种电路,除了"不一致电路",还有以下两种电路。
A | B | C | L |
---|---|---|---|
0 | 0 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 0 |
1 | 1 | 1 | 1 |
这种称为"一致电路"
A | B | C | L |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
这种称为"少数服从多数电路"。
设计一个三人表决电路,结果按"少数服从多数"原则决定。
解题步骤
第一步
设三人依次为A、B、C,A、B、C三人均可选择"同意"与"不同意",选择"同意"则输入"1",选择“不同意”则输入"0"。
第二步
A | B | C | L |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
第三步
这里只看L为1的情况,根据四种情况,可以得到以下表达式
其中
表示0、1、1、1的情况,其他相同
第四步
化简后为L=AB+BC+AC
第五步
逻辑函数最小项
对于有n个变量的逻辑函数,最小项是包含全部n个变量的乘积项。在每个乘积项中,每个变量以原变量(如A)或反变量(如
)的形式出现一次,且仅出现一次。
例如,对于两个变量A和B,最小项有
这四个。对于三个变量A、B、C,最小项有
这八个。
把变量取值组合看成二进制数,原变量用1表示,反变量用0表示,这个二进制数对应的十进制数就是最小项的编号。
例如,对于三个变量的逻辑函数,\(m_1\)对应的变量取值组合是001,即
;\(m_2\)对应的是010,即
;\(m_3\)对应的是011,即
。
用卡诺图法将逻辑函数
变成最小项形式。
解题步骤
第一步
第二步
由于我们画出的图为16格卡诺图,故需要跟第一个图对比
图中的蓝格是我们自己画出的卡诺图中为1的位置。
故
的最小项为
\(=m_1+m_4+m_5+m_7+m_6+m_9\)
用卡诺图法将逻辑函数
变成最小项的形式
第一步
第二步
由于我们画出的图为8格卡诺图,故需要跟第二个图对比
故
的最小项为
\(=m_1+m_3+m_7+m_6\)
用公式法将逻辑函数
变成最小项的形式。
解题步骤
,令每一项都包含全部代码。
变成0。
根据第一步
因为AB中没有C,故将AB变为
=
因为
中没有B,故将
变为
=
则有
根据第二步
根据第三步
将ABC变成111,
变成110,
变成011,
变成001
根据第四步
111变成十进制为7,110变成十进制为6,011变成十进制为3,001变成十进制为1。
根据第五步
\(L=m_7+m_6+m_3+m_1\)
from sympy import symbols, And, Or, Not
from itertools import product
def get_minterms(expr, variables):
# 获取变量的数量
num_vars = len(variables)
# 初始化最小项列表
minterms = []
# 遍历所有可能的输入组合
for i, inputs in enumerate(product([False, True], repeat=num_vars)):
# 构造一个字典来赋值给符号变量
assignment = {var: val for var, val in zip(variables, inputs)}
# 检查当前输入组合是否使表达式为真
if expr.subs(assignment):
# 计算最小项的索引(直接使用 i)
minterms.append(f"m_{i}")
return sorted(minterms) # 按照最小项索引排序
if __name__ == '__main__':
# 定义符号变量
A, B, C, D = symbols('A B C D')
# 示例逻辑表达式 AB + ~AC
# expr = Or(And(A, B), And(Not(A), C))
expr = Or(And(Not(A), B), And(Not(B), Not(C), D))
print("原始表达式:", expr)
# 获取最小项列表
minterms_list = get_minterms(expr, [A, B, C, D])
print("最小项列表形式:", " + ".join(minterms_list))
运行结果
原始表达式: (B & ~A) | (D & ~B & ~C)
最小项列表形式: m_1 + m_4 + m_5 + m_6 + m_7 + m_9
from sympy import symbols, And, Or, Not
from itertools import product
def get_minterms(expr, variables):
# 获取变量的数量
num_vars = len(variables)
# 初始化最小项列表
minterms = []
# 遍历所有可能的输入组合
for i, inputs in enumerate(product([False, True], repeat=num_vars)):
# 构造一个字典来赋值给符号变量
assignment = {var: val for var, val in zip(variables, inputs)}
# 检查当前输入组合是否使表达式为真
if expr.subs(assignment):
# 计算最小项的索引(直接使用 i)
minterms.append(f"m_{i}")
return sorted(minterms) # 按照最小项索引排序
if __name__ == '__main__':
# 定义符号变量
A, B, C = symbols('A B C')
# 示例逻辑表达式 AB + ~AC
expr = Or(And(A, B), And(Not(A), C))
# expr = Or(And(Not(A), B), And(Not(B), Not(C), D))
print("原始表达式:", expr)
# 获取最小项列表
minterms_list = get_minterms(expr, [A, B, C])
print("最小项列表形式:", " + ".join(minterms_list))
运行结果
原始表达式: (A & B) | (C & ~A)
最小项列表形式: m_1 + m_3 + m_6 + m_7
将\(L(A,B,C)=m_7+m_6+m_3+m_1\)化成变量的形式,解题步骤
,是1则变成A。
,是1则变成B。
,是1则变成C。
,是1则变成D。
第一步,7 6 3 1
第二步,L(A,B,C)是3输入,则以上四个数字变成二进制为
111 110 011 001
第三步,上面四个二进制数可转化为
则
\(L(A,B,C)=m_7+m_6+m_3+m_1\)=
第四步,最终化简结果为
=
将\(L(A,B,C,D)=m_1+m_4+m_5+m_6+m_7+m_9\)化成变量的形式
第一步,1 4 5 6 7 9
第二步,L(A,B,C,D)是4输入,则以上六个数字变成二进制为
0001 0100 0101 0110 0111 1001
第三步,上面六个二进制数可转化为
则
\(L(A,B,C,D)=m_1+m_4+m_5+m_6+m_7+m_9\)=
第四步,最终化简结果为
=
python代码
from sympy import symbols, And, Or, Not, simplify, to_dnf
def minterm_to_expr(minterm, variables):
"""
将最小项转换成逻辑表达式。
:param minterm: 最小项字符串,例如 "m_5"
:param variables: 变量列表,例如 [A, B, C, D]
:return: 逻辑表达式
"""
index = int(minterm[2:]) # 去掉 "m_" 前缀
and_terms = []
# 遍历所有变量,根据最小项索引构造与项
for i, var in enumerate(reversed(variables)): # 注意这里我们反转了变量列表以匹配二进制位序
if (index >> i) & 1:
and_terms.append(var)
else:
and_terms.append(Not(var))
return And(*and_terms)
def minterms_to_expr(minterms, variables):
"""
将最小项列表转换成逻辑表达式,并化简为DNF形式。
:param minterms: 最小项列表,例如 ["m_0", "m_3"]
:param variables: 变量列表,例如 [A, B, C, D]
:return: 化简后的逻辑表达式,以DNF形式
"""
expr_parts = [minterm_to_expr(minterm, variables) for minterm in minterms]
expr = Or(*expr_parts)
simplified_expr = simplify(expr)
dnf_expr = to_dnf(simplified_expr, simplify=True) # 确保使用DNF并尝试简化
return dnf_expr
if __name__ == '__main__':
# 定义符号变量
A, B, C = symbols('A B C')
# 示例最小项列表
minterms_list = ["m_1", "m_3", "m_6", "m_7"]
# 获取并打印化简后的逻辑表达式,以DNF形式
dnf_expr = minterms_to_expr(minterms_list, [A, B, C])
print("化简后的逻辑表达式(DNF形式):", dnf_expr)
运行结果
化简后的逻辑表达式(DNF形式): (A & B) | (C & ~A)
from sympy import symbols, And, Or, Not, simplify, to_dnf
def minterm_to_expr(minterm, variables):
"""
将最小项转换成逻辑表达式。
:param minterm: 最小项字符串,例如 "m_5"
:param variables: 变量列表,例如 [A, B, C, D]
:return: 逻辑表达式
"""
index = int(minterm[2:]) # 去掉 "m_" 前缀
and_terms = []
# 遍历所有变量,根据最小项索引构造与项
for i, var in enumerate(reversed(variables)): # 注意这里我们反转了变量列表以匹配二进制位序
if (index >> i) & 1:
and_terms.append(var)
else:
and_terms.append(Not(var))
return And(*and_terms)
def minterms_to_expr(minterms, variables):
"""
将最小项列表转换成逻辑表达式,并化简为DNF形式。
:param minterms: 最小项列表,例如 ["m_0", "m_3"]
:param variables: 变量列表,例如 [A, B, C, D]
:return: 化简后的逻辑表达式,以DNF形式
"""
expr_parts = [minterm_to_expr(minterm, variables) for minterm in minterms]
expr = Or(*expr_parts)
simplified_expr = simplify(expr)
dnf_expr = to_dnf(simplified_expr, simplify=True) # 确保使用DNF并尝试简化
return dnf_expr
if __name__ == '__main__':
# 定义符号变量
A, B, C, D = symbols('A B C D')
# 示例最小项列表
minterms_list = ["m_1", "m_4", "m_5", "m_6", "m_7", "m_9"]
# 获取并打印化简后的逻辑表达式,以DNF形式
dnf_expr = minterms_to_expr(minterms_list, [A, B, C, D])
print("化简后的逻辑表达式(DNF形式):", dnf_expr)
运行结果
化简后的逻辑表达式(DNF形式): (B & ~A) | (D & ~B & ~C)
将\(L(A,B,C,D)=\sum{m(1,4,5,6,7,9)}+\sum{d(10,11,12,13,14,15)}\)用卡诺图化简,解题步骤
第一步,由于L(A,B,C,D)是4输入,故我们要对应于
m后面的数字是1,4,5,6,7,9,故将卡诺图中相应位置上的数字变为1
d后面的数字为10,11,12,13,14,15,故将卡诺图中相应位置上的数字变为X
剩下的数字都变成0
第二步,找出8个1(X可以当成1用)
次时为B
找出4个1
此时为
故最终答案为
使用译码器和门电路实现逻辑函数
这是一个译码器74138,它是一个集成电路,内部逻辑图如下
它有16个引脚
其中\(V_{CC}\)表示电源(正),GND表示接地;\(A_0,A_1,A_2\)为二进制信号输入端;\(E_1,E_2,E_3\)(或者第一幅图中的\(G_1,G_{2A},G_{2B}\))为选通端,又叫做使能输入;\(Y_0\)到\(Y_7\)为输出端。74138 的基本功能是根据输入的二进制代码选择一个特定的输出。比如\(A_0A_1A_2=000\)时,只有\(Y_0\)输出低电平,其他都是高电平。\(A_0A_1A_2=010\)时,只有\(Y_2\)输出低电平,其他都是高电平。要使得这一功能得以实现,\(E_2\)(或\(G_{2A}\))和\(E_3\)(或\(G_{2B}\))必须为低电平,\(E_1\)(或\(G_1\))必须为高电平。
这里的高低电平是数字电路中表示二进制信息(即逻辑状态)的一种物理方式,它们直接与数字信号的概念相关联。在数字电子学中,所有的数据和指令最终都以二进制的形式存在,而高低电平则是用来区分这两种基本状态(0 和 1)的电压水平。
引脚(Pin)是集成电路(IC)或其他电子组件上用于电气连接的物理接口。每个引脚都是一个金属触点,通常排列在器件的边缘或底部,通过焊接到印刷电路板(PCB)上的相应焊盘来建立电气连接。引脚的主要功能是提供输入、输出以及电源和接地等必要的信号通路。
引脚的基本概念
引脚的分类
根据引脚的功能,它们可以分为几大类:
引脚编号与布局
实际应用中的引脚
在实际应用中,引脚的选择和使用非常重要。例如:
解题步骤
,
变成Y
第一步
第二步,由于L=AB+BC+AC有A、B、C三个输入量,故
第三步,\(L=AB+BC+AC=m_3+m_5+m_6+m_7\)
第四步,\(m_3+m_5+m_6+m_7\)=
第五步,
=
第六步,最终画线为
写出下列接线图中L的逻辑函数表达式
解题步骤
的情况,根据下列公式化简
第一步,
第二步,
第三步
\(=m_3+m_5+m_6+m_7\)
第四步,第五步
\(m_3+m_5+m_6+m_7=AB+BC+AC\)
这里我们以LED灯为例,我们的目标是点亮开发板上的LED灯。
原理图分析
上图是一个原理图,其中右边的绿色部件就是LED灯,三角形的左部为正极,右部的箭头为负极,绿色的斜线表示是一个发光二级管。当LED灯两边有电压时,该灯就会亮。这里我们可以看到,所有的LED灯经过了一个电阻(RLED)后接地(GND),表示二极管右方的电压为0V。