(原創) 如何將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_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行
// 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行
.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行
.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)