(转) 如何將CMOS彩色影像轉換成灰階影像? (SOC) (DE2)

Abstract
在友晶科技的DE2_CCD範例中,CMOS所擷取的是彩色RGB影像,然後由VGA顯示出來,若我要的是灰階影像,該怎麼做呢?

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

本文所提的方法並不是最好的方法,建議參考新作(原創) 如何Real Time產生灰階影像? (SOC) (DE2) (TRDB-DC2)(原創) 如何Real Time產生灰階影像? (SOC) (DE2-70) (TRDB-D5M) 

在友晶科技的範例程式光碟中的DE2_CCD,展示了130萬像素CMOS基本free run與capture的功能,最後影像呈現在VGA上,其架構如下所示:

SDRAM做為VGA Controller的frame buffer,最後由VGA Controller輸出RGB影像。由於SDRAM存放的是RGB彩色資料,為了讓產生它灰階輸出,我在VGA Controller和SDRAM Controller多加了一個RGB2Gray做轉換。

RGB2Gray.v / Verilog

/* 
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3 
4 Filename    : RGB2Gray.v
5 Compiler    : Quartus II 7.2 SP3
6 Description : RGB to gray
7 Release     : 07/14/2008 1.0
8 */
9 
10 module RGB2Gray (
11   input            clk,
12   input            rst_n,
13   input      [9:0] i_r,
14   input      [9:0] i_g,
15   input      [9:0] i_b,
16   output reg [9:0] o_r,
17   output reg [9:0] o_g,
18   output reg [9:0] o_b
19 );
20 
21 always@(posedge clk or negedge rst_n) begin
22   if (!rst_n) begin
23     o_r <= {10{1'b0}};
24     o_g <= {10{1'b0}};
25     o_b <= {10{1'b0}};
26   end
27   else begin
28     o_r <= (i_r + i_g + i_b) / 3;
29     o_g <= (i_r + i_g + i_b) / 3;
30     o_b <= (i_r + i_g + i_b) / 3;
31   end
32 end
33 
34 endmodule

28行

o_r <= (i_r + i_g + i_b) / 3;
o_g <= (i_r + i_g + i_b) / 3;
o_b <= (i_r + i_g + i_b) / 3;

整個關鍵的演算法在此, 我只是簡單的將RGB三個加起來除以三而已,雖然不是最嚴謹的方式,但大體上以此為基礎的灰階影像,都能夠順利的做些影像演算法。

DE2_CCD.v / Verilog (DE2_CCD的top module)

// --------------------------------------------------------------------
  2 // Copyright (c) 2005 by Terasic Technologies Inc. 
  3 // --------------------------------------------------------------------
  4 //
  5 // Permission:
  6 //
  7 //   Terasic grants permission to use and modify this code for use
  8 //   in synthesis for all Terasic Development Boards and Altera Development 
  9 //   Kits made by Terasic.  Other use of this code, including the selling 
10 //   ,duplication, or modification of any portion is strictly prohibited.
11 //
12 // Disclaimer:
13 //
14 //   This VHDL/Verilog or C/C++ source code is intended as a design reference
15 //   which illustrates how these types of functions can be implemented.
16 //   It is the user's responsibility to verify their design for
17 //   consistency and functionality through the use of formal
18 //   verification methods.  Terasic provides no warranty regarding the use 
19 //   or functionality of this code.
20 //
21 // --------------------------------------------------------------------
22 //           
23 //                     Terasic Technologies Inc
24 //                     356 Fu-Shin E. Rd Sec. 1. JhuBei City,
25 //                     HsinChu County, Taiwan
26 //                     302
27 //
28 //                     web: http://www.terasic.com/
29 //                     email: support@terasic.com
30 //
31 // --------------------------------------------------------------------
32 //
33 // Major Functions:    DE2 CMOS Camera Demo
34 //
35 // --------------------------------------------------------------------
36 //
37 // Revision History :
38 // --------------------------------------------------------------------
39 //   Ver  :| Author            :| Mod. Date :| Changes Made:
40 //   V1.0 :| Johnny Chen       :| 06/01/06  :|      Initial Revision
41 //   V1.1 :| Johnny Chen       :| 06/02/06  :|      Modify Image Quality
42 //   V1.2 :| Johnny Chen       :| 06/03/22  :|      Change Pin Assignment For New Sensor
43 //   V1.3 :| Johnny Chen       :| 06/03/22  :|      Fixed to Compatible with Quartus II 6.0
44 // --------------------------------------------------------------------
45 
46 module DE2_CCD (
47     ////////////////////  Clock Input  ////////////////////
48     CLOCK_27,           //  27 MHz
49     CLOCK_50,           //  50 MHz
50     EXT_CLOCK,          //  External Clock
51     ////////////////////  Push Button  ////////////////////
52     KEY,                //  Pushbutton[3:0]
53     ////////////////////  DPDT Switch  ////////////////////
54     SW,                 //  Toggle Switch[17:0]
55     ////////////////////  7-SEG Dispaly ////////////////////
56     HEX0,               //  Seven Segment Digit 0
57     HEX1,               //  Seven Segment Digit 1
58     HEX2,               //  Seven Segment Digit 2
59     HEX3,               //  Seven Segment Digit 3
60     HEX4,               //  Seven Segment Digit 4
61     HEX5,               //  Seven Segment Digit 5
62     HEX6,               //  Seven Segment Digit 6
63     HEX7,               //  Seven Segment Digit 7
64     ////////////////////////  LED  ////////////////////////
65     LEDG,               //  LED Green[8:0]
66     LEDR,               //  LED Red[17:0]
67     ////////////////////////  UART  ////////////////////////
68     UART_TXD,           //  UART Transmitter
69     UART_RXD,           //  UART Receiver
70     ////////////////////////  IRDA  ////////////////////////
71     IRDA_TXD,           //  IRDA Transmitter
72     IRDA_RXD,           //  IRDA Receiver
73     /////////////////////  SDRAM Interface  ////////////////
74     DRAM_DQ,            //  SDRAM Data bus 16 Bits
75     DRAM_ADDR,          //  SDRAM Address bus 12 Bits
76     DRAM_LDQM,          //  SDRAM Low-byte Data Mask 
77     DRAM_UDQM,          //  SDRAM High-byte Data Mask
78     DRAM_WE_N,          //  SDRAM Write Enable
79     DRAM_CAS_N,         //  SDRAM Column Address Strobe
80     DRAM_RAS_N,         //  SDRAM Row Address Strobe
81     DRAM_CS_N,          //  SDRAM Chip Select
82     DRAM_BA_0,          //  SDRAM Bank Address 0
83     DRAM_BA_1,          //  SDRAM Bank Address 0
84     DRAM_CLK,           //  SDRAM Clock
85     DRAM_CKE,           //  SDRAM Clock Enable
86     ////////////////////  Flash Interface  ////////////////
87     FL_DQ,              //  FLASH Data bus 8 Bits
88     FL_ADDR,            //  FLASH Address bus 22 Bits
89     FL_WE_N,            //  FLASH Write Enable
90     FL_RST_N,           //  FLASH Reset
91     FL_OE_N,            //  FLASH Output Enable
92     FL_CE_N,            //  FLASH Chip Enable
93     ////////////////////  SRAM Interface  ////////////////
94     SRAM_DQ,            //  SRAM Data bus 16 Bits
95     SRAM_ADDR,          //  SRAM Address bus 18 Bits
96     SRAM_UB_N,          //  SRAM High-byte Data Mask 
97     SRAM_LB_N,          //  SRAM Low-byte Data Mask 
98     SRAM_WE_N,          //  SRAM Write Enable
99     SRAM_CE_N,          //  SRAM Chip Enable
100     SRAM_OE_N,          //  SRAM Output Enable
101     ////////////////////  ISP1362 Interface  ////////////////
102     OTG_DATA,           //  ISP1362 Data bus 16 Bits
103     OTG_ADDR,           //  ISP1362 Address 2 Bits
104     OTG_CS_N,           //  ISP1362 Chip Select
105     OTG_RD_N,           //  ISP1362 Write
106     OTG_WR_N,           //  ISP1362 Read
107     OTG_RST_N,          //  ISP1362 Reset
108     OTG_FSPEED,         //  USB Full Speed, 0 = Enable, Z = Disable
109     OTG_LSPEED,         //  USB Low Speed,     0 = Enable, Z = Disable
110     OTG_INT0,           //  ISP1362 Interrupt 0
111     OTG_INT1,           //  ISP1362 Interrupt 1
112     OTG_DREQ0,          //  ISP1362 DMA Request 0
113     OTG_DREQ1,          //  ISP1362 DMA Request 1
114     OTG_DACK0_N,        //  ISP1362 DMA Acknowledge 0
115     OTG_DACK1_N,        //  ISP1362 DMA Acknowledge 1
116     ////////////////////  LCD Module 16X2 ////////////////
117     LCD_ON,             //  LCD Power ON/OFF
118     LCD_BLON,           //  LCD Back Light ON/OFF
119     LCD_RW,             //  LCD Read/Write Select, 0 = Write, 1 = Read
120     LCD_EN,             //  LCD Enable
121     LCD_RS,             //  LCD Command/Data Select, 0 = Command, 1 = Data
122     LCD_DATA,           //  LCD Data bus 8 bits
123     ////////////////////  SD_Card Interface  ////////////////
124     SD_DAT,             //  SD Card Data
125     SD_DAT3,            //  SD Card Data 3
126     SD_CMD,             //  SD Card Command Signal
127     SD_CLK,             //  SD Card Clock
128     ////////////////////  USB JTAG link    ////////////////////
129     TDI,                // CPLD -> FPGA (data in)
130     TCK,                // CPLD -> FPGA (clk)
131     TCS,                // CPLD -> FPGA (CS)
132     TDO,                // FPGA -> CPLD (data out)
133     ////////////////////  I2C  ////////////////////////////
134     I2C_SDAT,           //  I2C Data
135     I2C_SCLK,           //  I2C Clock
136     ////////////////////  PS2  ////////////////////////////
137     PS2_DAT,            //  PS2 Data
138     PS2_CLK,            //  PS2 Clock
139     ////////////////////  VGA  ////////////////////////////
140     VGA_CLK,            //  VGA Clock
141     VGA_HS,             //  VGA H_SYNC
142     VGA_VS,             //  VGA V_SYNC
143     VGA_BLANK,          //  VGA BLANK
144     VGA_SYNC,           //  VGA SYNC
145     VGA_R,              //  VGA Red[9:0]
146     VGA_G,              //  VGA Green[9:0]
147     VGA_B,              //  VGA Blue[9:0]
148     ////////////  Ethernet Interface  ////////////////////////
149     ENET_DATA,          //  DM9000A DATA bus 16Bits
150     ENET_CMD,           //  DM9000A Command/Data Select, 0 = Command, 1 = Data
151     ENET_CS_N,          //  DM9000A Chip Select
152     ENET_WR_N,          //  DM9000A Write
153     ENET_RD_N,          //  DM9000A Read
154     ENET_RST_N,         //  DM9000A Reset
155     ENET_INT,           //  DM9000A Interrupt
156     ENET_CLK,           //  DM9000A Clock 25 MHz
157     ////////////////  Audio CODEC  ////////////////////////
158     AUD_ADCLRCK,        //  Audio CODEC ADC LR Clock
159     AUD_ADCDAT,         //  Audio CODEC ADC Data
160     AUD_DACLRCK,        //  Audio CODEC DAC LR Clock
161     AUD_DACDAT,         //  Audio CODEC DAC Data
162     AUD_BCLK,           //  Audio CODEC Bit-Stream Clock
163     AUD_XCK,            //  Audio CODEC Chip Clock
164     ////////////////  TV Decoder  ////////////////////////
165     TD_DATA,            //  TV Decoder Data bus 8 bits
166     TD_HS,              //  TV Decoder H_SYNC
167     TD_VS,              //  TV Decoder V_SYNC
168     TD_RESET,           //  TV Decoder Reset
169     ////////////////////  GPIO  ////////////////////////////
170     GPIO_0,             //  GPIO Connection 0
171     GPIO_1              //  GPIO Connection 1
172 );
173 
174 ////////////////////////  Clock Input  ////////////////////////
175 input     CLOCK_27;       //  27 MHz
176 input     CLOCK_50;       //  50 MHz
177 input     EXT_CLOCK;      //  External Clock
178 ////////////////////////  Push Button  ////////////////////////
179 input [3:0] KEY;          //  Pushbutton[3:0]
180 ////////////////////////  DPDT Switch  ////////////////////////
181 input [17:0] SW;          //  Toggle Switch[17:0]
182 ////////////////////////  7-SEG Dispaly  ////////////////////////
183 output  [6:0] HEX0;       //  Seven Segment Digit 0
184 output  [6:0] HEX1;       //  Seven Segment Digit 1
185 output  [6:0] HEX2;       //  Seven Segment Digit 2
186 output  [6:0] HEX3;       //  Seven Segment Digit 3
187 output  [6:0] HEX4;       //  Seven Segment Digit 4
188 output  [6:0] HEX5;       //  Seven Segment Digit 5
189 output  [6:0] HEX6;       //  Seven Segment Digit 6
190 output  [6:0]    HEX7;       //  Seven Segment Digit 7
191 ////////////////////////////  LED  ////////////////////////////
192 output  [8:0] LEDG;       //  LED Green[8:0]
193 output  [17:0]  LEDR;     //  LED Red[17:0]
194 ////////////////////////////  UART////////////////////////////
195 output      UART_TXD;     //  UART Transmitter
196 input       UART_RXD;     //  UART Receiver
197 ////////////////////////////  IRDA  ////////////////////////////
198 output      IRDA_TXD;     //  IRDA Transmitter
199 input       IRDA_RXD;     //  IRDA Receiver
200 ///////////////////////  SDRAM Interface  ////////////////////////
201 inout [15:0]  DRAM_DQ;    //  SDRAM Data bus 16 Bits
202 output  [11:0]  DRAM_ADDR;//  SDRAM Address bus 12 Bits
203 output      DRAM_LDQM;    //  SDRAM Low-byte Data Mask 
204 output      DRAM_UDQM;    //  SDRAM High-byte Data Mask
205 output      DRAM_WE_N;    //  SDRAM Write Enable
206 output      DRAM_CAS_N;   //  SDRAM Column Address Strobe
207 output      DRAM_RAS_N;   //  SDRAM Row Address Strobe
208 output      DRAM_CS_N;    //  SDRAM Chip Select
209 output      DRAM_BA_0;    //  SDRAM Bank Address 0
210 output      DRAM_BA_1;    //  SDRAM Bank Address 0
211 output      DRAM_CLK;     //  SDRAM Clock
212 output      DRAM_CKE;     //  SDRAM Clock Enable
213 ////////////////////////  Flash Interface  ////////////////////////
214 inout [7:0] FL_DQ;        //  FLASH Data bus 8 Bits
215 output  [21:0]  FL_ADDR;  //  FLASH Address bus 22 Bits
216 output      FL_WE_N;      //  FLASH Write Enable
217 output      FL_RST_N;     //  FLASH Reset
218 output      FL_OE_N;      //  FLASH Output Enable
219 output      FL_CE_N;      //  FLASH Chip Enable
220 ////////////////////////  SRAM Interface  ////////////////////////
221 inout [15:0]  SRAM_DQ;    //  SRAM Data bus 16 Bits
222 output  [17:0]  SRAM_ADDR;//  SRAM Address bus 18 Bits
223 output      SRAM_UB_N;    //  SRAM High-byte Data Mask 
224 output      SRAM_LB_N;    //  SRAM Low-byte Data Mask 
225 output      SRAM_WE_N;    //  SRAM Write Enable
226 output      SRAM_CE_N;    //  SRAM Chip Enable
227 output      SRAM_OE_N;    //  SRAM Output Enable
228 ////////////////////  ISP1362 Interface ////////////////////////
229 inout [15:0]  OTG_DATA;   //  ISP1362 Data bus 16 Bits
230 output [1:0]  OTG_ADDR;   //  ISP1362 Address 2 Bits
231 output        OTG_CS_N;   //  ISP1362 Chip Select
232 output        OTG_RD_N;   //  ISP1362 Write
233 output        OTG_WR_N;   //  ISP1362 Read
234 output        OTG_RST_N;  //  ISP1362 Reset
235 output        OTG_FSPEED; //  USB Full Speed, 0 = Enable, Z = Disable
236 output        OTG_LSPEED; //  USB Low Speed,  0 = Enable, Z = Disable
237 input         OTG_INT0;   //  ISP1362 Interrupt 0
238 input         OTG_INT1;   //  ISP1362 Interrupt 1
239 input         OTG_DREQ0;  //  ISP1362 DMA Request 0
240 input         OTG_DREQ1;  //  ISP1362 DMA Request 1
241 output        OTG_DACK0_N;//  ISP1362 DMA Acknowledge 0
242 output        OTG_DACK1_N;//  ISP1362 DMA Acknowledge 1
243 ////////////////////  LCD Module 16X2  ////////////////////////////
244 inout [7:0] LCD_DATA;     //  LCD Data bus 8 bits
245 output      LCD_ON;       //  LCD Power ON/OFF
246 output      LCD_BLON;     //  LCD Back Light ON/OFF
247 output      LCD_RW;       //  LCD Read/Write Select, 0 = Write, 1 = Read
248 output      LCD_EN;       //  LCD Enable
249 output      LCD_RS;       //  LCD Command/Data Select, 0 = Command, 1 = Data
250 ////////////////////  SD Card Interface  ////////////////////////
251 inout       SD_DAT;       //  SD Card Data
252 inout       SD_DAT3;      //  SD Card Data 3
253 inout       SD_CMD;       //  SD Card Command Signal
254 output      SD_CLK;       //  SD Card Clock
255 ////////////////////////  I2C  ////////////////////////////////
256 inout       I2C_SDAT;     //  I2C Data
257 output      I2C_SCLK;     //  I2C Clock
258 ////////////////////////  PS2  ////////////////////////////////
259 input       PS2_DAT;      //  PS2 Data
260 input       PS2_CLK;      //  PS2 Clock
261 ////////////////////  USB JTAG link  ////////////////////////////
262 input       TDI;          //  CPLD -> FPGA (data in)
263 input       TCK;          //  CPLD -> FPGA (clk)
264 input       TCS;          //  CPLD -> FPGA (CS)
265 output      TDO;          //  FPGA -> CPLD (data out)
266 ////////////////////////  VGA  ////////////////////////////
267 output      VGA_CLK;      //  VGA Clock
268 output      VGA_HS;       //  VGA H_SYNC
269 output      VGA_VS;       //  VGA V_SYNC
270 output      VGA_BLANK;    //  VGA BLANK
271 output      VGA_SYNC;     //  VGA SYNC
272 output  [9:0] VGA_R;      //  VGA Red[9:0]
273 output  [9:0] VGA_G;      //  VGA Green[9:0]
274 output  [9:0] VGA_B;      //  VGA Blue[9:0]
275 ////////////////  Ethernet Interface  ////////////////////////////
276 inout [15:0]  ENET_DATA;  //  DM9000A DATA bus 16Bits
277 output        ENET_CMD;   //  DM9000A Command/Data Select, 0 = Command, 1 = Data
278 output        ENET_CS_N;  //  DM9000A Chip Select
279 output        ENET_WR_N;  //  DM9000A Write
280 output        ENET_RD_N;  //  DM9000A Read
281 output        ENET_RST_N; //  DM9000A Reset
282 input         ENET_INT;   //  DM9000A Interrupt
283 output        ENET_CLK;   //  DM9000A Clock 25 MHz
284 ////////////////////  Audio CODEC  ////////////////////////////
285 inout         AUD_ADCLRCK;//  Audio CODEC ADC LR Clock
286 input         AUD_ADCDAT; //  Audio CODEC ADC Data
287 inout         AUD_DACLRCK;//  Audio CODEC DAC LR Clock
288 output        AUD_DACDAT; //  Audio CODEC DAC Data
289 inout         AUD_BCLK;   //  Audio CODEC Bit-Stream Clock
290 output        AUD_XCK;    //  Audio CODEC Chip Clock
291 ////////////////////  TV Devoder  ////////////////////////////
292 input [7:0]   TD_DATA;    //  TV Decoder Data bus 8 bits
293 input     TD_HS;          //  TV Decoder H_SYNC
294 input     TD_VS;          //  TV Decoder V_SYNC
295 output    TD_RESET;       //  TV Decoder Reset
296 ////////////////////////  GPIO  ////////////////////////////////
297 inout [35:0]  GPIO_0;     //  GPIO Connection 0
298 inout [35:0]  GPIO_1;     //  GPIO Connection 1
299 
300 assign  LCD_ON    = 1'b1;
301 assign  LCD_BLON  = 1'b1;
302 assign  TD_RESET  = 1'b1;
303 
304 //  All inout port turn to tri-state
305 assign  FL_DQ     = 8'hzz;
306 assign  SRAM_DQ   = 16'hzzzz;
307 assign  OTG_DATA  = 16'hzzzz;
308 assign  LCD_DATA  = 8'hzz;
309 assign  SD_DAT    = 1'bz;
310 assign  I2C_SDAT  = 1'bz;
311 assign  ENET_DATA = 16'hzzzz;
312 assign  AUD_ADCLRCK = 1'bz;
313 assign  AUD_DACLRCK = 1'bz;
314 assign  AUD_BCLK  = 1'bz;
315 
316 //  CCD
317 wire  [9:0] CCD_DATA;
318 wire        CCD_SDAT;
319 wire        CCD_SCLK;
320 wire        CCD_FLASH;
321 wire        CCD_FVAL;
322 wire        CCD_LVAL;
323 wire        CCD_PIXCLK;
324 reg         CCD_MCLK; //  CCD Master Clock
325 
326 wire  [15:0]  Read_DATA1;
327 wire  [15:0]  Read_DATA2;
328 wire          VGA_CTRL_CLK;
329 wire          AUD_CTRL_CLK;
330 wire  [9:0]   mCCD_DATA;
331 wire          mCCD_DVAL;
332 wire          mCCD_DVAL_d;
333 wire  [10:0]  X_Cont;
334 wire  [10:0]  Y_Cont;
335 wire  [9:0]   X_ADDR;
336 wire  [31:0]  Frame_Cont;
337 wire  [9:0]   mCCD_R;
338 wire  [9:0]   mCCD_G;
339 wire  [9:0]   mCCD_B;
340 wire          DLY_RST_0;
341 wire          DLY_RST_1;
342 wire          DLY_RST_2;
343 wire          Read;
344 reg   [9:0]   rCCD_DATA;
345 reg           rCCD_LVAL;
346 reg           rCCD_FVAL;
347 wire  [9:0]   sCCD_R;
348 wire  [9:0]   sCCD_G;
349 wire  [9:0]   sCCD_B;
350 wire          sCCD_DVAL;
351 
352 // RGB2Gray output, VGA_Controller input
353 // add by oomusou 07/14/2008
354 wire  [9:0] w_r;
355 wire  [9:0] w_g;
356 wire  [9:0] w_b;
357 
358 //  For Sensor 1
359 assign  CCD_DATA[0] = GPIO_1[0];
360 assign  CCD_DATA[1] = GPIO_1[1];
361 assign  CCD_DATA[2] = GPIO_1[5];
362 assign  CCD_DATA[3] = GPIO_1[3];
363 assign  CCD_DATA[4] = GPIO_1[2];
364 assign  CCD_DATA[5] = GPIO_1[4];
365 assign  CCD_DATA[6] = GPIO_1[6];
366 assign  CCD_DATA[7] = GPIO_1[7];
367 assign  CCD_DATA[8] = GPIO_1[8];
368 assign  CCD_DATA[9] = GPIO_1[9];
369 assign  GPIO_1[11]  = CCD_MCLK;
370 //assign  GPIO_1[15]  = CCD_SDAT;
371 //assign  GPIO_1[14]  = CCD_SCLK;
372 assign  CCD_FVAL    = GPIO_1[13];
373 assign  CCD_LVAL    = GPIO_1[12];
374 assign  CCD_PIXCLK  = GPIO_1[10];
375 //  For Sensor 2
376 /*
377 assign  CCD_DATA[0] = GPIO_1[0+20];
378 assign  CCD_DATA[1] = GPIO_1[1+20];
379 assign  CCD_DATA[2] = GPIO_1[5+20];
380 assign  CCD_DATA[3] = GPIO_1[3+20];
381 assign  CCD_DATA[4] = GPIO_1[2+20];
382 assign  CCD_DATA[5] = GPIO_1[4+20];
383 assign  CCD_DATA[6] = GPIO_1[6+20];
384 assign  CCD_DATA[7] = GPIO_1[7+20];
385 assign  CCD_DATA[8] = GPIO_1[8+20];
386 assign  CCD_DATA[9] = GPIO_1[9+20];
387 assign  GPIO_1[11+20] = CCD_MCLK;
388 assign  GPIO_1[15+20] = CCD_SDAT;
389 assign  GPIO_1[14+20] = CCD_SCLK;
390 assign  CCD_FVAL = GPIO_1[13+20];
391 assign  CCD_LVAL = GPIO_1[12+20];
392 assign  CCD_PIXCLK = GPIO_1[10+20];
393 */
394 assign  LEDR    = SW;
395 assign  LEDG    = Y_Cont;
396 assign  VGA_CTRL_CLK= CCD_MCLK;
397 assign  VGA_CLK = ~CCD_MCLK;
398 
399 always@(posedge CLOCK_50) CCD_MCLK  <=  ~CCD_MCLK;
400 
401 always@(posedge CCD_PIXCLK)
402 begin
403   rCCD_DATA <=  CCD_DATA;
404   rCCD_LVAL <=  CCD_LVAL;
405   rCCD_FVAL <=  CCD_FVAL;
406 end
407 
408 VGA_Controller  u1  ( //  Host Side
409   .oRequest(Read),
410   .iRed(w_r),
411   .iGreen(w_g),
412   .iBlue(w_b),
413   //  VGA Side
414   .oVGA_R(VGA_R),
415   .oVGA_G(VGA_G),
416   .oVGA_B(VGA_B),
417   .oVGA_H_SYNC(VGA_HS),
418   .oVGA_V_SYNC(VGA_VS),
419   .oVGA_SYNC(VGA_SYNC),
420   .oVGA_BLANK(VGA_BLANK),
421   //  Control Signal
422   .iCLK(VGA_CTRL_CLK),
423   .iRST_N(DLY_RST_2)
424 );
425 
426 Reset_Delay u2  (
427   .iCLK(CLOCK_50),
428   .iRST(KEY[0]),
429   .oRST_0(DLY_RST_0),
430   .oRST_1(DLY_RST_1),
431   .oRST_2(DLY_RST_2)
432 );
433 
434 CCD_Capture u3  (
435   .oDATA(mCCD_DATA),
436   .oDVAL(mCCD_DVAL),
437   .oX_Cont(X_Cont),
438   .oY_Cont(Y_Cont),
439   .oFrame_Cont(Frame_Cont),
440   .iDATA(rCCD_DATA),
441   .iFVAL(rCCD_FVAL),
442   .iLVAL(rCCD_LVAL),
443   .iSTART(!KEY[3]),
444   .iEND(!KEY[2]),
445   .iCLK(CCD_PIXCLK),
446   .iRST(DLY_RST_1)
447 );
448 
449 RAW2RGB u4  (
450   .oRed(mCCD_R),
451   .oGreen(mCCD_G),
452   .oBlue(mCCD_B),
453   .oDVAL(mCCD_DVAL_d),
454   .iX_Cont(X_Cont),
455   .iY_Cont(Y_Cont),
456   .iDATA(mCCD_DATA),
457   .iDVAL(mCCD_DVAL),
458   .iCLK(CCD_PIXCLK),
459   .iRST(DLY_RST_1)
460 );
461 
462 SEG7_LUT_8 u5 (
463   .oSEG0(HEX0),
464   .oSEG1(HEX1),
465   .oSEG2(HEX2),
466   .oSEG3(HEX3),
467   .oSEG4(HEX4),
468   .oSEG5(HEX5),
469   .oSEG6(HEX6),
470   .oSEG7(HEX7),
471   .iDIG(Frame_Cont)
472 );
473 
474 Sdram_Control_4Port u6  (// HOST Side
475   .REF_CLK(CLOCK_50),
476   .RESET_N(1'b1),
477   //  FIFO Write Side 1
478   .WR1_DATA({sCCD_G[9:5], sCCD_B[9:0]}), 
479   .WR1(sCCD_DVAL),
480   .WR1_ADDR(0),
481   .WR1_MAX_ADDR(640*512),
482   .WR1_LENGTH(9'h100),
483   .WR1_LOAD(!DLY_RST_0),
484   .WR1_CLK(CCD_PIXCLK),
485   //  FIFO Write Side 2
486   .WR2_DATA({sCCD_G[4:0], sCCD_R[9:0]}),
487   .WR2(sCCD_DVAL),
488   .WR2_ADDR(22'h100000),
489   .WR2_MAX_ADDR(22'h100000+640*512),
490   .WR2_LENGTH(9'h100),
491   .WR2_LOAD(!DLY_RST_0),
492   .WR2_CLK(CCD_PIXCLK),
493   //  FIFO Read Side 1
494   .RD1_DATA(Read_DATA1),
495   .RD1(Read),
496   .RD1_ADDR(640*16),
497   .RD1_MAX_ADDR(640*496),
498   .RD1_LENGTH(9'h100),
499   .RD1_LOAD(!DLY_RST_0),
500   .RD1_CLK(VGA_CTRL_CLK),
501   //  FIFO Read Side 2
502   .RD2_DATA(Read_DATA2),
503   .RD2(Read),
504   .RD2_ADDR(22'h100000+640*16),
505   .RD2_MAX_ADDR(22'h100000+640*496),
506   .RD2_LENGTH(9'h100),
507   .RD2_LOAD(!DLY_RST_0),
508   .RD2_CLK(VGA_CTRL_CLK),
509   //  SDRAM Side
510   .SA(DRAM_ADDR),
511   .BA({DRAM_BA_1,DRAM_BA_0}), .CS_N(DRAM_CS_N),
512   .CKE(DRAM_CKE),
513   .RAS_N(DRAM_RAS_N),
514   .CAS_N(DRAM_CAS_N),
515   .WE_N(DRAM_WE_N),
516   .DQ(DRAM_DQ),
517   .DQM({DRAM_UDQM,DRAM_LDQM}),
518   .SDR_CLK(DRAM_CLK)
519 );
520 
521 I2C_CCD_Config u7 ( //  Host Side
522   .iCLK(CLOCK_50),
523   .iRST_N(KEY[1]),
524   .iExposure(SW[15:0]),
525   //    I2C Side
526   .I2C_SCLK(GPIO_1[14]),
527   .I2C_SDAT(GPIO_1[15])
528 );
529 
530 Mirror_Col  u8  ( //  Input Side
531   .iCCD_R(mCCD_R),
532   .iCCD_G(mCCD_G),
533   .iCCD_B(mCCD_B),
534   .iCCD_DVAL(mCCD_DVAL_d),
535   .iCCD_PIXCLK(CCD_PIXCLK),
536   .iRST_N(DLY_RST_1),
537   //  Output Side
538   .oCCD_R(sCCD_R),
539   .oCCD_G(sCCD_G),
540   .oCCD_B(sCCD_B),
541   .oCCD_DVAL(sCCD_DVAL)
542 );
543 
544 RGB2Gray u9 (
545   .clk(VGA_CTRL_CLK),
546   .rst_n(DLY_RST_2),
547   .i_r(Read_DATA2[9:0]),
548   .i_g({Read_DATA1[14:10],Read_DATA2[14:10]}),
549   .i_b(Read_DATA1[9:0]),
550   .o_r(w_r),
551   .o_g(w_g),
552   .o_b(w_b)
553 );
554 
555 endmodule

整個有改的地方如下:
352行

// RGB2Gray output, VGA_Controller input
// add by oomusou 07/14/2008
wire  [9:0] w_r;
wire  [9:0] w_g;
wire  [9:0] w_b;

宣告了wire供RGB2Gray與VGA_Controller之間的連線

408行

VGA_Controller  u1  ( //  Host Side
  .oRequest(Read),
  .iRed(w_r),
  .iGreen(w_g),
  .iBlue(w_b),
  //  VGA Side
  .oVGA_R(VGA_R),
  .oVGA_G(VGA_G),
  .oVGA_B(VGA_B),
  .oVGA_H_SYNC(VGA_HS),
  .oVGA_V_SYNC(VGA_VS),
  .oVGA_SYNC(VGA_SYNC),
  .oVGA_BLANK(VGA_BLANK),
  //  Control Signal
  .iCLK(VGA_CTRL_CLK),
  .iRST_N(DLY_RST_2)
);

VGA_Controller例化上,原來是直接從SDRAM輸入,現在改成剛剛宣告的w_r、w_g、w_b。

544行

RGB2Gray u9 (
  .clk(VGA_CTRL_CLK),
  .rst_n(DLY_RST_2),
  .i_r(Read_DATA2[9:0]),
  .i_g({Read_DATA1[14:10],Read_DATA2[14:10]}),
  .i_b(Read_DATA1[9:0]),
  .o_r(w_r),
  .o_g(w_g),
  .o_b(w_b)
);

RGB2Gray的例化,將SDRAM的資料送進RGB2Gray做灰階轉換。

完整程式碼下載
DE2_CCD_gray.7z

Conclusion
整個架構其實相當簡單,唯RGB轉灰階並不是用最嚴謹的演算法,可以就這個地方加以改善,或加上pipeline。

See Also
(原創) 如何控制DE2 VGA輸出時某座標的顏色? (IC Design) (DE2) (Quartus II)
(原創) 如何將CMOS所擷取的影像傳到PC端? (IC Design) (DE2)
(原創) 如何在DE2將CCD影像顯示在彩色LCD上? (純硬體篇) (IC Design) (DE2)
(原創) 如何解決DE2範例DE2_CCD_detect左右相反的問題? (IC Design) (DE2) (Quartus II)
(原創) 如何Real Time產生灰階影像? (SOC) (DE2) (TRDB-DC2)

 
分类: TRDB-DC2, DE2, SOC
原文地址:https://www.cnblogs.com/woshitianma/p/2585467.html