微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微波和射频技术 > RFIC设计学习交流 > 需要用verilog-a建模一个全差分的opamp,系统自带的是单端输出,应该怎么改?

需要用verilog-a建模一个全差分的opamp,系统自带的是单端输出,应该怎么改?

时间:10-02 整理:3721RD 点击:
本人小白,刚接触verilog-a不久。需要用它编写一个opamp,需要理想的,全差分的。
跟白痴一样自己写了 :
voutp<+Gain*vinp;
voutn<+Gain*vinn;
感觉完全不对,,看到系统的自带opamp代码,想改成差分输出,求指点
以下是系统opamp的单端输出的代码

  1. `include "discipline.h"
  2. `include "constants.h"

  3. // $Date: 1997/08/28 05:45:21 $
  4. // $Revision: 1.1 $
  5. //
  6. //
  7. // Based on the OVI Verilog-A Language Reference Manual, version 1.0 1996
  8. //
  9. //

  10. `define PI3.14159265358979323846264338327950288419716939937511



  11. //--------------------
  12. // opamp
  13. //
  14. // -operational amplifier
  15. //
  16. // vin_p,vin_n:differential input voltage [V,A]
  17. // vout:output voltage [V,A]
  18. // vref:reference voltage [V,A]
  19. // vspply_p:positive supply voltage [V,A]
  20. // vspply_n:negative supply voltage [V,A]
  21. //
  22. // INSTANCE parameters
  23. //gain= gain []
  24. //freq_unitygain = unity gain frequency [Hz]
  25. //rin= input resistance [Ohms]
  26. //vin_offset= input offset voltage referred to negative [V]
  27. //ibias= input current [A]
  28. //iin_max= maximum current [A]
  29. //slew_rate= slew rate [A/F]
  30. //rout= output resistance [Ohms]
  31. //vsoft= soft output limiting value [V]
  32. //
  33. // MODEL parameters
  34. //{none}
  35. //

  36. module opamp(vout, vref, vin_p, vin_n, vspply_p, vspply_n);
  37. input vref, vspply_p, vspply_n;
  38. inout vout, vin_p, vin_n;
  39. electrical vout, vref, vin_p, vin_n, vspply_p, vspply_n;
  40. parameter real gain = 835e3;
  41. parameter real freq_unitygain= 1.0e6;
  42. parameter real rin = 1e6;
  43. parameter real vin_offset = 0.0;
  44. parameter real ibias = 0.0;
  45. parameter real iin_max = 100e-6;
  46. parameter real slew_rate = 0.5e6;
  47. parameter real rout = 80;
  48. parameter real vsoft = 0.5;
  49. real c1;
  50. real gm_nom;
  51. real r1;
  52. real vmax_in;
  53. real vin_val;

  54. electrical cout;


  55. analog begin

  56. @ ( initial_step or initial_step("dc") ) begin
  57. c1 = iin_max/(slew_rate);
  58. gm_nom = 2 * `PI * freq_unitygain * c1;
  59. r1 = gain/gm_nom;
  60. vmax_in = iin_max/gm_nom;
  61. end

  62. vin_val = V(vin_p,vin_n) + vin_offset;

  63. //
  64. // Input stage.
  65. //
  66. I(vin_p, vin_n) <+ (V(vin_p, vin_n) + vin_offset)/ rin;
  67. I(vref, vin_p) <+ ibias;
  68. I(vref, vin_n) <+ ibias;

  69. //
  70. // GM stage with slewing
  71. //
  72. I(vref, cout) <+ V(vref, cout)/100e6;

  73. if (vin_val > vmax_in)
  74. I(vref, cout) <+ iin_max;
  75. else if (vin_val < -vmax_in)
  76. I(vref, cout) <+ -iin_max;
  77. else
  78. I(vref, cout) <+ gm_nom*vin_val ;

  79. //
  80. // Dominant Pole.
  81. //
  82. I(cout, vref) <+ ddt(c1*V(cout, vref));
  83. I(cout, vref) <+ V(cout, vref)/r1;

  84. //
  85. // Output Stage.
  86. //
  87. I(vref, vout) <+ V(cout, vref)/rout;
  88. I(vout, vref) <+ V(vout, vref)/rout;

  89. //
  90. // Soft Output Limiting.
  91. //
  92. if (V(vout) > (V(vspply_p) - vsoft))
  93. I(cout, vref) <+ gm_nom*(V(vout, vspply_p)+vsoft);
  94. else if (V(vout) < (V(vspply_n) + vsoft))
  95. I(cout, vref) <+ gm_nom*(V(vout, vspply_n)-vsoft);
  96. end
  97. endmodule

复制代码

已经解决!

求verilog-A入门教材

小编你好 本人刚接触理想运放 想请教一下像vref、freq_unitygain、vsoft 这几个参数是什么意思呢?谢谢!

个人理解,vref是设置opamp的输出直流点,unity_gain是运放的增益带宽积,vsoft是运放输出最高的电位与VDD的差值。

謝謝分享

小编能共享一下 你当初编写的全差分运放的veriloga程序吗?
谢谢!

在何乐年的书上有完整的运放代码最后一章

非常感谢!

谢谢!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top