所有接口都放在返回值中,所有电路都经过自己验证,可以放心扩展,注释少,适合有基础的人阅读。 如需扩展感知机,建议先阅读神经网络的深度学习。 对于时序逻辑电路,还需要考虑,也许等到寒假时间充裕的时候再模拟。 源代码如下: 验证部分无聊,没有技术,大部分已经删除,读者有兴趣可以一一验证。
#不要移动任何
基本感知机参数!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #!西邮物理系,庞某学物理,欢迎私信交流 #只做了一部分的扩展,请详细阅读并了解参数后再进行集成电路的扩展 #目前只支持非时序逻辑电路的模拟 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 = N