基于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 = 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))'''




如有错误与疑问,大胆交流,小心求证。若有引用,还请备注出处。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值