Chương trình kết hợp với giải mã led thể hiện tọa độ của mouse và nút nào được nhấn thể hiện qua dp của led 7 đoạn.. Chương trình kết hợp này thể hiện tọa độ hàng chục của chuột: LIBRARY
Trang 1Chương 24: Kiểm tra giới hạn trên của
màn hình
IF (cursor_column <128) AND ((NEW_cursor_column >
256) OR
(NEW_cursor_column < 2)) THEN
cursor_column<=CONV_STD_LOGIC_VECTOR (0, 10);
Kiểm tra giới hạn dưới của màn hình
ELSIF NEW_cursor_column > 640 THEN
cursor_column<=CONV_STD_LOGIC_VECTOR (640,10);
ELSE
cursor_column <= NEW_cursor_column;
END IF;
ELSIF PACKET_COUNT = "10" THEN
PACKET_CHAR2 <= SHIFTIN (7 DOWNTO 0);
ELSIF PACKET_COUNT = "11" THEN
PACKET_CHAR3 <= SHIFTIN (7 DOWNTO 0);
INCNT <= conv_std_logic_vector (0,4);
IF PACKET_COUNT = "11" THEN
PACKET_COUNT <= "01";
Hoàn tất đóng gói, để xử lý dữ liệu trong gói.
Tín hiệu hai giá trị của thành phần chuyển động mở rộng X và Y và cộng thêm địa chỉ con trỏ hiện hành.
Sự chuyển động Y ngược lên là địa chỉ hàng thấp.
Trang 2
NEW_cursor_row <= cursor_row -(PACKET_CHAR3 (7) &
PACKET_CHAR3 (7) & PACKET_CHAR3);
NEW_cursor_column<=cursor_column+
(PACKET_CHAR2(7) &
PACKET_CHAR2 (7) & PACKET_CHAR2);
LEFT_BUTTON <= PACKET_CHAR1 (0);
RIGHT_BUTTON <= PACKET_CHAR1 (1);
END IF;
END IF;
END IF;
END IF;
END PROCESS RECV_UART;
END behavior;
Bảng dữ liệu mouse
L =bit thể trạng thái của nút trái
M =bit thể trạng thái của nút giữa
R =bit thể trạng thái của nút phải
X7-X0= khoảng cách di chuyển của X (0=di chuyển trái, 1=dichuyển phải)
Trang 3Y7-Y0= khoảng cách di chuyển của Y (0=di chuyển trái, 1=dichuyển phải)
Xo= bit dữ liệu thể hiện X tràn (tràn=1)
Yo= bit dữ liệu thể hiện Y tràn (tràn=1)
…
Từ các bit trong 3 byte của mouse cho ta bit toa độ của mouse và cho biết nút nào của Mouse được nhấn
Chương trình kết hợp với giải mã led thể hiện tọa độ của mouse và nút nào được nhấn thể hiện qua dp của led 7 đoạn Do kit chỉ có 2 led 7đoạn nên ta chỉ thể hiện hàng đơn vị hay hàng chục của toạ độ của mouse
Chương trình kết hợp này thể hiện tọa độ hàng chục của chuột:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY kethop IS
PORT ( clock_25Mhz, reset : IN STD_LOGIC;
dataM,dataL :OUT STD_LOGIC_VECTOR (6 DOWNTO 0);
mouse_data, mouse_clk : INOUT STD_LOGIC;
left_button, right_button : OUT STD_LOGIC);
END kethop;
ARCHITECTURE bb OF kethop IS
SIGNAL mouse_cursor_row :STD_LOGIC_VECTOR (9 DOWNTO 0);
Trang 4SIGNAL mouse_cursor_column: STD_LOGIC_VECTOR (9 DOWNTO 0);
COMPONENT mouse
STD_LOGIC;
STD_LOGIC;
STD_LOGIC_VECTOR(9 DOWNTO 0);
STD_LOGIC_VECTOR(9DOWNTO 0));
END COMPONENT;
COMPONENT dec_7seg1
DOWNTO 0);
Data : OUT STD_LOGIC_VECTOR (6
DOWNTO 0));
END COMPONENT;
BEGIN
map(clock_25Mhz=>clock_25Mhz,reset=>reset,
mouse_data=>mouse_data,mouse_clk=>mouse_clk, left_button=>left_button,right_button=>right_button, mouse_cursor_row=>mouse_cursor_row,
mouse_cursor_column =>mouse_cursor_column);
Trang 5x2: dec_7seg1 port map (hex_digit=>
mouse_cursor_row(9 downto 6),data =>dataM);
x3: dec_7seg1 port map (hex_digit
=>mouse_cursor_column(9 downto 6),data
=>dataL);
END;
Sau đó ta gán chân như sau:
Tín hiệu Chân
dataL6 6
dataL5 7
dataL4 8
dataL3 9
dataL2 11
dataL1 12
dataL0 13
right_button 14
dataM6 17
dataM5 18
dataM4 19
dataM3 20
dataM2 21
dataM1 23
dataM0 24
left_button 25
mouse_clk 30
mouse_data 31
reset 41
clock_25Mhz 91
Trang 6Lưu và biên dịch lại, rồi nạp file sof lên Kit UP2 để chạy chương trình
VII Giao tiếp giữa VGA và bàn phím
1 Mô hình
Data : từ bàn phím xuất ra khi ta nhấn phím
Clk : từ bàn phím khi ta nhấn phím
Mã scancode được chương trình chuyển đổi (ở phần trước) từ tín hiệu data của bàn phím Tín hiệu data và clk được truyền thông qua cổng PS/2 đến KIT UP2
Sau đó mã scancode được giải mã thành địa chỉ của kí tự có mã scancode đó
Địa chỉ được đưa vào chương trình xuất kí tự( ở phần trước) đưa
kí tự lên màn hình Lúc này chương trình sẽ xuất ra 5 tín hiệu red, green, blue và hai tín hiệu đồng bộ ngang và dọc 5 tín hiệu này được truyền tới monitor thông qua cổng Vga của KIT UP2
2 Chương trình
a Chương trình giải mã
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.STD_LOGIC_ARITH.all;
USE IEEE.STD_LOGIC_UNSIGNED.all;
ENTITY giaima IS
Trang 7PORT( scan_in: IN STD_LOGIC_VECTOR (7
DOWNTO 0);
scan_out: OUT STD_LOGIC_VECTOR (5
DOWNTO 0));
END giaima;
ARCHITECTURE o OF giaima IS
SIGNAL scan1 : STD_LOGIC_VECTOR (5 DOWNTO 0);
BEGIN
PROCESS(scan_in)
BEGIN
CASE scan_in IS
WHEN "00011110" =>
scan1 <= "000000";
WHEN "00011100" =>
scan1 <= "000001";
WHEN "00110010" =>
scan1 <= "000010";
WHEN "00100001" =>
scan1 <= "000011";
WHEN "00100011" =>
scan1 <= "000100";
WHEN "00100100" =>
scan1 <= "000101";
WHEN "00101011" =>
scan1 <= "000110";
WHEN "00110100" =>
scan1 <= "000111";
Trang 8WHEN "00110011" =>
scan1 <= "001000";
WHEN "01000011" =>
scan1 <= "001001";
WHEN "01001011" =>
scan1 <= "001010";
WHEN "01000010" =>
scan1 <= "001011";
WHEN "01001100" =>
scan1 <= "001100";
WHEN "00111010" =>
scan1 <= "001101";
WHEN "00110001" =>
scan1 <= "001110";
WHEN "01000100" =>
scan1 <= "001111";
WHEN "01001101" =>
scan1 <= "010000";
WHEN "00010101" =>
scan1<= "010001";
WHEN "00101101" =>
scan1<= "010010";
WHEN "00011011" =>
scan1 <= "010011";
WHEN "00101100" =>
scan1 <= "010100";
WHEN "00111100" =>
scan1 <= "010101";
WHEN "00101010" =>
scan1 <= "010110";
Trang 9WHEN "00011101" =>
scan1 <= "010111";
WHEN "00100010" =>
scan1 <= "011000";
WHEN "00110101" =>
scan1 <= "011001";
WHEN "00011010" =>
scan1 <= "011010";
WHEN "01010100" =>
scan1 <= "011011";
WHEN "01110010" =>
scan1 <= "011100";
WHEN "01011011" =>
scan1 <= "011101";
WHEN "01110101" =>
scan1 <= "011110";
WHEN "01101011" =>
scan1 <= "011111";
WHEN "00101001" =>
scan1 <= "100000";
WHEN "00010110" =>
scan1 <= "100001";
WHEN "00100110" =>
scan1 <= "100011";
WHEN "00100101" =>
scan1 <= "100100";
WHEN "00101110" =>
scan1 <= "100101";
WHEN "00111101" =>
scan1 <= "100110";
Trang 10WHEN "01010010" =>
scan1 <= "100111";
WHEN "01000110" =>
scan1 <= "101000";
WHEN "01000101" =>
scan1 <= "101001";
WHEN "01111100" =>
scan1 <= "101010";
WHEN "01111001" =>
scan1 <= "101011";
WHEN "01000001" =>
scan1 <= "101100";
WHEN "01001110" =>
scan1 <= "101101";
WHEN "01001001" =>
scan1 <= "101110";
WHEN "01001010" =>
scan1 <= "101111";
WHEN "01110000" =>
scan1 <= "110000";
WHEN "01101001" =>
scan1 <= "110001";
WHEN "01111010" =>
scan1 <= "110011";
WHEN "01110001" =>
scan1 <= "110100";
WHEN "01110011" =>
scan1 <= "110101";
WHEN "01110100" =>
scan1 <= "110110";
Trang 11WHEN "01101100" =>
scan1 <= "110111";
WHEN "00111110" =>
scan1 <= "111000";
WHEN "01111101" =>
scan1 <= "111001";
WHEN OTHERS =>
scan1 <= "100000";
END CASE;
END PROCESS;
scan_out<=scan1;
END o;
b Chương trình kết hợp
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.STD_LOGIC_ARITH.all;
USE IEEE.STD_LOGIC_UNSIGNED.all;
ENTITY kh IS
keyboard_clk, keyboard_data, reset, read : IN
STD_LOGIC;
red_out, green_out, blue_out, horiz_sync_out, vert_sync_out
STD_LOGIC);
END kh;
ARCHITECTURE a OF kh IS
Trang 12SIGNAL rom_mux_output, green, blue, scan_ready : STD_LOGIC;
SIGNAL pixel_row, pixel_column: STD_LOGIC_VECTOR (9
DOWNTO 0);
SIGNAL scan_out: STD_LOGIC_VECTOR (5 DOWNTO 0);
SIGNAL scan_code: STD_LOGIC_VECTOR (7 DOWNTO 0);
COMPONENT VGA_SYNC
STD_LOGIC;
red_out, green_out, blue_out, horiz_sync_out, vert_sync_out
: OUT STD_LOGIC;
pixel_row, pixel_column: OUT STD_LOGIC_VECTOR (9
DOWNTO 0));
END COMPONENT;
COMPONENT Char_ROM
(5 DOWNTO 0);
font_row, font_col : IN STD_LOGIC_VECTOR (2 DOWNTO 0);
rom_mux_output : OUT STD_LOGIC);
END COMPONENT;
COMPONENT keyboard
PORT(keyboard_clk, keyboard_data, clock_25Mhz ,
reset, read : IN STD_LOGIC;
scan_code : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
scan_ready : OUT STD_LOGIC);
END COMPONENT;
Trang 13COMPONENT giaima
PORT (scan_in: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
scan_out: OUT STD_LOGIC_VECTOR (5 DOWNTO
0));
END COMPONENT;
BEGIN
x0: keyboard PORT MAP(keyboard_clk=>keyboard_clk,
keyboard_data=>keyboard_data, clock_25Mhz=>clock_25Mhz,reset=>reset , read=>read,scan_code=>scan_code,
scan_ready=>scan_ready);
(scan_in=>scan_code,scan_out=>scan_out);
x2: vga_sync PORT MAP (clock_25Mhz=>clock_25Mhz,
red=>scan_ready,green=>rom_mux_outpu t,
blue=>rom_mux_output,red_out=>red_out ,
green_out=>green_out,blue_out=>blue_ou t,
vert_sync_out=>vert_sync_out, horiz_sync_out=>horiz_sync_out, pixel_column=>pixel_column, pixel_row=>pixel_row);
x3:char_rom PORT MAP (character_address=>scan_out,
font_row=>pixel_row (3 downto 1),
font_col=>pixel_column (3 downto 1), rom_mux_output=>rom_mux_output);
Trang 14Sau đó chọn linh kiện và gán chân như sau:
Keyboard_clk : 30
Keyboard_data : 31
Read : 40
Reset : 41
Clock_25Mhz : 91
Red_out : 236
Green_out : 237
Blue_out : 238
Vert_sync_out : 239
Horiz_sync_out : 240
Các chân còn lại chương trình tự gán Lưu và biên dịch lại rồi nạp lên Kit
Tuy nhiên chương trình vẫn còn nhiều thiếu xót trong việc hiển thị, thứ nhất là do ROM của KIT nhỏ không thể hiện được hết các phím trên bàn phím, thứ hai là do có một số phím có mã scancode trùng nhau nên ta không thể hiển thị được các kí tự đó như @=shift + 2
VIII Giao tiếp với VGA và mouse :
1 Mô hình :
Trang 15Mouse_clk : xung của mouse phát ra khi ta di chuyển hoặc
nhấp chuột
Mouse_data : dữ liệu của mouse phát ra khi ta di chuyển
hoặc nhấp chuột
Reset :tín hiệu reset chương trình.
Clk_25Mhz : xung cấp cho chương trình VGA_sync.
Horiz_sync : tín hiệu đồng bộ ngang từ KIT truyền cho
monitor
Vert_sync : tín hiệu đồng bộ dọc từ KIT truyền cho
monitor
Red_out : tín màu đỏ từ KIT truyền cho monitor.
Green_out : tín màu xanh lá cây từ KIT truyền cho
monitor
Blue_out : tín màu xanh dương từ KIT truyền cho monitor.
Chương trình liên kết hiển thị con trỏ của chuột lên màn hình, vì trong bộ nhớ của KIT không hỗ trợ kí hiệu con trỏ nên
ta thay con trỏ như một dấu chấm
Đầu tiên tín hiệu xung và dữ liệu của mouse được đưa vào chương trình chuyển đổi(phần trước) nhận biết được nút trái hay phải được nhấp và cho biết toạ độ của mouse Tín hiệu toạ độ của chuột sẽ làm tín hiệu để so sánh với hàng cột của điểm ảnh
do chương trình Vga_sync( phần trước) Nếu thoả điều kiện thì tín hiệu color_on được đặt lên ‘1’ và nó chính là tín hiệu để hiển thị con trỏ của chuột màu xanh(RBG=’011’) với màn hình nền màu đen(RGB=’000’) Màn hình được quét liên tục nhưng chỉ có tín hiệu con trỏ lại được quét theo vị trí của con trỏ