マンデルブロ集合の計算のみを高速に行う回路です.VerilogHDLで記述されており,FPGA等に実装できます. 計算に必要な複素平面上の計算範囲をUARTで指定すると,画素ごとの結果(集束or発散までの計算回数)が順にUARTで返ってきます.
適当な回路に実装します.例としてSiPEED社の格安FPGAボードTangNano向けのプロジェクト関連ファイルが置いてあります.(載っているFPGAのGW1N-1の場合,使用率は90%程度)
なおおまけとして,PCなどにFTDI Basicで接続する場合に便利なように,FTDI Basicの6ピンのコネクタをそのまま挿せるようにピン割り当てを行っていますが,実際にUART通信使うのは送受信(TXDとRXD)のみです.
ー 計算範囲を,後述のプロトコルでUARTで送信して指定します.
- これらのデータ(10バイト)をすべて受信した直後から計算を開始します.
- 指定した範囲の左上から右下へ向かって,上から下,その後,1画素右の上から下,の順に,全画素の計算結果を1バイトずつ返します.
- 計算結果は,反復計算が集束(反復回数の上限の100に達した場合)の場合は上限の100を,発散の場合は発散までの反復回数(1〜99)を返します. ー 結果が得られるまでの時間は,(ほぼ)921,600bpsで全画素数分のバイト数を送信する時間なので,およそ(全画素数)÷92,160[秒]となります.(240×160画素の場合は約0.4秒)
通信プロトコル:UART N81, 921600bps 受信データ(計算範囲を指定する10バイト)
- 1バイト目: 横(実軸)の画素数
- 2バイト目: 縦(虚軸)の画素数
- 3バイト目: 描画範囲の左上の実部(上位バイト)
- 4バイト目: 描画範囲の左上の虚部(下位バイト)
- 5バイト目: 描画範囲の左上の実部(上位バイト)
- 6バイト目: 描画範囲の左上の虚部(下位バイト)
- 7バイト目: 1画素分の実部の増分(上位バイト)
- 8バイト目: 1画素分の実部の増分(下位バイト)
- 9バイト目: 1画素分の虚部の増分(上位バイト)
- 10バイト目: 1画素分の虚部の増分(下位バイト)
3バイト目〜10バイト目の数値は,2バイト組で,いわゆるQ12固定小数点フォーマット(整数部4ビット,小数部12ビット,2の補数)で指定します.
- 例:
0000_000000000000
: 0.0 - 例:
0001_000000000000
: +1.0 - 例:
0000_100000000000
: +0.5 - 例:
1111_000000000000
: -1.0
例えば,240x160画素で,実部-2.0〜+1.0,虚部-1.0〜+1.0を描画する場合は,1画素あたり3/240=0.0125(Q12表記で0000_000000110011(正確には0.01245)なので,以下のように与えればよいことになります.
- 横(実部)の画素数: 0xf0 (240)
- 縦(虚部)の画素数: 0xa0 (160)
- 描画範囲の左上の実部: 0xe000 (-2.0)
- 描画範囲の左上の虚部: 0xf000 (-1.0)
- 1画素分の実部の増分: 0x0033 (0.0125)
- 1画素分の虚部の増分: 0x0033 (0.0125)
※縦・横の画素数を2バイトで指定するように容易に改造できますが,TangNano(GWN-1)ではリソースがぎりぎり足りなくなるようです.
@akita11 (akita@ifdl.jp)