经典两级运放设计 | C语言辅助设计

简介:
本文主要用C语言实现经典两级运放架构的参数计算。目的是整合繁琐的代数运算,提高设计效率。
两级运放原理图:
经典两级运放设计 | C语言辅助设计_第1张图片

电路各部分间的约束关系:
经典两级运放设计 | C语言辅助设计_第2张图片
设计步骤:【注: S i = ( W / L ) i S_i = (W/L)_i Si=(W/L)i
(1) 计算Miller补偿电容 C c C_c Cc C c > 0.22 C L C_c > 0.22C_L Cc>0.22CL
(2) 计算尾电流 I 5 I_5 I5 I 5 = S R × C c I_5 = SR \times C_c I5=SR×Cc
(3) 计算 S 3 , S 4 S_3, S_4 S3,S4 S 3 = S 4 = I 5 K p ( V D D − ( V c m , m a x − V T H 1 , m i n − ∣ V T H 3 ∣ m a x ) ) 2 S_3 = S_4 = {\frac{I_5}{K_p(V_{DD} - (V_{cm,max} - V_{TH1,min} - |V_{TH3}|_{max}))^2}} S3=S4=Kp(VDD(Vcm,maxVTH1,minVTH3max))2I5
(4) 计算 S 1 , S 2 S_1, S_2 S1,S2 g m 1 = G B × C c g_{m1} = GB \times C_c gm1=GB×Cc S 1 = S 2 = g m 1 2 K n I 5 S_1 = S_2 = \frac {g_{m1}^2}{K_nI_5} S1=S2=KnI5gm12
(5) 计算 S 5 S_5 S5 V D S 1 , s a t = I 5 K n S 1 V_{DS1,sat} = {\sqrt{{\frac{I_5}{K_nS_1}}}} VDS1,sat=KnS1I5 V D S 5 = V c m , m i n − V S S − ( V D S 1 , s a t + V T H 1 , m a x ) V_{DS5} = {V_{cm,min}-V_{SS}-(V_{DS1,sat} + V_{TH1,max})} VDS5=Vcm,minVSS(VDS1,sat+VTH1,max) S 5 = 2 I 5 K n V D S 5 2 S_5 = {\frac{2I_5}{K_nV_{DS5}^2}} S5=KnVDS522I5
(6) 计算 S 6 S_6 S6 g m 6 = 2.2 G B C L g_{m6} = {2.2GBC_L} gm6=2.2GBCL g m 4 = I 5 K p S 4 g_{m4} = {\sqrt{I_5K_pS_4}} gm4=I5KpS4 S 6 = S 4 g m 6 g m 4 S_6 = {S_4 \frac{g_{m6}}{g_{m4}}} S6=S4gm4gm6
(7) 计算 S 7 S_7 S7 S 7 = S 5 I 6 I 5 S_7 = {S_5 \frac{I_6}{I_5}} S7=S5I5I6
(8) 检验开环增益和功耗是否满足设计指标: A V , d e s i g n = 2 g m 1 g m 6 I 5 ( λ 2 + λ 4 ) I 6 ( λ 6 + λ 7 ) A_{V,design} = {\frac{2g_{m1}g_{m6}}{I_5 (\lambda_2 + \lambda_4)I_6 (\lambda_6 + \lambda_7)}} AV,design=I5(λ2+λ4)I6(λ6+λ7)2gm1gm6 P d i s s , d e s i g n = ( I 5 + I 6 ) ( V D D − V S S ) P_{diss,design = {(I_5 + I_6)(V_{DD} - V_{SS})}} Pdiss,design=(I5+I6)(VDDVSS)
(9) 若指标不能满足,修改相关MOSFET尺寸,再次仿真直到满足设计要求。
鉴于以上八个步骤中代数计算有些繁琐,所以设计了下面的C语言计算程序以提高设计效率。
C语言完整计算代码如下:

/*-------------------------
Filename: OPAMP.c
Function: 经典两级运放设计
Author: Zhang Kaizhou
Date: 2020-5-2 19:25:11
--------------------------*/
#include 
#include 
#include 

/*定义工艺参数(本例中参考0.35m工艺)*/
#define L 1 //电路中所有MOSFET的沟长定义为1um
#define KN 240 //KN = unCox (uA/V^2)
#define KP 50 //KP = upCox (uA/V^2)
#define VTHN_min 0.35 //NMOSFET阈值电压范围
#define VTHN_max 0.65
#define VTHP_min 0.35 //MOSFET阈值电压范围(绝对值)
#define VTHP_max 0.65
#define LammdaN 0.06 //n沟长调制系数
#define LammdaP 0.08 //p沟长调制系数
#define PI 3.1415926 //圆周率

int main(){
    /*定义运放约束条件*/
    double Av_expect, VDD, VSS, GB, SR, CL, PM, Vout_min, Vout_max, Vcm_min, Vcm_max, Pdiss;
    /*定义运算中间变量*/
    double gm1, VGS1, VDS5, gm4, gm6, I6, Av_real, Pdiss_real;

    /*定义输出结果*/
    double Cc, I5, S1, S2, S3, S4, S5, S6, S7; //S = W/L

    /*约束条件输入*/
    printf("----------请输入设计指标-----------\n");
    printf("--Av_expect(V/V) = "); scanf("%lf", &Av_expect);
    printf("--VDD(V) = "); scanf("%lf", &VDD);
    printf("--VSS(V) = "); scanf("%lf", &VSS);
    printf("--GB(MHz) = "); scanf("%lf", &GB);
    printf("--SR(V/us) = "); scanf("%lf", &SR);
    printf("--CL(pF) = "); scanf("%lf", &CL);
    printf("--PM(degree) = "); scanf("%lf", &PM);
    printf("--Vout_min(V) = "); scanf("%lf", &Vout_min);
    printf("--Vout_max(V) = "); scanf("%lf", &Vout_max);
    printf("--Vcm_min(V) = "); scanf("%lf", &Vcm_min);
    printf("--Vcm_max(V) = "); scanf("%lf", &Vcm_max);
    printf("--Pdiss(mW) = "); scanf("%lf", &Pdiss);

    /*由约束条件计算器件尺寸参数*/
    //计算补偿电容Cc (pF)
    Cc = 0.22 * CL;
    Cc = (double)ceil(Cc); //补偿电容向上取整以保证PM

    //计算尾电流I5 (uA)
    I5 = SR * Cc;

    //计算S3, S4
    S3 = I5 / (KP * pow(((VDD - (Vcm_max - VTHN_min) - VTHP_max)), 2));
    S4 = S3;
    gm4 = sqrt(I5 * KP * S4);

    //计算S1, S2
    gm1 = 2.0 * PI * GB * Cc;
    S1 = pow(gm1, 2) / (KN * I5);
    S2 = S1;

    //计算S5
    VGS1 = sqrt(I5 / (KN * S1)) + VTHN_max;
    VDS5 = Vcm_min - VGS1 - VSS;
    S5 = 2.0 * I5 / (KN * VDS5 * VDS5);

    //计算S6
    gm6 = 2.2 * (2 * PI * GB) * CL;
    S6 = S4 * (gm6 / gm4);
    I6 = (gm6 * gm6) / (2.0 * KP * S6); //功耗的主要来源

    //计算S7
    S7 = S5 * (I6 / I5);

    //检查增益
    Av_real = 2.0 * gm1 * gm6 / (I5 * (LammdaN + LammdaP) * I6 * (LammdaP + LammdaN));

    //检查功耗
    Pdiss_real = (I5 + I6) * (VDD - VSS) / 1000.0;

    printf("----------设计结果如下-------------\n");
    printf("--S1 = %lf\n", S1);
    printf("--S2 = %lf\n", S2);
    printf("--S3 = %lf\n", S3);
    printf("--S4 = %lf\n", S4);
    printf("--S5 = %lf\n", S5);
    printf("--S6 = %lf\n", S6);
    printf("--S7 = %lf\n", S7);
    printf("--Cc(pF)= %lf\n", Cc);
    printf("--I5(uA) = %lf\n", I5);
    printf("--Av_real(V/V) = %lf\n", Av_real);
    printf("--Pdiss_real(mW) = %lf\n", Pdiss_real);
    printf("----------初步设计结束^_^----------\n");
	
	system("pause"); //暂停程序 查看结果
    return 0;
}

程序运行结果如下(程序中的输入设计指标为示例参数):
经典两级运放设计 | C语言辅助设计_第3张图片
附注:以上C语言代码生成的可执行文件可点击下载OPMAP

总结:
以上就是经典两级运放设计初步过程,由上面程序中得到的设计尺寸参数需要在仿真软件(Speture 或 Hspice等)仿真后,再做优化。

你可能感兴趣的:(模拟IC设计,C语言编程)