# multilayer microstrip

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

1. ### yonniGuest

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 LarkinGuest

Agilent's Appcad.

John

3. ### GrumpsGuest

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

4. ### JoergGuest

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)));
}
}
----------------------------------------------------------

7. ### vasileGuest

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. ### yonniGuest

sorry but i need to produce a microstrip that is seen like
this

9. ### John LarkinGuest

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. ### yonniGuest

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

11. ### RobertGuest

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

A lot of transmission line tools both free and otherwise.

Robert

12. ### yonniGuest

thanks for the anser robet
but didn't found a good software for my application

13. ### John LarkinGuest

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

John

14. ### yonniGuest

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

15. ### John LarkinGuest

There is a Windows version.

John

16. ### Joel KolstadGuest

....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. ### JeffMGuest

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.
Continue to site