FPGA:VGA Pmod gradation
第2章の課題 2-4-2 グラデーション表示
階調を段階的に16階調、各色4ビット。水平方向を10分割縦は4分割で上から白、赤、緑、青。各ブロックの横方向に4ビットごとに色を変化させる事をしなさいという課題
module pattern(
input CLK,
input RST,
output reg [3:0] VGA_R, VGA_G, VGA_B,
output VGA_HS, VGA_VS,
output reg VGA_DE,
output PCK
);
VGAは4ビットしかカラー表示ができないので、VGA_RGBのビットは4ビットに
wire [9:0] cnt_h_color = (HCNT-HBLANK+10'd1);
wire [9:0] cnt_v_color =((VCNT-VBLANK)/VSIZE);
cnt_h_color :横方向には表示領域以降にカウントアップする信号を作る。
cnt_v_color :VSIZEで割り算して、4行分が入るが、上から0,1,2,3とする
cnt_h_colorは
0000000000 → 0000000001 → 0000000010 → 0000000011 ・・・
と変化していく。
試しに例題としてすでに実行したpatternのソースで
{VGA_R, VGA_G, VGA_B} <={{cnt_h_color[3:0]}, {4{rgb_1[1]}}, {4{rgb_1[0]}} };
とでもして実行してみるとわかりやすい。
16ピクセル周期でグラデーションされる。4回繰り返ししたい。
そこでcnt_h_color[5:2]にしてしまう。
例えば3ビット目より左は 000, 001, 010, 011, 100, 101, ・・・・
といたぐあいに4で繰り上がり数字が増えるので4回繰り返してくれる事になる。
縦方向だが、白、赤、緑、青の順番
だが力業・・・cnt_v_color の値で場合わけ、セレクタで対応。
always @( posedge PCK ) begin
if ( RST )
{VGA_R, VGA_G, VGA_B} <= 12'h0;
else if ( disp_enable )
case (cnt_v_color)
2'h0: {VGA_R, VGA_G, VGA_B} <= {{cnt_h_color[5:2]}, {{cnt_h_color[5:2]}}, {{cnt_h_color[5:2]}} };
2'h1: {VGA_R, VGA_G, VGA_B} <= {{cnt_h_color[5:2]}, {4'b0000}, {4'b0000} };
2'h2: {VGA_R, VGA_G, VGA_B} <= {{4'b0000}, {{cnt_h_color[5:2]}}, {4'b0000} };
2'h3: {VGA_R, VGA_G, VGA_B} <= {{4'b0000}, {4'b0000}, {{cnt_h_color[5:2]}} };
default {VGA_R, VGA_G, VGA_B} <= {{4'b0000}, {4'b0000}, {4'b0000} };
endcase
// {VGA_R, VGA_G, VGA_B} <={{cnt_h_color[5:2]}, {4{rgb_1[1]}}, {4{rgb_1[0]}} };
else
{VGA_R, VGA_G, VGA_B} <= 12'h0;
end
pattern_vgaの方は8ビットが入ってくることで想定されてダミー処理をしてるが
そのまま出力してほしいので、
pattern pattern(
.CLK (CLK),
.RST (RST),
.VGA_R ({VGA_R}),
.VGA_G ({VGA_G}),
.VGA_B ({VGA_B}),
.VGA_HS (VGA_HS),
.VGA_VS (VGA_VS),
.VGA_DE (),
.PCK ()
);
と編集
写真では黒い部分がどうしても広がるが目視ではちゃんとグラデーションされている。
ヒントに書かれている本来の回答とは違うんだろうけど、一応課題はこなせたことにする。
コメント
コメントを投稿