热度 18| ||
Matlab的Simulink生成二进制单极性非归零码数据:
100Kbps生成数据,10us一个点,Zero-Order Hold可以用来设置采样时间,如果是10us,在virtuoso里台阶会非常明显,但如果太小,比如1ns,virtuoso会报错“Time is not strictly increasing in waveform...”(理解是数据点太密,导致Tran认为两个相邻的时间不可区分;2024_01_17 三:这个错误的具体理解和解决方案在后边),采样时间设置为100ns会比较合适。
数据导出的步骤是这样的:Scope的设置里可以“Save data to workspace”,这样你在Matlab工作区就可以看到,如果直接对"ScopeData"右键保存,则是.mat后缀文件,这个Virtuoso识别不了,需要将.mat文件转为.txt(csv应该也行),这里采用dlmwrite('text文件保存位置/文件名',ScopeData)一行代码就可以了(要求更高可以search相关代码)。
有了text文件,在Virtuoso里调用Vsource (Source type选pwl) 或Vpwlf,将路径(带文件后缀)填入File name就可以了。
2024_01_17 三
Time is not strictly increasing in waveform...”这个问题的主要原因是导出来的数据分辨率不够,横坐标有数据相同了。注意一下错误报的横坐标相同的位置,去查一下,就会发现问题了。我的是在100002行。
参考资料:vpwlf error: Time is not strictly increasing
查了一天,具体说下流程(不想看可以直接跳到解决方案)。一开始我以为是matlab有效位数导致的问题,默认的short显示格式就是保留5位有效数据(点进去是可以看到所有位数的,默认的double数据类型是可以显示16位的)。这个可以在Preferences-MATLAB-Command Window里改。改了以后工作区的却始终不变,原来要改另一个位置Preferences-MATLAB-Variables里,这里short改成long,工作区的有效位数就变成16位了。
参考资料:MATLAB中csv文件读取浮点数只有4位小数,后续的有效数字被自动截断的解决方案
这里为了改变有效位数,理解了很长时间的定点数、浮点数内容,但有趣的是,这种位数显示的问题和matlab存储和处理它们没有关系,只是显示而已。所以改了Variables没有用。(默认的double数据类型是64bit的浮点数,IEEE 754浮点数)
解决方案:真正的问题在于dlwwrite导出时留的位数不够,有截断。查询一下dlmwrite的帮助文档,修改为dlmwrite('text文件保存位置/文件名',ScopeData,‘precision’,‘%.10f’),这样就保留了需要的位数,横轴就不会相同了。
可以看出,我的横轴时间的分辨率是1ns,这么小的时间间隔在横轴设置正确后,很快就遇到了下个问题,Virtuoso里的Tran仿真不收敛。
报的错误是 "No convergence achieved with the minimum time step specified."
主要的原因是我的Tran仿真设定的电压变化是突变的,是和matlab里是一致的。修改了cmin为100fF(自己试出来的)就好了。这里推荐一篇文档,是说这个问题比较好的文档:
其他帖子提到的修改trap,reltol这里都有:[求助] 求助仿真问题瞬态仿真
Cadence常见问题:No convergence achieved with the minimum time step specified.
error:No convergence achieved with the minimum time step specified