最近要在电路中仿真不同大小的“Clock jitter”和“随机比特序列 ”对系统输出信号的影响。但是,当作者浏览完analogLib中的各种source后,也没有发现令人满意的产生上述信号的方式。因此作者研究了如何用Matlab 代码生成所需的波形文件,并将其导入Cadence中作为输入信号。整个操作非常简单,各种细节列在此处,供大家参考。
下面以随机比特序列为例进行演示。作者用如下Matlab代码产生随机的比特序列,并输出成波形文件pwlTest.p。
t = 1:1:100;
y = round(rand(1,100));
a = [t' y'];
save -ascii pwlTest.p a
在图1中的Filename一栏中填入pwlTest.p,并运行瞬态仿真,得到图2所示的波形。其瞬态波形的最小间隔为0.5ns,幅度为1.2V,与【功能说明】中的设置吻合。
在逻辑翻转时, 相邻比特之间本应存在rise-transition 和fall-transition 的过渡。但这种情况并没有出现,而是进行了幅度的插值。这是我们所不希望看到的。于是,作者写了一个简单的Matlab小程序来自动引入rise/fall transition。其中tr为rise/fall time,这取0.1。
[t, y] = data_generation(t,y,0.1)
function [t,dout]=data_generation(tin,din,tr)
dout = [];
t = [];
for i = 1 :length(tin)-1
t = [t, tin(i)+tr/2, tin(i+1)-tr/2];
dout = [dout, din(i), din(i)];
end
dout = [dout,din(length(tin))];
t = [t, tin(length(tin))+tr/2];
end
通过该程序对bit序列进行处理,我们就能得到所期望的波形,如图3所示。
下面用同样的方式产生clock jitter,jitter的rms为20ps,即0.5ns的4/100。(感谢
的指正)t_clk = 0:1:10;
v_clk = mod(t_clk,2);
%% jitter added
t_clk = t_clk + wgn(1,length(t_clk),-34);
%% add transition
[t_clk, v_clk] = data_generation(t_clk, v_clk,0.1);
%% export file
a = [t_clk' v_clk'];
save -ascii pwlTest.p a
仿真结果如下: