门关键词: 光耦继电器 电容充放电原理 电子元件符号 六脚拨动开关 流量开关工作原理 入耳式耳机 防水插头插座
IC库存(8958万) PDF资料(329万) IC价格 IC求购 资讯 技术资料
电子元器件搜索:
维库电子市场网是知名的电子元器件交易网站,为电子生产企业提供IC库存和技术资料查询服务。
关于键盘程序设计的一点问题~~
新闻出处:中电网论坛 发布时间: 2005-05-28
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;

关闭】 【打印
 
相关专题
 
友情链接:
© 2007 电子元件网 网站地图