如何將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上,其架構如下所示:

vga00

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

RGB2Gray.v / Verilog

1  /*  
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)

  1  // --------------------------------------------------------------------
  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: [email protected]
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)

你可能感兴趣的:(SOC)