(原創) DE2_70_D5M_XVGA 1.0 (SOC) (DE2-70)

Abstract
在DE2-70的範例中,一直找不到DE2-70 + 500萬像素CMOS + VGA的範例,只好自己弄一個。

Introduction
使用環境:Quartus II 7.2 SP3 + DE2-70 (Cyclone II EP2C70F896C6N)

在DE2平台上,DE2 + 130萬像素CMOS + 640 x 480 VGA的DE2_CCD範例,一直是大家研究電腦視覺的經典範例,到了更強大的DE2-70後,或許因為DE2-70 + 500萬像素CMOS + 800 x 480 LTM三合一套件的關係,原廠CD就找不到對等於DE2_CCD的範例了。在TRDB_D5M_CD_v1.0.zip 中的\TRDB_D5M_CD_v1.0\DE2_70_CAMERA\HW\DE2_70_CAMERA\ 中勉強找到較類似的範例:DE2-70 + 500萬像素CMOS + 1280 x 1024 XVGA。這個範例充分的發揮DE2-70兩顆32MB SDRAM的特性,不像DE2因為只有一顆8MB SDRAM,所以必須靠2 read與2 write來share SDRAM頻寬,此範例將GB寫在第一顆SDRAM,GR寫在第二顆SDRAM,這樣就不用再share同一顆SDRAM的頻寬,並且SDRAM的clock達到166MHz(DE2為125MHz),這樣有什麼好處呢?這使的外接VGA的解析度可以高達XVGA的1280 x 1024 x 60MHz(DE2_CCD範例為640 x 480 x 60MHz),整個VGA的control clock高達108MHz(參見(筆記) D-Sub VGA timing table (SOC) (DE2) (DE2-70))(DE2的VGA control clock為25MHz),如此再也不會糟蹋500萬像素CMOS的2592 x 1944的實力。

不過很可惜這個範例還包含了Nios II與SOPC,對於想弄純硬體電腦視覺的人略顯多餘,我特別將Nios II與SOPC部分拔除,只留下純硬體部分,若你想在DE2-70 + 500萬像素CMOS + 1280 x 1024 XVGA的平台加上純硬體的電腦視覺前處理與後處理演算法,可以用我改過的這個版本當作DE2-70的DE2_CCD繼續開發。

DE2_70_D5M_XVGA.v / Verilog

  1  /*  
  2  (C) OOMusou 2008 http://oomusou.cnblogs.com
  3 
  4  Filename    : DE2_70_D5M_XVGA.v
  5  Compiler    : Quartus II 7.2 SP3
  6  Description : Demo how to use TRDB-D5M with 1280 x 1024 XVGA
  7  Release     : 08/22/2008 1.0
  8  */
  9 
10  module DE2_70_D5M_XVGA (
11    Clock Input
12    input           iCLK_28,           // 28.63636 MHz
13    input           iCLK_50,           // 50 MHz
14    input           iCLK_50_2,         // 50 MHz
15    input           iCLK_50_3,         // 50 MHz
16    input           iCLK_50_4,         // 50 MHz
17    input           iEXT_CLOCK,        // External Clock
18    Push Button
19    input   [ 3 : 0 ]   iKEY,              // Pushbutton[3:0]
20    DPDT Switch
21    input   [ 17 : 0 ]  iSW,               // Toggle Switch[17:0]
22    7-SEG Dispaly
23    output [ 6 : 0 ]   oHEX0_D,           // Seven Segment Digit 0
24    output          oHEX0_DP,          // Seven Segment Digit 0 decimal point
25    output [ 6 : 0 ]   oHEX1_D,           // Seven Segment Digit 1
26    output          oHEX1_DP,          // Seven Segment Digit 1 decimal point
27    output [ 6 : 0 ]   oHEX2_D,           // Seven Segment Digit 2
28    output          oHEX2_DP,          // Seven Segment Digit 2 decimal point
29    output [ 6 : 0 ]   oHEX3_D,           // Seven Segment Digit 3
30    output          oHEX3_DP,          // Seven Segment Digit 3 decimal point
31    output [ 6 : 0 ]   oHEX4_D,           // Seven Segment Digit 4
32    output          oHEX4_DP,          // Seven Segment Digit 4 decimal point
33    output [ 6 : 0 ]   oHEX5_D,           // Seven Segment Digit 5
34    output          oHEX5_DP,          // Seven Segment Digit 5 decimal point
35    output [ 6 : 0 ]   oHEX6_D,           // Seven Segment Digit 6
36    output          oHEX6_DP,          // Seven Segment Digit 6 decimal point
37    output [ 6 : 0 ]   oHEX7_D,           // Seven Segment Digit 7
38    output          oHEX7_DP,          // Seven Segment Digit 7 decimal point
39    /// / LED /// /
40    output [ 8 : 0 ]   oLEDG,             // LED Green[8:0]
41    output [ 17 : 0 ]  oLEDR,             // LED Red[17:0]
42    /// / UART /// /
43    output          oUART_TXD,         // UART Transmitter
44    input           iUART_RXD,         // UART Receiver
45    output          oUART_CTS,         // UART Clear To Send
46    input           iUART_RTS,         // UART Requst To Send
47    /// / IRDA /// /
48    output          oIRDA_TXD,         // IRDA Transmitter
49    input           iIRDA_RXD,         // IRDA Receiver
50    / // SDRAM Interface
51    inout    [ 31 : 0 ] DRAM_DQ,           // SDRAM Data bus 32 Bits
52    output   [ 12 : 0 ] oDRAM0_A,          // SDRAM0 Address bus 13 Bits
53    output   [ 12 : 0 ] oDRAM1_A,          // SDRAM1 Address bus 13 Bits
54    output          oDRAM0_LDQM0,      // SDRAM0 Low-byte Data Mask
55    output          oDRAM1_LDQM0,      // SDRAM1 Low-byte Data Mask
56    output          oDRAM0_UDQM1,      // SDRAM0 High-byte Data Mask
57    output          oDRAM1_UDQM1,      // SDRAM1 High-byte Data Mask
58    output          oDRAM0_WE_N,       // SDRAM0 Write Enable
59    output          oDRAM1_WE_N,       // SDRAM1 Write Enable
60    output          oDRAM0_CAS_N,      // SDRAM0 Column Address Strobe
61    output          oDRAM1_CAS_N,      // SDRAM1 Column Address Strobe
62    output          oDRAM0_RAS_N,      // SDRAM0 Row Address Strobe
63    output          oDRAM1_RAS_N,      // SDRAM1 Row Address Strobe
64    output          oDRAM0_CS_N,       // SDRAM0 Chip Select
65    output          oDRAM1_CS_N,       // SDRAM1 Chip Select
66    output   [ 1 : 0 ]  oDRAM0_BA,         // SDRAM0 Bank Address
67    output   [ 1 : 0 ]  oDRAM1_BA,         // SDRAM1 Bank Address
68    output          oDRAM0_CLK,        // SDRAM0 Clock
69    output          oDRAM1_CLK,        // SDRAM1 Clock
70    output          oDRAM0_CKE,        // SDRAM0 Clock Enable
71    output          oDRAM1_CKE,        // SDRAM1 Clock Enable
72    Flash Interface
73    inout    [ 14 : 0 ] FLASH_DQ,          // FLASH Data bus 15 Bits (0 to 14)
74    inout           FLASH_DQ15_AM1,    // FLASH Data bus Bit 15 or Address A-1
75    output   [ 21 : 0 ] oFLASH_A,          // FLASH Address bus 26 Bits
76    output          oFLASH_WE_N,       // FLASH Write Enable
77    output          oFLASH_RST_N,      // FLASH Reset
78    output          oFLASH_WP_N,       // FLASH Write Protect /Programming Acceleration
79    input           iFLASH_RY_N,       // FLASH Ready/Busy output
80    output          oFLASH_BYTE_N,     // FLASH Byte/Word Mode Configuration
81    output          oFLASH_OE_N,       // FLASH Output Enable
82    output          oFLASH_CE_N,       // FLASH Chip Enable
83    SRAM Interface
84    inout    [ 31 : 0 ] SRAM_DQ,           // SRAM Data Bus 32 Bits
85    inout    [ 3 : 0 ]  SRAM_DPA,          // SRAM Parity Data Bus
86    output   [ 18 : 0 ] oSRAM_A,           // SRAM Address bus 21 Bits
87    output          oSRAM_ADSC_N,      // SRAM Controller Address Status    
88    output          oSRAM_ADSP_N,      // SRAM Processor Address Status
89    output          oSRAM_ADV_N,       // SRAM Burst Address Advance
90    output   [ 3 : 0 ]  oSRAM_BE_N,        // SRAM Byte Write Enable
91    output          oSRAM_CE1_N,       // SRAM Chip Enable
92    output          oSRAM_CE2,         // SRAM Chip Enable
93    output          oSRAM_CE3_N,       // SRAM Chip Enable
94    output          oSRAM_CLK,         // SRAM Clock
95    output          oSRAM_GW_N,        // SRAM Global Write Enable
96    output          oSRAM_OE_N,        // SRAM Output Enable
97    output          oSRAM_WE_N,        // SRAM Write Enable
98    // // ISP1362 Interface
99    inout    [ 15 : 0 ] OTG_D,             // ISP1362 Data bus 16 Bits
100    output   [ 1 : 0 ]  oOTG_A,            // ISP1362 Address 2 Bits
101    output          oOTG_CS_N,         // ISP1362 Chip Select
102    output          oOTG_OE_N,         // ISP1362 Read
103    output          oOTG_WE_N,         // ISP1362 Write
104    output          oOTG_RESET_N,      // ISP1362 Reset
105    inout           OTG_FSPEED,        // USB Full Speed,    0 = Enable, Z = Disable
106    inout           OTG_LSPEED,        // USB Low Speed,     0 = Enable, Z = Disable
107    input           iOTG_INT0,         // ISP1362 Interrupt 0
108    input           iOTG_INT1,         // ISP1362 Interrupt 1
109    input           iOTG_DREQ0,        // ISP1362 DMA Request 0
110    input           iOTG_DREQ1,        // ISP1362 DMA Request 1
111    output          oOTG_DACK0_N,      // ISP1362 DMA Acknowledge 0
112    output          oOTG_DACK1_N,      // ISP1362 DMA Acknowledge 1
113    // // LCD Module 16X2 /// /
114    inout    [ 7 : 0 ]  LCD_D,             // LCD Data bus 8 bits
115    output          oLCD_ON,           // LCD Power ON/OFF
116    output          oLCD_BLON,         // LCD Back Light ON/OFF
117    output          oLCD_RW,           // LCD Read/Write Select, 0 = Write, 1 = Read
118    output          oLCD_EN,           // LCD Enable
119    output          oLCD_RS,           // LCD Command/Data Select, 0 = Command, 1 = Data
120    // // SD Card Interface
121    inout           SD_DAT,            // SD Card Data
122    inout           SD_DAT3,           // SD Card Data 3
123    inout           SD_CMD,            // SD Card Command Signal
124    output          oSD_CLK,           // SD Card Clock
125    I2C // //
126    inout           I2C_SDAT,          // I2C Data
127    output          oI2C_SCLK,         // I2C Clock
128    PS2 // //
129    inout           PS2_KBDAT,         // PS2 Keyboard Data
130    inout           PS2_KBCLK,         // PS2 Keyboard Clock
131    inout           PS2_MSDAT,         // PS2 Mouse Data
132    inout           PS2_MSCLK,         // PS2 Mouse Clock
133    VGA /// /
134    output          oVGA_CLOCK,        // VGA Clock
135    output          oVGA_HS,           // VGA H_SYNC
136    output          oVGA_VS,           // VGA V_SYNC
137    output          oVGA_BLANK_N,      // VGA BLANK
138    output          oVGA_SYNC_N,       // VGA SYNC
139    output   [ 9 : 0 ]  oVGA_R,            // VGA Red[9:0]
140    output   [ 9 : 0 ]  oVGA_G,            // VGA Green[9:0]
141    output   [ 9 : 0 ]  oVGA_B,            // VGA Blue[9:0]
142    /// / Ethernet Interface /// /
143    inout    [ 15 : 0 ] ENET_D,            // DM9000A DATA bus 16Bits
144    output          oENET_CMD,         // DM9000A Command/Data Select, 0 = Command, 1 = Data
145    output          oENET_CS_N,        // DM9000A Chip Select
146    output          oENET_IOW_N,       // DM9000A Write
147    output          oENET_IOR_N,       // DM9000A Read
148    output          oENET_RESET_N,     // DM9000A Reset
149    input           iENET_INT,         // DM9000A Interrupt
150    output          oENET_CLK,         // DM9000A Clock 25 MHz
151    // // Audio CODEC  /// /
152    inout           AUD_ADCLRCK,       // Audio CODEC ADC LR Clock
153    input           iAUD_ADCDAT,       // Audio CODEC ADC Data
154    inout           AUD_DACLRCK,       // Audio CODEC DAC LR Clock
155    output          oAUD_DACDAT,       // Audio CODEC DAC Data
156    inout           AUD_BCLK,          // Audio CODEC Bit-Stream Clock
157    output          oAUD_XCK,          // Audio CODEC Chip Clock
158    // // TV Devoder   /// /
159    input           iTD1_CLK27,        // TV Decoder1 Line_Lock Output Clock
160    input    [ 7 : 0 ]  iTD1_D,            // TV Decoder1 Data bus 8 bits
161    input           iTD1_HS,           // TV Decoder1 H_SYNC
162    input           iTD1_VS,           // TV Decoder1 V_SYNC
163    output          oTD1_RESET_N,      // TV Decoder1 Reset
164    input           iTD2_CLK27,        // TV Decoder2 Line_Lock Output Clock        
165    input    [ 7 : 0 ]  iTD2_D,            // TV Decoder2 Data bus 8 bits
166    input           iTD2_HS,           // TV Decoder2 H_SYNC
167    input           iTD2_VS,           // TV Decoder2 V_SYNC
168    output          oTD2_RESET_N,      // TV Decoder2 Reset
169    GPIO // //
170    inout    [ 31 : 0 ] GPIO_0,            // GPIO Connection 0 I/O
171    input           GPIO_CLKIN_N0,     // GPIO Connection 0 Clock Input 0
172    input           GPIO_CLKIN_P0,     // GPIO Connection 0 Clock Input 1
173    inout           GPIO_CLKOUT_N0,    // GPIO Connection 0 Clock Output 0
174    inout           GPIO_CLKOUT_P0,    // GPIO Connection 0 Clock Output 1
175    inout    [ 31 : 0 ] GPIO_1,            // GPIO Connection 1 I/O
176    input           GPIO_CLKIN_N1,     // GPIO Connection 1 Clock Input 0
177    input           GPIO_CLKIN_P1,     // GPIO Connection 1 Clock Input 1
178    inout           GPIO_CLKOUT_N1,    // GPIO Connection 1 Clock Output 0
179    inout           GPIO_CLKOUT_P1     // GPIO Connection 1 Clock Output 1
180  );
181 
182  // CCD
183  wire   [ 11 : 0 ]  CCD_DATA;
184  wire           CCD_SDAT;
185  wire           CCD_SCLK;
186  wire           CCD_FLASH;
187  wire           CCD_FVAL;
188  wire           CCD_LVAL;
189  wire           CCD_PIXCLK;
190  wire           CCD_MCLK;    // CCD Master Clock
191 
192  wire   [ 15 : 0 ]  Read_DATA1;
193  wire   [ 15 : 0 ]  Read_DATA2;
194  wire           VGA_CTRL_CLK;
195  wire   [ 11 : 0 ]  mCCD_DATA;
196  wire           mCCD_DVAL;
197  wire           mCCD_DVAL_d;
198  wire   [ 15 : 0 ]  X_Cont;
199  wire   [ 15 : 0 ]  Y_Cont;
200  wire   [ 9 : 0 ]   X_ADDR;
201  wire   [ 31 : 0 ]  Frame_Cont;
202  wire           DLY_RST_0;
203  wire           DLY_RST_1;
204  wire           DLY_RST_2;
205  wire           Read;
206  reg    [ 11 : 0 ]  rCCD_DATA;
207  reg            rCCD_LVAL;
208  reg            rCCD_FVAL;
209  wire   [ 11 : 0 ]  sCCD_R;
210  wire   [ 11 : 0 ]  sCCD_G;
211  wire   [ 11 : 0 ]  sCCD_B;
212  wire           sCCD_DVAL;
213  reg    [ 1 : 0 ]   rClk;
214  wire           sdram_ctrl_clk;
215 
216  assign CCD_DATA[ 0 = GPIO_1[ 11 ];
217  assign CCD_DATA[ 1 = GPIO_1[ 10 ];
218  assign CCD_DATA[ 2 = GPIO_1[ 9 ];
219  assign CCD_DATA[ 3 = GPIO_1[ 8 ];
220  assign CCD_DATA[ 4 = GPIO_1[ 7 ];
221  assign CCD_DATA[ 5 = GPIO_1[ 6 ];
222  assign CCD_DATA[ 6 = GPIO_1[ 5 ];
223  assign CCD_DATA[ 7 = GPIO_1[ 4 ];
224  assign CCD_DATA[ 8 = GPIO_1[ 3 ];
225  assign CCD_DATA[ 9 = GPIO_1[ 2 ];
226  assign CCD_DATA[ 10 ] = GPIO_1[ 1 ];
227  assign CCD_DATA[ 11 ] = GPIO_1[ 0 ];
228 
229  assign GPIO_CLKOUT_N1 = CCD_MCLK;
230  assign CCD_FVAL       = GPIO_1[ 18 ];
231  assign CCD_LVAL       = GPIO_1[ 17 ];
232  assign CCD_PIXCLK     = GPIO_CLKIN_N1;
233 
234  assign GPIO_1[ 15 ]     =   1 ' b1;  // tRIGGER
235  assign GPIO_1[ 14 ]     = DLY_RST_1;
236 
237  assign oLEDR          = iSW;
238 
239  assign oTD1_RESET_N  =   1 ' b1;
240  assign oVGA_CLOCK    =~ VGA_CTRL_CLK;
241  assign CCD_MCLK      = rClk[ 0 ];
242 
243  vga_pll vga_pll0 (
244    .areset( ! DLY_RST_0),
245    .inclk0(iTD1_CLK27),
246    .c0(VGA_CTRL_CLK)
247  );
248 
249  VGA_Controller vga0 (
250    // Host Side
251    .oRequest(Read),
252    .iRed(Read_DATA2[ 9 : 0 ]),
253    .iGreen({Read_DATA1[ 14 : 10 ], Read_DATA2[ 14 : 10 ]}),
254    .iBlue(Read_DATA1[ 9 : 0 ]),
255    // VGA Side
256    .oVGA_R(oVGA_R),
257    .oVGA_G(oVGA_G),
258    .oVGA_B(oVGA_B),
259    .oVGA_H_SYNC(oVGA_HS),
260    .oVGA_V_SYNC(oVGA_VS),
261    .oVGA_SYNC(oVGA_SYNC_N),
262    .oVGA_BLANK(oVGA_BLANK_N),
263    // Control Signal
264    .iCLK(VGA_CTRL_CLK),
265    .iRST_N(DLY_RST_2),
266    .iZOOM_MODE_SW(iSW[ 16 ])
267  );
268 
269  Reset_Delay reset0 (
270    .iCLK(iCLK_50),
271    .iRST(iKEY[ 0 ]),
272    .oRST_0(DLY_RST_0),
273    .oRST_1(DLY_RST_1),
274    .oRST_2(DLY_RST_2)
275  );
276 
277  CCD_Capture capture0 (
278    .oDATA(mCCD_DATA),
279    .oDVAL(mCCD_DVAL),
280    .oX_Cont(X_Cont),
281    .oY_Cont(Y_Cont),
282    .oFrame_Cont(Frame_Cont),
283    .iDATA(rCCD_DATA),
284    .iFVAL(rCCD_FVAL),
285    .iLVAL(rCCD_LVAL),
286    .iSTART( ! iKEY[ 3 ]),
287    .iEND( ! iKEY[ 2 ]),
288    .iCLK(CCD_PIXCLK),
289    .iRST(DLY_RST_2)
290  );
291 
292  RAW2RGB rgb0 (
293    .iCLK(CCD_PIXCLK),
294    .iRST_n(DLY_RST_1),
295    .iData(mCCD_DATA),
296    .iDval(mCCD_DVAL),
297    .oRed(sCCD_R),
298    .oGreen(sCCD_G),
299    .oBlue(sCCD_B),
300    .oDval(sCCD_DVAL),
301    .iZoom(iSW[ 17 : 16 ]),
302    .iX_Cont(X_Cont),
303    .iY_Cont(Y_Cont)
304  );
305 
306  SEG7_LUT_8 seg70 (
307    .oSEG0(oHEX0_D),
308    .oSEG1(oHEX1_D),
309    .oSEG2(oHEX2_D),
310    .oSEG3(oHEX3_D),
311    .oSEG4(oHEX4_D),
312    .oSEG5(oHEX5_D),
313    .oSEG6(oHEX6_D),
314    .oSEG7(oHEX7_D),
315    .iDIG(Frame_Cont[ 31 : 0 ])
316  );
317 
318  sdram_pll sdram_pll0 (
319    .inclk0(iCLK_50),
320    .c0(sdram_ctrl_clk),
321    .c1(oDRAM0_CLK),
322    .c2(oDRAM1_CLK)
323  );
324 
325  Sdram_Control_4Port sdram0 (
326    // HOST Side
327    .REF_CLK(iCLK_50),
328    .RESET_N( 1 ' b1),
329    .CLK(sdram_ctrl_clk),
330    // FIFO Write Side 1
331    .WR1_DATA({sCCD_G[ 11 : 7 ], sCCD_B[ 11 : 2 ]}),
332    .WR1(sCCD_DVAL),
333    .WR1_ADDR( 0 ),
334    .WR1_MAX_ADDR( 1280 * 1024 ),
335    .WR1_LENGTH( 9 ' h100),
336    .WR1_LOAD( ! DLY_RST_0),
337    .WR1_CLK(CCD_PIXCLK),
338    // FIFO Read Side 1
339    .RD1_DATA(Read_DATA1),
340    .RD1(Read),
341    .RD1_ADDR( 0 ),
342    .RD1_MAX_ADDR( 1280 * 1024 ),
343    .RD1_LENGTH( 9 ' h100),
344    .RD1_LOAD( ! DLY_RST_0),
345    .RD1_CLK(VGA_CTRL_CLK),
346    // SDRAM Side
347    .SA(oDRAM0_A[ 11 : 0 ]),
348    .BA(oDRAM0_BA),
349    .CS_N(oDRAM0_CS_N),
350    .CKE(oDRAM0_CKE),
351    .RAS_N(oDRAM0_RAS_N),
352    .CAS_N(oDRAM0_CAS_N),
353    .WE_N(oDRAM0_WE_N),
354    .DQ(DRAM_DQ[ 15 : 0 ]),
355    .DQM({oDRAM0_UDQM1,oDRAM0_LDQM0})
356  );
357 
358  Sdram_Control_4Port sdram1 (
359    // HOST Side
360    .REF_CLK(iCLK_50),
361    .RESET_N( 1 ' b1),
362    .CLK(sdram_ctrl_clk),
363    // FIFO Write Side 1
364    .WR1_DATA({sCCD_G[ 6 : 2 ], sCCD_R[ 11 : 2 ]}),
365    .WR1(sCCD_DVAL),
366    .WR1_ADDR( 0 ),
367    .WR1_MAX_ADDR( 1280 * 1024 ),
368    .WR1_LENGTH( 9 ' h100),
369    .WR1_LOAD( ! DLY_RST_0),
370    .WR1_CLK(CCD_PIXCLK),
371    // FIFO Read Side 1
372    .RD1_DATA(Read_DATA2),
373    .RD1(Read),
374    .RD1_ADDR( 0 ),
375    .RD1_MAX_ADDR( 1280 * 1024 ),
376    .RD1_LENGTH( 9 ' h100),
377    .RD1_LOAD( ! DLY_RST_0),
378    .RD1_CLK(VGA_CTRL_CLK),
379    // SDRAM Side
380    .SA(oDRAM1_A[ 11 : 0 ]),
381    .BA(oDRAM1_BA),
382    .CS_N(oDRAM1_CS_N),
383    .CKE(oDRAM1_CKE),
384    .RAS_N(oDRAM1_RAS_N),
385    .CAS_N(oDRAM1_CAS_N),
386    .WE_N(oDRAM1_WE_N),
387    .DQ(DRAM_DQ[ 31 : 16 ]),
388    .DQM({oDRAM1_UDQM1,oDRAM1_LDQM0})
389  );
390 
391  I2C_CCD_Config i2c0 (
392    // Host Side
393    .iCLK(iCLK_50),
394    .iRST_N(DLY_RST_2),
395    .iZOOM_MODE_SW(iSW[ 16 ]),
396    .iEXPOSURE_ADJ(iKEY[ 1 ]),
397    .iEXPOSURE_DEC_p(iSW[ 0 ]),
398    // I2C Side
399    .I2C_SCLK(GPIO_1[ 20 ]),
400    .I2C_SDAT(GPIO_1[ 19 ])
401  );
402 
403  always @( posedge iCLK_50)
404    rClk <= rClk + 1 ;
405 
406  always @( posedge CCD_PIXCLK) begin
407    rCCD_DATA <= CCD_DATA;
408    rCCD_LVAL <= CCD_LVAL;
409    rCCD_FVAL <= CCD_FVAL;
410  end
411 
412  endmodule


325行

Sdram_Control_4Port sdram0 (
 
// HOST Side
  .REF_CLK(iCLK_50),
  .RESET_N(
1 ' b1),
  .CLK(sdram_ctrl_clk),
 
// FIFO Write Side 1
  .WR1_DATA({sCCD_G[ 11 : 7 ], sCCD_B[ 11 : 2 ]}),
  .WR1(sCCD_DVAL),
  .WR1_ADDR(
0 ),
  .WR1_MAX_ADDR(
1280 * 1024 ),
  .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(
0 ),
  .RD1_MAX_ADDR(
1280 * 1024 ),
  .RD1_LENGTH(
9 ' h100),
  .RD1_LOAD( ! DLY_RST_0),
  .RD1_CLK(VGA_CTRL_CLK),
 
// SDRAM Side
  .SA(oDRAM0_A[ 11 : 0 ]),
  .BA(oDRAM0_BA),
  .CS_N(oDRAM0_CS_N),
  .CKE(oDRAM0_CKE),
  .RAS_N(oDRAM0_RAS_N),
  .CAS_N(oDRAM0_CAS_N),
  .WE_N(oDRAM0_WE_N),
  .DQ(DRAM_DQ[
15 : 0 ]),
  .DQM({oDRAM0_UDQM1,oDRAM0_LDQM0})
);

Sdram_Control_4Port sdram1 (
 
// HOST Side
  .REF_CLK(iCLK_50),
  .RESET_N(
1 ' b1),
  .CLK(sdram_ctrl_clk),
 
// FIFO Write Side 1
  .WR1_DATA({sCCD_G[ 6 : 2 ], sCCD_R[ 11 : 2 ]}),
  .WR1(sCCD_DVAL),
  .WR1_ADDR(
0 ),
  .WR1_MAX_ADDR(
1280 * 1024 ),
  .WR1_LENGTH(
9 ' h100),
  .WR1_LOAD( ! DLY_RST_0),
  .WR1_CLK(CCD_PIXCLK),
 
// FIFO Read Side 1
  .RD1_DATA(Read_DATA2),
  .RD1(Read),
  .RD1_ADDR(
0 ),
  .RD1_MAX_ADDR(
1280 * 1024 ),
  .RD1_LENGTH(
9 ' h100),
  .RD1_LOAD( ! DLY_RST_0),
  .RD1_CLK(VGA_CTRL_CLK),
 
// SDRAM Side
  .SA(oDRAM1_A[ 11 : 0 ]),
  .BA(oDRAM1_BA),
  .CS_N(oDRAM1_CS_N),
  .CKE(oDRAM1_CKE),
  .RAS_N(oDRAM1_RAS_N),
  .CAS_N(oDRAM1_CAS_N),
  .WE_N(oDRAM1_WE_N),
  .DQ(DRAM_DQ[
31 : 16 ]),
  .DQM({oDRAM1_UDQM1,oDRAM1_LDQM0})
);


使用兩個sdram controller是DE2-70的最大特色,既然有兩顆32MB SDRAM,就不用像DE2那樣2 read 2 write來share SDRAM頻寬,也因為SDRAM頻寬充裕,所以可以撐住XVGA(1280 x 1024)的108MHz,不糟蹋TRDB-D5M的500萬像素CMOS。

完整程式碼下載
DE2_70_D5M_XVGA.7z

Conclusion
前面提到這麼範例原本包含了Nios II與SOPC,在DE2時代,很多人跟我一樣想讓Nios II也能參與CMOS的控制,進而用C語言讀取SDRAM所capture的影像做處理,但都沒有成功,這個範例因為DE2-70的兩顆SDRAM,每顆SDRAM只用到1 read 1 write,所以將另外沒用到的read port連Nios II,看似可以成功,不過我還沒深入研究,有興趣的人可以看看。

See Also
(筆記) D-Sub VGA timing table (SOC) (DE2) (DE2-70)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是从外网好不容易找到的,上传与大家共享,不要积分随便下!我也是下载的,不是自己发明的,如果再去要下载积分,人品还不至于这么差! 里面有加密的,官方说明是这样的:There are two encrypted verilog files in the "DE2_70_TV_PIP" demonstraction. If users want to modify this demonstration and re-compile the project, please perform the following steps: 1.Use Notepad or other text edit software to open the file "Teraisc_license.dat", which is located in the "DE2_70_demonstrations/License for encrypted IP" folder of the DE2-70 System CD-ROM. 2. The license contains the FEATURE lines required to license the IP Cores as shown below FEATURE 535C_0009 alterad 9999.12 permanent uncounted D702CF471AC0 \ VENDOR_STRING="ddddddddhbilhyyyyyyyyUCIwiFFFFFFFF170M8XXXXXXXXpLsGcTTTTTTTTt7X8GAAAAAAAAbEQP0hhhhhhhhgrtJieeeeeeeebTNOVJJJJJJJJBLNGkuuuuuuuuDLxzRPPPPPPPPW01t4" \ HOSTID=ANY SIGN="0F45 927A 00F9 DBF3 3AAB D703 4F3D 2406 B374 \ 0E5C 87A1 34BA 10C6 0C08 E554 183B BD2D B79D D64E 3F98 393E \ 94FB F798 07B8 C334 C8B6 D1E4 36F5 67D5 1690" FEATURE 535C_000A alterad 9999.12 permanent uncounted F7FD875F1A28 \ VENDOR_STRING="ddddddddhbilhyyyyyyyyUCIwiFFFFFFFF170M8XXXXXXXXpLsGcTTTTTTTTt7X8GAAAAAAAAbEQP0hhhhhhhhgrtJieeeeeeeebTNOVJJJJJJJJBLNGkuuuuuuuuDLxzRPPPPPPPPW01t4" \ HOSTID=ANY SIGN="1834 5F1A 9CE6 15FD 9246 A640 66FE 918D 1091 \ A2D0 7DF8 7584 0E78 3732 1F48 0B24 3A92 870A EDAA F6F0 2145 \ 3098 5631 C5E1 4DC2 B14D C81A D30D 5518 63D0" 3.Open your Quartus II license.dat file in a text editor. 4.Copy the all the contents of the Terasic_license.dat and paste it at the end of your Quartus II license file. (Note: Do not delete any FEATURE lines from the Quartus II license file. Doing so will result in a non-usable license file.) 5.Open the "DE2_70_TV_PIP" project from Quartus II and compile this project. 6.After compilation is completed, it will generate a sof file named "DE2_70_TV_PIP_time_limited.sof" 7.Load this sof file into the FPGA and the demonstration will have at most one hour to be modified. In another words, the VGA output will be turned off after one hour. If users want to know more information about this demonstration, please contact us at support@terasic.com.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值