Home > Community > Forums > RF Design > Verilog-A large-signal model for an ohmic cantilever RF MEMS switch

Email

* Required Fields

Recipients email * (separate multiple addresses with commas)

Your name *

Your email *

Message *

Contact Us

* Required Fields
First Name *

Last Name *

Email *

Company / Institution *

Comments: *

 Verilog-A large-signal model for an ohmic cantilever RF MEMS switch 

Last post Wed, Dec 15 2010 9:13 AM by vcaeken. 0 replies.
Started by vcaeken 15 Dec 2010 09:13 AM. Topic has 0 replies and 1523 views
Page 1 of 1 (1 items)
Sort Posts:
  • Wed, Dec 15 2010 9:13 AM

    • vcaeken
    • Not Ranked
    • Joined on Fri, Aug 13 2010
    • Posts 3
    • Points 15
    Verilog-A large-signal model for an ohmic cantilever RF MEMS switch Reply

    /* Verilog-A large-signal model for a ohmic cantilever RF MEMS switch
    Content of OHMIC_CANTILEVER_RF_MEMS_SWITCH.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 and
    Johnson-Nyquist noise.

    Electromechanical: C-V hysteresis, hold-down, self-actuation,
        displacement-compensated squeeze-film damping
    Noise: Brownian noise, Johnson-Nyquist noise (not included: 1/f noise)

    23th of July, 2011
    K. Van Caekenberghe (vcaeken@umich.edu)
    Check for update: http://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 OHMIC_CANTILEVER_RF_MEMS_SWITCH(s,d,g);
        inout s, d, g;
        electrical s, d, g;
        kinematic z, velocity;

        // Dimensions
        parameter real g_0=0.6e-6 from (0:inf); // nominal gap height [m]
        parameter real g_d=0.2e-6 from (0:inf); // nominal gap height minus dimple thickness [m]
        parameter real l=75e-6 from (0:inf); // beam length [m]
        parameter real t=5e-6 from (0:inf); // beam thickness [m]
        parameter real w=30e-6 from (0:inf); // beam width [m]
        parameter real W_c=10e-6 from (0:inf); // contact width [m]
        parameter real W=10e-6 from (0:inf); // electrode width [m]
        parameter real x=30e-6 from (0:inf); // beam anchor to electrode edge distance [m]
        // Electrical parameters
        parameter real R_c=1.0 from [0:inf); // contact resistance [Ohm]
        // Material parameters: beam (gold)
        parameter real rho=19.2e3 from (0:inf); // mass density [kg/m^3]
        parameter real E=78e9 from (0:inf); // Young's modulus [Pa]
        // 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_ds, C_gs, C_u, F_c, F_e, F_s, f_m_0, I1, I2, IIP3, k_1, 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=2*E*w*pow(t/l,3)*(1-x/l)/(3-4*pow(x/l,3)+pow(x/l,4));
            $strobe("%M: k_1 (spring constant [N/m]) = %E",k_1);
            V_H=sqrt(2*k_1*(g_0-g_d)*pow(g_d,2)/(`P_EPS0*A));
            $strobe("%M: V_H (hold-down voltage [V]) = %E",V_H);
            V_P=sqrt(8*k_1*pow(g_0,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));
            $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*W_c*w/g_0;
            $strobe("%M: C_u (up-state capacitance [F]) = %E",C_u);
            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_d*tanh(Pos(z)/g_d)/g_0,2),1.5)*(1+9.9638*pow(lambda/(g_0-g_d*tanh(Pos(z)/g_d)),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*W_c*w/pow(g_d-g_d*tanh(Pos(z)/g_d)+1e-9,3)-c_2*W_c*w/pow(g_d-g_d*tanh(Pos(z)/g_d)+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(s,g),2)/2*1/pow(g_0-Pos(z),2);
        //F_e=`P_EPS0*A*pow(V(s,g),2)/2*1/pow(g_0-g_d*tanh(Pos(z)/g_d),2); // Envelope simulation
        $strobe("%M: F_e (electrostatic force [N]) = %E",F_e);
        F_s=k_1*Pos(z);
        //F_s=k_1*g_d*tanh(Pos(z)/g_d); // Envelope simulation
        $strobe("%M: F_s (spring force [N]) = %E",F_s);

        // Nonlinear 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"));

        C_ds=1.4*`P_EPS0*W_c*w/(g_0-Pos(z));
        I1=ddt(C_ds*V(d,s));
        I2=V(d,s)/R_c+white_noise(4*`P_K*$temperature/R_c, "JOHNSON_NYQUIST_NOISE_R_c");
        if (Pos(z)<g_d)
            I(d,s)<+I1;
        else
            I(d,s)<+I2;

        C_gs=1.4*`P_EPS0*A/(g_0-Pos(z));
        I(g,s)<+ddt(C_gs*V(g,s));

        end

    endmodule

    Filed under:
    • Post Points: 5
Page 1 of 1 (1 items)
Sort Posts:
Started by vcaeken at 15 Dec 2010 09:13 AM. Topic has 0 replies.