ISE11でPack I/O Registersの設定オプションにご注意
Spartan-6の開発を行うにはXILINX ISE 11が必要ですが、ISE11のデフォルトの設定では、I/O内のフリップフロップが使われる設定になっていません。
このため、入出力のタイミングをきっちり正確に作ったつもりでも、予期しない遅延が入ってしまって、正確なタイミングを出せないことがあります。それは、周辺ICとのインタフェースにおけるセットアップ・ホールドタイムの不足や、論理合成後のタイミングエラーを引き起こします。
目安としては、5ns以下の制度で制御したいタイミングは、OFD(出力フリップフロップ)やIFD(入力フリップフロップ)を使うべきです。OFDを使うと、クロックから出力信号の遷移するタイミングが予測可能になるからです。
それに対して、スライス内のFFを使った場合は配線遅延が出てきますので、クロックから出力信号の遷移するタイミングは制御できません。UCFファイルにOUT AFTER属性を書けば最大値を制約することはできますが、最小値は制約できません。
やはり、OFDが必要なのです。
しかし、XILINXのプリミティブにIFDやOFDはありません。ODDR2を使う方法もありますが、面倒です。
具体的には、OFDやIFDは次のようにして「推論」させます。
process(clk) begin
if(clk'event and clk='1') then
input_signal_X <= input_signal_X_ip;
output_signal_X_op <= output_signal_X;
end if;
end process;
このように書くと、input_signal_Xやoutput_signal_XにはIOB内のIFDやOFDが適用されることが期待されます。
ISE9のころは推論されたのですが、ISE11ではそうなりません。スライス内の通常のFFが使われてしまいます。
この問題を回避するには、Implement DesignのオプションでProcess Propertyを開きます。
次にMap Propertiesタブを開いて、Pack I/O Registers/Latches into IOBsを見てみます。なんということでしょう。「OFF」になっています。
もちろん、「For Input and Outputs」に変更します。
こうして論理合成します。論理合成後のDesign Summaryで、IOB Propertiesを見たときに、IFF1やOFF1と書かれていれば成功です。
貴方の設計したI/Oは、設計したとおりのタイミングで動くでしょう。
逆に、この方法を使わないと、まず間違いなく高速インタフェースでは失敗します。論理合成時の偶然で動いたり動かなかったりということが起こります。ご注意ください。
| 固定リンク
コメント
Latches into IOBsがデフォルトOFFなのは、ISE10からかもしれません。
思いもよりませんでした。おかげ様で悩みが解消できました。
投稿: marsee | 2010.03.15 12:03
IOBのFFは大事な機能なのにデフォルトで使わせてくれないなんて、まるで罠ですよね。
これからはバージョンアップのたびに、いろんなところをチェックしていかなければなりませんね。
投稿: なひたふ | 2010.03.15 12:10