(原創) 如何產生VGA的Color Pattern Generator? (SOC) (Verilog) (DE2) (DE2-70)

Abstract
本文使用Verilog在VGA產生Color Pattern Generator。

Introduction
使用環境:Quartus II 8.0 + DE2(Cyclone II EP2C35F627C6) or DE2-70 (Cyclone II EP2C70F896C6N)

DE2_70.v / Verilog

  1 /* 
  2 (C) OOMusou 2008 http://oomusou.cnblogs.com
  3 
  4 Filename    : DE2_70.v
  5 Compiler    : Quartus II 8.0
  6 Description : Demo how to write color pattern generator
  7 Release     : 11/16/2008 1.0
  8 */
  9 
10 module DE2_70 (
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 // Horizontal Parameter
183 parameter H_FRONT = 16;
184 parameter H_SYNC  = 96;
185 parameter H_BACK  = 48;
186 parameter H_ACT   = 640;
187 parameter H_BLANK = H_FRONT + H_SYNC + H_BACK;
188 parameter H_TOTAL = H_FRONT + H_SYNC + H_BACK + H_ACT;
189 
190 // Vertical Parameter
191 parameter V_FRONT = 11;
192 parameter V_SYNC  = 2;
193 parameter V_BACK  = 32;
194 parameter V_ACT   = 480;
195 parameter V_BLANK = V_FRONT + V_SYNC + V_BACK;
196 parameter V_TOTAL = V_FRONT + V_SYNC + V_BACK + V_ACT;
197 
198 wire CLK_25;
199 wire CLK_to_DAC;
200 wire RST_N;
201 
202 PLL pll0 (
203   .inclk0(iCLK_50),
204   .c0(CLK_25)
205 );
206 
207 // Select DAC clock
208 assign CLK_to_DAC = CLK_25;
209 assign oVGA_SYNC_N  = 1'b0;        // This pin is unused.
210 assign oVGA_BLANK_N = ~((H_Cont<H_BLANK)||(V_Cont<V_BLANK));
211 assign oVGA_CLOCK   = ~CLK_to_DAC; // Invert internal clock to output clock
212 assign RST_N     = iKEY[0];      // Set reset signal is KEY[0]
213 
214 reg [10:0] H_Cont;
215 reg [10:0] V_Cont;
216 reg [9:0]  vga_r;
217 reg [9:0]  vga_g;
218 reg [9:0]  vga_b;
219 reg        vga_hs;
220 reg        vga_vs;
221 reg [10:0] X;
222 reg [10:0] Y;
223 
224 assign oVGA_R = vga_r;
225 assign oVGA_G = vga_g;
226 assign oVGA_B = vga_b;
227 assign oVGA_HS = vga_hs;
228 assign oVGA_VS = vga_vs;
229 
230 // Horizontal Generator: Refer to the pixel clock
231 always@(posedge CLK_to_DAC, negedge RST_N) begin
232   if(!RST_N) begin
233     H_Cont <= 0;
234     vga_hs <= 1;
235     X      <= 0;
236   end 
237   else begin
238     if (H_Cont < H_TOTAL)
239       H_Cont    <=    H_Cont+1'b1;
240     else
241       H_Cont    <=    0;
242      
243     // Horizontal Sync
244     if(H_Cont == H_FRONT-1) // Front porch end
245       vga_hs <= 1'b0;
246      
247     if(H_Cont == H_FRONT + H_SYNC -1) // Sync pulse end
248       vga_hs <= 1'b1;
249 
250     // Current X
251     if(H_Cont >= H_BLANK)
252       X <= H_Cont-H_BLANK;
253     else
254       X <= 0;
255   end
256 end
257 
258 // Vertical Generator: Refer to the horizontal sync
259 always@(posedge oVGA_HS, negedge RST_N) begin
260   if(!RST_N) begin
261     V_Cont <= 0;
262     vga_vs <= 1;
263     Y      <= 0;
264   end
265   else begin
266     if (V_Cont<V_TOTAL)
267       V_Cont <= V_Cont + 1'b1;
268     else
269       V_Cont    <= 0;
270      
271     // Vertical Sync
272     if (V_Cont == V_FRONT-1) // Front porch end
273       vga_vs <= 1'b0;
274      
275     if (V_Cont == V_FRONT + V_SYNC-1) // Sync pulse end
276       vga_vs <= 1'b1;
277      
278     // Current Y
279     if (V_Cont >= V_BLANK)
280       Y <= V_Cont-V_BLANK;
281     else
282       Y <= 0;
283   end
284 end
285 
286 // Pattern Generator
287 always@(posedge CLK_to_DAC, negedge RST_N) begin
288   if(!RST_N) begin
289     vga_r <= 0;
290     vga_g <= 0;
291     vga_b <= 0;
292   end
293   else begin
294     vga_r <= (Y < 120) ? 256 :
295              (Y >= 120 && Y < 240) ? 512 :
296              (Y >= 240 && Y < 360) ? 768 :
297              1023;
298             
299     vga_g <= (X < 80) ? 128 :
300              (X >= 80  && X < 160) ? 256 :
301              (X >= 160 && X < 240) ? 384 :
302              (X >= 240 && X < 320) ? 512 :
303              (X >= 320 && X < 400) ? 640 :
304              (X >= 400 && X < 480) ? 768 :
305              (X >= 480 && X < 560) ? 896 :
306              1023;
307             
308     vga_b <= (Y < 60) ? 1023:
309              (Y >= 60  && Y < 120) ? 896 :
310              (Y >= 120 && Y < 180) ? 768 :
311              (Y >= 180 && Y < 240) ? 640 :
312              (Y >= 240 && Y < 300) ? 512 :
313              (Y >= 300 && Y < 360) ? 384 :
314              (Y >= 360 && Y < 420) ? 256 :
315              128;
316   end
317 end
318 
319 endmodule


執行結果

vga00

程式碼的解釋在都寫在註解裡了,我就不再多言。初學者可能會遇到幾個問題:
1.VGA Timing部分:
這在網上討論很多,讀者可自行google,我舉一篇讓各位參考:VGA显示原理与VGA时序实现

2.若欲更改解析度與頻率:
請參考(筆記) D-Sub VGA timing table (SOC) (DE2) (DE2-70),自行更改parameter。

3.若欲更改顏色與座標:
請參考(原創) 如何控制DE2 VGA輸出時某座標的顏色? (IC Design) (DE2) (Quartus II)

完整程式碼下載
DE2_VGA_pattern_gen.7z (for DE2)
DE2_70_VGA_pattern_gen.7z (for DE2-70)

See Also
(筆記) D-Sub VGA timing table (SOC) (DE2) (DE2-70)
(原創) 如何控制DE2 VGA輸出時某座標的顏色? (IC Design) (DE2) (Quartus II)
(原創) 如何控制TRDB-LTM輸出時某座標的顏色? (SOC) (DE2-70) (TRDB-LTM)

posted on 2008-11-16 15:36  真 OO无双  阅读(17595)  评论(22编辑  收藏  举报

导航