electrical level conversion

Oh. If both clock inputs are internally terminated, the simplest thing might to be to use an active buffer, an lvds-lvds part with two differential outputs. It could be a dual buffer or one of the fanout things with one input and multiple outputs. Four resistors at the pecl output would pull down the pecl and shift the dc level down to make the lvds buffer inputs all nice and legal. Then just route pairs from each lvds output to the Vertex clock inputs.

Check TI and National for apropriate lvds buffers. You'll need some software to calculate the differential trace impedances, Txline maybe.

John

Reply to
John Larkin
Loading thread data ...

Hoping they will chime in, I have added caf.

Reply to
Richard Henry

All,

I have previously posted on the differential input circuit that we (Xilinx) use.

I will repeat what I have said before: the differential input circuit is a full CMOS differential comparator. It will operate (function) from rail to rail on its inputs. Its performance has only been characterized for LVDS, and low voltage LVPECL common mode voltages and swings.

Now for the new part: there are no configuration bits to select anything. The comparator is the comparator, and it is the same circuit regardless of standard selected. If it is differential, it is the same circuit.

Hope this helps,

Austin

Reply to
Austin Lesea

I have a perl script I posted some time ago that calculates differential impedance (there's a bug I have never fixed in the propagation velocity, though).

I've used this a number of times and empirically it agrees with the board manufacturer's data when they calculate the requirements for me.

Once I get home, I'll post it again.

Cheers

PeteS

Reply to
PeteS

# 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 : "; $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) : "; $input = ; $h = $input unless $input eq "\\n"; print "Enter width of track (mil) : "; $input = ; $w = $input unless $input eq "\\n"; print "Enter separation of diff traces : "; $input = ; $s = $input unless $input eq "\\n"; print "Enter thickness of trace (mil) (1oz = 1.37) : "; $input = ; $t = $input unless $input eq "\\n"; print "Enter dielectric constant : "; $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) : "; $input = ; $h1 = $input unless $input eq "\\n"; print "Enter distance to reference plane below (mil) : "; $input = ; $h2 = $input unless $input eq "\\n"; print "Enter width of track (mil) : "; $input = ; $w = $input unless $input eq "\\n"; print "Enter separation of diff traces : "; $input = ; $s = $input unless $input eq "\\n"; print "Enter thickness of trace (mil) (1oz = 1.37) : "; $input = ; $t = $input unless $input eq "\\n"; print "Enter dielectric constant : "; $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))); } }

Reply to
PeteS

It is, incidentally, a *very good* comparator!

John

Reply to
John Larkin

One caution, most Xilinx LVDS inputs have a Cin of around 8-12 pF (single ended), which will cause horrible {re}reflections when driven directly in a multidrop topology from a fast ECL driver- unless those MGT clock inputs have much better Cin than the regular LVDS inputs.

Given the physical size of an FX60 package, there's likely to be enough distance between the two inputs to create a ledge or double clock with both inputs hanging off of the same net like that.

The fanout buffer is probably the best solution, but if I had to make it work driving two 10 pF inputs with internal Rterm from a single net, I'd probably try series R's at each clock input to form a higher impedance line tap/divider coupling a portion of the signal off of an externally end-terminated net.

other related FPGA LVDS notes:

- Spartan 3E LVDS inputs have a much improved Cin of around 3 pF

- Xilinx common mode input range with internal terminations: Although the LVDS inputs WITHOUT internal termination have a wide common mode range, the internally terminated variants (DIFF_TERM, DT) apparently are restricted to the much narrower common mode range of the associated differential OUTPUT standard to meet the specified internal termination tolerance

- resistive ECL level shifts for solitary FPGA LVDS inputs: When driving a single LVDS input, I usually use something like Fig. 15 of AN1568, which creates the shift with a tapped pulldown: -

formatting link

Plus additional provision for a series Rs from each junction, letting you tweak the back termination to match the line.

Those resistors can then all be placed right at the driver, far, far away from the cluttered BGA breakout pattern, with the typical LVDS 100 ohm Rdiff at the receiver input.

Brian

Reply to
Brian Davis

Brian,

The specification is min 3pF; max 10 pF for 3E.

Aust> John Lark>

Reply to
Austin

Try looking at the IBIS files, which show a total max Cin ( C_pkg plus C_comp ) of a mere 2.4 pF for a VQ100.

Measured reflections off a fast LVDS driver in the lab also agree with a Cin value in that range.

Perhaps I should file a WebCase asking Xilinx to update their datasheet to match their IBIS files :)

Also, as I mentioned last April, detail for the different pin types is also missing from the datasheet:

formatting link

Brian

Reply to
Brian Davis

Brian,

I will look into that. From what I know about the design, the only way to reduce the C is to leave out the LVDS output driver (0.5pF less), or make the IO drive strength smaller. Until we drop the high output standards, the C is unlikely to get any smaller (just physics of a general purpose pin). It may be that 3E drops some of these (I will check).

The Vref pins do not have any more load, until they are programmed to be a Vref, so we do not specify their C as a Vref (as the recommendation is to put a 0.1uF as close as possible to the Vref pin anyway).

Sometimes a missing specification is just something not needed.

But, if you filed it as a case, you should have received a reply as to why the specification did not require an update. Case #?

Austin

Reply to
Austin

The simplified S3E I/O drops DCI and some of the higher drive standards vs. S3, and adds DIFF_TERM support.

Some inputs, such as global clocks or the MGT clock inputs of this thread, are likely to differ from general I/O, but are not documented as such in that single datasheet spec, nor in the IBIS files.

If the "perhaps" and the smiley didn't give it away, that was intended as a humorous observation for those of us who have filed WebCases.

Brian

Reply to
Brian Davis

Are you the Brian Davis that workled for Microdyne?

--
Service to my country? Been there, Done that, and I\'ve got my DD214 to
prove it.
Member of DAV #85.

Michael A. Terrell
Central Florida
Reply to
Michael A. Terrell

Brian,

That would make sense (dropping a low voltage strong standard reduces pin C). Dropping DCI would hardly save anything except area, however.

I will take it that you did not file a webcase. With a webcase number, it could be tracked and solved, or escalated (and solved). Or even reported to myself or Peter (as some have done).

Now that Spartan has "grown up", they are making their own decisions as to what to spend their silicon on, so I have lost track of some of their features. I should not have replied for them, as I really don't know what they are doing (without asking).

Austin

Brian Davis wrote:

Reply to
Austin

Brian,

OK, now I see it. Spartan 3/3E/3A dropped HSTL IV, which is a 48 mA drive strength standard. III is 24 mA. That means the area required is cut in half, so the C could be half that of the Virtex series IOB's (that have HSTL IV).

I wonder how many people need IV?

Aust> Brian,

Reply to
Austin Lesea

Not me, sorry!

Aust>

If you look at the available S3E TTL/LVCMOS drive strengths, they are mostly around half of the S3 max strengths.

Sym>

Not yet, only took some initial measurements on an eval board of an I/O capable global clock pair in a FT256 package, which seemed in line with a ~3 pF Cin.

Note that many of those input only pins don't travel in pairs, and they also lack the internal termination feature.

I also haven't spotted any detail on those, or any limits for the S3E diff_term range.

BTW, if you check the S3A datasheet, they provide better numbers for the DIFF_TERM range and spec them for usage at 3.3V VCCIO; they've also gone to a top/bottom left/right split between the "goes to eleven" drivers and the lightweight S3E versions.

Brian

Reply to
Brian Davis

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.