• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. RF Design
  3. Verilog-A large-signal model for a fixed-fixed beam RF MEMS...

Stats

  • Locked Locked
  • Replies 0
  • Subscribers 63
  • Views 13123
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Verilog-A large-signal model for a fixed-fixed beam RF MEMS capacitive switch, switched capacitor and varactor

vcaeken
vcaeken over 14 years ago

/* Verilog-A large-signal model for a fixed-fixed beam RF MEMS capacitive switch, switched capacitor and varactor.
Content of RF_MEMS_CAPACITOR.va. Open-source code covered by BSD license.

The Verilog-A large signal model can be used for operating point, small signal (AC, SP)
and large signal (HB, PSS, QPSS) simulations, using ADS, SpectreRF or Qucs. It includes
large-signal electromechanical effects, as well as small-signal Brownian noise. It does
not include electro-thermal effects yet.

Electromechanical: C-V hysteresis, hold-down, self-actuation,
    displacement-compensated squeeze-film damping
Noise: Brownian noise

5th of September, 2011
Check for update: www-personal.umich.edu/~vcaeken

Reference: "Modeling RF MEMS Devices", by K. Van Caekenberghe,
IEEE Microwave Magazine, vol. 13, no. 1, pp. 83-110, Jan.-Feb. 2012 */

`include "disciplines.vams"
`include "constants.vams"

module RF_MEMS_CAPACITOR (in,out);
    inout in, out;
    electrical in, out;
    kinematic z, velocity;

    // Dimensions
    parameter real g_0=2e-6 from (0:inf); // nominal gap height [m]
    parameter real l=300e-6 from (0:inf); // beam length [m]
    parameter real t=0.5e-6 from (0:inf); // beam thickness [m]
    parameter real t_d=0.2e-6 from [0:inf); // dielectric thickness [m]
    parameter real w=80e-6 from (0:inf); // beam width [m]
    parameter real W=100e-6 from (0:inf); // electrode width [m]
    // Material parameters: beam (gold)
    parameter real nu=0.44 from [0:inf); // Poisson ratio []
    parameter real rho=19.2e3 from (0:inf); // mass density [kg/m^3]
    parameter real sigma=100e6 from [0:inf); // residual stres [Pa]
    parameter real E=78e9 from (0:inf); // Young's modulus [Pa]
    // Material parameters: dielectric (silicon nitride)
    parameter real epsilon_r=7.6 from [1:inf); // dielectric constant []
    // Material parameters: gas (air):
    parameter real lambda = 1.5e-7 from [0:inf); // mean-free path [m]
    parameter real mu = 1.845e-5 from (0:inf); // viscosity coefficient [kg/(m.s)]
    // van der Waals and nuclear force coefficients
    parameter real c_1=10e-80 from [0:inf); // van der Waals force coefficient [N.m]
    parameter real c_2=10e-75 from [0:inf); // nuclear force coefficient [N.m^8]

    real A, b, C, C_d, C_u, F_c, F_e, F_s, f_m_0, IIP3, k_1, k_3, m, Q_e, Q_m, t_s_max, t_s_min, V_H, V_P, V_S;

    analog begin

    @ ( initial_step ) begin
        A=W*w;
        $strobe("\n%M: A (electrode area [m^2]) = %E",A);
        m=0.4*rho*l*t*w;
        $strobe("%M: m (effective beam mass [kg]) = %E",m);
        k_1=32*E*w*pow(t/l,3)*27/49+8*sigma*(1-nu)*w*t/l*3/5;
        $strobe("%M: k_1 (spring constant [N/m]) = %E",k_1);
        k_3=pow(`M_PI,4)*E*w*t/(8*pow(l,3));
        $strobe("%M: k_3 (stretching constant [N/m^3]) = %E",k_3);
        V_H=sqrt(2*k_1*g_0*pow(t_d/epsilon_r,2)/(`P_EPS0*epsilon_r*A));
        $strobe("%M: V_H (pull-in voltage [V]) = %E",V_H);
        V_P=sqrt(8*k_1*pow(g_0+t_d/epsilon_r,3)/(27*A*`P_EPS0));
        $strobe("%M: V_P (pull-in voltage [V]) = %E",V_P);
        f_m_0=sqrt(k_1/m)/(2*`M_PI);
        $strobe("%M: f_m_0 (mechanical resonant frequency [Hz]) = %E",f_m_0);
        Q_m=sqrt(E*rho)*pow(t,2)*pow(g_0,3)/(mu*pow(w*l/2,2));
        $strobe("%M: Q_m (mechanical quality factor []) = %E",Q_m);
        V_S=V_P;
        t_s_max=27*pow(V_P,2)/(4*2*`M_PI*f_m_0*Q_m*pow(V_S,2));
        $strobe("%M: t_s_max (maximum switching time [s], V_S = V_P) = %E",t_s_max);
        t_s_min=3.67*V_P/(V_S*sqrt(k_1/m));
        $strobe("%M: t_s_min (minimum switching time [s], V_S = V_P) = %E",t_s_min);
        C_u=`P_EPS0*A/(g_0+t_d/epsilon_r);
        $strobe("%M: C_u (up-state capacitance [F]) = %E",C_u);
        C_d=`P_EPS0*A/(t_d/epsilon_r);
        $strobe("%M: C_d (down-state capacitance [F]) = %E",C_d);
        IIP3=10*log(2*k_1*pow(g_0,2)/(`M_PI*10e9*pow(C_u*50,2)))+30;
        $strobe("%M: IIP3 (third order intercept [dBm], C=C_u, delta_f < f_m_0, f=10 GHz, Z=50 Ohm) = %E",IIP3);
    end

    // b: damping coefficient [N.s/m] (displacement-compensated squeeze-film damping)
    Q_e=Q_m*pow(1.1-pow(g_0*tanh(Pos(z)/g_0)/g_0,2),1.5)*(1+9.9638*pow(lambda/(g_0-g_0*tanh(Pos(z)/g_0)),1.159));
    $strobe("\n%M: Q_e (displacement-compensated mechanical quality factor []) = %E",Q_e);
    b=k_1/(2*`M_PI*f_m_0*Q_e);
    $strobe("%M: b (damping coefficient [N.s/m]) = %E",b);

        // Forces
    F_c=c_1*A/pow(g_0-g_0*tanh(Pos(z)/g_0)+1e-9,3)-c_2*A/pow(g_0-g_0*tanh(Pos(z)/g_0)+1e-9,10);
    $strobe("%M: F_c (attractive van der Waals and repulsive nuclear forces [N]) = %E",F_c);
        F_e=`P_EPS0*A*pow(V(out,in),2)/2/pow(g_0+t_d/epsilon_r-Pos(z),2);
        //F_e=`P_EPS0*A*pow(V(out,in),2)/2/pow(g_0+t_d/epsilon_r-g_0*tanh(Pos(z)/g_0),2); // Envelope simulation
    $strobe("%M: F_e (electrostatic force [N]) = %E",F_e);
        F_s=k_1*Pos(z)+k_3*pow(Pos(z),3);
        //F_s=k_1*g_0*tanh(Pos(z)/g_0)+k_3*pow(g_0*tanh(Pos(z)/g_0),3); // Envelope simulation
    $strobe("%M: F_s (spring force [N]) = %E",F_s);

    // Nonlinear time-varying state-space description
    Pos(velocity):ddt(Pos(z))==Pos(velocity);
    Pos(z):ddt(Pos(velocity))==1/m*(-b*Pos(velocity)-F_s+F_e+F_c+white_noise(4*`P_K*$temperature*b, "BROWNIAN_NOISE"));

    if (Pos(z)<g_0)
        C=`P_EPS0*A/(g_0+t_d/epsilon_r-Pos(z));   
    else
        C=C_d;

    I(out,in)<+ddt(C*V(out,in));

    end

endmodule
23th of July, 2011
K. Van Caekenberghe (vcaeken@umich.edu)
Check for update: www-personal.umich.edu/~vcaeken

Reference: "RF MEMS Theory, Design and Technology", by G. M. Rebeiz, Wiley, 2003 */

`include "disciplines.vams"
`include "constants.vams"

module RF_MEMS_CAPACITOR (in,out);
    inout in, out;
    electrical in, out;
    kinematic z, velocity;

    // Dimensions
    parameter real g_0=2e-6 from (0:inf); // nominal gap height [m]
    parameter real l=300e-6 from (0:inf); // beam length [m]
    parameter real t=0.5e-6 from (0:inf); // beam thickness [m]
    parameter real t_d=0.2e-6 from [0:inf); // dielectric thickness [m]
    parameter real w=80e-6 from (0:inf); // beam width [m]
    parameter real W=100e-6 from (0:inf); // electrode width [m]
    // Material parameters: beam (gold)
    parameter real nu=0.44 from [0:inf); // Poisson ratio []
    parameter real rho=19.2e3 from (0:inf); // mass density [kg/m^3]
    parameter real sigma=100e6 from [0:inf); // residual stres [Pa]
    parameter real E=78e9 from (0:inf); // Young's modulus [Pa]
    // Material parameters: dielectric (silicon nitride)
    parameter real epsilon_r=7.6 from [1:inf); // dielectric constant []
    // Material parameters: gas (air):
    parameter real lambda = 1.5e-7 from [0:inf); // mean-free path [m]
    parameter real mu = 1.845e-5 from (0:inf); // viscosity coefficient [kg/(m.s)]
    // van der Waals and nuclear force coefficients
    parameter real c_1=10e-80 from [0:inf); // van der Waals force coefficient [N.m]
    parameter real c_2=10e-75 from [0:inf); // nuclear force coefficient [N.m^8]

    real A, b, C, C_d, C_u, F_c, F_e, F_s, f_m_0, IIP3, k_1, k_3, m, Q_e, Q_m, t_s_max, t_s_min, V_H, V_P, V_S;

    analog begin

    @ ( initial_step ) begin
        A=W*w;
        $strobe("\n%M: A (electrode area [m^2]) = %E",A);
        m=0.4*rho*l*t*w;
        $strobe("%M: m (effective beam mass [kg]) = %E",m);
        k_1=32*E*w*pow(t/l,3)*27/49+8*sigma*(1-nu)*w*t/l*3/5;
        $strobe("%M: k_1 (spring constant [N/m]) = %E",k_1);
        k_3=pow(`M_PI,4)*E*w*t/(8*pow(l,3));
        $strobe("%M: k_3 (stretching constant [N/m^3]) = %E",k_3);
        V_H=sqrt(2*k_1*g_0*pow(t_d/epsilon_r,2)/(`P_EPS0*epsilon_r*A));
        $strobe("%M: V_H (pull-in voltage [V]) = %E",V_H);
        V_P=sqrt(8*k_1*pow(g_0+t_d/epsilon_r,3)/(27*A*`P_EPS0));
        $strobe("%M: V_P (pull-in voltage [V]) = %E",V_P);
        f_m_0=sqrt(k_1/m)/(2*`M_PI);
        $strobe("%M: f_m_0 (mechanical resonant frequency [Hz]) = %E",f_m_0);
        Q_m=sqrt(E*rho)*pow(t,2)*pow(g_0,3)/(mu*pow(w*l/2,2));
        $strobe("%M: Q_m (mechanical quality factor []) = %E",Q_m);
        V_S=V_P;
        t_s_max=27*pow(V_P,2)/(4*2*`M_PI*f_m_0*Q_m*pow(V_S,2));
        $strobe("%M: t_s_max (maximum switching time [s], V_S = V_P) = %E",t_s_max);
        t_s_min=3.67*V_P/(V_S*sqrt(k_1/m));
        $strobe("%M: t_s_min (minimum switching time [s], V_S = V_P) = %E",t_s_min);
        C_u=1.4*`P_EPS0*A/(g_0+t_d/epsilon_r);
        $strobe("%M: C_u (up-state capacitance [F]) = %E",C_u);
        C_d=0.65*`P_EPS0*A/(t_d/epsilon_r);
        $strobe("%M: C_d (down-state capacitance [F]) = %E",C_d);
        IIP3=10*log(2*k_1*pow(g_0,2)/(`M_PI*10e9*pow(C_u*50,2)))+30;
        $strobe("%M: IIP3 (third order intercept [dBm], C=C_u, delta_f < f_m_0, f=10 GHz, Z=50 Ohm) = %E",IIP3);
    end

    // b: damping coefficient [N.s/m] (displacement-compensated squeeze-film damping)
    Q_e=Q_m*pow(1.1-pow(g_0*tanh(Pos(z)/g_0)/g_0,2),1.5)*(1+9.9638*pow(lambda/(g_0-g_0*tanh(Pos(z)/g_0)),1.159));
    $strobe("\n%M: Q_e (displacement-compensated mechanical quality factor []) = %E",Q_e);
    b=k_1/(2*`M_PI*f_m_0*Q_e);
    $strobe("%M: b (damping coefficient [N.s/m]) = %E",b);

    // Forces
    F_c=c_1*A/pow(g_0-g_0*tanh(Pos(z)/g_0)+1e-9,3)-c_2*A/pow(g_0-g_0*tanh(Pos(z)/g_0)+1e-9,10);
    $strobe("%M: F_c (attractive van der Waals and repulsive nuclear forces [N]) = %E",F_c);
    F_e=`P_EPS0*A*pow(V(out,in),2)/2/pow(g_0+t_d/epsilon_r-Pos(z),2);
    //F_e=1.4*`P_EPS0*A*pow(V(out,in),2)/2/pow(g_0+t_d/epsilon_r-g_0*tanh(Pos(z)/g_0),2); // Envelope simulation
    $strobe("%M: F_e (electrostatic force [N]) = %E",F_e);
    F_s=k_1*Pos(z)+k_3*pow(Pos(z),3);
    //F_s=k_1*g_0*tanh(Pos(z)/g_0)+k_3*pow(g_0*tanh(Pos(z)/g_0),3); // Envelope simulation
    $strobe("%M: F_s (spring force [N]) = %E",F_s);

    // Nonlinear time-varying state-space description
    Pos(velocity):ddt(Pos(z))==Pos(velocity);
    Pos(z):ddt(Pos(velocity))==1/m*(-b*Pos(velocity)-F_s+F_e+F_c+white_noise(4*`P_K*$temperature*b, "BROWNIAN_NOISE"));

    if (Pos(z)<g_0)
        C=1.4*`P_EPS0*A/(g_0+t_d/epsilon_r-Pos(z));    
    else
        C=C_d;

    I(out,in)<+ddt(C*V(out,in));

    end

endmodule

  • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information