Posts Tagged with "FPGA"

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.
posted by sakurai on December 2, 2022 #561

画面の縦横の入れ替えの変更

過去記事において、本来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に改造後のブロック図を示します。

図%%.1
図561.1 VRAMモジュール

以下に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を切り替えることで、リアルタイムに画面の縦横変換ができるようになりました。


左矢前のブログ 次のブログ右矢


ページ: