求助,懂VerilogA的看过来,全差分运放的编写
`include "discipline.h"
`include "constants.h"
module diff_opamp(vout_p,vout_n,vref,vin_p,vin_n,vsupply_p,vsupply_n);
input vref,vsupply_p,vsupply_n;
inout vout_p,vout_n,vin_p,vin_n;
parameterfreq_unitygain=1e6;
parametergain=1000;
parameterr_in=10e6;
parameteri_bias=0;
parameterr_out=100;
parameter realiin_max=100e-6;
parameter realslew_rate=20e6;
parametervin_offset=0;
parametervsoft=0.5;
realgm_nom;
realvmax_in;
realvin_al,c1,r1;
electrical vout_p,vout_n,vref,vin_p,vin_n,vsupply_n,vsupply_p;
electrical cout_n,cout_p;
analog begin
@(initial_step or initial_step("dc"))begin
c1=iin_max/slew_rate;
gm_nom=2*3.14*freq_unitygain*c1;
r1=gain/gm_nom;
vmax_in=iin_max/gm_nom;
end
//
//input stage
//
V(vref)<+ V(vsupply_n)+0.5*V(vsupply_p,vsupply_n);
vin_al=V(vin_p,vin_n)/2+vin_offset;
I(vref,vin_n)<+i_bias;
I(vref,vin_p)<+i_bias;
I(vin_p,vin_n)<+V(vin_p,vin_n)/r_in+vin_offset/r_in;
//
//GM stage with slew rating
//
I(cout_n,vref)<+ V(cout_n,vref)/100e6;
I(cout_p,vref)<+ V(cout_p,vref)/100e6;
if(vin_al>vmax_in)begin
I(vref,cout_p)<+ iin_max;
I(vref,cout_n)<+ -iin_max;
end
else if(vin_al<-vmax_in)begin
I(vref,cout_p)<+ -iin_max;
I(vref,cout_n)<+iin_max;
end
else begin
I(vref,cout_p)<+0.5*gm_nom*vin_al;
I(vref,cout_n)<+ -0.5*gm_nom*vin_al;
end
//
//dominate pole
//
I(vref,cout_n)<+ c1*ddt(V(vref,cout_n));
I(vref,cout_p)<+ c1*ddt(V(vref,cout_p));
I(vref,cout_n)<+ V(vref,cout_n)/r1;
I(vref,cout_p)<+ V(vref,cout_p)/r1;
//
//output stage
//
I(vout_n,vref)<+ V(vref,cout_n)/r1;
I(vout_n,vref)<+ V(vout_n,vref)/r1;
I(vout_p,vref)<+ V(vref,cout_p)/r1;
I(vout_p,vref)<+ V(vout_p,vref)/r1;
//
//soft output limiting
//
if(V(vout_p)>(V(vsupply_p)-vsoft))begin
I(cout_p,vref)<+gm_nom*(V(vout_p,vsupply_p)+vsoft);
end
else if(V(vout_p)<(V(vsupply_n)+vsoft))begin
I(cout_p,vref)<+gm_nom*(V(vout_p,vsupply_n)-vsoft);
end
if(V(vout_n)>(V(vsupply_n)-vsoft))begin
I(cout_n,vref)<+gm_nom*(V(vout_n,vsupply_p)+vsoft);
end
else if(V(vout_n)<(V(vsupply_n)+vsoft))begin
I(cout_n,vref)<+gm_nom*(V(vout_n,vsupply_n)-vsoft);
end
end
endmodule
补充一下,是vout_n的输出有问题
粗粗看好像不错啊,哪里有问题。不好意思没时间看的很细。
看头晕了也没看出哪出问题了
一切都是浮云 你懂的 lZ
vsoft 是用来限制输出摆幅的,例如在单电源供电的情况下,若vdd=3.3v,vsoft=0.5v,则你的输出摆幅就只有3.3-2*0.5=2.3v了。
一般在调用该全差分运放是把vsoft设为0.
另外,你的这段程序应该是何乐年的《模拟集成电路设计与仿真》上的吧,那段程序我用过,没有问题的,你再好好看看吧。
倒数第八行
if(V(vout_n)>(V(vsupply_n)-vsoft))begin
应该是
if(V(vout_n)>(V(vsupply_p)-vsoft))begin
所以你的vout_n有问题
这段是限幅的,因为vout不能超过电源电压减vsoft
请问cout_p、cout_n是干什么用的?
wwwwwwwwwwwww
ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
wwwwwwwwwwwwwwwwww
llllllllllllllllll
oooooooooooooooooooo
llllllllllllllll
aaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaa
aaaaaaaaaaaa
iiiiiiiiiiiiiiii
何乐年的吧,通吗?
请问一下你是怎么在输入端加电压的,我也在仿真这个运放,但是一直没成功过,可否把电路图截图给我看下
搭车问下这段是什么意思?
analog begin
@(initial_step or initial_step("dc"))begin
c1=iin_max/slew_rate;
gm_nom=2*3.14*freq_unitygain*c1;
r1=gain/gm_nom;
vmax_in=iin_max/gm_nom;
end
analog begin
@(initial_step or initial_step("dc"))begin
c1=iin_max/slew_rate;
gm_nom=2*3.14*freq_unitygain*c1;
r1=gain/gm_nom;
vmax_in=iin_max/gm_nom;
end
问下这段是什么意思啊?
时间太久记不起来了,好像跟仿真普通的电路没什么区别
就是通过最大输出电流、压摆率、单位增益带宽来确定跨导、负载电容、最大信号输入幅度等参数,这里还是比较灵活的,你可以画个小信号看一下,没记错的话何乐年那书上好像有个类似的小信号
能仔细解释一下这个程序吗?还有在仿真的时候怎样进行仿真呀?谢谢,比较急。
请问cout_p、cout_n是干什么用的?
小编这个正确仿真出来了吗?我最近也在仿真全差分的运放。
Vref怎么接
O(∩_∩)O谢谢