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】1295. Find Numbers with Even Number of Digits
    【leetcode】427. Construct Quad Tree
    【leetcode】1240. Tiling a Rectangle with the Fewest Squares
    【leetcode】1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold
    【leetcode】1291. Sequential Digits
    【leetcode】1290. Convert Binary Number in a Linked List to Integer
    【leetcode】1269. Number of Ways to Stay in the Same Place After Some Steps
    【leetcode】1289. Minimum Falling Path Sum II
    【leetcode】1288. Remove Covered Intervals
    【leetcode】1287. Element Appearing More Than 25% In Sorted Array
  • 原文地址:https://www.cnblogs.com/woshitianma/p/2585467.html
Copyright © 2011-2022 走看看