放課後の電子工作 HOME > Mandelbrot集合描画ハードウェア [ Pyxis 2010 ] |
2011年2月13日 更新 |
Mandelbrot集合描画ハードウェア [ Pyxis 2010 ]
|
Mandelbrot集合描画 ハードウェア [ Pyxis 2010 ] 製作中 |
「マンデルブロ集合をとにかく速く表示したい」との想いから、丸2年の歳月をかけた『Mandelbrot集合描画支援ハードウェア [ Pyxis ] 』が完成したのは、22年前の1988年のことです。 マンデルブロ集合を求める漸化式、 |
使用するFPGA
AlteraのCycloneIII、EP3C120F484です。 |
|
FPGA裏面
1mm間隔でびっしりと並んだ、484個のはんだボール。 |
|
パスコンを実装
電源ピンとグランドピンは概ねきれいに隣接して配置されているので、それらを繋ぐようにパスコンを直接実装します。 |
|
電源系の配線
主な電源とグランドを配線したところ。 |
|
配線の様子
配線は複雑に立体交差しています。 |
|
基板製作
FPGAを基板に組み込み、さらに主な周辺回路を実装したところ。 |
|
動作確認
バラックで取り急ぎ動作が確認できた記念の1枚です。 |
|
実行速度の確認
マンデルブロ集合の全体像を表示してみました。 |
|
電源の実装準備
FPGAのコア電源(1.2V)には市販のPOL用DC/DCコンバータ(BellnixのBSV-3.3S8R0M)を使用しました。 |
|
電源の実装とFPGA用ヒートシンク
電源の放熱用パッドをベタにしっかりとはんだ付けして固定し、スズメッキ線を使って基板表側と入出力を最短で接続します。電源の周囲が緑色なのは、絶縁確保のために電源の下一帯にカプトンテープを貼ってあるからです。 |
|
PSPへの組み込み準備(1)
Pyxis 2010のケースはPSPです。 |
|
PSPへの組み込み準備(2)
メイン基板は写真の通りに惜しげもなく二分し、右側の細い方だけを使います。 |
|
PSPへの組み込み(1) -放熱
いよいよPSPへ組み込みます。 |
|
PSPへの組み込み(2) -基板の固定
基板は本体側ではなく、UMDのふた側にスタッドで固定します。 |
|
PSPへの組み込み(3) -基板と本体の接続
液晶パネルやスイッチ基板からは元々メイン基板と接続されていたFPCが出ていますが、それらは組み込んだ基板までは届きません。ですので、その延長も兼ねてFFCを"ごにょごにょ"っと接続します。 |
|
PSPへの組み込み(4) -FPCとFFCの接続
FPCとFFCを"ごにょごにょ"っと接続している部分です。 |
|
PSPへの組み込み(5) -本体裏側の処理
UMDのふたの"PSP"ロゴが入っている部分を全てくりぬくと、40mm角ファンの開口にちょうど良い丸穴になります。 |
|
PSPへの組み込み(6) -動作確認
取り急ぎ動作確認。無事に動きました。 |
|
組み込み後の開発環境との接続
FPGA用とマイコン用のそれぞれの開発環境と接続している様子です。 |
|
オーバレイによる文字表示
座標値などの各種情報表示用に、キャラクタジェネレータ方式による文字のオーバレイ表示ができるようにしました。 |
|
フォント作成
文字サイズは8ピクセル×8ピクセルにしてみました。行間と文字間に1ピクセルずつ空けるため、実際は7×7です。 |
|
デモ画像(1) -起動画面
電源オン後、最初にタイトル「Pyxis 2010」を表示する起動画面を作ってみました。 |
|
デモ画像(2) -動作画面
画面上部に各種ステータスを表示するようにしました。 |
|
デモ画面(3) -パレット変更(1)
Mandelbrot集合のグラフィクス表示は、Z0 = 0 および各ピクセルの複素座標を C として漸化式 Zn+1 = Zn2 + C を反復計算し、その値が発散すると判定された時点での n の値に対応した色でそのピクセルを描画することで実現されます。したがってこの
n の値と色の対応付けが、出力画像の見え方を左右する重要な要素になります。 |
|
デモ画面(4) -パレット変更(2)
これは不連続サイクリック型(色の変化に不連続な箇所があり、かつ周期的に同じ色パターンが繰り返されるタイプ)のパレットです。 |
|
デモ画面(5) -パレット変更(3)
これは連続非サイクリック型(スムースに色が変化し、かつその変化が周期的でないタイプ)です。 |
|
デモ画面(6) -パレット変更(4)
これは(1)と同じ、連続サイクリック型の別のパレットです。色の変化の仕方が異なると全然印象が違ってきます。 |
現在の動作の様子です。 |
*リソース利用状況
QuartusIIのFlow reportからの抜粋です。
Total logic elements ; 34,337 / 119,088 ( 29 % )
Total registers ; 31405
Total memory bits ; 2,439,816 / 3,981,312 ( 61 % )
Embedded Multiplier 9-bit elements ; 576 / 576 ( 100 % )
外付けのメモリを使用せず、フレームバッファやパレットテーブルなども詰め込んであるので、メモリの使用量が相応にかさんでいます。
エンベデッドマルチプライヤの利用率は100%。全て使い切りました。
右はChip Plannerのイメージです。
*数値データの表現法
数値データのフォーマットは実部、虚部共に、2の補数による64ビット固定小数点(符号1ビット、整数部3ビット、小数部60ビット)にしました。これはオリジナルPyxisと同じフォーマットです。
マンデルブロ集合の計算において演算回路を自作する場合、浮動小数点表現を採用するメリットはほとんどありません。漸化式の計算の中で表現される数値は、およそ-2から+2の間をまんべんなく変動する感じになるからです。拡大率がどんなに大きくなっても、例えば10-10などという非常に小さな数値になることはまずありません。従ってデータビット(64ビット)のうち整数部を必要最低限とし、小数部のビット数をできるだけ多くした固定小数点にするのが有利といえます。この辺の詳細についてはこちらもご参照ください。
*描画の高速化
描画性能を向上させるためには次の2つが鍵になります。
(1)演算回路のクロック周波数の向上
(2)処理の並列化
趣味の作品と割り切れば『動けばOK』という考え方もアリですが、達成の正否をちゃんと評価したいので、『QuartusIIのTiming Analyzerでタイミング要件を満足すること』を条件としました。
目的の回路は、Mandelbrot集合の漸化式に基づいて、64ビットの加減算器と乗算器を繋げば基本的にはできてしまいます。でもそれでは高速化は望めません。実際、最初に試してみた時には、80MHzにも届きませんでした。
データサイズが64ビットにもなると、遅延の影響でクロック周波数を上げることが難しくなります。その対応として当然パイプライン化が必要になりますが、メガファンクションのパイプラインパラメータと最適化パラメータをどう調整しても動作周波数が思うように上がりませんでした。調べてみると、メガファンクションの自動生成回路において、パイプラインの効果が上手く出ていないことがわかりました。そこで加減算器と乗算器を独自に設計し、その他いろいろ改良を加えることで、150~160MHzくらいまで出るようになりました。
ここまで来ると200MHzの大台に乗せたくなります。RTL ViewerやTechnology Map Viewerを参考にしながらロジックを改良したり、インスタンスのLocationをアサインしたり、Design
Space ExplorerでRandom seedほか各種パラメータの最適値を探したりを地味に続けて、現在の結果に至りました。その間、180MHzくらいまでは順調だったのですが、200MHzのクリアにはかなりの調整を要しました。例えば9ビットダウンカウンタのキャリー出力生成においてロジック的な一工夫が必要になったり、などです。
次はタイミングアナライザレポートからの抜粋です。
Type : Slow Model Clock Setup: 'altpll0:(中略)clk[0]'
Slack : 0.108 ns
Required Time : 200.00 MHz ( period = 5.000 ns )
Actual Time : 204.42 MHz ( period = 4.892 ns )
Failed Paths : 0
条件の厳しいSlow Model解析において、204.42MHzが得られました。
最終的に、独自に設計した加減算器のパイプラインステージは3段、乗算器は10段です。それらを組み込んだ漸化式の全演算ループは22段のパイプラインになっています。さらにそのパイプラインを6回路、並列に動作させる構成としました。つまり132ピクセル分のデータが同時に計算されていることになります。実質的には200MHz1クロック毎に6ピクセル分、したがって200×106×6で毎秒12億回の漸化式演算となります。
FPGA全体で考えると、加減算器は24個、乗算器は18個が並列で動いていますので、64ビット演算を毎秒84億回実行していることになります。
Copyright 2010, 2011 Chiaki Nakajima.
All rights reserved.