资讯详情

基于Python人工神经网络基本感知机对部分中小规模非时序逻辑集成电路的构造与验证

所有接口都放在返回值中,所有电路都经过自己验证,可以放心扩展,注释少,适合有基础的人阅读。 如需扩展感知机,建议先阅读神经网络的深度学习。 对于时序逻辑电路,还需要考虑,也许等到寒假时间充裕的时候再模拟。 源代码如下: 验证部分无聊,没有技术,大部分已经删除,读者有兴趣可以一一验证。

#不要移动任何基本感知机参数!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #!西邮物理系,庞某学物理,欢迎私信交流 #只做了一部分的扩展,请详细阅读并了解参数后再进行集成电路的扩展 #目前只支持非时序逻辑电路的模拟  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

标签: 集成电路x0st层集成电路if202集成电路

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台