所有介面都已放在回傳值中,所有電路都已經過本人驗證,可以放心擴展使用,注釋較少,適合有基礎的人群閱讀,
如果必須要對感知機進行擴展,建議先行閱讀神經網路的深度學習, 對于時序邏輯電路,還需要思考,可能等寒假時間寬裕時再進行模擬, 源代碼如下:
驗證部分比較無聊,且沒有技術可言,大部分都已刪去,讀者有興趣可以一一進行驗證,
#勿動基礎感知機任何引數!!!
#!西郵物理系,學物理的龐某人,歡迎私信交流
#只做了一部分的擴展,請詳細閱讀并了解引數后再進行集成電路的擴展
#目前來看,僅支持非時序邏輯電路的模擬
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))'''
如有錯誤與疑問,大膽交流,小心求證,若有參考,還請備注出處,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/234893.html
標籤:其他
