用python脚本模拟fibonacci LFSR生成PRBS码
多通道信号传输的眼图分析可以分4种case来分别仿真,这4种CASE基本能覆盖到通道的所有信号传输情况
case1,不考虑串扰,A通道传输prbs码,其他通道接地或者电源或者者浮空
case2,偶模串扰,最小串扰,A通道传输prbs码,其他通道传输A通道相同的码型
case3,奇模串扰,最大串扰,A通道传输prbs码,其他通道传输A通道相位相反的码型
case4,随机串扰,所有通道传输相同tap,seed不同的prbs码
PRBS码可以用fibonacci LFSR 来生成,但是LFSR的输入不能是全0,所以生成的PRBS码元前,可以手动加入一段与tap长度相同的全0和全1的码元,用于验证通道的ISI性能。
py的实现代码 2<= taps <= 18,多项式不唯一,可以根据协议的spec要求更改。脚本运行完后,会生成4个文件夹,分别对应4个CASE的仿真PRBS文件,仿真眼图时,将这些文件导入仿真工具的VPRBS发生器中即可。
python代码如下:
`import os
import random
current_dir = os.path.dirname(os.path.abspath(file))
os.chdir(current_dir) #切换工作目录为当前文件所在目录
taps = 8 #LFSR 位数,可生成2^taps-1个码元, taps取值>=2
ch_num = 4 #通道数量,必须>=1
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,2taps)))[2:]))
if len(seed_list)<taps+1:
list1 = [0]*(taps-len(seed_list))
seed_list = list1+seed_list
for index in range(2taps):
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}")
###############################################################
`
浙公网安备 33010602011771号