眼图仿真的几种case
多通道的眼图分析在不使用PDA方法仿真时,可以分4种case来分别仿真,这4种CASE基本能覆盖到通道的最恶劣情况
case1,A通道传输prbs码,其他通道接地或者电源或者者浮空(不考虑串扰)
case2,A通道传输prbs码,其他通道传输A通道相同的码型(偶模串扰)
case3,A通道传输prbs码,其他通道传输A通道相位相反的码型(奇模串扰)
case4,A通道传输prbs码,其他通道传输与A通道tap相同,seed不同的prbs码
PRBS码的生成方法
PRBS码可以用fibonacci LFSR 来生成,但是LFSR的输入不能是全0,所以生成的PRBS码元前,可以手动加入一段与tap长度相同的全0和全1的码元,用于验证通道的ISI性能。
py的实现代码 2<= taps <= 18,多项式不唯一,可以根据协议的spec要求更改。
import os
import random
current_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(current_dir)
taps = 8
ch_num = 4
polynomial = [
[],
[],
[0,1],
[0,2],
[0,3],
[1,4],
[0,5],
[0,6],
[1,2,3,7],
[3,8],
[2,9],
[1,10],
[0,3,5,11],
[0,2,3,12],
[0,2,4,13],
[0,14],
[1,2,4,15],
[2,16],
[6,17]
]
def prbs_gen(taps):
output=[]
seed_list = list(map(int,list(bin(random.randrange(1,2**taps)))[2:]))
if len(seed_list)<taps+1:
list1 = [0]*(taps-len(seed_list))
seed_list = list1+seed_list
for index in range(2**taps):
xor=0
for x in polynomial[taps]:
xor = seed_list[x] ^ xor
seed_list.append(xor)
output.append(seed_list.pop(0))
list_0=[0]*taps
list_1 = [1]*taps
output= list_0+list_1+output
return output
###############################################################
if not os.path.exists("case1"):
os.makedirs("case1")
case_dir = os.path.join(curren_dir,"case1")
output=prbs_gen(taps)
prbs_file = "prbs{}_all_0.txt".format(taps)
with open(os.path.join(case_dir,prbs_file ),"w") as file:
for bit in output:
file.write(f"0")
prbs_file = "prbs{}_all_1.txt".format(taps)
with open(os.path.join(case_dir,prbs_file ),"w") as file:
for bit in output:
file.write(f"1")
prbs_file = "prbs{}.txt".format(taps)
with open(os.path.join(case_dir,prbs_file ),"w") as file:
for bit in output:
file.write(f"{bit}")
###############################################################
if not os.path.exists("case2"):
os.makedirs("case2")
case_dir = os.path.join(curren_dir,"case2")
with open(os.path.join(case_dir,prbs_file ),"w") as file:
for bit in output:
file.write(f"{bit}")
###############################################################
if not os.path.exists("case3"):
os.makedirs("case3")
case_dir = os.path.join(curren_dir,"case3")
with open(os.path.join(case_dir,prbs_file ),"w") as file:
for bit in output:
file.write(f"{bit}")
prbs_file = "prbs{}_ODD.txt".format(taps)
with open(os.path.join(case_dir,prbs_file ),"w") as file:
for bit in output:
if bit == 0:
bit = 1
else:
bit = 0
file.write(f"{bit}")
###############################################################
if not os.path.exists("case4"):
os.makedirs("case4")
case_dir = os.path.join(curren_dir,"case4")
for index in range(ch_num):
output=prbs_gen(taps)
prbs_file = "prbs{}_{}.txt".format(taps,index )
with open(os.path.join(case_dir,prbs_file ),"w") as file:
for bit in output:
file.write(f"{bit}")
###############################################################
prbs文件使用方法
以ADS为例,调用VtPRBS 器件,mode=Bit File, BitFile=文件路径