VCO部の回路説明

 任意の周波数を電圧により可変させることが可能な発振器です。
 周波数の生後は、VCOの電圧対周波数の絶対精度と制御電圧の絶対精度をとることが難しいため、通常はPLLで他のクロックと比較し、相対的に電圧制御されます。
 高周波ではコルピッツLC発振という発振回路がよく使われているようです。
 PC用のPLLでは、CMOSインバーターの単純帰還発振を使い、インバーターの電源電圧を変化さることでVCOにしている回路も見られます。
 ここではSpartanIIの特徴を最大限いかすために、最も基本的なCR+インバーター発振器をベースに裏技を使ってVCO化します。

1.基本構成

 C11,R11に時定数をもたせた、シュミットトリガインバーターのCR発振器です。
 SpartanIIのIOはシュミットトリガではないため、VCO_INHでHレベル(LVTTL=1.65V)、VCO_INLでLレベル(GTL=VREF)をSRラッチ構成で判定しています。

 VREFを使用するため、同バンク内のVREF端子をすべて使ってしまうため、貴重なピンリソースを多く占有します。TQ144パッケージでは、VREFx4,OUTx1,INx2で計7本のピンが必要です。

 VREFを可変させるという規定外の使い方もするため、この回路は実験程度にしておいたほうがよいでしょう。
 FEXT-PLLなどで採用されている74VHC04のゲート帰還型発振器+FETによる電源電圧制御方式なら、74VHC04、FET、パスコン、直流カット用コンデンサ、バイアス用抵抗2本に、SpartanIIのI/Oが1ポート必要で、こちらの方が実用的だと思います。電源安定化も楽そうです。

2.VCO化

 SpartanIIのGTL入力ポートは、VCCOを必要とせず(3.3V可能)、入力スレッシュホールド電圧としてVREF端子電圧(通常1.0V)を使用するタイプのポートです。
 このGTL入力ポートにおいて、VREF電圧を変更させると、当然スレッシュホールド電圧が変化し、低電圧高速コンパレーターとして流用可能になります。
 基準電圧となるVREF入力電流は、MAX 20uA/PINと微少なため比較的高インピーダンスのPLLループバックフィルタを繋ぐにはうってつけです。
 なお、SpartanIIの入力ポートでは、ヒステリシス幅がGTLに限らず実測値で0.1〜0.2V程度のようでした。データシートでは規定がなくバス規格の数値が記載されています。

 このVCOにおいては、VREF電圧の変動によりL側のシュレッシュホールド電圧が変動することでヒステリシス幅も変動し、充放電時間が増減することにより周波数が変動します。

 もちろんこのような使い方は規定外で動作保証外ですが、VCOのコントロール電圧の変動は緩やかで、Lレベルのみの検出で、絶対定格も越えていないため、VCCO電圧を越えない限りには、問題はなさそうです。
 そもそも、IOを発振回路などに使ってはいけないと思われるので、動作保証など気にしている場合ではありません。石が壊れる危険がなければそれでよいことにします。

3.周波数可変範囲

 SpartanII内部のDLLは、最低入力周波数が25MHz〜80MHzなので、25MHz〜50MHz の周波数をターゲットとしました。
 25MHz〜50MHzでジッター1ns以内(DLLの規定)におさめれば、SpartanIIのDLLで2倍、または4倍にできるため、分周回路も組み合われば0Hz〜160MHzまでの「まさに任意」の周波数が作れるはずです。

 CR充放電が有効な周波数領域では、出力Lレベル、充放電カーブ、スレッシュホールド精度などの制限から、VREF(TP2)=0.6V〜1.5V程度の時の、発振周波数が有効な可変範囲の目安となるでしょう。
 現状の定数(C11=100pF,R11=470ohm)において、25MHz〜50MHzがなんとか実用範囲に収まっているようです。ただし温度テストは全然やってません。

4.周波数安定度

 SpartanIIに組み込めれた周波数モニタでは、7桁の精度をたたき出しました。
 もっともPLLでフィードバックを掛けているので、ロックさえすれば長期測定(0.5sec) で周波数が源発振に対して一致するのは当たり前なのです。
 問題は短い時間でみた場合のジッターなのだが、これはTP1を実測してみないとわからりません。
 オシロでTP1を測定したところ、25MHz〜50MHzにおいて、1nsecの変動をみませんでしたので、DLLのクロックソースとして合格でしょう。

 最大の懸念は...Hレベルの検出電圧です。
 これはLVTTL入力レベルでVCCOを基準にしているが、他の出力ポート等の電源もVCCOからとられているため、出力ポートのドライブ状況によりVCCOが変動したりノイズが飛んできたりする可能性があります。
 データシートでも、同時に大電流ポートをスイッチさせると、内部GNDレベルが一瞬持ち上がって入力レベルが不安定になる為、推奨同時スイッチ数を規定しています。
 VCCOはバンク別に分離されているので、VCOバンクのVCCOを他のVCCOから隔離する方法も考えられるが、手元にあるXSP005ではできないので、これは次回に見送ります。
 まぁ売り物じゃないので、ダメだったらそのときまた考えましょう。

5.周波数と乗数の調整

 DLLが使わずに、66MHzやそれ以上の周波数を望むなら、R11の乗数をちいさくしていくことで、最大周波数を多少のばせます。
 C11も有効ではあるが、入力ピン自体5pF〜10pFの容量を持っているため、100pFを切ると安定度に欠けてしまうでしょう。

 R11を小さくしていくと、CR型からインバータの単純帰還型発振器へだんだん変貌していくようで、TP1の主に放電波形がひずんでいき反射の影響も大きくなります。
 結果、VREF<1.0Vあたりの低周波数領域がジッターの増加により使えなくなりました。
 C11=100pF,R11=47ohmの時、最大周波数は60MHz程度で、最小周波数はジッターの関係から、40MHz程度と狭くなりました。

 VCO_OUTのバッファタイプによる影響も大きく、RC充放電領域ではドライブ電流を8mA以上にすると、オーバーシュートで過充電されてしまい、最大周波数が減少する方向にありました。
 このため4mA程度のポートが良好のようだが、単純帰還型の領域になれば、この限りではありません。

 いろいろ実験した結果、80MHz位まではVCOによる制御が可能でしたが、有効レンジは数MHzと非常に狭くなりました。汎用性には欠けます。
 ちなみに、入力ポートをLVTTLで無負荷とし、インバータの単純帰還型で発振させた時には、周波数は130MHz程度でした。

 逆に低い周波数の場合、CRを調整するとスレッシュホールド電圧の対ノイズ性が悪くなると思いますので、VCOを最安定領域で発振させ、SpartanII内部で分周したほうがよいでしょう。

5.最後に

 50MHz〜100MHzともなると、十分に高周波の世界の感がみえてしまいます。
 オーバーシュートや反射、ゲート遅延などいろいろな要素が混じり、1GHz帯域のオシロが無いと測定も調整もできないし、部品の乗数の調整もカット&トライで結構時間がかかります。
 ただ、この実験でSpartanIIのSlewレートとドライブ電流に関しては、その有効性と傾向を実感することができました。
 まぁ、コイルを避けたことで、「%何mmのボビンに何番線を何回巻いて」なんて世界までは行かなくてすんだので、自分的には良しとしています。