There's a Verilog description written for Spartan 3, which is supposed to display something on a VGA. It has a 3-bit output "rgb" for the VGA (declared as output [2:0] rgb). In the pin assignments, there are 3 pins designated for the 3-bit rgb output. If we want to write the Verilog description with the same functionality (displaying on the VGA) for an Altera DE2, do we have to change this VGA output for it to work properly? I'm confused because the standard pin assignments for the DE2 include 30 bits output for VGA. That is, there are 10 pins assigned each for VGA_R, VGA_G, and VGA_B. So, how are we supposed to display the output on VGA of the Verilog description for Spartan 3 on an Altera DE2? What's the matter regarding the VGA pin assignments (3-bit vs. 30-bit) and how do we go about this compatibility issue?
Charan Mehta wrote: > What's the matter regarding > the VGA pin assignments (3-bit vs. 30-bit) It's the numer of selectable colors: 3 bit = 8 colors, 30 bit = 2^30 colors. You just need a mapping. The way from 8 to 2^30 is easy. Just copy the bit for the color (eg. red) in the vector of ten bits. Duke
Helllo
1 | Here I want to display "A" on my display using xc6lx9 tqg144 spartan 6 package..If I pass continuous '0' or '1' then its working very well But I f I am passing any particular pattern then it does not ...It will mix up data and randering in pixel.... |
2 | |
3 | Code is given below : |
4 | |
5 | --------------------------------------------------------------------------------
|
6 | --
|
7 | -- FileName: vga_controller.vhd
|
8 | -- Dependencies: none
|
9 | -- Design Software: Quartus II 64-bit Version 12.1 Build 177 SJ Full Version
|
10 | --
|
11 | -- HDL CODE IS PROVIDED "AS IS." DIGI-KEY EXPRESSLY DISCLAIMS ANY
|
12 | -- WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
13 | -- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
14 | -- PARTICULAR PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL DIGI-KEY
|
15 | -- BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL
|
16 | -- DAMAGES, LOST PROFITS OR LOST DATA, HARM TO YOUR EQUIPMENT, COST OF
|
17 | -- PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
|
18 | -- BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
|
19 | -- ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER SIMILAR COSTS.
|
20 | --
|
21 | -- Version History
|
22 | -- Version 1.0 05/10/2013 Scott Larson
|
23 | -- Initial Public Release
|
24 | --
|
25 | --------------------------------------------------------------------------------
|
26 | LIBRARY ieee; |
27 | USE ieee.std_logic_1164.all; |
28 | USE ieee.numeric_std.all; |
29 | --USE ieee.std_logic_arith.all;
|
30 | ENTITY vga_controller IS |
31 | GENERIC( |
32 | OFFSET : INTEGER := 1; |
33 | HEIGHT : INTEGER := 16; |
34 | WIDTH : INTEGER := 8; |
35 | START_X : INTEGER := 100; |
36 | START_Y : INTEGER := 80; |
37 | h_pulse : INTEGER := 120; --horiztonal sync pulse width in pixels |
38 | h_bp : INTEGER := 64; --horiztonal back porch width in pixels |
39 | h_pixels : INTEGER := 800; --horiztonal display width in pixels |
40 | h_fp : INTEGER := 56; --horiztonal front porch width in pixels |
41 | h_pol : STD_LOGIC := '1'; --horizontal sync pulse polarity (1 = positive, 0 = negative) |
42 | v_pulse : INTEGER := 6; --vertical sync pulse width in rows |
43 | v_bp : INTEGER := 23; --vertical back porch width in rows |
44 | v_pixels : INTEGER := 600; --vertical display width in rows |
45 | v_fp : INTEGER := 37; --vertical front porch width in rows |
46 | v_pol : STD_LOGIC := '1'); --vertical sync pulse polarity (1 = positive, 0 = negative) |
47 | PORT( |
48 | --cnt : inout std_logi
|
49 | payal: inout std_logic_vector(1 downto 0):="10"; |
50 | Y : inout std_logic:='0'; |
51 | BELL : out std_logic; |
52 | clk25: in std_logic; |
53 | addr: inout std_logic_vector(10 downto 0); |
54 | data: inout std_logic_vector(7 downto 0):="00000000"; |
55 | blue : out std_logic; |
56 | green : out std_logic; |
57 | red : out std_logic; |
58 | --clk25 : IN STD_LOGIC; --pixel clock at frequency of VGA mode being used
|
59 | reset_n : IN STD_LOGIC; --active low asycnchronous reset |
60 | h_sync : INOUT STD_LOGIC; --horiztonal sync pulse |
61 | v_sync : OUT STD_LOGIC; --vertical sync pulse |
62 | disp_ena : INOUT STD_LOGIC; --display enable ('1' = display time, '0' = blanking time) |
63 | column : INOUT INTEGER; --horizontal pixel coordinate |
64 | row : INOUT INTEGER; --vertical pixel coordinate |
65 | n_blank : OUT STD_LOGIC; --direct blacking output to DAC |
66 | n_sync : OUT STD_LOGIC); --sync-on-green output to DAC |
67 | END vga_controller; |
68 | ARCHITECTURE behavior OF vga_controller IS |
69 | --signal clk25 : std_logic;
|
70 | -- component clocking
|
71 | -- port (
|
72 | -- clk50 : in std_logic;
|
73 | -- clk25 : out std_logic
|
74 | -- );
|
75 | -- end component;
|
76 | --COMPONENT text
|
77 | --PORT(
|
78 | -- --cnt : out std_logic;
|
79 | -- clk: in std_logic;
|
80 | -- addr: inout std_logic_vector(10 downto 0);
|
81 | -- data: out std_logic_vector(7 downto 0);
|
82 | -- Y : inout std_logic
|
83 | --
|
84 | --);
|
85 | --END COMPONENT;
|
86 | CONSTANT h_period : INTEGER := h_pulse + h_bp + h_pixels + h_fp; --total number of pixel clocks in a row |
87 | CONSTANT v_period : INTEGER := v_pulse + v_bp + v_pixels + v_fp; --total number of rows in column |
88 | |
89 | type rom_type is array (0 to 15) |
90 | of std_logic_vector(7 downto 0); |
91 | -- ROM definition
|
92 | constant ROM: rom_type:=( |
93 | "00000000", -- 0 |
94 | "00000000", -- 1 |
95 | "00010000", -- 2 * |
96 | "00111000", -- 3 *** |
97 | "01101100", -- 4 ** ** |
98 | "11000110", -- 5 ** ** |
99 | "11000110", -- 6 ** ** |
100 | "11111110", -- 7 ******* |
101 | "11000110", -- 8 ** ** |
102 | "11000110", -- 9 ** ** |
103 | "11000110", -- a ** ** |
104 | "11000110", -- b ** ** |
105 | "00000000", -- c |
106 | "00000000", -- d |
107 | "00000000", -- e |
108 | "00000000" -- f |
109 | );
|
110 | |
111 | BEGIN
|
112 | -- CLKMGNT : clocking
|
113 | -- port map (
|
114 | -- clk50 => clk50,
|
115 | -- clk25 => clk25
|
116 | --
|
117 | -- );
|
118 | --generator : text
|
119 | --port map(
|
120 | --Y => Y,
|
121 | --clk => pixel_clk,
|
122 | --data => data,
|
123 | --addr => addr
|
124 | --);
|
125 | BELL <= '1'; |
126 | n_blank <= '1'; --no direct blanking |
127 | n_sync <= '0'; --no sync on green |
128 | -- pppp <= "11111111";
|
129 | P1:PROCESS(clk25) |
130 | VARIABLE h_count : INTEGER RANGE 0 TO h_period - 1 := 0; --horizontal counter (counts the columns) |
131 | VARIABLE v_count : INTEGER RANGE 0 TO v_period - 1 := 0; --vertical counter (counts the rows) |
132 | BEGIN
|
133 | |
134 | -- IF(reset_n = '0') THEN --reset asserted
|
135 | -- h_count := 0; --reset horizontal counter
|
136 | -- v_count := 0; --reset vertical counter
|
137 | -- h_sync <= NOT h_pol; --deassert horizontal sync
|
138 | -- v_sync <= NOT v_pol; --deassert vertical sync
|
139 | -- disp_ena <= '0'; --disable display
|
140 | -- column <= 0; --reset column pixel coordinate
|
141 | -- row <= 0; --reset row pixel coordinate
|
142 | --
|
143 | IF(clk25'EVENT AND clk25 = '1') THEN |
144 | --counters
|
145 | |
146 | IF(h_count < h_period - 1) THEN --horizontal counter (pixels) |
147 | h_count := h_count + 1; |
148 | ELSE
|
149 | h_count := 0; |
150 | IF(v_count < v_period - 1) THEN --veritcal counter (rows) |
151 | v_count := v_count + 1; |
152 | ELSE
|
153 | v_count := 0; |
154 | END IF; |
155 | END IF; |
156 | --horizontal sync signal
|
157 | IF(h_count < h_pixels + h_fp OR h_count > h_pixels + h_fp + h_pulse) THEN |
158 | h_sync <= NOT h_pol; --deassert horiztonal sync pulse |
159 | ELSE
|
160 | h_sync <= h_pol; --assert horiztonal sync pulse |
161 | END IF; |
162 | --cnt <= h_sync;
|
163 | --vertical sync signal
|
164 | IF(v_count < v_pixels + v_fp OR v_count > v_pixels + v_fp + v_pulse) THEN |
165 | v_sync <= NOT v_pol; --deassert vertical sync pulse |
166 | ELSE
|
167 | v_sync <= v_pol; --assert vertical sync pulse |
168 | END IF; |
169 | |
170 | --set pixel coordinates
|
171 | IF(h_count < h_pixels) THEN --horiztonal display time |
172 | column <= h_count; --set horiztonal pixel coordinate |
173 | END IF; |
174 | IF(v_count < v_pixels) THEN --vertical display time |
175 | row <= v_count; --set vertical pixel coordinate |
176 | END IF; |
177 | --set display enable output
|
178 | IF(h_count < h_pixels AND v_count < v_pixels) THEN --display time |
179 | disp_ena <= '1'; --enable display |
180 | ELSE --blanking time |
181 | disp_ena <= '0'; --disable display |
182 | END IF; |
183 | END IF; |
184 | END PROCESS; |
185 | P2:PROCESS(disp_ena, row, column , h_sync) |
186 | VARIABLE I : INTEGER RANGE 0 TO 7 := 0; |
187 | VARIABLE CHARX : INTEGER RANGE 0 TO 7 := 0; |
188 | VARIABLE CHARY : INTEGER RANGE 0 TO 15 := 0; |
189 | BEGIN
|
190 | IF(disp_ena = '1') THEN |
191 | if(column = START_X-1) then |
192 | if(row = START_Y)then |
193 | Y<= '1'; |
194 | end if; |
195 | end if; |
196 | |
197 | if(row > (START_Y - OFFSET)and row < START_Y + HEIGHT) then |
198 | if(column > (START_X - OFFSET )and column < START_X + WIDTH) then |
199 | |
200 | |
201 | if(data(CHARX) = '0' or data(CHARX) = '1') then |
202 | IF (data(CHARX) = '0') THEN |
203 | red <='1'; |
204 | green <= '1'; |
205 | blue <= '1'; |
206 | ELSE IF(data(CHARX) = '1') THEN |
207 | red <='0'; |
208 | green <= '0'; |
209 | blue <= '1'; |
210 | END IF; |
211 | END IF; |
212 | if(CHARX = 7) then |
213 | CHARX := 0; |
214 | |
215 | if (CHARY = 15 ) then |
216 | CHARY := 0; |
217 | else
|
218 | CHARY := CHARY+ 1; |
219 | Y<= '1'; |
220 | end if; |
221 | |
222 | |
223 | else
|
224 | CHARX :=CHARX + 1; |
225 | if (Y = '1') then |
226 | Y <= '0'; |
227 | end if; |
228 | |
229 | -- IF(I = 7)THEN
|
230 | -- I := 0;
|
231 | -- Y<= '1';
|
232 | -- ELSE
|
233 | -- I := I+1;
|
234 | -- if (Y = '1') then
|
235 | -- Y <= '0';
|
236 | -- end if;
|
237 | -- END IF;
|
238 | end if; |
239 | end if; |
240 | else
|
241 | -- if (Y = '1') then
|
242 | -- Y <= '0';
|
243 | -- end if;
|
244 | red <='1'; |
245 | green <= '1'; |
246 | blue <= '1'; |
247 | end if; |
248 | else
|
249 | red <='1'; |
250 | green <= '1'; |
251 | blue <= '1'; |
252 | -- if (Y = '1') then
|
253 | -- Y <= '0';
|
254 | -- end if;
|
255 | CHARX := 0; |
256 | end if; |
257 | ELSE
|
258 | red <='0'; |
259 | green <= '0'; |
260 | blue <= '0'; |
261 | END IF; |
262 | END PROCESS; |
263 | P3 : PROCESS (Y) |
264 | VARIABLE CNT : INTEGER RANGE 0 TO 15 := 0; |
265 | BEGIN
|
266 | IF(Y = '1') THEN |
267 | data <= ROM(CNT); |
268 | IF (CNT = 15 )THEN |
269 | CNT := 0; |
270 | ELSE
|
271 | CNT := CNT+1; |
272 | END IF; |
273 | |
274 | ELSE
|
275 | data <= ROM(CNT); |
276 | END IF; |
277 | END PROCESS; |
278 | END behavior; |
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.