Analog/RF IC设计
直播中

杨静

7年用户 1455经验值
私信 关注

请给解释一下全差分运放的编写问题

小弟初学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)

华农武

2021-6-24 13:23:39
倒数第八行
if(V(vout_n)>(V(vsupply_n)-vsoft))begin
应该是
if(V(vout_n)>(V(vsupply_p)-vsoft))begin
所以你的vout_n有问题
这段是限幅的,因为vout不能超过电源电压减vsoft
举报

许佳

2021-6-24 13:23:59
补充一下,是vout_n的输出有问题。
举报

殷夏

2021-6-24 13:24:27
vsoft 是用来限制输出摆幅的,例如在单电源供电的情况下,若vdd=3.3v,vsoft=0.5v,则你的输出摆幅就只有3.3-2*0.5=2.3v了。
一般在调用该全差分运放是把vsoft设为0。
举报

张珊珊

2021-6-24 13:24:57
wwwwwwwwwwwww
举报

更多回帖

发帖
×
20
完善资料,
赚取积分