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.7z、DE2_CCD_no_mirror.7z
Method 2 DE2_CCD_detect_hinverse_2.7z
See Also
(原創) 如何將CMOS彩色影像轉換成灰階影像? (SOC) (DE2)
(原創) 如何解決DE2_LCM_CCD上下顛倒左右相反的問題? (SOC) (DE2)