如何控制DE2 VGA輸出時某座標的顏色? (IC Design) (DE2) (Quartus II)

Abstract
在友晶科技的DE2_CCD範例中,將CMOS的影像直接在VGA輸出,是否能控制VGA的座標,並顯示不同的影像呢?

Introduction
版權聲明:本文根據友晶科技光碟所附的範例程式加以修改,原範例版權歸友晶科技所有。
使用環境:Quartus II 7.2 SP1 + DE2(Cyclone II EP2C35F627C6) + TRDB_DC2

本程式依照友晶科技的DE2_CCD範例加以修改。

VGA影像輸出的好壞,除了決定於VGA螢幕外,VGA Controller也扮演很重要的角色,我們可以在VGA Controller埋入影像處理的演算法改善畫值,但首先要面對的,就是取得輸出時VGA的X與Y作標,這樣才能做後續的影像處理。

VGA_Controller.v

  1  module VGA_Controller (
  2    // Host Side
  3    iRed,
  4    iGreen,
  5    iBlue,
  6    oRequest,
  7    // VGA Side
  8    oVGA_R,
  9    oVGA_G,
10    oVGA_B,
11    oVGA_H_SYNC,
12    oVGA_V_SYNC,
13    oVGA_SYNC,
14    oVGA_BLANK,
15    oVGA_CLOCK,
16    // Control Signal
17    iCLK,
18    iRST_N
19  );
20 
21  `include " VGA_Param.h "
22 
23  // Host Side
24  input       [ 9 : 0 ] iRed;
25  input       [ 9 : 0 ] iGreen;
26  input       [ 9 : 0 ] iBlue;
27  output reg        oRequest;
28 
29  // VGA Side
30  output reg  [ 9 : 0 ] oVGA_R;
31  output reg  [ 9 : 0 ] oVGA_G;
32  output reg  [ 9 : 0 ] oVGA_B;
33  output reg        oVGA_H_SYNC;
34  output reg        oVGA_V_SYNC;
35  output            oVGA_SYNC;
36  output            oVGA_BLANK;
37  output            oVGA_CLOCK;
38  // Control Signal
39  input             iCLK;
40  input             iRST_N;
41 
42  // Internal Registers and Wires
43  reg         [ 9 : 0 ] H_Cont;
44  reg         [ 9 : 0 ] V_Cont;
45  reg         [ 9 : 0 ] Cur_Color_R;
46  reg         [ 9 : 0 ] Cur_Color_G;
47  reg         [ 9 : 0 ] Cur_Color_B;
48  wire              mCursor_EN;
49  wire              mRed_EN;
50  wire              mGreen_EN;
51  wire              mBlue_EN;
52 
53  // add by oomusou
54  reg         [ 9 : 0 ] coord_x;
55  reg         [ 9 : 0 ] coord_y;
56 
57  assign oVGA_BLANK = oVGA_H_SYNC & oVGA_V_SYNC;
58  assign oVGA_SYNC  =   1 ' b0;
59  assign oVGA_CLOCK = iCLK;
60 
61  // add by oomusou
62  always@(H_Cont or V_Cont) begin
63    if (H_Cont >= X_START && H_Cont < X_START + H_SYNC_ACT &&
64        V_Cont >= Y_START && V_Cont < Y_START + V_SYNC_ACT)
65      oVGA_R = iRed;
66    else
67      oVGA_R =   0
68     
69    if (H_Cont >= X_START && H_Cont < X_START + H_SYNC_ACT &&
70        V_Cont >= Y_START && V_Cont < Y_START + V_SYNC_ACT)
71      oVGA_G = iGreen;
72    else
73      oVGA_G =   0 ;
74 
75    if (H_Cont >= X_START && H_Cont < X_START + H_SYNC_ACT &&
76      V_Cont >= Y_START && V_Cont < Y_START + V_SYNC_ACT)
77      oVGA_B = iBlue;
78    else
79      oVGA_B =   0 ;
80     
81    if (coord_x >   200   && coord_x <   320   &&  
82        coord_y >   200   && coord_y <   240 ) begin
83        oVGA_R =   10 ' h000;
84        oVGA_G =   10 ' h000;
85        oVGA_B =   10 ' h000;
86    end
87  end
88 
89  // Pixel LUT Address Generator
90  always@(posedge iCLK or negedge iRST_N) begin
91    if ( ! iRST_N) begin
92      oRequest   <=   0 ;
93      coord_x     <=   0 ;
94      coord_y     <=   0 ;
95    end
96    else begin
97    if (H_Cont >= X_START -   2   && H_Cont < X_START + H_SYNC_ACT - 2   &&
98        V_Cont >= Y_START && V_Cont < Y_START + V_SYNC_ACT) begin
99      oRequest <=   1 ;
100      coord_x     <= H_Cont - (X_START -   2 );
101      coord_y     <= V_Cont - Y_START;
102    end
103    else
104      oRequest <=   0 ;
105    end
106  end
107 
108  // H_Sync Generator, Ref. 25.175 MHz Clock
109  always@(posedge iCLK or negedge iRST_N) begin
110    if ( ! iRST_N) begin
111      H_Cont      <=   0 ;
112      oVGA_H_SYNC <=   0 ;
113    end
114    else begin
115      // H_Sync Counter
116      if (H_Cont < H_SYNC_TOTAL)
117        H_Cont <= H_Cont +   1 ;
118      else
119        H_Cont <=   0 ;
120       
121      // H_Sync Generator
122      if (H_Cont < H_SYNC_CYC)
123        oVGA_H_SYNC <=   0 ;
124      else
125        oVGA_H_SYNC <=   1 ;
126    end
127  end
128 
129  // V_Sync Generator, Ref. H_Sync
130  always@(posedge iCLK or negedge iRST_N) begin
131    if ( ! iRST_N) begin
132      V_Cont      <=   0 ;
133      oVGA_V_SYNC <=   0 ;
134    end
135    else begin
136      // When H_Sync Re-start
137      if (H_Cont ==   0 ) begin
138      // V_Sync Counter
139      if (V_Cont < V_SYNC_TOTAL)
140        V_Cont <= V_Cont +   1 ;
141      else
142        V_Cont <=     0 ;
143       
144      // V_Sync Generator
145      if (V_Cont < V_SYNC_CYC)
146        oVGA_V_SYNC <=   0 ;
147      else
148        oVGA_V_SYNC <=   1 ;
149      end
150    end
151  end
152 
153  endmodule


89行

// Pixel LUT Address Generator
always@(posedge iCLK or negedge iRST_N) begin
 
if ( ! iRST_N) begin
    oRequest
<=   0 ;
    coord_x    
<=   0 ;
    coord_y    
<=   0 ;
  end
 
else begin
 
if (H_Cont >= X_START -   2   && H_Cont < X_START + H_SYNC_ACT - 2   &&
      V_Cont
>= Y_START && V_Cont < Y_START + V_SYNC_ACT) begin
    oRequest  
<=   1 ;
    coord_x    
<= H_Cont - (X_START -   2 );
    coord_y    
<= V_Cont - Y_START;
  end
 
else
    oRequest
<=   0 ;
  end
end


加入coord_x與coord_y兩reg,計算出目前的X與Y座標。

81行

if (coord_x >   200   && coord_x <   320   &&  
    coord_y
>   200   && coord_y <   240 ) begin
  oVGA_R
=   10 ' h000;
  oVGA_G =   10 ' h000;
  oVGA_B =   10 ' h000;
end


如此就能在指定的座標下指定特定的顏色,以上會在中間的區域顯示黑色,如下圖所示。

 (原創) 如何控制DE2 VGA輸出時某座標的顏色? (IC Design) (DE2) (Quartus II)_第1张图片

完整程式碼下載
友晶科技範例 DE2_CCD.7z
本文程式 DE2_CCD_CV.7z

Conclusion
抓出X與Y座標只是初步,若要能做影響處理,可能需要搭配一個FIFO,將目前frame的所有pixel的資訊流住,目前我正在朝這方向努力當中。

See Also
(原創) 如何將CMOS彩色影像轉換成灰階影像? (SOC) (DE2)
(原創) 如何控制TRDB-LTM輸出時某座標的顏色? (SOC) (DE2-70) (TRDB-LTM)

你可能感兴趣的:(design)