sdsd0544 发布于 2005-5-28 11:36:00 我用Quartus2II的VHDL设计一个键盘功能程序,写在UP2上用外接显示器实现,我按下什么键,显示器就显示我按的字母,但是我现在的程序只能到我按下什么键,屏幕上显示的是键的代码的最后2个字节,并不是内容,比如我按“A”,屏幕上显示“1C”,并不是“A”。 我现在应该怎么做呢?
 sdsd0544 发布于 2005-5-28 14:32:00 这个是字符得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 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 Char_ROM;
ARCHITECTURE a OF Char_ROM IS SIGNALrom_data: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNALrom_address: STD_LOGIC_VECTOR(8 DOWNTO 0); BEGIN -- Small 8 by 8 Character Generator ROM for Video Display -- Each character is 8 8-bits 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;
这个是键盘得 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.STD_LOGIC_ARITH.all; USE IEEE.STD_LOGIC_UNSIGNED.all;
ENTITY keyboard IS PORT(keyboard_clk, keyboard_data, clock_25Mhz , reset, read: INSTD_LOGIC; scan_code: OUTSTD_LOGIC_VECTOR(7 DOWNTO 0); scan_ready: OUTSTD_LOGIC); END keyboard;
ARCHITECTURE a OF keyboard IS SIGNAL INCNT: std_logic_vector(3 downto 0); SIGNAL SHIFTIN : std_logic_vector(8 downto 0); SIGNAL READ_CHAR : std_logic; SIGNAL INFLAG, ready_set: std_logic; SIGNAL keyboard_clk_filtered : std_logic; SIGNAL filter : std_logic_vector(7 downto 0); BEGIN
PROCESS (read, ready_set) BEGIN IF read = '1' THEN scan_ready <= '0'; ELSIF ready_set'EVENT and ready_set = '1' THEN scan_ready <= '1'; END IF; END PROCESS;
--This process filters the raw clock signal coming from the keyboard using a shift register and two AND gates Clock_filter: PROCESS BEGIN WAIT UNTIL clock_25Mhz'EVENT AND clock_25Mhz= '1'; filter (6 DOWNTO 0) <= filter(7 DOWNTO 1) ; filter(7) <= keyboard_clk; IF filter = "11111111" THEN keyboard_clk_filtered <= '1'; ELSIF filter= "00000000" THEN keyboard_clk_filtered <= '0'; END IF; END PROCESS Clock_filter;
--This process reads in serial data coming from the terminal PROCESS BEGIN WAIT UNTIL (KEYBOARD_CLK_filtered'EVENT AND KEYBOARD_CLK_filtered='1'); IF RESET='1' THEN INCNT <= "0000"; READ_CHAR <= '0'; ELSE IF KEYBOARD_DATA='0' AND READ_CHAR='0' THEN READ_CHAR<= '1'; ready_set<= '0'; ELSE -- Shift in next 8 data bits to assemble a scan code IF READ_CHAR = '1' THEN IF INCNT < "1001" THEN INCNT <= INCNT + 1; SHIFTIN(7 DOWNTO 0) <= SHIFTIN(8 DOWNTO 1); SHIFTIN(8) <= KEYBOARD_DATA; ready_set <= '0'; -- End of scan code character, so set flags and exit loop ELSE scan_code <= SHIFTIN(7 DOWNTO 0); READ_CHAR<='0'; ready_set <= '1'; INCNT <= "0000"; END IF; END IF; END IF; END IF; END PROCESS; END a;
[此贴子已经被作者于2005-5-28 14:32:41编辑过] sdsd0544 发布于 2005-5-28 14:23:00
这个是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;
|