今回作成したVGAテストセット
裏面
表示画面
画素数はVGA(640 x 480、ピクセルクロック 25MHz)としている。SVGA(800x600,50MHz)だと僅かにタイミングマージンが不足する。
リソースの使用状況はこんな感じだった。

スプライトで表示している四角のパターンは、ソース上はROMとして推論されるように記述しているのだがROMとして推論されず、CLBに展開されてしまっている。

色々試行錯誤したのだが、どうやってもROMとして推論されなかった。 iCE40には4KbitのBRAMが20個あるが、容量が4Kbit以上の場合は推論されないようだ。仕方がないので、BRAMのプリミティブセルをインスタンスしそれに初期値を設定して使う方法でやってみた。ここで、初期値のロードに$readmemhが使えると楽なのだが、iCE40のプリミティブセル内のメモリ配列が1次元のレジスタとして記述されていて$readmemhが使えないので、以下のようにparameterとして設定した。

ROM化すると回路規模は以下のようになった。

ROM化出来ていない場合に比べ若干小さくなっているように見える。
タイミングマージンは改善されSVGAでもMetするようになった。

リソースには空きがかなりあるので、ブロック崩しゲーム位なら実装できるかも知れないな。