Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 16 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
16
Dung lượng
76,91 KB
Nội dung
Chương 23: Chöông trình keát hôïp LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY scancode IS PORT (keyboard_clk, keyboard_data, clock_25Mhz , reset, read : IN STD_LOGIC; dataL,dataM : OUT STD_LOGIC_VECTOR (6 DOWNTO 0); scan_ready : OUT STD_LOGIC); END scancode; ARCHITECTURE a OF scancode IS SIGNAL scan_code : STD_LOGIC_VECTOR(7 DOWNTO 0); 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; COMPONENT dec_7seg PORT(hex_digit : IN STD_LOGIC_VECTOR(3 DOWNTO 0); data : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END COMPONENT; BEGIN x1: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); x2: dec_7seg PORT MAP(hex_digit=>scan_code(3 downto 0),data=>dataL); x3:dec_7seg PORT MAP(hex_digit=>scan_code(7 downto 4),data=>dataM); END; Sau đó ta gán chân theo các chân đã được nối với chip sẵn như sau : dataM6 : 6 dataM5 : 7 dataM4 : 8 dataM3 : 9 dataM2 : 11 dataM1 : 12 dataM0 : 13 dataL6 : 17 dataL5 : 18 dataL4 : 19 dataL3 : 20 dataL2 : 21 dataL1 : 23 dataL0 : 24 keyboard_clk : 30 keyboard_data : 31 read : 40 reset : 41 scan_ready : 45 clock_25Mhz : 91 VI. Giao tiếp với mouse a. Cách hoạt động Mouse chứa quả banh để cuộn 2 slotted wheels. Wheels được nối đến hai con mã hoá quang học. Hai đầu dò mã hóa x và y hoạt động do việc đếm xung khi wheels di chuyển. Mouse chứa 2 hay 3 nút nhấn có thể được đọc bởi hệ thống và chip điều khiển. Vi điều khiển sẽ gửi tín hiệu đến máy tính thông báo tình trạng nút nhấn và yêu cầu hoạt động. Dữ liệu của mouse truyền như bàn phím thông qua cổng PS/2. nhưng khi không truyền thì đường xung của mouse sẽ được kéo lên cao còn đường dữ liệu ở trạng thái nào cũng được. Và quá trình truyền phức tạp hơn vì một lệnh của mouse trước khi truyền phải gửi mã tự kiểm tra tương ứng với mã AA hay 00, rồi gửi lệnh Acknowledge tương ứng với mã FA. Rồi mới bắt đầu gửi 3 bit. b. Chương trình LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY MOUSE IS PORT ( clock_25Mhz, reset : IN STD_LOGIC; SIGNAL mouse_data : INOUT STD_LOGIC; SIGNAL mouse_clk : INOUT STD_LOGIC; SIGNAL left_button, right_button : OUT STD_LOGIC; SIGNAL mouse_cursor_row: OUT STD_LOGIC_VECTOR (9 DOWNTO 0 ); SIGNAL mouse_cursor_column: OUT STD_LOGIC_VECTOR (9 DOWNTO 0)); END MOUSE; ARCHITECTURE behavior OF MOUSE IS TYPE STATE_TYPE IS (INHIBIT_TRANS, LOAD_COMMAND, LOAD_COMMAND2, WAIT_OUTPUT_READY, WAIT_CMD_ACK, INPUT_PACKETS); Tín hieäu cho mouse SIGNAL mouse_state : STATE_TYPE; SIGNAL inhibit_wait_count : STD_LOGIC_VECTOR(10 DOWNTO 0); SIGNAL CHARIN, CHAROUT : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL new_cursor_row, new_cursor_column: STD_LOGIC_VECTOR (9 DOWNTO 0 ); SIGNAL cursor_row, cursor_column: STD_LOGIC_VECTOR(9 DOWNTO 0); SIGNAL INCNT, OUTCNT, MSB_OUT: STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL PACKET_COUNT : STD_LOGIC_VECTOR (1 DOWNTO 0); SIGNAL SHIFTIN : STD_LOGIC_VECTOR (8 DOWNTO 0); SIGNAL SHIFTOUT : STD_LOGIC_VECTOR (10 DOWNTO 0); SIGNAL PACKET_CHAR1, PACKET_CHAR2, PACKET_CHAR3 : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL MOUSE_CLK_BUF, DATA_READY, READ_CHAR: STD_LOGIC; SIGNAL i : INTEGER; SIGNAL cursor, iready_set, break, toggle_next, output_ready, send_char, send_data : STD_LOGIC; SIGNAL MOUSE_DATA_DIR, MOUSE_DATA_OUT, MOUSE_DATA_BUF, MOUSE_CLK_DIR : STD_LOGIC; SIGNAL MOUSE_CLK_FILTER : STD_LOGIC; SIGNAL filter : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN mouse_cursor_row <= cursor_row; mouse_cursor_column <= cursor_column; Tri_state điều khiển đường xung và đường dữ liệu mouse. MOUSE_DATA <= 'Z' WHEN MOUSE_DATA_DIR = '0' ELSE MOUSE_DATA_BUF; MOUSE_CLK<='Z' WHEN MOUSE_CLK_DIR = '0' ELSE MOUSE_CLK_BUF; Tình trạng mạch khi gửi lệnh cấm và xử lý tín hiệu nhận. PROCESS (reset, clock_25Mhz) BEGIN IF reset = '1' THEN mouse_state <= INHIBIT_TRANS; inhibit_wait_count <= conv_std_logic_vector(0,11); SEND_DATA <= '0'; ELSIF clock_25Mhz'EVENT AND clock_25Mhz = '1' THEN CASE mouse_state IS Mouse được bật và gửi mã tự kiểm tra, AA và 00 trước khi mạch downloaded Đường xung kéo lên cao cấm bất kỳ tín hiệu truyền từ mouse. Cần ít nhất 60us để dừng việc truyền trong khi tiến hành. Lúc này cảm biến quang của mouse sẽ không truyền. WHEN INHIBIT_TRANS => inhibit_wait_count<= inhibit_wait_count + 1; IF inhibit_wait_count(10 DOWNTO 9) = "11" THEN mouse_state <= LOAD_COMMAND; END IF; Cho phép Streaming Mode Command, F4 charout <= "11110100"; Kéo đường dữ liệu của mouse xuống để tín hiệu dữ liệu có giá trò. WHEN LOAD_COMMAND => SEND_DATA <= '1'; mouse_state <= LOAD_COMMAND2; WHEN LOAD_COMMAND2 => SEND_DATA <= '1'; mouse_state <= WAIT_OUTPUT_READY; Chờ cho đến khi Mouse phát xung lệnh. Lệnh gửi là F4, cho phép Streaming Mode Mouse bắt đầu gửi 3-byte packets với các data hoạt động của mouse. WHEN WAIT_OUTPUT_READY => SEND_DATA <= '0'; Tín hiệu Output Ready cho tất cả dữ liệu là xung ra của thanh ghi dòch. IF OUTPUT_READY='1' THEN mouse_state <= WAIT_CMD_ACK; ELSE mouse_state <= WAIT_OUTPUT_READY; END IF; Chờ cho Mouse gửi trả lệnh Acknowledge, FA WHEN WAIT_CMD_ACK => SEND_DATA <= '0'; IF IREADY_SET='1' THEN mouse_state <= INPUT_PACKETS; END IF; Tháo bỏ đường clock_25Mhz và dữ liệu và mở chế độ ngõ vào mouse. Trong trạng thái này và nhận 3-byte mouse data packets Tốc độ xác đònh là 100 packets per second WHEN INPUT_PACKETS => mouse_state <= INPUT_PACKETS; END CASE; END IF; END PROCESS; WITH mouse_state SELECT Đường dữ liệu mouse nằm trên đường điều khiển Tri-state: '1' FLEX Chip phát động, '0'=Mouse phát động. MOUSE_DATA_DIR <= '0' WHEN INHIBIT_TRANS, '0' WHEN LOAD_COMMAND, '0' WHEN LOAD_COMMAND2, '1' WHEN WAIT_OUTPUT_READY, '0' WHEN WAIT_CMD_ACK, '0' WHEN INPUT_PACKETS; Đường xung mouse nằm trên đường điều khiển Tri-state : '1' FLEX Chip phát động, '0'=Mouse phát động. WITH mouse_state SELECT MOUSE_CLK_DIR <= '1' WHEN INHIBIT_TRANS, '1' WHEN LOAD_COMMAND, '1' WHEN LOAD_COMMAND2, '0' WHEN WAIT_OUTPUT_READY, '0' WHEN WAIT_CMD_ACK, '0' WHEN INPUT_PACKETS; WITH mouse_state SELECT Ngõ vào tri-state từ FLEX chip đệm đường clock_25Mhz mouse. MOUSE_CLK_BUF <= '0' WHEN INHIBIT_TRANS, '1' WHEN LOAD_COMMAND, '1' WHEN LOAD_COMMAND2, '1' WHEN WAIT_OUTPUT_READY, '1' WHEN WAIT_CMD_ACK, '1' WHEN INPUT_PACKETS; Lọc tín hiệu xung cùa mouse cho khỏi nhiễu PROCESS [...]... filter(7 DOWNTO 1) . Chương 23: Chöông trình keát hôïp LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE. hoạt động do việc đếm xung khi wheels di chuyển. Mouse chứa 2 hay 3 nút nhấn có thể được đọc bởi hệ thống và chip điều khiển. Vi điều khiển sẽ gửi tín hiệu đến máy tính thông báo tình trạng nút. WHEN MOUSE_CLK_DIR = '0' ELSE MOUSE_CLK_BUF; Tình trạng mạch khi gửi lệnh cấm và xử lý tín hiệu nhận. PROCESS (reset, clock_25Mhz) BEGIN IF reset = '1' THEN mouse_state