|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
關(guān)于鍵盤程序設(shè)計的一點問題~~ |
| 作者:sdsd0544 欄目:EDA技術(shù) |
我用Quartus2II的VHDL設(shè)計一個鍵盤功能程序,寫在UP2上用外接顯示器實現(xiàn),我按下什么鍵,顯示器就顯示我按的字母,但是我現(xiàn)在的程序只能到我按下什么鍵,屏幕上顯示的是鍵的代碼的最后2個字節(jié),并不是內(nèi)容,比如我按“A”,屏幕上顯示“1C”,并不是“A”。 我現(xiàn)在應(yīng)該怎么做呢? |
| 2樓: | >>參與討論 |
| 作者: sdsd0544 于 2005/5/28 14:17:00 發(fā)布:
關(guān)于鍵盤程序設(shè)計的一點問題~~ 這個是字符得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; 這個是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.html">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 IEE |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |