2012年2月17日金曜日

FPGAをただのバッファとして使う場合のskew制約

今設計している回路では、
大規模なFPGA1があって、FPGA1は2.5V系のoutputしかできません.
DACは、3.3V系入力しかできません.

このようなときは、2.5V→3.3VへのレベルシフタICを挿入しますが、レベルシフタ専用ICを使うのではなく、小規模なFPGAを使ってしまってもよいので、FPGA2でレベルシフトさせることにしました.

DACへのclock周波数が50MHzだとすると、20ns毎にデータを伝送しますので、FPGA2から出ている17本の信号同士のTpdばらつき、すなわちスキューが1nsぐらいの精度でピッタシ揃っていないと嫌だなぁという課題が生じます.
同期回路の制約のやり方は、ユーザーガイドにたくさん書いてあるんだけど、FPGA2は同期回路じゃありませんで、ただ信号をスルーするだけです.そういう場合にはどういう制約を与えたらいいんでしょう?

いろいろとやってみた結果、こうすればいいみたいです.

まず、FPGA2のmoduleの定義は、skew指定したいピンをピン名の頭文字で指定できるように、SKG_という名前をつけておきます.SKG_はなんでも構いません.
  module FPGA2 (
    input [15:0] DATA,
    input    clk,
    output [15:0] SKG_data,
    output  SKG_clk  );
    assign SKG_data = DATA;
    assign SKG_clk = clk;
  endmodule

つぎに、制約を記述する.ucfファイルには、次の1行を追加すればOKです.
  NET "SKG_*" MAXSKEW = 1;

こうして論理合成すると、report fileを見たところでは、in~outのTpdがチャックりと揃いました.素のTpdは4nsぐらいです.

2 件のコメント:

  1. FPGAで言語記述でスキュー揃えるのって・・。

    コンパイルする毎にうまく行ったりいかなかったりしそう。

    返信削除
  2. なにもしないととんでもないことになりそうですね.
    どこをどう通って信号が出てくるのやらみたいな.

    返信削除