如何解決DE2範例DE2_CCD_detect左右相反的問題? (IC Design) (DE2) (Quartus II)

Abstract
DE2_CCD_detect是友晶科技為DE2和其130萬像素CMOS所寫的motion detection範例,有motion之處會在輸出的VGA顯示紅色,但官方的範例會造成左右相反,本文提出解決的方式。

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

在友晶科技的範例程式光碟中,有兩個有趣的例子,一個是DE2_CCD,展示了130萬像素CMOS基本free run與capture的功能,一個是DE2_CCD_detect,能做real time的motion detection,成果展示可在http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=Taiwan&CategoryNo=38&No=62 觀賞。

DE2_CCD結果正常,DE2_CCD_detect雖然能正確的做出motion detection,但可惜左右相反,經過一番研究,本文提出想種解決方法。

Method 1
這是我寫email問友晶科技([email protected])後,所回覆的官方解法,最簡單也最直接,直接修改I2C_CCD_Config.v。

I2C_CCD_Config.v

  1  module I2C_CCD_Config (    //     Host Side
  2                          iCLK,
  3                          iRST_N,
  4                          iExposure,
  5                          //     I2C Side
  6                          I2C_SCLK,
  7                          I2C_SDAT    );
  8  //     Host Side
  9  input            iCLK;
10  input            iRST_N;
11  input    [ 15 : 0 ]    iExposure;
12  //     I2C Side
13  output        I2C_SCLK;
14  inout        I2C_SDAT;
15  //     Internal Registers/Wires
16  reg    [ 15 : 0 ]    mI2C_CLK_DIV;
17  reg    [ 23 : 0 ]    mI2C_DATA;
18  reg            mI2C_CTRL_CLK;
19  reg            mI2C_GO;
20  wire        mI2C_END;
21  wire        mI2C_ACK;
22  reg    [ 15 : 0 ]    LUT_DATA;
23  reg    [ 5 : 0 ]    LUT_INDEX;
24  reg    [ 3 : 0 ]    mSetup_ST;
25 
26  //     Clock Setting
27  parameter    CLK_Freq    =     50000000 ;    //     50    MHz
28  parameter    I2C_Freq    =     20000 ;        //     20    KHz
29  //     LUT Data Number
30  parameter    LUT_SIZE    =     17 ;
31 
32  /////////////////////     I2C Control Clock    ////////////////////////
33  always@(posedge iCLK or negedge iRST_N)
34  begin
35      if ( ! iRST_N)
36      begin
37          mI2C_CTRL_CLK    <=     0 ;
38          mI2C_CLK_DIV    <=     0 ;
39      end
40      else
41      begin
42          if ( mI2C_CLK_DIV    < (CLK_Freq / I2C_Freq) )
43          mI2C_CLK_DIV    <=     mI2C_CLK_DIV + 1 ;
44          else
45          begin
46              mI2C_CLK_DIV    <=     0 ;
47              mI2C_CTRL_CLK    <=     ~ mI2C_CTRL_CLK;
48          end
49      end
50  end
51  ////////////////////////////////////////////////////////////////// //
52  I2C_Controller     u0    (    .CLOCK(mI2C_CTRL_CLK),        //     Controller Work Clock
53                          .I2C_SCLK(I2C_SCLK),        //     I2C CLOCK
54                                .I2C_SDAT(I2C_SDAT),        //     I2C DATA
55                          .I2C_DATA(mI2C_DATA),        //     DATA:[SLAVE_ADDR,SUB_ADDR,DATA]
56                          .GO(mI2C_GO),                  //     GO transfor
57                          .END(mI2C_END),                //     END transfor
58                          .ACK(mI2C_ACK),                //     ACK
59                          .RESET(iRST_N)    );
60  ////////////////////////////////////////////////////////////////// //
61  ///////////////////// /    Config Control    /////////////////////////// /
62  always@(posedge mI2C_CTRL_CLK or negedge iRST_N)
63  begin
64      if ( ! iRST_N)
65      begin
66          LUT_INDEX    <=     0 ;
67          mSetup_ST    <=     0 ;
68          mI2C_GO        <=     0 ;
69      end
70      else
71      begin
72          if (LUT_INDEX < LUT_SIZE)
73          begin
74              case (mSetup_ST)
75              0 :    begin
76                      mI2C_DATA    <=     { 8 ' hBA,LUT_DATA};
77                      mI2C_GO        <=     1 ;
78                      mSetup_ST    <=     1 ;
79                  end
80              1 :    begin
81                      if (mI2C_END)
82                      begin
83                          if ( ! mI2C_ACK)
84                          mSetup_ST    <=     2 ;
85                          else
86                          mSetup_ST    <=     0 ;                           
87                          mI2C_GO        <=     0 ;
88                      end
89                  end
90              2 :    begin
91                      LUT_INDEX    <=     LUT_INDEX + 1 ;
92                      mSetup_ST    <=     0 ;
93                  end
94              endcase
95          end
96      end
97  end
98  ////////////////////////////////////////////////////////////////// //
99  /////////////////////     Config Data LUT      //////////////////////// //   
100  always
101  begin
102      case (LUT_INDEX)
103      0     :    LUT_DATA    <=     16 ' h0000;
104      1     :    LUT_DATA    <=     16 ' h2000;
105      2     :    LUT_DATA    <=     16 ' hF103;    //    Mirror Row and Columns
106      3     :    LUT_DATA    <=     { 8 ' h09,iExposure[15:8]};//    Exposure
107      4     :    LUT_DATA    <=     { 8 ' hF1,iExposure[7:0]};
108      5     :    LUT_DATA    <=     16 ' h2B00;    //    Green 1 Gain
109      6     :    LUT_DATA    <=     16 ' hF1B0;
110      7     :    LUT_DATA    <=     16 ' h2C00;    //    Blue Gain
111      8     :    LUT_DATA    <=     16 ' hF1CF;
112      9     :    LUT_DATA    <=     16 ' h2D00;    //    Red Gain
113      10     :    LUT_DATA    <=     16 ' hF1CF;
114      11     :    LUT_DATA    <=     16 ' h2E00;    //    Green 2 Gain
115      12     :    LUT_DATA    <=     16 ' hF1B0;
116      13     :    LUT_DATA    <=     16 ' h0500;    //    H_Blanking
117      14     :    LUT_DATA    <=     16 ' hF188;
118      15     :    LUT_DATA    <=     16 ' h0600;    //    V_Blanking
119      16     :    LUT_DATA    <=     16 ' hF119;
120      default :LUT_DATA    <=     16 ' h0000;
121      endcase
122  end
123  ////////////////////////////////////////////////////////////////// //
124  endmodule


105行

  2     :    LUT_DATA    <=     16 ' hF103;    //    Mirror Row and Columns


原來是16'hF101,改成16'F103後就可以左右正常。

Method 2
在DE2_CCD中,影像其實原本也是左右相反的,但他透過了Mirror_Col將左右影像再做一次mirror變正常,所以我們試著也將DE2_CCD_detect模仿DE2_CCD所使用的技巧。

Step 1:
將DE2_CCD中的Mirror_Col.v與Stack_RAM.v複製到DE2_CCD_detect目錄下。

Step 2:
修改DE2_CCD_detect.v如下

  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 - Motion Detect
34  //
35  // --------------------------------------------------------------------
36  //
37  // Revision History :
38  // --------------------------------------------------------------------
39  //    Ver  :| Author            :| Mod. Date :| Changes Made:
40  //    V1.0 :| Johnny Chen       :| 06/02/23  :|      Initial Revision
41  //    V1.1 :| Johnny Chen       :| 06/03/22  :|      Change Pin Assignment For New Sensor
42  //    V1.2 :| Johnny Chen       :| 06/03/22  :|      Fixed to Compatible with Quartus II 6.0
43  // --------------------------------------------------------------------
44 
45  module DE2_CCD_detect
46      (
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  assign    AUD_XCK        =     AUD_CTRL_CLK;
304 
305  //     All inout port turn to tri-state
306  assign    FL_DQ        =     8 ' hzz;
307  assign    SRAM_DQ        =     16 ' hzzzz;
308  assign    OTG_DATA    =     16 ' hzzzz;
309  assign    LCD_DATA    =     8 ' hzz;
310  assign    SD_DAT        =     1 ' bz;
311  assign    ENET_DATA    =     16 ' hzzzz;
312 
313  //     CCD
314  wire    [ 9 : 0 ]    CCD_DATA;
315  wire            CCD_SDAT;
316  wire            CCD_SCLK;
317  wire            CCD_FLASH;
318  wire            CCD_FVAL;
319  wire            CCD_LVAL;
320  wire            CCD_PIXCLK;
321  reg                CCD_MCLK;    //     CCD Master Clock
322 
323  wire    [ 15 : 0 ]    Read_DATA1;
324  wire    [ 15 : 0 ]    Read_DATA2;
325  wire            VGA_CTRL_CLK;
326  wire            AUD_CTRL_CLK;
327  wire    [ 9 : 0 ]    mCCD_DATA;
328  wire            mCCD_DVAL;
329  wire            mCCD_DVAL_d;
330  wire    [ 10 : 0 ]    X_Cont;
331  wire    [ 10 : 0 ]    Y_Cont;
332  wire    [ 9 : 0 ]    X_ADDR;
333  wire    [ 31 : 0 ]    Frame_Cont;
334  wire    [ 9 : 0 ]    mCCD_R;
335  wire    [ 9 : 0 ]    mCCD_G;
336  wire    [ 9 : 0 ]    mCCD_B;
337  wire            DLY_RST_0;
338  wire            DLY_RST_1;
339  wire            DLY_RST_2;
340  wire            Read;
341  reg        [ 9 : 0 ]    rCCD_DATA;
342  reg                rCCD_LVAL;
343  reg                rCCD_FVAL;
344     
345  //     For Sensor 1
346  assign    CCD_DATA[ 0 ]    =     GPIO_1[ 0 ];
347  assign    CCD_DATA[ 1 ]    =     GPIO_1[ 1 ];
348  assign    CCD_DATA[ 2 ]    =     GPIO_1[ 5 ];
349  assign    CCD_DATA[ 3 ]    =     GPIO_1[ 3 ];
350  assign    CCD_DATA[ 4 ]    =     GPIO_1[ 2 ];
351  assign    CCD_DATA[ 5 ]    =     GPIO_1[ 4 ];
352  assign    CCD_DATA[ 6 ]    =     GPIO_1[ 6 ];
353  assign    CCD_DATA[ 7 ]    =     GPIO_1[ 7 ];
354  assign    CCD_DATA[ 8 ]    =     GPIO_1[ 8 ];
355  assign    CCD_DATA[ 9 ]    =     GPIO_1[ 9 ];
356  assign    GPIO_1[ 11 ]    =     CCD_MCLK;
357  // assign    GPIO_1[15]    =    CCD_SDAT;
358  // assign    GPIO_1[14]    =    CCD_SCLK;
359  assign    CCD_FVAL    =     GPIO_1[ 13 ];
360  assign    CCD_LVAL    =     GPIO_1[ 12 ];
361  assign    CCD_PIXCLK    =     GPIO_1[ 10 ];
362  //     For Sensor 2
363  /*
364  assign    CCD_DATA[0]    =    GPIO_1[0+20];
365  assign    CCD_DATA[1]    =    GPIO_1[1+20];
366  assign    CCD_DATA[2]    =    GPIO_1[5+20];
367  assign    CCD_DATA[3]    =    GPIO_1[3+20];
368  assign    CCD_DATA[4]    =    GPIO_1[2+20];
369  assign    CCD_DATA[5]    =    GPIO_1[4+20];
370  assign    CCD_DATA[6]    =    GPIO_1[6+20];
371  assign    CCD_DATA[7]    =    GPIO_1[7+20];
372  assign    CCD_DATA[8]    =    GPIO_1[8+20];
373  assign    CCD_DATA[9]    =    GPIO_1[9+20];
374  assign    GPIO_1[11+20]    =    CCD_MCLK;
375  assign    GPIO_1[15+20]    =    CCD_SDAT;
376  assign    GPIO_1[14+20]    =    CCD_SCLK;
377  assign    CCD_FVAL    =    GPIO_1[13+20];
378  assign    CCD_LVAL    =    GPIO_1[12+20];
379  assign    CCD_PIXCLK    =    GPIO_1[10+20];
380  */
381  assign    LEDR        =     SW;
382  assign    LEDG        =     Y_Cont;
383  assign    VGA_CTRL_CLK =     CCD_MCLK;
384  assign    VGA_CLK        =     ~ CCD_MCLK;
385 
386  always@(posedge CLOCK_50)    CCD_MCLK    <=     ~ CCD_MCLK;
387 
388  always@(posedge CCD_PIXCLK)
389  begin
390      rCCD_DATA    <=     CCD_DATA;
391      rCCD_LVAL    <=     CCD_LVAL;
392      rCCD_FVAL    <=     CCD_FVAL;
393  end
394 
395  VGA_Controller        u1    (    //     Host Side
396                              .oRequest(Read),
397                              .iRed(mVGA_R),
398                              .iGreen(mVGA_G),
399                              .iBlue(mVGA_B),
400                              .oCoord_X(mVGA_X),
401                              .oCoord_Y(mVGA_Y),
402                              //     VGA Side
403                              .oVGA_R(VGA_R),
404                              .oVGA_G(VGA_G),
405                              .oVGA_B(VGA_B),
406                              .oVGA_H_SYNC(VGA_HS),
407                              .oVGA_V_SYNC(VGA_VS),
408                              .oVGA_SYNC(VGA_SYNC),
409                              .oVGA_BLANK(VGA_BLANK),
410                              //     Control Signal
411                              .iCLK(VGA_CTRL_CLK),
412                              .iRST_N(DLY_RST_2)    );
413 
414  Reset_Delay            u2    (    .iCLK(CLOCK_50),
415                              .iRST(KEY[ 0 ]),
416                              .oRST_0(DLY_RST_0),
417                              .oRST_1(DLY_RST_1),
418                              .oRST_2(DLY_RST_2)    );
419 
420  CCD_Capture            u3    (    .oDATA(mCCD_DATA),
421                              .oDVAL(mCCD_DVAL),
422                              .oX_Cont(X_Cont),
423                              .oY_Cont(Y_Cont),
424                              .oFrame_Cont(Frame_Cont),
425                              .iDATA(rCCD_DATA),
426                              .iFVAL(rCCD_FVAL),
427                              .iLVAL(rCCD_LVAL),
428                              .iSTART( ! KEY[ 3 ]),
429                              .iEND( ! KEY[ 2 ]),
430                              .iCLK(CCD_PIXCLK),
431                              .iRST(DLY_RST_1)    );
432 
433  RAW2RGB                u4    (    .oRed(mCCD_R),
434                              .oGreen(mCCD_G),
435                              .oBlue(mCCD_B),
436                              .oDVAL(mCCD_DVAL_d),
437                              .iX_Cont(X_Cont),
438                              .iY_Cont(Y_Cont),
439                              .iDATA(mCCD_DATA),
440                              .iDVAL(mCCD_DVAL),
441                              .iCLK(CCD_PIXCLK),
442                              .iRST(DLY_RST_1)    );
443 
444  SEG7_LUT_8             u5    (    .oSEG0(HEX0),.oSEG1(HEX1),
445                              .oSEG2(HEX2),.oSEG3(HEX3),
446                              .oSEG4(HEX4),.oSEG5(HEX5),
447                              .oSEG6(HEX6),.oSEG7(HEX7),
448                              .iDIG(Frame_Cont) );
449 
450  Sdram_Control_4Port    u6 (   
451    //     HOST Side
452    .REF_CLK(CLOCK_50),
453    .RESET_N( 1 ' b1),
454    //     FIFO Write Side 1
455    .WR1_DATA({sCCD_R[ 9 : 5 ], sCCD_G[ 9 : 5 ], sCCD_B[ 9 : 5 ]}),
456    .WR1(mCCD_DVAL_d),
457    .WR1_ADDR( 0 ),
458    .WR1_MAX_ADDR( 640 * 512 * 2 ),
459    .WR1_LENGTH( 9 ' h100),
460    .WR1_LOAD( ! DLY_RST_0),
461    .WR1_CLK(CCD_PIXCLK),
462    //     FIFO Read Side 1
463    .RD1_DATA(Read_DATA1),
464    .RD1(Read),
465    .RD1_ADDR( 640 * 16 ),
466    .RD1_MAX_ADDR( 640 * 496 ),
467    .RD1_LENGTH( 9 ' h100),
468    .RD1_LOAD( ! DLY_RST_0),
469    .RD1_CLK(VGA_CTRL_CLK),
470    //     FIFO Read Side 2
471    .RD2_DATA(Read_DATA2),
472    .RD2(Read),
473    .RD2_ADDR( 640 * 512 + 640 * 16 ),
474    .RD2_MAX_ADDR( 640 * 512 + 640 * 496 ),
475    .RD2_LENGTH( 9 ' h100),
476    .RD2_LOAD( ! DLY_RST_0),
477    .RD2_CLK(VGA_CTRL_CLK),
478    //     SDRAM Side
479    .SA(DRAM_ADDR),
480    .BA({DRAM_BA_1,DRAM_BA_0}),
481    .CS_N(DRAM_CS_N),
482    .CKE(DRAM_CKE),
483    .RAS_N(DRAM_RAS_N),
484    .CAS_N(DRAM_CAS_N),
485    .WE_N(DRAM_WE_N),
486    .DQ(DRAM_DQ),
487    .DQM({DRAM_UDQM,DRAM_LDQM}),
488    .SDR_CLK(DRAM_CLK)
489  );
490 
491  I2C_CCD_Config         u7    (    //     Host Side
492                              .iCLK(CLOCK_50),
493                              .iRST_N(KEY[ 1 ]),
494                              .iExposure(SW[ 15 : 0 ]),
495                              //     I2C Side
496                              .I2C_SCLK(GPIO_1[ 14 ]),
497                              .I2C_SDAT(GPIO_1[ 15 ])    );
498                             
499  I2C_AV_Config         u8    (    //     Host Side
500                              .iCLK(CLOCK_50),
501                              .iRST_N(KEY[ 0 ]),
502                              //     I2C Side
503                              .I2C_SCLK(I2C_SCLK),
504                              .I2C_SDAT(I2C_SDAT)    );
505 
506  AUDIO_DAC             u9    (    //     Audio Side
507                              .oAUD_BCK(AUD_BCLK),
508                              .oAUD_DATA(AUD_DACDAT),
509                              .oAUD_LRCK(AUD_DACLRCK),
510                              //     Control Signals
511                              .iSrc_Select( ~ (SP_cont[ 21 ] & SP)),
512                              .iCLK_18_4(AUD_CTRL_CLK),
513                              .iRST_N(DLY_RST_1)    );
514 
515  Audio_PLL             u10    (    .inclk0(CLOCK_27),.c0(AUD_CTRL_CLK)    );
516 
517  // ======================    motion detect    ====================== //
518  wire    [ 10 : 0 ]    mTap_0;
519  reg        [ 10 : 0 ]    mTap_1,mTap_2,mTap_3,
520                  mTap_4,mTap_5,mTap_6,
521                  mTap_7,mTap_8,mTap_9,mTap_10;
522  wire    [ 10 : 0 ]    rTap_0;
523  reg        [ 10 : 0 ]    rTap_1,rTap_2,rTap_3,
524                  rTap_4,rTap_5,rTap_6,
525                  rTap_7,rTap_8,rTap_9,rTap_10;
526  wire    [ 10 : 0 ]    sTap_0;
527  reg        [ 10 : 0 ]    sTap_1,sTap_2,sTap_3,
528                  sTap_4,sTap_5,sTap_6,
529                  sTap_7,sTap_8,sTap_9,sTap_10;
530  reg                X,Y,Z;
531  reg                F1,F2;
532  reg        [ 5 : 0 ]    Read_d;
533 
534  always@(posedge VGA_CTRL_CLK)
535  begin
536      // ---------------    binary    ------------------- //    
537      F1    <=     (    Read_DATA1[ 14 : 10 ] + Read_DATA1[ 9 : 5 ] + Read_DATA1[ 4 : 0 ] )    > 48 ;
538      F2    <=     (    Read_DATA2[ 14 : 10 ] + Read_DATA2[ 9 : 5 ] + Read_DATA2[ 4 : 0 ] )    > 48 ;   
539      // --------------------------------------------- //
540      mTap_1    <=     mTap_0;
541      mTap_2    <=     mTap_1;
542      mTap_3    <=     mTap_2;
543      mTap_4    <=     mTap_3;
544      mTap_5    <=     mTap_4;
545      mTap_6    <=     mTap_5;
546      mTap_7    <=     mTap_6;
547      mTap_8    <=     mTap_7;
548      mTap_9    <=     mTap_8;
549      mTap_10    <=     mTap_9;
550      // ---------------    erode    ------------------- //
551      X        <=     ( & mTap_0) & ( & mTap_1) & ( & mTap_2) &
552                  ( & mTap_3) & ( & mTap_4) & ( & mTap_5) &
553                  ( & mTap_6) & ( & mTap_7) & ( & mTap_8) &
554                  ( & mTap_9) & ( & mTap_10);
555      // --------------------------------------------- //
556      rTap_1    <=     rTap_0;
557      rTap_2    <=     rTap_1;
558      rTap_3    <=     rTap_2;
559      rTap_4    <=     rTap_3;
560      rTap_5    <=     rTap_4;
561      rTap_6    <=     rTap_5;
562      rTap_7    <=     rTap_6;
563      rTap_8    <=     rTap_7;
564      rTap_9    <=     rTap_8;
565      rTap_10    <=     rTap_9;
566      // ---------------    dilate    ------------------- //
567      Y        <=     ( | rTap_0) | ( | rTap_1) | ( | rTap_2) |
568                  ( | rTap_3) | ( | rTap_4) | ( | rTap_5) |
569                  ( | rTap_6) | ( | rTap_7) | ( | rTap_8) |
570                  ( | rTap_9) | ( | rTap_10);
571      // --------------------------------------------- //
572      sTap_1    <=     sTap_0;
573      sTap_2    <=     sTap_1;
574      sTap_3    <=     sTap_2;
575      sTap_4    <=     sTap_3;
576      sTap_5    <=     sTap_4;
577      sTap_6    <=     sTap_5;
578      sTap_7    <=     sTap_6;
579      sTap_8    <=     sTap_7;
580      sTap_9    <=     sTap_8;
581      sTap_10    <=     sTap_9;
582      // ---------------    erode    ------------------- //
583      Z        <=     ( & sTap_0) & ( & sTap_1) & ( & sTap_2) &
584                  ( & sTap_3) & ( & sTap_4) & ( & sTap_5) &
585                  ( & sTap_6) & ( & sTap_7) & ( & sTap_8) &
586                  ( & sTap_9) & ( & sTap_10);
587      // --------------------------------------------- //
588      Read_d    <=     {Read_d[ 4 : 0 ],Read};
589  end
590  // ---------------    detect method 1    ------------------- //
591  Tap_1     u99    (    .clken(Read),
592                  .clock(VGA_CTRL_CLK),
593                  .shiftin(    (Read_DATA1[ 14 : 10 ] ^ Read_DATA2[ 14 : 10 ]) |  
594                              (Read_DATA1[ 9 : 5 ] ^ Read_DATA2[ 9 : 5 ]) |
595                              (Read_DATA1[ 4 : 0 ] ^ Read_DATA2[ 4 : 0 ]) ),
596                  .taps(mTap_0));
597         
598  Tap_1     u98    (    .clken(Read_d[ 5 ]),
599                  .clock(VGA_CTRL_CLK),
600                  .shiftin(X),
601                  .taps(rTap_0));
602  // ---------------    detect method 2    ------------------- //
603  Tap_1     u97    (    .clken(Read_d[ 0 ]),
604                  .clock(VGA_CTRL_CLK),
605                  .shiftin(F1 ^ F2),
606                  .taps(sTap_0));
607  // ================================================================== //
608  wire    [ 9 : 0 ]    mVGA_R    =     (    (mVGA_X >= 20   && mVGA_X < 620 ) && (mVGA_Y >= 20   && mVGA_Y < 460 )    ) ?
609                              (    Y | Z    ?     1023     :    {Read_DATA1[ 14 : 10 ], 5 ' h00}    ):
610                                                      {Read_DATA1[ 14 : 10 ], 5 ' h00}    ;
611  wire    [ 9 : 0 ]    mVGA_G    =     {Read_DATA1[ 9 : 5 ], 5 ' h00};
612  wire    [ 9 : 0 ]    mVGA_B    =     {Read_DATA1[ 4 : 0 ], 5 ' h00};
613  wire    [ 9 : 0 ]    mVGA_X;
614  wire    [ 9 : 0 ]    mVGA_Y;
615 
616  // ======================    Speaker Control        ==================== //
617  reg            SP;
618  reg    [ 21 : 0 ]    SP_cont;
619  reg    [ 23 : 0 ]    DLY_cont;
620 
621  always@(posedge CLOCK_50)
622  begin
623      SP_cont    <=     SP_cont + 1 ' b1;
624      if (Y | Z)                //     if datected => turn on speaker
625      DLY_cont    <=     0 ;
626      else
627      begin
628          if (DLY_cont < 24 ' hffffff)        //    20 * 2^24 ns
629          begin
630              DLY_cont    <=     DLY_cont + 1 ;
631              SP            <=     1 ;
632          end
633          else
634          SP            <=     0 ;       
635      end
636  end
637  // ================================================================== //
638 
639  wire    [ 9 : 0 ]    sCCD_R;
640  wire    [ 9 : 0 ]    sCCD_G;
641  wire    [ 9 : 0 ]    sCCD_B;
642  wire            sCCD_DVAL;
643 
644  Mirror_Col u11    (    //     Input Side
645    .iCCD_R(mCCD_R),
646    .iCCD_G(mCCD_G),
647    .iCCD_B(mCCD_B),
648    .iCCD_DVAL(mCCD_DVAL_d),
649    .iCCD_PIXCLK(CCD_PIXCLK),
650    .iRST_N(DLY_RST_1),
651    //     Output Side
652    .oCCD_R(sCCD_R),
653    .oCCD_G(sCCD_G),
654    .oCCD_B(sCCD_B),
655    .oCCD_DVAL(sCCD_DVAL)
656  );
657  endmodule               


639行

wire    [ 9 : 0 ]    sCCD_R;
wire    [
9 : 0 ]    sCCD_G;
wire    [
9 : 0 ]    sCCD_B;
wire            sCCD_DVAL;

Mirror_Col u11    (   
//     Input Side
  .iCCD_R(mCCD_R),
  .iCCD_G(mCCD_G),
  .iCCD_B(mCCD_B),
  .iCCD_DVAL(mCCD_DVAL_d),
  .iCCD_PIXCLK(CCD_PIXCLK),
  .iRST_N(DLY_RST_1),
 
//     Output Side
  .oCCD_R(sCCD_R),
  .oCCD_G(sCCD_G),
  .oCCD_B(sCCD_B),
  .oCCD_DVAL(sCCD_DVAL)
);


加上以上Mirror_Col,將mCCD_R、mCCD_G、mCCD_B輸入,輸出sCCD_R、sCCD_G、sCCD_B。

450行

Sdram_Control_4Port    u6 (   
 
//     HOST Side
  .REF_CLK(CLOCK_50),
  .RESET_N(
1 ' b1),
  //     FIFO Write Side 1
  .WR1_DATA({sCCD_R[ 9 : 5 ], sCCD_G[ 9 : 5 ], sCCD_B[ 9 : 5 ]}),
  .WR1(mCCD_DVAL_d),
  .WR1_ADDR(
0 ),
  .WR1_MAX_ADDR(
640 * 512 * 2 ),
  .WR1_LENGTH(
9 ' h100),
  .WR1_LOAD( ! DLY_RST_0),
  .WR1_CLK(CCD_PIXCLK),
 
//     FIFO Read Side 1
  .RD1_DATA(Read_DATA1),
  .RD1(Read),
  .RD1_ADDR(
640 * 16 ),
  .RD1_MAX_ADDR(
640 * 496 ),
  .RD1_LENGTH(
9 ' h100),
  .RD1_LOAD( ! DLY_RST_0),
  .RD1_CLK(VGA_CTRL_CLK),
 
//     FIFO Read Side 2
  .RD2_DATA(Read_DATA2),
  .RD2(Read),
  .RD2_ADDR(
640 * 512 + 640 * 16 ),
  .RD2_MAX_ADDR(
640 * 512 + 640 * 496 ),
  .RD2_LENGTH(
9 ' h100),
  .RD2_LOAD( ! DLY_RST_0),
  .RD2_CLK(VGA_CTRL_CLK),
 
//     SDRAM Side
  .SA(DRAM_ADDR),
  .BA({DRAM_BA_1,DRAM_BA_0}),
  .CS_N(DRAM_CS_N),
  .CKE(DRAM_CKE),
  .RAS_N(DRAM_RAS_N),
  .CAS_N(DRAM_CAS_N),
  .WE_N(DRAM_WE_N),
  .DQ(DRAM_DQ),
  .DQM({DRAM_UDQM,DRAM_LDQM}),
  .SDR_CLK(DRAM_CLK)
);


將輸出的sCCD_R、sCCD_G、sCCD_B傳入Sdram_Control_4Port。

完整程式碼下載
友晶科技範例 DE2_CCD.7z
友晶科技範例 DE2_CCD_detect.7z
Method 1 DE2_CCD_detect_hinverse_1.7zDE2_CCD_no_mirror.7z
Method 2 DE2_CCD_detect_hinverse_2.7z

See Also
(原創) 如何將CMOS彩色影像轉換成灰階影像? (SOC) (DE2)
(原創) 如何解決DE2_LCM_CCD上下顛倒左右相反的問題? (SOC) (DE2)

你可能感兴趣的:(design)