最近想使用免费的LTSPICE做一些简单的信号仿真,评估信号经过一些链路模型传输后信号SI表型如何?需要在LTSPICE中采用信号系统中通常采用的伪随二进制码序列(PRBS)作为信号激励,模拟真实传输场景下数字信号频谱分布,同时在链路的接收端将信号切片叠成眼图形式对接收到的方波信号质量做比较直观的评估。但是如果采用LTSPICE中自带的移位寄存器设计数字电路来实现这个功能,整体的模拟时间会比较长,同时产生长序列高速率的PRBS比较困难。为提高模拟效率并简化仿真电路,所以信号采用导入PRBS的PWL file来实现。

PWL文件的产生

PRBS(伪随机二进制序列)简介

Pseudo-Random Binary Sequence,伪随机二进制序列的产生一般依靠数字电路的移位寄存器来实现。

LFSR PRB3产生示意图

从上图中我们可以得到一些信息:

1、n阶PRBS的码型长度是2^n-1,图中第7次运算已经重复了time 0的情况,所以0~6是一个标准的循环,第7次已出栈的模型长度是7个

2、从右到左,最先出栈的n个码型对应的是LFSR的初始寄存器值,后文对应seed值;

3、对于PRBS n来说,其中最长有n个连续的1或者0,对应n-1个连续的0或者1;

对于具体的PRBS特征可以查阅对应资料深入了解,后续对他的频谱、功率谱、Mark ration概念再做进一步学习。

构建一个函数实现通信常用的N阶PRBS信号

详见代码和代码注释

#############################################################################################

# function: 产生通信测试用PRBS伪随机序列

# 入口参数:

# 1、User_defined/PRBS_N (N=7,9,11,15,17,20,23,29,31)--使用自定义或者规定的PRBS_N序列;

# 2、seeds--产生伪随机序列的种子;

# 3、polynomial tap--规定的伪随机序列的标准tap;x^tap1+x^tap2+1 tap1>tap2

# 参数使用字典来传递

# 返回参数:

# 对应的PRBS码型

#############################################################################################

# seed 文件只作为参考,后续可根据对应协议更正

prbs_dictionary={"PRBS_7":['0101010',[7,6]],

"PRBS_9":['010101010',[9,5]],

"PRBS_11":['01010101010',[11,9]],

"PRBS_15":['010101010101010',[15,14]],

"PRBS_17":['01010101010101010',[17,14]],

"PRBS_20":['10101010101010101010',[20,3]],

"PRBS_23":['01010101010101010101010',[23,18]],

"PRBS_29":['01010101010101010101010101010',[29,27]],

"PRBS_31":['0101010101010101010101010101010',[31,28]],

}

# if prbstype=PRBS_N, default of seed and taps are None,

# if prbstype=User_defined, seed and taps must be given

def prbs_Generator(prbstype, seed = None, taps = None):

if prbstype == 'User_defined':

prbs_sequence = prbs_create(seed,taps)

else:

prbs_sequence = prbs_create(prbs_dictionary.get(prbstype)[0],prbs_dictionary.get(prbstype)[1])

return prbs_sequence

def prbs_create(seed, taps):

#传入的字符串转化为列表

sequence_list = [int(i) for i in list(seed)]

#获得对应的PRBS周期长度

prbs_length = (2 << (len(seed) - 1))-1

#产生定义长度的伪随机序列

for i in range(prbs_length):

# 对taps规定的bit位置进行异或计算

mod_two_add = sum([sequence_list[t-1] for t in taps])

xor = mod_two_add % 2

#计算出的Bit值插入到队列首端

sequence_list.insert(0, xor)

#list 倒置

sequence_list.reverse()

return sequence_list

将PRBS信号转换成标准模拟用的PWL文件

LTSPICE的PWL文件格式如下,第一行的表头不体现,其他行多是时间参数对应的电平电压

time

Voltage

时间

电平电压

转换过程涉及将Bit序列转换成逻辑电平,在逻辑电平转换过程中引入上升、下降时间、Bit Rate(bit period的倒数)等常见定义,转换过程详见下述代码。

#############################################################################################

# function: 通过特定的PRBS产生PWL文件

# version: V1.0

# 入口参数:

# 1、输入PWL文件需要的Bit, V0(低电平), V1(高电平), Bit rate, Rise time, Fall time;

# 返回参数:

# 输出符合spice仿真需要的PWL文件(当前为time 与 waveform对应的dictionary)

#############################################################################################

def create_PWL(Bits, V0, V1, BitRate, RiseTime, FallTime):

#从逻辑level转换成电平幅度

waveform_list = []

time_list = []

volt_Bits = []

# print len(Bits)

# print range(len(Bits))

for i in range(len(Bits)):

if Bits[i] == 1:

volt_Bits.append(V1)

else:

volt_Bits.append(V0)

# 装换成含上升,下降时间的电平幅度

for bitN in range(len(Bits)):

waveform_list.append(volt_Bits[bitN])

waveform_list.append(volt_Bits[bitN])

# 获取精准的浮点运算,先将数字转换成字符使用Decimal计算后,再转回float类型

bit_Period = round(1.0/BitRate, 3)

for time in range(len(waveform_list)-1):

if time%2 == 1:

if waveform_list[time] > waveform_list[time+1]:

time_list.append(float(Decimal(str(time+1))/Decimal('2')*Decimal(str(bit_Period))-Decimal(FallTime)))

else:

time_list.append(float(Decimal(str(time+1))/Decimal('2')*Decimal(str(bit_Period))-Decimal(RiseTime)))

else:

time_list.append(float(Decimal(str(time))/Decimal('2')*Decimal(str(bit_Period))))

pwl_List = {"time":time_list, "Waveform":waveform_list}

return pwl_List

其中关键点时使用到了Decimal函数,代码运用过程中发现,计算机采用二进制对浮点数进行表示和运算会出现计算精度丢失的情况,哪怕是0.2-0.1的计算,也会出现莫名的精度丢失,所以采用python中Decimal函数克服。

The decimal module provides support for fast correctly-rounded decimal floating point arithmetic. It offers several advantages over the float datatype:

将产生的PWL字典文件写入TEXT文档

上文已经可以产生需要的PWL文件,但是为了模拟仿真的方便性,我们需要将产生的PWL数据写入Text文档中,然后在LTSPICE仿真时直接引入,下面是存储的代码文件

#############################################################################################

# function:将生成的pwl_List按照标准格式写入text文档中,第一列为time, 第二列为voltage

# version: v1.0

# 入口:

# 1、pwl_list; 标准波形存储的字典

# 2、savePath_Name; 文件保存路径和名称

# 出口:

# 标准格式保存的text文档

#############################################################################################

def save_PWL_File(pwl_list, savePath_Name):

DataFile = open(savePath_Name, mode = 'w+')

for i in range(len(pwl_list.get("time"))):

content = str(pwl_list.get("time")[i]) + ' ' + str(pwl_list.get("Waveform")[i]) + '\n'

DataFile.writelines(content)

DataFile.close()

使用下面的代码生成一个测试文件来进行仿真测试

result_data = prbs_Generator(prbstype = "PRBS_9")

savePath_Name = ".\pwl.txt"

pwl_file = create_PWL(result_data, 0, 5, BitRate = 10, RiseTime = 0.01, FallTime = 0.02)

save_PWL_File(pwl_file, savePath_Name)

运行代码后可以产生一个pwl.txt文档,其中部分信息如下图

image

LTSPICE仿真测试

首先构建如下图的仿真电路,假设信号源的阻抗是25ohm,高速线的阻抗为25ohm,负载采用RLC模型代替,其阻抗跟随频率变化。

image

导入PWL的设置如下

[图片上传失败...(image-fb6199-1570288240270)]

仿真设置中比较关键的利用.option baudrate让仿真软件自动在结果测生成眼图,软件运行的仿真结果如下,生成了比较漂亮的眼图,同时源的方波也比较正常

image

源的waveform

image

【本文仅供学习交流使用,转载请注明出处,谢谢!】

python电路仿真_Python创建PWL用于SPICE仿真相关推荐

  1. python系统目录_Python创建系统目录的方法

    本文实例讲述了Python创建系统目录的方法.分享给大家供大家参考.具体如下: Python2 mkdir在没有上级目录时创建会失败.该方法可以创建多级目录. /temp/gapgers/upload ...

  2. python 立方体_Python | 创建三个数字列表,分别是正方形和立方体

    python 立方体 Take a range i.e. start and end, and we have to create three lists, list1 should contains ...

  3. python子类_python创建子类的方法分析

    本文实例讲述了python创建子类的方法.分享给大家供大家参考,具体如下: 如果你的类没有从任何祖先类派生,可以使用object作为父类的名字.经典类的声明唯一不同之处在于其没有从祖先类派生---此时 ...

  4. python创_Python创建Windows 服务

    Python 写windows 服务,需要使用 pywin32包. 直接上代码: #encoding=utf8 ''' Created on 2014-7-1 @author: wangmengnan ...

  5. python电路仿真_如何使用Python自动产生SPICE仿真用PWL文件

    最近想使用免费的LTSPICE做一些简单的信号仿真,评估信号经过一些链路模型传输后信号SI表型如何?需要在LTSPICE中采用信号系统中通常采用的伪随二进制码序列(PRBS)作为信号激励,模拟真实传输 ...

  6. python 电路仿真spice_检查电路稳定性的小能手为数SPICE仿真当之无愧

    SPICE是一种检查电路潜在稳定性问题的有用工具 .本文将介绍一种使用SPICE工具来检查电路潜在稳定性的简单方法. 图1是使用OPA211搭建 的一个同相放大器,在许多应用中,只是对图1做了较小的变 ...

  7. python创建多个文件_Python创建文件夹与文件的快捷方法

    这篇文章主要给大家介绍了关于Python创建文件夹与文件的快捷方法以及批量创建文件夹的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学 ...

  8. python新建文件夹和文件夹_Python创建文件夹与文件的快捷方法

    前言 Python快捷创建文件夹和文件详解 自己做文件时发现  简单的反复操作十分浪费时间,于是想到了 使用Python,这个分享给大家,快捷高效办公. 项目目录 file11 创建文件夹 file2 ...

  9. python os模块创建文件夹_Python创建文件夹与文件的快捷方法

    前言 Python快捷创建文件夹和文件详解 自己做文件时发现  简单的反复操作十分浪费时间,于是想到了 使用Python,这个分享给大家,快捷高效办公. 项目目录 file11 创建文件夹 file2 ...

最新文章

  1. 最小割 ---- 最大密度子图(最大权值闭合子图)
  2. vs2010中svn使用教程_SVN安装以及和VS2010整合使用-阿里云开发者社区
  3. linux系统运行时间
  4. python批量生成图_python图像处理-批量生成纯色图片
  5. HttpURLConnection和HttpClient的简单用法
  6. fedora下安装pps
  7. linux修改grub权限,linux下肿么修改grub.cfg
  8. 【转】【Linux】sed命令详解
  9. ECMAScript 6环境搭建
  10. spring boot(一):Hello World
  11. c语言中next和prior连在一起,C语言中双向链表和双向循环链表详解
  12. 解决win10 自动修复失败电脑无法开机问题
  13. 模糊聚类算法(FCM)
  14. 局域网中别人不能访问我的电脑
  15. 2022起重机械指挥考试模拟100题及答案
  16. CSS 实现倒三角形
  17. 基于Node与express完成图书管理系统项目
  18. 网络编程-线程,守护线程,线程互斥锁-26
  19. 电脑蓝牙打电话-总结(四、百瑞互联BRLink)
  20. vi / vim——常用命令

热门文章

  1. 包子笔记 - 关于塔勒布策略
  2. Date相关日期格式转换
  3. PDMA新产品开发手册【笔记】(一)
  4. 利用PPT绘制京东阅读Logo
  5. 在Java中判断一个数是奇数还是偶数
  6. java自动装箱的好处_Java自动拆装箱为什么不起作用了
  7. IATF16949认证辅导,促进减少在汽车零部件供应链中易发生的质量波动和浪费
  8. SSRF漏洞验证及利用方法
  9. 第十一章 多媒体应用开发(音视频播放)
  10. krpano 生成文件格式_写给Krpano小白们的最最最入门级教程(一)