首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于键盘程序设计的一点问题~~

关于键盘程序设计的一点问题~~

我用Quartus2II的VHDL设计一个键盘功能程序,写在UP2上用外接显示器实现,我按下什么键,显示器就显示我按的字母,但是我现在的程序只能到我按下什么键,屏幕上显示的是键的代码的最后2个字节,并不是内容,比如我按“A”,屏幕上显示“1C”,并不是“A”。
我现在应该怎么做呢?
[em01]
这个是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;
这个是字符得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编辑过]

返回列表