上一期已经讲了Verilog-AMS 是怎么生成一个电阻的,本期我们来看看Verilog-AMS如何整整电容/电感,这样被动元件就齐了。再来看看再Spice代码又是如何。
代码1:电容Verilog-ams
// 带入verilog a的头文件 `include "disciplines.vams" //在这里要带入我们之前没有用过的ddt // ddt 函数的解释如下 // 真值 =ddt(表达式) // real_value = ddt( expression ) ; // 在DC分析中,DDT返回0,在ac分析中ddt遵循以下关系 // In DC analyses, ddt returns zero. In AC analysis, the function is defined by the relation: // output (ω) = input (ω) · jω //定义电容的两极 module cap(p,n); //给电容赋值一个参数 parameter real capcatior = 1n; //电气化端口,代表输入电压/电流信号 eletrical p,n; //analog 表示以下信号是连续变化的 analog // 电容计算公式 电流=电容量*(电压/时间) // 电容计算公式 (电流*时间)/电容量 =电压 // 由此下面的公式就好理解 i(p,n)<+ capcatior*ddt(V(p,n));
endmodule // 请大家容忍下我这辣眼睛的翻译
|
Verilog-a 描述了电压电流时间和电容量的关系,要注意的是,ddt(expression) 内的东西是除时间,所以要对电压电流关系进行换算,换算过程在以上⬆️
根据以上关系式,我们对电容进行仿真看看电压电容量和时间的关系是否如代码所描述,这里没有直接使用verilog-a仿真,用的是LTspice仿真仅论证这个关系式。⬇️
图1:电容仿真图纸
代码2: LTspice 仿真电容
* C1 net1 0 1 I1 net1 0 -1 .tran 8m .ic v(net1)=0 .backanno .end
|
在代码2中,net1代表网络节点net1,.ic 代表初始化的时候是什么样,以上图纸如果没有使用.ic 初始时候电容的电压可能是非常高的电压 因为我们要初始化 net1对地的初始电压,所以我们要用v() 把net1 括起来,若是初始化电流则使用i()把电流括起来即可。
根据以上代码得出仿真结果如下⬇️,和verilog-a所描述的公式相符合。
图2:电容仿真结果
咱们在看看电感是怎么仿的。
参考代码3:Verilog-ams电感
//既然有电容必定有电感 `include "disciplines.vams" //定义输入端口 module inductor(p,n); //给电感赋值 parameter real l=1u; //代表以下连续变化 analog //电感电压电流时间的关系是 // 电流=(电压*时间)/电感值 // 电流*电感值=电压*时间 // 电压=(电感值*电流)/时间 v(p,n)<+l*ddt(i(p,n)); //最终得到电感值 endmodule
|
图3:电感仿真图纸
代码4:LTspice仿真电感
* L1 net1 0 1000µ V1 net1 0 1 .tran 8m .ic i(L1)=0 .backanno .end
|
在这里使用.ic 初始化了电感电流。
图4:电感仿真结果
看过以上代码,应该大致知道ddt函数是怎么回事,就是将仿真时间和电路的电压电流关系相结合,咱们也可以整个其他时间相关东西玩玩,比如时间变化电压对数变化也可以。当然实际做电路更加重要,仿真能提高效率也是很棒的!
今天就先到这里啦~