試作の検討

これは趣味として試作をするものであるので売り物を作る訳ではありません.

前作の性能の限界とその対策

  • MCU block が FPGA の内部ロジック使用量の半分を超えている
  • FPGA のパッケージが大きい,単価も少し高い
  • ソフトウェア部がPC用,6502用,MCU用の3つに分かれており管理の負担が多い

MCU の選定

以前からSTM32F シリーズの選定をしていましたが、最近の mruby 系などのスクリプト管理をできることやメモリ容量や価格などを考えて旧 Atmel の SAMD20 / 21 series を使うことにしました.

SAMD20 は SAMD21 から USB 機能がない分単価が50円ほどやすく200円ぐらいで手に入るようです. またSAMD21 の評価ボードは豊富にあります. デバッグ機能として SAMD21 を利用するのは便利だと思いました.

mruby/c とメモリ容量の関係ですが、前回の記述で動かしてみたところ動的に管理する RAM 領域が 0x4000 bytes は必要だとわかりました. また先述の3つに分かれているソフトウェア部を統合しますと 0x40000 bytes の ROM に .text や .rodata を割り当てられるというのは魅力です.

mruby/c のドキュメント量の少なさは作っている過程で非常に嫌な気持ちになっていたのですが、サンプル用の映像を出してみたら C で全部書くこととどっちが嫌かと考えた場合に C のほうが嫌ということになってしまいました.

FPGA 周辺の IO 端子の数

以前から ICE40UP を利用するか考えていたので、IO 端子の数を減らすことを考えています. 全部のバスを(レベルシフタ経由で)直接つなぐと IO の数を食ってしまっていて、基板設計でも負担が大きかったです.

今のところは CPU のバスは 16 bits 用意し、 read or write strobe が来たところで入力元を切り替える方針にしています. video のバスはパラレル->シリアルのシフトレジスタを利用してますが、data 1 本では時間が足りないので 2 本にしています.

それ以外にも multitap 内蔵のためのコネクタ用のポート、MCU との通信、mmc、 serial SRAM あたりはすべて SPI バスを利用するためにシフトレジスタを多用することになっています. analog 映像出力もシフトレジスタを使いたいのですが時間が足りないようなので data 6 本を使うパラレルのレジスタを使うかもしれません.

その他更新頻度が低いとか(FPGAの精度と比較して)厳密なタイミングを求めないIO端子は MCU にもやってもらうことにしました.

analog 映像出力は SPI x4, digital 映像出力なしでの今のところの必要な IO 端子の数は 69 本です. 前回の設計では IO 端子が 130 本ぐらいあったので半分近くは減ってるでしょうか. とりあえずこれであれば小さめの QFP144 に収まりそうです.