完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
小弟初学verilogA,对全差分运放的编写一直没弄明白,从一本书上找了一个全差分运放的例子,看代码没啥问题,但是仿真时总有问题,仿真运放的幅频和相频特性时总是一个输出端正确另外一个不正确。代码在下面,仿真结果截图附件上传,请高手帮忙看看哪里有问题。另外代码最后的soft output limiting那一段看不明白,请给解释一下
`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; parameter freq_unitygAIn=1e6; parameter gain=1000; parameter r_in=10e6; parameter i_bias=0; parameter r_out=100; parameter real iin_max=100e-6; parameter real slew_rate=20e6; parameter vin_offset=0; parameter vsoft=0.5; real gm_nom; real vmax_in; real vin_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 请问cout_p、cout_n是干什么用的? |
|
相关推荐
4个回答
|
|
倒数第八行
if(V(vout_n)>(V(vsupply_n)-vsoft))begin 应该是 if(V(vout_n)>(V(vsupply_p)-vsoft))begin 所以你的vout_n有问题 这段是限幅的,因为vout不能超过电源电压减vsoft |
|
|
|
补充一下,是vout_n的输出有问题。
|
|
|
|
vsoft 是用来限制输出摆幅的,例如在单电源供电的情况下,若vdd=3.3v,vsoft=0.5v,则你的输出摆幅就只有3.3-2*0.5=2.3v了。
一般在调用该全差分运放是把vsoft设为0。 |
|
|
|
wwwwwwwwwwwww
|
|
|
|
只有小组成员才能发言,加入小组>>
786个成员聚集在这个小组
加入小组4966 浏览 0 评论
3728 浏览 0 评论
4686 浏览 0 评论
3708 浏览 0 评论
7454 浏览 0 评论
715浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 12:24 , Processed in 0.741789 second(s), Total 85, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号