FPGA:VGA Pmod

 

FPGAが何ものかを勉強するために手にしたArty A7-35T。多くの事ができるが、FPGAプログラミング大全を読み進めるには、画像出力がないのため、VGAのPmodを購入した。
Pmodは4つのジャンパーを備えているが、高速動作する中央の2か所に差し込む形で使う。

2章のソースコードを試す訳だが、本にはすべてのコードが載っている訳ではないので、
書籍のサポートページからサンプルをDLさせていただく。https://www.shuwasystem.co.jp/support/7980html/6326.html

これまでの知識でなんとなく、記載している内容がわかるとところと、わからない部分があるがまずまず動作の確認を進める。
特に困る事もないので、詳細は割愛するが、patten_vgaを実行してみた。
PCのモニターにVGA出力されてくる。いままでマイコンで液晶とかOLEDに文字を表示したりというのばかりで、
こういうの経験がないので感動する。

さて読み進めて第2章の課題としてグラデーショ表示があるのでやってみる。
その前に、完全に理解できなくてもグラデーションする前のソースの理解を進める。
横に8分割、縦に4分割 (横HSIZE=80、縦VSIZE=120)
この分割の色を決めている変数rgb_0、とrgb_1は

wire [2:0] rgb_0 = (HCNT-HBLANK+10'd1)/HSIZE;


HCNTは水平位置で、HBLANKは非表示区間の長さ160にあたる。
HBLANKを引いた値をHSIZEで割り算したが位置によって0から7までの3ビットでrgb_0になる
今度は垂直方向
wire [2:0] rgb_1 = (((VCNT-VBLANK)/VSIZE)&1)==0 ? 3'd7-rgb_0: rgb_0;
(VCNT-VBLANK)/VSIZE)は、垂直方向の位置VCNTから非表示区間分VBLANKを引いてVSIZE(120)で割った数になる。&1で論理和をとると、上から000と001と交互に入る事になる。
==0なのでゼロと等しい時は、7からrgb_0を引いた数が、rgb_1に入り、等しくない時はrgb_0がそのまま入る事になる。
最終的なrgb_1の3ビットは位置より以下になる。
これを24ビットのVGA_R, VGA_G,  VGA_Bにする。
  { {8{rgb_1[2]}}, {8{rgb_1[1]}}, {8{rgb_1[0]}} };
の部分だがこれは連接演算子という処理をしている。
例えば、A=2'b01なら2{A}という表記はAの2ビットを連接させるという意味で2{A}=4’b0101になる。
8{rgb_1[2]}は、rgb_1[2]は1ビットで0または1でそれを8個連接させるのでrgb_1[2]が0なら8’b00000000、1なら8’b11111111となる。
これが8{rgb_1[2]}、8{rgb_1[1]}、8{rgb_1[0]}と並ぶので
例えば、rgb_1が101なら
24’b11111111 00000000 11111111
になる。






コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

ILI9341 240X320 Arduino

Attiny85 FuseRest