这个是VGA得
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: INSTD_LOGIC;
red_out, green_out, blue_out, horiz_sync_out, vert_sync_out: OUTSTD_LOGIC;
pixel_row, pixel_column: OUT STD_LOGIC_VECTOR(10 DOWNTO 0));
END VGA_SYNC;
ARCHITECTURE a OF VGA_SYNC IS
SIGNAL horiz_sync, vert_sync : STD_LOGIC;
SIGNAL video_on, video_on_v, video_on_h : STD_LOGIC;
SIGNAL h_count, v_count :STD_LOGIC_VECTOR(10 DOWNTO 0);
BEGIN
-- video_on is high only when RGB data is displayed
video_on <= video_on_H AND video_on_V;
PROCESS
BEGIN
WAIT UNTIL(clock_25Mhz'EVENT) AND (clock_25Mhz='1');
--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 <= "00000000000";
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 <= "00000000000";
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 elminate any delays that cause a blurry image
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;
这个是上层得key_display
-- keyboard Video display
-- UP1PACK - UP1core package
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;
PACKAGE up1core IS
COMPONENT dec_7seg
PORT(hex_digit: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
segment_a, segment_b, segment_c, segment_d,
segment_e, segment_f, segment_g : OUT STD_LOGIC);
END COMPONENT;
COMPONENT debounce
PORT(pb, clock_100Hz : INSTD_LOGIC;
pb_debounced: OUTSTD_LOGIC);
END COMPONENT;
COMPONENT onepulse
PORT(pb_debounced, clock: INSTD_LOGIC;
pb_single_pulse: OUTSTD_LOGIC);
END COMPONENT;
COMPONENT clk_div
PORT(clock_25Mhz: INSTD_LOGIC;
clock_1MHz: OUTSTD_LOGIC;
clock_100KHz: OUTSTD_LOGIC;
clock_10KHz: OUTSTD_LOGIC;
clock_1KHz: OUTSTD_LOGIC;
clock_100Hz: OUTSTD_LOGIC;
clock_10Hz: OUTSTD_LOGIC;
clock_1Hz: OUTSTD_LOGIC);
END COMPONENT;
COMPONENT vga_sync
PORT(clock_25Mhz, red, green, blue: INSTD_LOGIC;
red_out, green_out, blue_out: OUT STD_LOGIC;
horiz_sync_out, vert_sync_out: OUT STD_LOGIC;
pixel_row, pixel_column: OUT STD_LOGIC_VECTOR(10 DOWNTO 0));
END COMPONENT;
COMPONENT char_rom
PORT(character_address: INSTD_LOGIC_VECTOR(5 DOWNTO 0);
font_row, font_col: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
rom_mux_output: OUTSTD_LOGIC);
END COMPONENT;
COMPONENT keyboard
PORT(keyboard_clk, keyboard_data, clock_25Mhz ,
reset, read: INSTD_LOGIC;
scan_code: OUTSTD_LOGIC_VECTOR(7 DOWNTO 0);
scan_ready: OUTSTD_LOGIC);
END COMPONENT;
COMPONENT mouse
PORT( clock_25Mhz, reset : IN std_logic;
mouse_data: INOUT std_logic;
mouse_clk : INOUT std_logic;
left_button, right_button : OUT std_logic;
mouse_cursor_row, mouse_cursor_column : OUT std_logic_vector(9 DOWNTO 0));
END COMPONENT;
END up1core;
-- Bouncing Ball Video
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.STD_LOGIC_ARITH.all;
USE IEEE.STD_LOGIC_UNSIGNED.all;
LIBRARY work;
USE work.up1core.all;
ENTITY key_display IS
Generic(ADDR_WIDTH: integer := 12; DATA_WIDTH: integer := 1);
PORT(SIGNAL Clock : IN std_logic;
SIGNAL Keyboard_clk, Keyboard_data: IN STD_LOGIC;
SIGNAL LSB_a, LSB_b, LSB_c, LSB_d: OUT std_logic;
SIGNAL LSB_e, LSB_f, LSB_g, LSB_dp: OUT std_logic;
SIGNAL MSB_a, MSB_b, MSB_c, MSB_d: OUT std_logic;
SIGNAL MSB_e, MSB_f, MSB_g, MSB_dp : OUT std_logic;
SIGNAL Red,Green,Blue : OUT std_logic;
SIGNAL Horiz_sync,Vert_sync: OUT std_logic);
END key_display;
architecture behavior of key_display is
-- Video Display Signals
SIGNAL Red_Data, Green_Data, Blue_Data: std_logic;
SIGNAL Char_X_pos: Integer Range 0 To 640;
SIGNAL Char_Y_pos: Integer Range 0 To 480;
SIGNAL pixel_row, pixel_column: std_logic_vector(10 DOWNTO 0);
-- Signals for LED Display
SIGNAL LSB,MSB: std_logic_vector(3 DOWNTO 0);
SIGNAL Scan_code: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL char_address: STD_LOGIC_VECTOR(5 DOWNTO 0);
SIGNAL font_row, font_col: STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL rom_mux_on, Char_on, disp_on: std_logic;
SIGNAL scan_ready: STD_LOGIC;
BEGIN
SYNC: vga_sync
PORT MAP(clock_25Mhz => clock,
red => red_data, green => green_data, blue => blue_data,
red_out => red, green_out => green, blue_out => blue,
horiz_sync_out => Horiz_sync, vert_sync_out => Vert_sync,
pixel_row => pixel_row, pixel_column => pixel_column);
-- Display PC in seven-segment displays
MSD: dec_7seg
PORT MAP(hex_digit => MSB,
segment_a => MSB_a, segment_b => MSB_b, segment_c => MSB_c,
segment_d => MSB_d,segment_e => MSB_e, segment_f => MSB_f,
segment_g => MSB_g );
LSD: dec_7seg
PORT MAP(hex_digit => LSB,
segment_a => LSB_a, segment_b => LSB_b, segment_c => LSB_c,
segment_d => LSB_d,segment_e => LSB_e, segment_f => LSB_f,
segment_g => LSB_g );
KBD: keyboard
PORT MAP(keyboard_clk => Keyboard_clk, keyboard_data => Keyboard_data,
clock_25Mhz => clock, reset => '0', read => '0',
scan_code => Scan_code, scan_ready => scan_ready);
ROM: char_rom
PORT MAP(character_address => char_address,
font_row => font_row, font_col => font_col,
rom_mux_output => rom_mux_on);
char_address (5 DOWNTO 4) <= "11";
font_row <= pixel_row(3 DOWNTO 1);
font_col <= pixel_column(3 DOWNTO 1);
-- Colors for pixel data on video signal
Red_Data <= '1';
-- Turn off Green and Blue when displaying ball
Green_Data <= NOT Char_on;
Blue_Data <= NOT Char_on;
-- Turn off LED display decimal points
LSB_dp <= '1';
MSB_dp <= '1';
-- display ball row in LEDs
LSB <= Scan_code (3 DOWNTO 0);
MSB <= Scan_code (7 DOWNTO 4);
Char_X_pos <= 320;
Char_Y_pos <= 240;
RGB_Display: Process (Char_X_pos, Char_Y_pos, pixel_column, pixel_row,
Scan_code, disp_on, rom_mux_on)
BEGIN
-- Set Ball_on ='1' to display ball
IF (Char_X_pos <= CONV_INTEGER(pixel_column)) AND
-- compare positive numbers only
(Char_X_pos + 31 >= CONV_INTEGER(pixel_column)) AND
(Char_Y_pos <= CONV_INTEGER(pixel_row)) AND
(Char_Y_pos + 15 >= CONV_INTEGER(pixel_row)) THEN
disp_on <= '1';
ELSE
disp_on <= '0';
END IF;
IF pixel_column(4) = '1' THEN
char_address(3 DOWNTO 0) <= Scan_code (3 DOWNTO 0);
ELSE
char_address(3 DOWNTO 0) <= Scan_code (7 DOWNTO 4);
END IF;
Char_on <= disp_on AND rom_mux_on;
END process RGB_Display;
END behavior; |