Connect with us

multilayer microstrip

Discussion in 'Electronic Design' started by yonni, Jul 5, 2006.

Scroll to continue with content
  1. yonni

    yonni Guest

    Hello,
    i need to deign a multilayer microstrip with more then two layers and i
    need to calculate the charateristic impedance(Z0)of the line.
    i'm looking for a model or a software that can make this calculation.
    thanks for help
    yoni
     
  2. John  Larkin

    John Larkin Guest


    Agilent's Appcad.

    John
     
  3. Grumps

    Grumps Guest

    And the first thing you must do (IIRC) is switch the sound off.
     
  4. Joerg

    Joerg Guest

    Maybe this helps:
    http://www.emclab.umr.edu/pcbtlc2/index.html
     
  5. Guest

    If you know all the details of your materials, and you are doing
    differential pairs, then this script might help (note there is a known
    bug in the signal velocity calculation that I haven't bothered to fix).

    This requires you to know the thicknesses and dielectric constants of
    the board material and the prepreg (varies widely) for the stack you
    are using.

    --------------------------------------------

    Invoke with perl <filename you save it as>

    # top-level options

    # Globals

    $Pi = 3.1415926535;

    # main
    print "\n\n";
    print "Impedance calculator\n\n";
    print "Source material:\n Johnson & Graham, ";
    print "\"High-Speed Digital Design.\" 1993. Appendix C.\n";
    print "Differential impedance calculations based on empirical data\n";
    {
    my ($choice);
    do {
    print "\nEnter S for stripline, M for microstrip, X to exit
    <$choice>: ";
    $entry = <>;
    chomp $entry;
    $choice = uc $entry unless $entry eq "";
    print "\n";

    if ($choice eq "S") {
    STRIPLINE();
    }

    if ($choice eq "M") {
    MICROSTRIP();
    }
    } until ($choice eq "X")
    }

    # Subroutines
    BEGIN {

    sub E_skny($$$) {
    local ($h,$w,$Er) = @_;
    return ($Er + 1) / 2 + ($Er - 1) / 2 * ((1 + 12 * $h / $w) ** -0.5 +
    0.04*(1-$w/$h)**2);
    }

    sub E_wide($$$) {
    local ($h,$w,$Er) = @_;
    return ($Er + 1) / 2 + ($Er - 1) / 2 * (1 + 12 * $h / $w) ** -0.5;
    }

    sub E_temp($$$) {
    local ($h, $w, $Er) = @_;
    return ( $w > $h ? E_wide($h, $w, $Er) : E_skny($h, $w, $Er));
    }

    sub EEFF($$$$) {
    local ($h, $w, $t, $Er) = @_;
    return E_temp($h, $w, $Er) - (($Er - 1) * $t / $h) / 4.6 * ($w / $h)
    ** 0.5;
    }

    sub WE_skny($$$) {
    local ($h, $w, $t) = @_;
    return $w + (1.25 * $t)/$Pi * (1 + log(4 * $Pi * $w / $t));
    }

    sub WE_wide($$$) {
    local ($h, $w, $t) = @_;
    return $w + (1.25 * $t)/$Pi * (1 + log(2 * $h / $t));
    }

    sub WE($$$) {
    local ($h, $w, $t) = @_;
    return ($w > $h / (2 * $Pi) ? WE_wide($h, $w, $t) : WE_skny($h, $w,
    $t));
    }

    sub ZMS_skny($$$) {
    local ($h, $w, $t) = @_;
    return 60 * log((8 * $h / WE($h, $w, $t)) + (WE($h, $w, $t) / (4 *
    $h)));
    }

    sub ZMS_wide($$$) {
    local ($h, $w, $t) = @_;
    return 120 * $Pi / (WE($h, $w, $t) / $h + 1.393 + 0.667 *
    log(WE($h, $w, $t) / $h + 1.444));
    }

    sub ZMSTRIP($$$$) {
    local ($h, $w, $t, $Er) = @_;
    return ($w > $h ? ZMS_wide($h, $w, $t) : ZMS_skny($h, $w, $t)) /
    EEFF($h, $w, $t, $Er) ** 0.5;
    }

    sub PMSTRIP($$$$) {
    local ($h, $w, $t, $Er) = @_;
    return 84.72e-12 * EEFF($h, $w, $t, $Er) ** 0.5;
    }

    sub LMSTRIP($$$$) {
    local ($h, $w, $t, $x) = @_;
    return PMSTRIP($h, $w, $t, 1) * ZMSTRIP($h, $w, $t, 1) * $x;
    }

    sub CMSTRIP($$$$$) {
    local ($h, $w, $t, $Er, $x) = @_;
    return PMSTRIP($h, $w, $t, $Er) / ZMSTRIP($h, $w, $t, $Er) * $x;
    }

    { # this block makes the "my" below permanent
    my ($h, $w, $t, $s);
    sub MICROSTRIP {
    print "\nMicrostrip configuration\n";
    $h *= 1000;
    $w *= 1000;
    $t *= 1000;
    $s *= 1000;
    print "Enter height to reference plane (mil) <$h>: ";
    $input = <>;
    $h = $input unless $input eq "\n";
    print "Enter width of track (mil) <$w>: ";
    $input = <>;
    $w = $input unless $input eq "\n";
    print "Enter separation of diff traces <$s>: ";
    $input = <>;
    $s = $input unless $input eq "\n";
    print "Enter thickness of trace (mil) (1oz = 1.37) <$t>: ";
    $input = <>;
    $t = $input unless $input eq "\n";
    print "Enter dielectric constant <$Er>: ";
    $input = <>;
    $Er = $input unless $input eq "\n";

    $h /= 1000;
    $w /= 1000;
    $t /= 1000;
    $s /= 1000;
    chomp $Er;

    $hi_accuracy = 0;
    if (($t / $h > 0) && ($t / $h < 0.2)) {
    if (($w / $h > 0.1) && ($w / $h < 20)) {
    if (($Er > 0) && ($Er < 16)) {
    $hi_accuracy = 1;
    }
    }
    }

    print "\n";
    $Zo = ZMSTRIP($h, $w, $t, $Er);
    printf "Calculated impedance (ohm): %6.2f ", $Zo;
    print ($hi_accuracy ? "(accuracy > 98%)" : "(accuracy
    undefined)");
    print "\n";
    printf "Differential impedance (ohm): %6.2f (+/-10%)\n",
    ZMDIFF ($Zo, $s, $h);
    printf "Calculated prop delay (in/ns): %6.2f\n", 1e-9 /
    PMSTRIP($h, $w, $t, $Er);
    printf "Calculated inductance (nH/in): %6.2f\n", 1e9 *
    LMSTRIP($h, $w, $t, 1);
    printf "Calculated capacitance (pF/in): %6.2f\n", 1e12 *
    CMSTRIP($h, $w, $t, $Er, 1);
    }
    }

    sub ZSTR_K1 ($$) {
    local ($w, $t) = @_;
    local ($tmp1, $tmp2, $tmp3) = 0;
    $tmp1 = 1 + log(4 * $Pi * $w / $t);
    $tmp2 = 1 + $t * $tmp1 / ($Pi * $w);
    $tmp3 = $tmp2 + 0.255 * ($t / $w) ** 2;
    return $w * $tmp3 / 2;
    }

    sub ZSTR_skny ($$$$) {
    local ($b, $w, $t, $Er) = @_;
    return 60 / ($Er ** 0.5) * log (4 * $b / ($Pi * ZSTR_K1($w, $t)));
    }

    sub ZSTR_K2 ($$) {
    local ($b, $t) = @_;
    local ($tmp1) = 0;
    $tmp1 = 1 - $t / $b;
    return 2 / $tmp1 * log(1 / $tmp1 + 1) - (1 / $tmp1 - 1) *
    log(1 / $tmp1 ** 2 - 1);
    }

    sub ZSTR_wide ($$$$) {
    local ($b, $w, $t, $Er) = @_;
    return 94.15 / $Er ** 0.5 / ( ($w / $b) / (1 - $t / $b) +
    ZSTR_K2 ($b, $t) / $Pi);
    }

    sub ZSTRIP ($$$$) {
    local ($b, $w, $t, $Er) = @_;
    return ($w > 0.35 * $b ? ZSTR_wide($b, $w, $t, $Er) :
    ZSTR_skny ($b, $w, $t, $Er));
    }

    sub ZOFFSET ($$$$$) {
    local ($h1, $h2, $w, $t, $Er) = @_;
    return (2 * ZSTRIP(2 * $h1 + $t, $w, $t, $Er) *
    ZSTRIP(2 * $h2 + $t, $w, $t, $Er)) /
    (ZSTRIP(2 * $h1 + $t, $w, $t, $Er) +
    ZSTRIP(2 * $h2 + $t, $w, $t, $Er));
    }

    sub PSTRIP($) {
    local $Er = @_;
    return 84.72e-12 * $Er ** 0.5;
    }

    sub LSTRIP($$$$) {
    local ($b, $w, $t, $x) = @_;
    return PSTRIP(1) * ZSTRIP($b, $w, $t, 1) * $x;
    }

    sub LOSTRIP($$$$$) {
    local ($h1, $h2, $w, $t, $x) = @_;
    return PSTRIP(1) * ZOFFSET($h1, $h2, $w, $t, 1) * $x;
    }

    sub CSTRIP($$$$$) {
    local ($b, $w, $t, $Er, $x) = @_;
    return PSTRIP($Er) / ZSTRIP($b, $w, $t, $Er);
    }

    sub COSTRIP($$$$$$) {
    local ($h1, $h2, $w, $t, $Er, $x) = @_;
    return PSTRIP($Er) / ZOFFSET($h1, $h2, $w, $t, $Er);
    }

    { # this line makes the "my" below permanent
    my ($h1, $h2, $w, $t, $s);
    sub STRIPLINE {
    print "\nStripline configuration\n";
    $h1 *= 1000;
    $h2 *= 1000;
    $w *= 1000;
    $t *= 1000;
    $s *= 1000;
    print "Enter distance to reference plane above (mil) <$h1>: ";
    $input = <>;
    $h1 = $input unless $input eq "\n";
    print "Enter distance to reference plane below (mil) <$h2>: ";
    $input = <>;
    $h2 = $input unless $input eq "\n";
    print "Enter width of track (mil) <$w>: ";
    $input = <>;
    $w = $input unless $input eq "\n";
    print "Enter separation of diff traces <$s>: ";
    $input = <>;
    $s = $input unless $input eq "\n";
    print "Enter thickness of trace (mil) (1oz = 1.37) <$t>: ";
    $input = <>;
    $t = $input unless $input eq "\n";
    print "Enter dielectric constant <$Er>: ";
    $input = <>;
    $Er = $input unless $input eq "\n";

    $h1 /= 1000;
    $h2 /= 1000;
    $w /= 1000;
    $t /= 1000;
    $s /= 1000;
    chomp $Er;

    $b = $h1 + $h2 + $t;
    $hi_accuracy = 0;

    if ($h1 == $h2) {
    print "Symmetric stripline configuration\n\n";
    if (($t / $b < 0.25) && ($t / $w < 0.11)) { $hi_accuracy = 1 }
    $symmetric = 1;
    }
    else {
    print "Asymmetric stripline configuration\n\n";
    $symmetric = 0;
    }

    $Zo = ($symmetric ? ZSTRIP($b,$w,$t,$Er) : ZOFFSET($h1, $h2, $w,
    $t, $Er));
    printf "Calculated impedance (ohm): %6.2f ", $Zo;
    print ($hi_accuracy ? "(accuracy > 98.7%)" : "(accuracy
    undefined)");
    print "\n";
    printf "Differential impedance (ohm): %6.2f (+/-10%)\n",
    ZSDIFF($Zo, $s, $h1, $h2);
    printf "Calculated prop delay (in/ns): %6.2f\n", 1e-9 /
    PSTRIP($Er);
    printf "Calculated inductance (nH/in): %6.2f\n", 1e9 *
    ($symmetric ? LSTRIP($b, $w, $t, 1) : LOSTRIP($h1, $h2, $w, $t, 1));
    printf "Calculated capacitance (pF/in): %6.2f\n", 1e12 *
    ($symmetric ? CSTRIP($b, $w, $t, $Er, 1) :
    COSTRIP($h1, $h2, $w, $t, $Er, 1));
    }
    }
    sub ZMDIFF ($$$) {
    my ($Zo, $s, $h) = @_;
    return 2*$Zo*(1-0.48*exp(-.96*$s/$h));
    }
    sub ZSDIFF ($$$$) {
    my ($Zo, $s, $h1, $h2) = @_;
    return 2*$Zo*(1-0.374*exp(-2.9*$s/($h1+$h2)));
    }
    }
    ----------------------------------------------------------
     
  6. upda

    upda Guest

  7. vasile

    vasile Guest


    Why ? Usually the microstrip active line is on the top (where the RF
    components are soldered) and ground on the bottom. Every via means a
    parasytic inductance.
    Knowing the epsilon of the board, the trace width, the copper/gold
    thickness and isolations between the line and ground you may design
    exactly the line impedance. The line lenght gaves you the phase of the
    signal measured from the reference point.
    You need to get microwave office or other RF design program.

    greetings,
    Vasile
     
  8. yonni

    yonni Guest

    sorry but i need to produce a microstrip that is seen like
    this
     
  9. John  Larkin

    John Larkin Guest


    Ah, mixed dielectrics. You could either

    1. estimate effective E and run a regular microstrip program

    or

    2. use a real field-solver. ATLC would work and is free, if a bit of a
    pain to use. There are others around, maybe demo/student versions.
    Sonnet Lite might work, but I'm not sure it will let you mix layers
    like this. Otherwise expect big bucks.

    What are the dielectric constants here? Are the traces long enough,
    and the frequency high enough, that transmission line effects matter?
    Distributed amplifier or something like that?

    John
     
  10. yonni

    yonni Guest

    the microstrip is oen end with length of ~1-2 cm and the freq. is
    6-10Ghz
    yonni
     
  11. Robert

    Robert Guest

    You might take a look here:
    http://www.circuitsage.com/tline.html

    A lot of transmission line tools both free and otherwise.

    Robert
     
  12. yonni

    yonni Guest

    thanks for the anser robet
    but didn't found a good software for my application
     
  13. John  Larkin

    John Larkin Guest


    This site has ATLC, which would do what you want, as I understand the
    problem.

    John
     
  14. yonni

    yonni Guest

    sorry but i have problem becuase i'm usig windows xp and this program
    is for linux
     
  15. John  Larkin

    John Larkin Guest

    There is a Windows version.


    John
     
  16. Joel Kolstad

    Joel Kolstad Guest

    ....plus -- at least if the OP is in the US -- you can buy a Linux box at
    Fry's for all of $229 these days...
     
  17. JeffM

    JeffM Guest

Ask a Question
Want to reply to this thread or ask your own question?
You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.
Electronics Point Logo
Continue to site
Quote of the day

-