Figure 10.1 Color CRT and Phosphor Dots On Face of Display.: Scanning Electron Beam
Figure 10.1 Color CRT and Phosphor Dots On Face of Display.: Scanning Electron Beam
Grid
Phosphor Screen
Blue
Electron Guns
Red Green
Metal Mask
R B R G
B R B
G B G
R G R
B R B
G B G
R G R B
0,479
639,479
480 Horizontal Refresh Cycles Red, Green, Blue P i x e l D a ta Vertical Sync 64 s 16.6 ms
1.02 ms
15.24 ms
0.35 ms
1.89 s
25.17 s
0.94 s
31.77 s
25 M hz C lo c k
S y n c G e n e r a tio n C o u n te rs R ow C ol
H o r iz o n t a l S ync V e r t ic a l S ync
D a ta fr o m D e s ig n
V G A S ig n a ls
P ix e l R A M o r C h a ra c te r G e n e ra to r R O M R G B
VGA_SYNC clock_48Mhz red green blue red_out green_out blue_out horiz_sync_out vert_sync_out video_on pixel_clock pixel_row[9..0] pixel_column[9..0] inst
UP3core VGA_SYNC
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY VGA_SYNC IS PORT( clock_25Mhz, red, green, blue red_out, green_out, blue_out horiz_sync_out, vert_sync_out pixel_row, pixel_column END VGA_SYNC;
ARCHITECTURE a OF VGA_SYNC IS : STD_LOGIC; SIGNAL horiz_sync, vert_sync SIGNAL video_on, video_on_v, video_on_h : STD_LOGIC; : STD_LOGIC_VECTOR( 9 DOWNTO 0 ); SIGNAL h_count, v_count BEGIN -- video_on is High only when RGB data is displayed video_on <= video_on_H AND video_on_V;
--Generate Horizontal and Vertical Timing Signals for Video Signal -- H_count counts pixels (640 + extra time for sync signals) --- Horiz_sync -------------------------------------------________--------- H_count 0 640 659 755 799 -IF ( h_count = 799 ) THEN h_count <= "0000000000"; ELSE h_count <= h_count + 1; END IF; --Generate Horizontal Sync Signal using H_count IF ( h_count <= 755 ) AND (h_count => 659 ) THEN horiz_sync <= '0'; ELSE horiz_sync <= '1'; END IF;
--V_count counts rows of pixels (480 + extra time for sync signals) --- Vert_sync ----------------------------------------_______------------- V_count 0 480 493-494 524 -IF ( v_count >= 524 ) AND ( h_count => 699 ) THEN v_count <= "0000000000"; ELSIF ( h_count = 699 ) THEN v_count <= v_count + 1; END IF; -- Generate Vertical Sync Signal using V_count IF ( v_count <= 494 ) AND ( v_count = >493 ) THEN vert_sync <= '0'; ELSE vert_sync <= '1'; END IF;
-- Generate Video on Screen Signals for Pixel Data IF ( h_count <= 639 ) THEN video_on_h <= '1'; pixel_column <= h_count; ELSE video_on_h <= '0'; END IF; IF ( v_count <= 479 ) THEN video_on_v <= '1'; pixel_row <= v_count; ELSE video_on_v <= '0'; END IF; -- Put all video signals through DFFs to eliminate -- any delays that can cause a blurry image -- Turn off RGB outputs when outside video display area red_out <= red AND video_on; green_out <= green AND video_on; blue_out <= blue AND video_on; horiz_sync_out <= horiz_sync; vert_sync_out <= vert_sync; END PROCESS; END a;
VGA_SYNC
clock_48Mhz
red
green
blue
red_out
green_out
blue_out
horiz_sync_out
vert_sync_out
video_on
pixel_clock
pixel_row[9..0]
pixel_column[9..0]
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
GND 11
VGA_SYNC Clock_48Mhz
INPUT VCC
Pixel_row[9..0]
Font Data 00011000 ; 00111100 ; 01100110 ; 01111110 ; 01100110 ; 01100110 ; 01100110 ; 00000000 ;
inst
UP3core CHAR_ROM
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; LIBRARY lpm; USE lpm.lpm_components.ALL; ENTITY Char_ROM IS character_address PORT( font_row, font_col rom_mux_output END Char_ROM;
: IN : IN : OUT
ARCHITECTURE a OF Char_ROM IS : STD_LOGIC_VECTOR( 7 DOWNTO 0 ); SIGNAL rom_data : STD_LOGIC_VECTOR( 8 DOWNTO 0 ); SIGNAL rom_address BEGIN -- Small 8 by 8 Character Generator ROM for Video Display -- Each character is 8 8-bit words of pixel data char_gen_rom: lpm_rom GENERIC MAP ( lpm_widthad => 9, lpm_numwords => "512", lpm_outdata => "UNREGISTERED", lpm_address_control => "UNREGISTERED", -- Reads in mif file for character generator font data lpm_file => "tcgrom.mif", lpm_width => 8) PORT MAP ( address => rom_address, q = > rom_data); rom_address <= character_address & font_row; -- Mux to pick off correct rom data bit from 8-bit word -- for on screen character generation rom_mux_output <= rom_data ( (CONV_INTEGER( NOT font_col( 2 DOWNTO 0 ))) ); END a;
Table 10.1 Character Address Map for 8 by 8 Font ROM. CHAR ADDRESS CHAR ADDRESS CHAR ADDRESS CHAR ADDRESS
@ A B C D E F G H I J K L M N O
00 01 02 03 04 05 06 07 10 11 12 13 14 15 16 17
P Q R S T U V W X Y Z [
Dn Arrow
]
Up Arrow Lft Arrow
20 21 22 23 24 25 26 27 30 31 32 33 34 35 36 37
40 41 42 43 44 45 46 47 50 51 52 53 54 55 56 57
0 1 2 3 4 5 6 7 8 9 A B C D E F
60 61 62 63 64 65 66 67 70 71 72 73 74 75 76 77
VGA_SYNC
Clock_48Mhz
VCC
INPUT VCC
clock_48Mhz
red
green
blue
red_out
green_out
blue_out
horiz_sync_out
vert_sync_out
video_on
pixel_clock
pixel_row[9..0]
pixel_column[9..0]
OUTPUT
OUTPUT
OUTPUT
VGA_Red
VGA_Green
VGA_Blue
OUTPUT
OUTPUT
VGA_HSync
VGA_VSync
Pixel_row[9..0]
Pixel_column[9..0]
Char_ROM
clock
Pixel_row[9..4]
Pixel_row[3..1]
Pixel_column[3..1]
rom_mux_output
character_address[5..0]
f ont_row[2..0]
f ont_col[2..0]
inst
-- Character Format ROM for Video Display -- Displays constant format character data -- on left side of Display area format_rom: lpm_rom GENERIC MAP ( lpm_widthad lpm_numwords lpm_outdata lpm_address_control lpm_file lpm_width
=> 6, =>"60", => "UNREGISTERED", => "UNREGISTERED", -- Reads in mif file for data display titles =>"format.mif", => 6)
799
ENTITY ball IS PORT( : OUT STD_LOGIC; SIGNAL Red, Green, Blue : IN STD_LOGIC; SIGNAL vert_sync_out SIGNAL pixel_row, pixel_column : IN STD_LOGIC_VECTOR( 9 DOWNTO 0 )); END ball; ARCHITECTURE behavior OF ball IS -- Video Display Signals SIGNAL reset, Ball_on, Direction : STD_LOGIC; : STD_LOGIC_VECTOR( 9 DOWNTO 0 ); SIGNAL Size : STD_LOGIC_VECTOR( 10 DOWNTO 0 ); SIGNAL Ball_Y_motion SIGNAL Ball_Y_pos, Ball_X_pos : STD_LOGIC_VECTOR( 10 DOWNTO 0 ); -- Size of Ball BEGIN Size <= CONV_STD_LOGIC_VECTOR (8,10 ); -- Ball center X address Ball_X_pos <= CONV_STD_LOGIC_VECTOR( 320,11 ); -- Colors for pixel data on video signal Red <= '1'; -- Turn off Green and Blue to make -- color Red when displaying ball Green <= NOT Ball_on; Blue <= NOT Ball_on;
RGB_Display: PROCESS ( Ball_X_pos, Ball_Y_pos, pixel_column, pixel_row, Size ) BEGIN -- Set Ball_on = '1' to display ball <= pixel_column + Size ) AND IF ( Ball_X_pos ( Ball_X_pos + Size >= pixel_column ) AND ( Ball_Y_pos <= pixel_row + Size ) AND ( Ball_Y_pos + Size >= pixel_row ) THEN Ball_on <= '1'; ELSE Ball_on <= '0'; END IF; END PROCESS RGB_Display; Move_Ball: PROCESS BEGIN -- Move ball once every vertical sync WAIT UNTIL Vert_sync'EVENT AND Vert_sync = '1'; -- Bounce off top or bottom of screen IF Ball_Y_pos >= 480 - Size THEN Ball_Y_motion <= - CONV_STD_LOGIC_VECTOR(2,11); ELSIF Ball_Y_pos <= Size THEN Ball_Y_motion <= CONV_STD_LOGIC_VECTOR(2,11); END IF; -- Compute next ball Y position Ball_Y_pos <= Ball_Y_pos + Ball_Y_motion; END PROCESS Move_Ball; END behavior;