在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 10714|回复: 20

[求助] 全差分运放的verilog-A

[复制链接]
发表于 2013-9-21 22:20:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本人在做一个流水线ADC,需要一个运放理想模型仿真测试,何乐年那本书上有一段全差分运放的verilog代码,我仿真了下好像有点问题啊,不知道哪里出错了,哪位个指点一下。代码贴到下面。
`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 real freq_unitygain=1e6;
parameter real gain=835e3;
parameter rin=1e6;
parameter real ibias=0;
parameter real rout=80;
parameter real  iin_max=100e-6;
parameter real  slew_rate=0.5e6;
parameter vin_offset=0;
parameter real vsoft=0;
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
      vin_al=V(vin_p,vin_n)/2+vin_offset;
   //
   //input stage
   //
    I(vref,vin_n)<+ibias;
    I(vref,vin_p)<+ibias;
    I(vin_p,vin_n)<+(V(vin_p,vin_n)+vin_offset)/rin;
   //
   //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(vref,vout_n)<+ V(cout_n,vref)/rout;
    I(vout_n,vref)<+ V(vout_n,vref)/rout;
    I(vref,vout_p)<+ V(cout_p,vref)/rout;
    I(vout_p,vref)<+ V(vout_p,vref)/rout;
    //
    //soft output limiting
    //
    if(V(vout_p)>(V(vsupply_p)-vsoft))
     I(cout_p,vref)<+gm_nom*(V(vout_p,vsupply_p)+vsoft);
      else if(V(vout_p)<(V(vsupply_n)+vsoft))
         I(cout_p,vref)<+gm_nom*(V(vout_p,vsupply_n)-vsoft);
    if(V(vout_n)>(V(vsupply_p)-vsoft))
     I(cout_n,vref)<+gm_nom*(V(vout_n,vsupply_p)+vsoft);
      else if(V(vout_n)<(V(vsupply_n)+vsoft))
         I(cout_n,vref)<+gm_nom*(V(vout_n,vsupply_n)-vsoft);
end
endmodule
增益和相位曲线

仿真的电路图
QQ截图20130921114953.png
我接成增益为1的情况。正选波输入,为什么输出的波形是这个样子的,下面两个是输出
snapshot.bmp
 楼主| 发表于 2013-9-21 22:25:28 | 显示全部楼层
QQ21114953.png 是我的图太大了吗,怎么不显示出来
 楼主| 发表于 2013-9-21 22:26:58 | 显示全部楼层
3.png
 楼主| 发表于 2013-9-23 10:09:06 | 显示全部楼层
有人知道吗,就简答啊
发表于 2013-9-23 10:56:42 | 显示全部楼层
瞬态有个建立过程很正常,主要看稳定后的
发表于 2013-9-23 12:54:47 | 显示全部楼层
本帖最后由 peterlin2010 于 2013-9-23 13:14 编辑

看圖好像 OUTPUT 和INPUT 間有相位差嗎???

  freq  1M => 100Khz ,
parameter real freq_unitygain=1e6;  => 100e6

你在 sim  ..


如果  
freq  1M => 100Khz ,
parameter real freq_unitygain=1e6  =>
還是有差異 但比先前 input signal 1Mhz 好很多了
 楼主| 发表于 2013-9-23 16:03:34 | 显示全部楼层
回复 6# peterlin2010


    不只是相位,峰值也有问题,输入峰值200mW,输出峰值才50mW,而且输出看起来也不想是sin波,圆圆的。您的意思是我的仿真输入信号频率高了吗,改成100KHz?
发表于 2013-9-23 17:35:38 | 显示全部楼层
回复 7# 000shzhf


    hspice sim
1.jpg


input signal 你先降低看看 ..

.hdl 'full_diff.v'


.OPTIONS BRIEF=0
.param d_vcc =5

x1  vout_p vout_n vref vin_p vin_n dvdd 0  diff_opamp

vcc1 dvdd 0 pwl(0,0 1.5u,0 2.2u,d_vcc  )
vss2 gnd 0 0
vss1 dvss 0 0
v1p0 vip  n0 sin(0,0.4,100k)
vin  vin    n0 sin(0,0.4,100k,0.5m)
vn0 n0 0 0.9
vref vref 0 0.9
r11 vip vin_p  200k
r12  vin_p vout_n 200k
r21 vin vin_n  200k
r22 vin_n vout_p 200k
c11 vout_p 0 4p
c21 vout_n 0 4p

=======

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 real freq_unitygain=100e6;
parameter real gain=835e3;
parameter rin=1e6;
parameter real ibias=0;
parameter real rout=80;
parameter real  iin_max=100e-6;
parameter real  slew_rate=0.5e6;
parameter vin_offset=0;
parameter real vsoft=0;

=>  real freq_unitygain=100e6;
发表于 2013-9-23 18:08:06 | 显示全部楼层
thanks very much
 楼主| 发表于 2013-9-23 19:27:21 | 显示全部楼层
确实是输入频率降低,波形就正常了,谢谢啦。
real freq_unitygain=100e6;这个意思是单位增益带宽是100MHZ吗,但是具体测出来却不是这样的,我把这个1e9,带宽却达不到1GHz
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-21 21:04 , Processed in 0.038097 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表