所有接口都已放在返回值中,所有电路都已经过本人验证,可以放心扩展使用,注释较少,适合有基础的人群阅读。
如果必须要对感知机进行扩展,建议先行阅读神经网络的深度学习。 对于时序逻辑电路,还需要思考,可能等寒假时间宽裕时再进行模拟。 源代码如下:
验证部分比较无聊,且没有技术可言,大部分都已删去,读者有兴趣可以一一进行验证。
#勿动基础感知机任何参数!!!
#!西邮物理系,学物理的庞某人,欢迎私信交流
#只做了一部分的扩展,请详细阅读并了解参数后再进行集成电路的扩展
#目前来看,仅支持非时序逻辑电路的模拟
import numpy as np
import time
#与门
def And(x,y,z=1,zx=1,zy=1,zz=1):
x1 = np.array([x,y,z,zx,zy,zz])
x2 = np.array([0.5,0.5,0.5,0.5,0.5,0.5])
b = -2.7
tmp = np.sum(x1 *x2) + b
if tmp <= 0:
return 0
else:
return 1
#或门
def Or(x,y,z=0,zx=0,zy=0,zz=0,zzx=0,zzy=0,zzz=0):
x1 = np.array([x,y,z,zx,zy,zz,zzx,zzy,zzz])
x2 = np.array([0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5])
b = -0.2
tmp = np.sum(x1 * x2)
if tmp <=0:
return 0
else:
return 1
#与非
def Notand(x,y,z=1,zx=1,zy=1):
x1 = np.array([x,y,z,zx,zy])
x2 = np.array([-0.5,-0.5,-0.5,-0.5,-0.5])
b = 2.2
tmp = np.sum(x1 * x2) + b
if tmp <= 0:
return 0
else:
return 1
#或非门
def Notor(x,y,z=0,zx=0,zy=0):
x1 = np.array([x,y,z,zx,zy])
x2 = np.array([-0.5,-0.5,-0.5,-0.5,-0.5])
b = 0.4
tmp = np.sum(x1 * x2) + b
if tmp <=0:
return 0
else :
return 1
#同或门
def tonghuo(x,y):
x01 = Notand(x,1)
x02 = Notand(y,1)
x1 = And(x01,x02)
x2 = And(x,y)
return Or(x1,x2)
#异或门
def yihuo(x,y):
s1 = Notand(x,y)
s2 = Or(x,y)
return And(s1,s2) #两层感知机实现异或门
#理论分析知:基本与非门可以实现无限深层,以获得复杂计算机。
#非门
def Not(x):
x1 = Notand(x,1)
return x1
#一位全加器,已验证
def allsum_1(a,b,ci):
s1 = yihuo(a,b)
s2 = Notand(s1,ci)
s3 = Notand(a,b)
f = yihuo(s1,ci)
co = Notand(s2,s3)
return co,f
#四位逐位进位加法器,二进制,已验证
def allsum_4(b3,b2,b1,b0,a3,a2,a1,a0):
ci_0 = 0
ci_1 = allsum_1(a0,b0,ci_0)[0]
ci_2 = allsum_1(a1,b1,ci_1)[0]
ci_3 = allsum_1(a2,b2,ci_2)[0]
f0 = allsum_1(a0,b0,ci_0)[1]
f1 = allsum_1(a1,b1,ci_1)[1]
f2 = allsum_1(a2,b2,ci_2)[1]
f3 = allsum_1(a3,b3,ci_3)[1]
return f3,f2,f1,f0
#四位超前进位全加器
def allsum_4_front(b3,b2,b1,b0,a3,a2,a1,a0,ci_0=0):
s1 = Notand(b3,a3)
s2 = Notor(b3,a3)
s3 = Notand(b2,a2)
s4 = Notor(b2,a2)
s5 = Notand(b1,a1)
s6 = Notor(b1,a1)
s7 = Notand(b0,a0)
s8 = Notor(b0,a0)
s9 = Not(ci_0)
#进位输出
s21 = s2
s22 = And(s4,s1)
s23 = And(s6,s1,s3)
s24 = And(s8,s1,s3,s5)
s25 = And(s1,s3,s5,s7,s9)
co4 = Notor(s21,s22,s23,s24,s25)#进位输出
#f4最高位输出
s26 = And(s1,Not(s2))
s27 = s4
s28 = And(s6,s3)
s29 = And(s8,s3,s5)
s210 = And(s3,s5,s7,s9)
s31 = Notor(s27,s28,s29,s210)
f4 = yihuo(s26,s31)#最高位输出
#f3输出
s211 = And(s3,Not(s4))
s212 = s6
s213 = And(s8,s2)
s214 = And(s5,s7,s9)
s32 = Notor(s212,s213,s214)
f3 = yihuo(s211,s32)
#f2输出
s215 = And(s5,Not(s6))
s216 = s8
s217 = And(s7,s9)
s33 = Notor(s216,s217)
f2 = yihuo(s215,s33)
#f1输出
s218 = And(s7,Not(s8))
s219 = Not(s9)
f1 = yihuo(s218,s219)
return co4,f4,f3,f2,f1
#优先编码器|||8线-3线,已验证
def code_front(x0,x1,x2,x3,x4,x5,x6,x7,st=0):
m = Not(st)
ys = Or(Not(x0),Not(x1),Not(x2),Not(x3),Not(x4),Not(x5),Not(x6),Not(x7),Not(m))
yex = Notand(ys,m)
#!y0输出
s1 = And(Not(x1),x2,x4,x6,m)
s2 = And(Not(x3),x4,x6,m)
s3 = And(Not(x5),x6,m)
s4 = And(Not(x7),m)
y0 = Notor(s1,s2,s3,s4)
#!y1输出
s5 = And(Not(x2),x4,x5,m)
s6 = And(Not(x3),x5,x4,m)
s7 = And(Not(x6),m)
s8 = And(Not(x7),m)
y1 = Notor(s5,s6,s7,s8)
#!y2输出
s9 = And(Not(x4),m)
s10 = And(Not(x5),m)
s11 = And(Not(x6),m)
s12 = And(Not(x7),m)
y2 = Notor(s9,s10,s11,s12)
return y2,y1,y0,yex,ys
#8线-3线扩展为16线-4线优先编码器,已验证
def code_front_expand(a0,a1,a2,a3,a4,a5,a6,a7,b0,b1,b2,b3,b4,b5,b6,b7,st=0):
st1 = code_front(b0,b1,b2,b3,b4,b5,b6,b7,st)[4]
y10 = code_front(a0,a1,a2,a3,a4,a5,a6,a7,st1)[2]
y11 = code_front(a0,a1,a2,a3,a4,a5,a6,a7,st1)[1]
y12 = code_front(a0,a1,a2,a3,a4,a5,a6,a7,st1)[0]
y20 = code_front(b0,b1,b2,b3,b4,b5,b6,b7,st)[2]
y21 = code_front(b0,b1,b2,b3,b4,b5,b6,b7,st)[1]
y22 = code_front(b0,b1,b2,b3,b4,b5,b6,b7,st)[0]
yex1 = code_front(a0,a1,a2,a3,a4,a5,a6,a7,st1)[3]
yex2 = code_front(b0,b1,b2,b3,b4,b5,b6,b7,st)[3]
y0 = And(y10,y20)
y1 = And(y11,y21)
y2 = And(y12,y22)
y3 = code_front(b0,b1,b2,b3,b4,b5,b6,b7,st)[3]
yex = And(yex1,yex2)
ys = code_front(a0,a1,a2,a3,a4,a5,a6,a7,st1)[4]
return y3,y2,y1,y0,yex,ys
#2线-4线译码器,已验证
def uncode_2_4(x,y,st=0):
xx = Not(x)
yy = Not(y)
sst = Not(st)
y0 = Notand(xx,yy,sst)
y1 = Notand(sst,xx,y)
y2 = Notand(sst,yy,x)
y3 = Notand(sst,x,y)
return y3,y2,y1,y0
#2-4线扩展为3-8线译码器,已验证
def uncode_3_8(x,y,z):
y0 = uncode_2_4(y,z,x)[3]
y1 = uncode_2_4(y,z,x)[2]
y2 = uncode_2_4(y,z,x)[1]
y3 = uncode_2_4(y,z,x)[0]
y4 = uncode_2_4(y,z,Not(x))[3]
y5 = uncode_2_4(y,z,Not(x))[2]
y6 = uncode_2_4(y,z,Not(x))[1]
y7 = uncode_2_4(y,z,Not(x))[0]
return y7,y6,y5,y4,y3,y2,y1,y0
#七段数字显像管,2进制→10进制的转换,已验证
def screen_uncode(x3,x2,x1,x0,RBI=1,LT=1,BIoRBO=1):
#显像管(简易版)
#显像管a
ya1 = Not(And(x3,x1))
ya2 = Not(And(x2,Not(x0)))
ya3 = Not(And(Not(x3),Not(x2),Not(x1),x0))
y1 = And(ya1,ya2,ya3)
#显像管b
yb1 = Not(And(x3,x1))
yb2 = Not(And(x2,Not(x1),x0))
yb3 = Not(And(x2,x1,Not(x0)))
y2 = And(yb1,yb2,yb3)
#显像管c
yc1 = Not(And(x3,x2))
yc2 = Not(And(Not(x2),x1,Not(x0)))
y3 = And(yc1,yc2)
#显像管d
yd1 = Not(And(Not(x2),Not(x1),x0))
yd2 = Not(And(x2,Not(x1),Not(x0)))
yd3 = Not(And(x2,x1,x0))
y4 = And(yd1,yd2,yd3)
#显像管e
ye1 = Not(And(x2,Not(x1)))
ye2 = Not(x0)
y5 = And(ye1,ye2)
#显像管f
yf1 = Not(And(x1,x0))
yf2 = Not(And(Not(x2),x1))
yf3 = Not(And(Not(x3),Not(x2),x0))
y6 = And(yf1,yf2,yf3)
#显像管g
yg1 = Not(And(Not(x3),Not(x2),Not(x1)))
yg2 = Not(And(x2,x1,x0))
y7 = And(yg1,yg2)
ai = " ——"
gi = " ——"
di = " ——"
ei = "|"
fi = "|"
bi = " |"
ci = " |"
mi =" "
AX = [ai,bi,ci,di,ei,fi,gi]
A = [ai,bi,ci,di,ei,fi,gi]
Y = [y1,y2,y3,y4,y5,y6,y7]
for i in range(len(Y)):
if Y[i] != 0:
A[i] = AX[i]
else:
A[i] = mi
print(f"{A[0]}\n{A[5]}{A[1]}\n{A[6]}\n{A[4]}{A[2]}\n{A[3]}\n")
'''
#对显像管的验证,仅实现0--9,若需再次验证,请去掉注释符
for i in range(2):
for j in range(2):
for k in range(2):
for z in range(2):
screen_uncode(i,j,k,z)
'''
#1位二进制数值比较器,已验证
def compare_1(x,y):
s = Notand(x,y)
fh = And(x,s)
fl = And(y,s)
fs = Notor(fh,fl)
print("F(x>y),F(x=y),F(x<y)")
return fh,fs,fl
#4位二进制数值比较器
#其中h,l,s分别位级联输入端
def compare_4(a3,a2,a1,a0,b3,b2,b1,b0,h=0,l=0,s=1):
#第一层门电路结构
s3 = Notand(a3,b3)
s2 = Notand(a2,b2)
s1 = Notand(a1,b1)
s0 = Notand(a0,b0)
#第二层门电路结构
p3 = Notor(And(a3,s3),And(s3,b3))
p2 = Notor(And(a2,s2),And(s2,b2))
p1 = Notor(And(a1,s1),And(s1,b1))
p0 = Notor(And(a0,s0),And(s0,b0))
#第三层门电路结构
#A>B:
p4 = Notand(b3,s3)
p5 = Notand(b2,s2,p3)
p6 = Notand(b1,s1,p3,p2)
p7 = Notand(b0,s0,p3,p2,p1)
p8 = Notand(p3,p2,p1,p0,l)
p9 = Notand(p3,p2,p1,p0,s)
Fh = And(p4,p5,p6,p7,p8,p9)
#A=B:
Fs = And(p3,p2,p1,p0,s)
#A<B:
p10 = Notand(p3,p2,p1,p0,s)
p11 = Notand(p3,p2,p1,p0,h)
p12 = Notand(p1,p2,p3,s0,b1)
p13 = Notand(p2,p3,s1,a1)
p14 = Notand(p3,s2,a2)
p15 = Notand(s3,a3)
Fl = And(p10,p11,p12,p13,p14,p15)
return Fh,Fl,Fs
#对比较器的验证,判断不会发生错误
'''
for i in range(2):
for j in range(2):
print(i,j,compare_4(1,i,1,1,1,j,1,1))'''
如有错误与疑问,大胆交流,小心求证。若有引用,还请备注出处。