zoukankan      html  css  js  c++  java
  • (转) 如何將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
  • 相关阅读:
    [leetcode-604-Design Compressed String Iterator]
    [leetcode-617-Merge Two Binary Trees]
    OpenCV学习1-----打开摄像头并在画面上添加水印
    cvCvtColor与cvtColor区别
    [leetcode-547-Friend Circles]
    [leetcode-260-Single Number III]
    复位电路
    单片机特殊功能寄存器
    单片机的定时器与计数器
    单片机定时/计数工作方式
  • 原文地址:https://www.cnblogs.com/woshitianma/p/2585467.html
Copyright © 2011-2022 走看看