![]() |
2 |
画面の縦横の入れ替え |
画面の縦横の入れ替えの変更
過去記事において、本来VRAMの読み出しアドレスのxとyを入れ替えるつもりが、たまたま書き込み側のアドレスマルチプレクサが目につき、それを流用しました。が、動作的にあまり良くありませんでした。具体的には、画面書き換えの途中で切り替えると、縦図形と横図形が混在したり、初期画面を動的に準備する負担が大きくなっていました。
これを本来の読み出し側アドレススイッチの増設に変更します。書き込みアドレスマルチプレクサは名前をWriteMuxに変更しましたが、元の単なるセレクタに戻しました。新たにReadMuxモジュールを設置し、読み出し側アドレスのxとyを入れ替えます。実際にはyはx(a[7:0])をそのまま用い、xはy(a[15:8])を256から引いたものを用います。
$$ \begin{eqnarray} \left\{ \begin{array}{l} x&\Leftarrow&256-y \\ y&\Leftarrow&x \end{array} \right. \end{eqnarray} $$
図561.1に改造後のブロック図を示します。

以下にBSVソースを示します。処理は書き込み側で実施した入れ替えとほとんど同様です。
ReadMux.bsv:
typedef Bit#(16) Addr_t; interface ReadMux_ifc; (* prefix="" *) method Addr_t outp(Bool sel, Addr_t a); endinterface (* synthesize, always_ready = "outp", no_default_clock, no_default_reset *) module mkReadMux(ReadMux_ifc); method Addr_t outp(Bool sel, Addr_t a); Bit#(8) xa = a[7:0]; Int#(10) yax = 256 - signExtend(unpack(a[15:8])); Bit#(8) ya = truncate(pack(yax)); if (sel) return {xa, ya}; else return a; // normal state endmethod endmodule
この変更により、ボード上のdip swを切り替えることで、リアルタイムに画面の縦横変換ができるようになりました。