大規模な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ぐらいです.
FPGAで言語記述でスキュー揃えるのって・・。
返信削除コンパイルする毎にうまく行ったりいかなかったりしそう。
なにもしないととんでもないことになりそうですね.
返信削除どこをどう通って信号が出てくるのやらみたいな.