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    ()
);
と編集


写真では黒い部分がどうしても広がるが目視ではちゃんとグラデーションされている。

ヒントに書かれている本来の回答とは違うんだろうけど、一応課題はこなせたことにする。


コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

ILI9341 240X320 Arduino

Attiny85 FuseRest