今日はUCF制約を書きながら、配線などしてた。
実は配線の工程が一番心配だった。というのも133MHzともなると回路の遅延にずいぶんシビアになるから。
いったいどんなことになるのか、実行してみるまでわからなかった。
実行させてみて、配線の結果を見ると……なんか×マークが出てる。いくつかタイミングのエラーが出ていたようだ。
ところで論理回路の遅延についてとやかく言ってるのはなぜかご存じですかね。
トランジスタのスイッチのON・OFFの切り替えに時間がかかるので、入力が変わっても出力が変わるまで少し時間がかかるんですね。
さらに複数の信号が同時に変わると、ハザードという現象により、変わってすぐは実際の出力じゃない値が出てくることがある。
そんなわけで、正しい出力が得られるまでにはしばらく時間がかかる。組み合わせ回路だけではこういう問題があるわけだ。
そこで、この出力をフリップフロップ(FF)につないで、クロックにあわせて取り込む。
こうすれば、正しい出力がクロックにあわせて出てくる。こういう順序回路が主になっている。
こうすれば1クロック後には確実な値が得られるわけだ。
ただ、信号が変化してからFFで取り込むまでの時間が、遅延より短いとうまく動かない。
そうならないために、UCFにあるタイミング制約を見ながら、回路の遅延を調整しているようだが、無理だとエラーになる。
というわけで、どこが問題なのかをPlanAheadを立ち上げて見てみる。
見てみると、オーバーしている時間と変化する入力信号とFFで取り込まれる出力信号の名前が並んでいる。
その詳しい情報を見ると、入力信号の変化するタイミングと出力信号の取り込むタイミングが見える。
見て、気付いた。これはひどいと。
というのも、MIGってメインクロックの立ち下がりと、そのクロックの位相を90度進めたクロックの立ち上がりにあわせて動いているのだが、
その90度進めたクロックにあわせて動く、データ入出力と周辺の回路のタイミングが問題だった。
module A(input I,output reg O) begin
reg X,Y;
always @(posedge CLK_90) begin
X<=I;
O<=Y;
end
end
module B(input O) begin
reg K;
always @(posedge CLK_0) begin
K<=f(O);
end
end
module C(output reg I) begin
reg L;
always @(posedge CLK_0) begin
I<=L;
end
end
実際はこんなんではないが、AがMIG、BとCが周辺の回路と考えてほしい。
MIGは入力信号のIをCLK_90にあわせて取り込んで、出力信号のOをCLK_90にあわせて書き出している。
BはOを入力に取って、Oになんかして内部のレジスタYにCLK_0の立ち上がりのときに書き込むとする。
この場合Oが変化してから、Kに取り込まれるまで、3/4クロックの時間がある。
CLK_0が立ち上がってから1/4クロック後にCLK_90が立ち上がるなら、CLK_90の立ち上がりから数えれば3/4クロック後にCLK_0は立ち上がるからね。
なので、わりと余裕があるので、このパターンはわりとうまく動いてた。
問題はCの方、これはCLK_0が立ち上がりにあわせて、出力のIが変わる。
AはCLK_90が立ち上がったらIを取り込むので、なんと1/4クロックの間に出力を取り込む必要がある。
これがかなり厳しかったらしい。最初にエラー出た。
これの解決は入力信号を与える部分をCLK_0の立ち下がりで動くようにした。
これで出力が変わってから取り込むまで3/4クロックの時間をかけることができる。
こういう1/4クロックでやれという無茶な記述をずいぶんしていたので、そういうところは真っ先になおした。
ただ、それだけではなくならず、今度は1/2クロックでやれというところでエラーが出てきた。
立ち上がりと立ち下がりが混在するとどうしてもシビアになりがちだ。
ただ、MIGの都合もあるので、止む得ない面もある。
なのでFFを追加して、1/2クロック後にとりあえず信号をFF取り込んで、1クロックでやれというようにしたらこのあたりは解決できた。
それで全部解決できたかなと思ったのだが、1クロックでやれというところで少々エラーが出ているので、
このあたりを今度は直したいと思う。つくりが悪かったのよね。
133MHzの回路の設計は難しいわ。50MHzのときは全くエラーは出なかったのにね。
MIG周りの回路が完成したら、今度は画像処理のコアの回路を作る予定なのだが、
この部分は50MHzで動作させようと思った。その方がよっぽどいいだろう。
多分MIGの設計をした人もいろいろ苦労したんだろうな。MIGの作りってけっこう複雑なんだけど、速く動かすことを考えて設計したんだろうな。
おかげでMIG自体の配線では全くエラーが出ていない。さすがだな。
ここでMIGのエラーが出たらどうしようとおもったが、その心配はなかったようだ。