Điều khiển tín hiệu bàn phím chuẩn PS2 và tín hiệu VGA dựa trên công nghệ FPGA

Mục Lục 1

Danh mục hình vẽ 3

Danh mục bảng 4

Lời nói đầu 5

Thuật Ngữ Tiếng Anh 6

CHƯƠNG I - TỔNG QUAN VỀ FPGA VÀ NGÔN NGỮ VHDL 8

1.1 Tổng quan về FPGA 8

1.1.1. Lịch sử ra đời của FPGA 8

1.1.2. Khái niệm cơ bản và cấu trúc của FPGA 8

1.1.3. Các ứng dụng của FPGA 11

1.1.4 Ý nghĩa và vai trò của FPGA 11

1.1.5 So sánh FPGA với một số mạch lập trình được 13

1.1.5.1 FPGA với CPLD 13

1.1.5.2 FPGA với SoC 13

1.1.6 Trình tự thiết kế chip dựa vào FPGA 14

1.2 Ngôn ngữ mô tả phần cứng - VHDL 17

1.2.1 Đặt vấn đề 17

1.2.2 Những ưu điểm của phương pháp thiết sử dụng HDL. 18

1.2.3. Giới thiệu ngôn ngữ mô tả phần cứng VHDL 19

1.2.4 Cấu trúc một mô hình hệ thống mô tả bằng VHDL 20

1.2.5 Trình tự thiết kế một chíp dựa trên VHDL 23

CHƯƠNG II - GIỚI THIỆU VỀ SPARTAN -3E KIT VÀ ISE 9.2I 25

2.1 Hãng Xilinx 25

2.2 Mạch phát triển họ Spartan 3E Kit Board của hãng Xilink 25

2.2.1 Kiến trúc cơ bản 25

2.2.2 Các thông số kỹ thuật và một số hình ảnh 27

2.2.3 Mã số Chip và ý nghĩa của nó. 28

2.3 Môi trường lập trình ISE Foundation 9.2i 29

2.3.1. Giới thiệu môi trường lập trình ISE. 29

2.3.2 Ý nghĩa của bộ công cụ ISE 30

2.3.3 Giới thiệu các công cụ lập trình của hãng Xilink 30

2.3.3.1 ISE 9.2 30

2.3.3.2 Logic Core 9.2 31

2.3.3.3 EDK 9.2 31

2.3.3.4 System Generator 9.2 31

2.3.4 Sơ lược cách sử dụng phần mềm ISE Foundation 9.2i 32

CHƯƠNG III – TÌM HIỂU TÍN HIỆU PS2 VÀ VGA 36

3.1 Khái niệm về VGA 36

3.1.1 Nguyên lý hoạt động của màn hình 36

3.1.1.1 Lý thuyết về điểm ảnh 36

3.1.1.2 Các màu cơ bản 37

3.1.1.3 Nguyên lý truyền hình cơ bản 38

3.1.1.4 Các chỉ tiêu của màn hình 41

3.1.2 VGA 43

3.1.3 Các thông số kỹ thuật của VGA 43

3.1.4 DB-15 Connector 44

3.2 Sử dụng cổng VGA của Spartan-3E Kit 45

3.2.1 Các chân tín hiệu 45

3.2.2 Định thời tín hiệu cho chế độ hiển thị VGA 60Hz, 640x480 47

3.3 Cổng chuột và bàn phím PS/2 51

CHƯƠNG IV – THIẾT KẾ HỆ THỐNG 56

4.1 Phân tích bài toán 56

4.2 Hiển thị hình ảnh lên màn CRT qua cổng VGA 56

4.3 Giao tiếp dữ liệu với bàn phím và mã hóa thành mã ASCII 58

4.4 Các thành phần ROM và RAM 73

4.4.1. SRAM 73

4.4.2 ROM 74

4.5 Thực thể ghép nối Top – Module 89

Kết luận và nhận xét 94

Tài liệu tham khảo 95

DANH MỤC HÌNH VẼ

Hình 1.1 Kiến trúc tổng quan của FPGA 8

Hình 1.2 Khối logic lập trình được của FPGA 9

Hình 1.3 Chênh lệch giá thành của FPGA và ASIC 11

Hình 1.4 Trình tự thiết kế chip 13

Hình 1.5 Kiến trúc thực một thể Entity 20

Hình 1.6 Thí dụ của một mô hình VHDL có thứ bậc 21

Hình 1.7 Kiến trúc thực thể Tesstbench 22

Hình 1.8 Quy trình thiết kế chip dựa trên VHDL 23

Hình 2.1 Cấu trúc các thành phần của Spartan 3E 25

Hình 2.2 Spartan-3E Starter Kit Board nhìn từ mặt trên. 27

Hình 2.3 Một số cổng của Spartan-3E Kit Board. 27

Hình 2.4 Chíp Spartan-3E Xilink với các thông số 27

Hình 2.5 Giao diện chính của môi truờng lập trình ISE 9.2i 31

Hình 2.6 Tạo một Project mới 32

Hình 2.7 Lựa chọn thiết bị cho đề án. 32

Hình 2.8 Thêm module vào đề án thiết kế 33

Hình 2.9 Lựa chọn các cổng vào ra 33

Hình 3.1 Cách xác định số dòng quét trên mỗi hình 37

Hình 3.2 Cách quét xen kẽ trong kỹ thuật truyền hình 38

Hình 3.3 Dòng quét ngang có dạng răng cưa tuyến tính theo chiều ngang 39

Hình 3.4 Một dòng quét AB của tín hiệu hình được điều chế biên độ âm 40

Hình 3.5 VGA port 43

Hình 3.6 Đầu nối DB15 VGA (nhìn mặt trước) 43

Hình 3.7 Đầu nối VGA trong Spartan-3E Starter Kit Board 45

Hình 3.8 Ví dụ về CRT Display Timing 46

Hình 3.9 Biểu đồ thời gian tín hiệu VGA 47

Hình 3.10 Biểu đồ thời gian tín hiệu VGA 51

Hình 3.11 Tín hiệu vào/ra cổng PS2 52

Hình 3.12 Bảng mã scancode với các phím tương ứng 52

Hình 4.1 Xây dựng SRAM từ CORE Generator 72

Hình 4.2 Thông số khởi tạo SRAM 73

 

 

doc95 trang | Chia sẻ: lethao | Lượt xem: 5310 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Điều khiển tín hiệu bàn phím chuẩn PS2 và tín hiệu VGA dựa trên công nghệ FPGA, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
i thể hiện số khung hình đạt được trong một giây. Tốc độ làm tươi đối với các loại màn hình thông dụng ở tần số 60, 75, 85 Hz (trong điện ảnh: với các phim nhựa, tần số thường là 24). Đối với màn hình máy tính loại CRT, độ làm tươi có thể thay đổi rộng từ 60 Hz trở lên. Những loại màn hình CRT thông dụng thường từ 60 đến 85 Hz, đối với một số model đặc biệt, độ làm tươi có thể đến 120 Hz hoặc cao hơn. Đối với màn hình tinh thể lỏng, tốc độ làm tươi thường là 60 Hz. Tốc độ làm tươi ảnh hưởng đến sức khoẻ của người sử dụng máy tính. Nếu đặt quá thấp với màn hình CRT sẽ có cảm giác rung hình, nhức mắt dẫn đến nhức đầu khi làm việc liên tục. Thông thường với màn hình CRT nên đặt tối thiểu 75 Hz để tránh có cảm giác này. Với màn hình tinh thể lỏng độ làm tươi 60 Hz cũng ít tạo ra cảm giác rung hình và nhức mắt như trên bởi cơ chế tạo hình ảnh của nó hoàn toàn khác với màn hình CRT. Thời gian đáp ứng Thời gian đáp ứng là một khái niệm chỉ nhắc đến đối với các màn hình tinh thể lỏng. Thời gian đáp ứng ở màn hình tinh thể lỏng được tính bằng miligiây (ms), nói đến khoảng thời gian biến đổi hoàn toàn một màu sắc của một điểm ảnh. Chính vì công nghệ tinh thể lỏng không thể hiển thị một điểm ảnh tức thời nên mới xuất hiện khái niệm này như một thông số để đánh giá về màn hình tinh thể lỏng. Nếu như cần hiển thị một chuyển động rất nhanh (ví dụ tường thuật một trận đua xe công thức 1 hoặc chơi games đua xe chẳng hạn) thì màn hình phải thay đổi các hình tĩnh liên tục. Nếu như việc chuyển đổi các hình ảnh không kịp thời sẽ xảy ra hiện tượng hình ảnh mới xuất hiện nhưng hình ảnh cũ không kịp xoá hết, không kịp thay đổi thì kết quả hiển thị sẽ xuất hiện vệt mờ của hình cũ - quen gọi là "bóng ma". Với việc xử lý văn bản, lướt web, xem phim thông thường (không có các pha hành động cực nhanh) thì thời giam đáp ứng 25 ms cũng đủ. Tuy nhiên với việc chơi các games đua xe hoặc các tác vụ khác liên quan đến thay đổi hình ảnh liên tục thì người sử dụng nên chọn thời gian đáp ứng càng thấp càng tốt. Hiện nay nhiều hãng sản xuất màn hình tinh thể lỏng đã quảng cáo sản phẩm của mình có thời giam đáp ứng đạt mức 2 ms (mức có thể đáp ứng mọi vấn đề về hiển thị). Tuy nhiên, có rất nhiều vấn đề còn tranh cãi trong việc tính thời gian đáp ứng trên màn hình tinh thể lỏng của các hãng, bởi mỗi hãng tính theo một cách khác nhau và công bố theo kết quả riêng của họ. Kích thước điểm ảnh Kích thước điểm ảnh là một thông số cố định và không thay đổi được, nó là kích thước điểm ảnh nhỏ nhất - tương ứng với độ phân giải lớn nhất. Các kích thước điểm ảnh còn có thể thay đổi đến lớn hơn tuỳ thuộc vào người sử dụng khi thiết lập độ phân giải màn hình thấp hơn so với thiết kế của nhà sản xuất. Kích thước điểm ảnh của mỗi hãng, mỗi model đều có thể khác nhau. Thấy rõ nhất là với các màn hình tinh thể lỏng có giá phổ thông hai loại màn hình có kích thước đường chéo khác nhau 17" và 19" thường cùng độ phân giải (lớn nhất) 1280x1024 (cùng so sánh với thể loại không phải màn hình rộng (non-wide) ) Kích thước điểm ảnh càng nhỏ hình ảnh hiển thị sẽ nét hơn và nếu kích thước điểm ảnh càng lớn thì ngược lại. 3.1.2 VGA VGA (hay Video Graphics Array) là một chuẩn hiển thị trên màn hình máy tính được giới thiệu năm 1987 từ phía IBM cùng với dòng máy tính PS/2. Nó có thể hiểu là thiết bị xuất đồ họa dưới dạng Video thành từng dãy ra màn hình và có thể hiển thị 256 màu biến đổi liên tục cùng một lúc, với độ phân giải 640 dòng chiều ngang và 480 dòng chiều dọc. Chuẩn VGA tương thích lùi với tất cả các chuẩn hiển thị trước đó, như CGA, MDA và EGA. Chuẩn VGA cao EGA hơn không những chỉ vì độ phân giải cao, mà còn vì công nghệ VGA cho phép giữ vững tỉ lệ co giãn của các hình đồ họa trên màn hình máy tính. Chuẩn VGA cũng dùng công nghệ tín hiệu đầu vào dạng tương tự để tạo ra một số lượng không hạn chế các màu sắc biến đổi theo một dải liên tục, trong khi đó EGA dùng công nghệ màn hình số nên bị giới hạn về số lượng các mức cường độ màu. Chuẩn VGA của IBM được các hãng sản xuất thiết bị nâng lên cao hơn khi đưa ra các bộ điều hợp VGA (Video Graphics Adapter – Card màn hình) có khả năng hiển thị thêm các chế độ đồ họa bổ sung. Đó là chế độ Super VGA có độ phân giải 800 pixel dòng chiều ngang và 600 dòng chiều dọc, và các bộ điều hợp cao cấp hơn cho phép hiển thị độ phân giải 1024 x 768 hoặc cao hơn, ở mức độ tối thiểu 256 màu (8 bit). 3.1.3 Các thông số kỹ thuật của VGA Với khả năng hiển thị hình ảnh động trên màn hình Analog CRT, chuẩn VGA có các thông số tiêu chuẩn sau : 256 KB Video RAM Các chế độ 16-màu và 256-màu 262144-giá trị trong bảng màu (sáu bit cho mỗi màu Red, Green và Blue) Có thể lựa chọn giữa tần số 25.2 MHz hoặc 28.3 MHz Số điểm ảnh ngang lớn nhất : 720 điểm Số hàng 480 hàng Tần số làm tươi lên đến 70 Hz Điện áp tín hiệu 0.7 V peak-peak 3.1.4 DB-15 Connector Đầu nối DB-15 có dạng như hình ảnh : Hình 3.5 VGA port Thứ tự chân cắm trên đầu nối được đánh số như sau : Hình 3.6 Đầu nối DB15 VGA (nhìn mặt trước) Mô tả chức năng các chân như sau : Bảng 3.1 Mô tả các chân của DB-15 PIN SIGNAL NAME DESCRIPTION 1 RED Tín hiệu cho màu Red 2 GREEN Tín hiệu cho màu Green 3 BLUE Tín hiệu cho màu Blue 4 MONID(0) Monitor ID signal 0 5 GND DDC Đất 6, 7, 8 AGND_VID Analog video ground 9 +5V_IO 5 V Power for I/O device 10 GND HSYNC and VSYNC ground 11 VGA_ID VGA ID signal 12 MONID(2) Monitor ID signal 2 13 HSYNC Tín hiệu đồng bộ mành 14 VSYNC Tín hiệu đồng bộ dòng 15 MONID(1) Monitor ID signal 1 3.2 Sử dụng cổng VGA của Spartan-3E Kit 3.2.1 Các chân tín hiệu Bo mạch Spartan-3E kit có một cổng ra VGA thông qua đầu nối DB15. Cổng kết nối này có thể kết nối trực tiếp vào hầu hết màn hình máy tính hoặc LCD dùng loại cáp chuẩn thông thường. Hình 3.7 Đầu nối VGA trong Spartan-3E Starter Kit Board Bo Spartan-3E FPGA trực tiếp điều khiển năm tín hiệu VGA nhờ các điện trở. Dây cable tín hiệu có giá trị trở kháng là 75Ω để đảm bảo rằng các tín hiệu màu có độ lớn trong phạm vi 0V ÷ 0,7V. Tín hiệu VGA_HSYNC và VGA_VSYNC sử dụng chuẩn I/O LVTTL hoặc LVCMOS33 để điều khiển các trạng thái khác nhau.Các tín hiệu VGA_RED, VGA_GREEN và VGA_BLUE khi thay đổi sẽ tạo ra 8 màu cơ bản được trình bày trong bảng sau. Bảng 3.2 Mã hiển thị màu VGA_Red VGA_Green VGA_Blue Màu tương ứng 0 0 0 Đen 0 0 1 Xanh dương 0 1 0 Xanh lá 0 1 1 Lục lam 1 0 0 Đỏ 1 0 1 Hồng 1 1 0 Vàng 1 1 1 Trắng 3.2.2 Định thời tín hiệu cho chế độ hiển thị VGA 60Hz, 640x480 Việc hiển thị lên màn hình được tiến hành dựa trên các đường quét ngang từ phải qua trái và quét dọc từ trên xuống dưới.Để hiển thị lên trên màn hình dưới dạng các điểm ảnh (các pixel). Số pixel để quét hết một đường ngang và số pixel để quét hết một đường dọc gọi là độ phân giải. Để dễ dàng hình dung cách tạo ảnh trên màn hình chúng ta xét hình vẽ. Hình 3.8 Ví dụ về CRT Display Timing Hình vẽ trên là một ví dụ minh hoạ cho việc hiển thị trên màn hình CRT với độ phân giải là 640*480. Như vậy, để tạo ra điện áp răng cưa thực hiện việc quét cần phải cung cấp một tín hiệu sao cho ứng với điện áp quét ngược khi đó sẽ là tín hiệu xoá cho một dòng quét. Dưới đây là biểu đồ thời gian tín hiệu VGA : Hình 3.9 Biểu đồ thời gian tín hiệu VGA Trong đó các tham số TPW, TS,Tdisp, Tfp, Tbp với các độ phân giải khác nhau sẽ khác nhau. Có hai độ phân giải ta thường sử dụng hơn cả là 640*480 và 800*600. Dưới đây là bảng tham số TPW, TS,Tdisp, Tfp, Tbp ứng với độ phân giải 640*480 là độ phân giải mà ta hay sử dụng trong quá trình thiết kế. Thực ra các giá trị này chúng ta có thể thay đổi trong một vài giá trị vẫn đảm bảo việc đồng bộ quét và tạo ảnh trên màn hình theo đúng ý đồ thiết kế việc hiển thị. Bảng 3.3 Các tham số cho chế độ 640 * 480 Như vậy để tạo ra tín hiệu quét như trên đơn giản ta tạo ra một bộ đếm với số đếm tối đa lên đến 800 sẽ reset về không. Bộ đếm đó thực hiện đếm đến các giá trị tương ứng cho trên bảng trên thì xuất tín hiệu đó lên mức ‘1’. Một điều lưu ý là tần số ứng với mỗi Pixel là 25 Mhz. Chính vì vậy ta phải tạo ra xung clock 25Mhz để tạo sự kiện đếm đối với mỗi giá trị Pixel. Trên đây là các thông số để hiển thị hình ảnh ở độ phân giải 640*480 với mỗi pixel có tần số 25 MHz. Nếu muốn tạo ra và sử dụng tín hiệu hình ảnh ở độ phân giải khác, phải đưa vào các hằng số sau để điều khiển tín hiệu quét dòng và mành : Horizontal constants: 800X600 and 40 MHz Hactive <= "001100011111" HFP <= "001101000111" Hsynch <= "001111000111" Hin <= "001110000111" HBP <= "010000011111" 1024x768 and 65MHz Hactive <= "001111111111" HFP <= "010000010111" Hsynch <= "010010011111" Hin <= "010001011011" HBP <= "010100111111" 1280x1024 @ 110MHz Hactive <= "010011111111" HFP <= "010100110011" Hsynch <= "010110101011" Hin <= "010101101111" HBP <= "011010101011" 1600x1200 @ 160MHz Hactive <= "011000111111" HFP <= "011001110111" Hsynch <= "011100110111" Hin <= "011011010111" HBP <= "100001011111" Vertical constants: 800X600 and 40 MHz Vactive <= "01001010111" VFP <= "01001011000" Vsynch <= "01001011100" VBP <= "01001110011" 1024x768 and 65MHz Vactive <= "01011111111" VFP <= "01100000010" Vsynch <= "01100001000" VBP <= "01100100101" 1280x1024 @ 110MHz Vactive <= "01111111111" VFP <= "10000000010" Vsynch <= "10000000111" VBP <= "10000110001" 1600x1200 @ 160MHz Vactive <= "10010101111" VFP <= "10010110000" Vsynch <= "10010110011" VBP <= "10011011011" Để vẽ một frame, có những mạch điện có trách nhiệm di chuyển dòng electron từ trái sang phải và từ trên xuống dưới dọc theo màn hình gọi là deflection circuit. Những mạch này yêu cầu phải có 2 tín hiệu động bộ để khởi động và dừng dòng electron tại đúng thời điểm để cho một dòng các điểm ảnh được vẽ dọc theo màn hình và mỗi dòng được điền theo cơ chế từ trên xuống dưới để tạo lên một ảnh. Hệ thống bên ngoài ghi giá trị pixel vào trong bộ đệm pixel (pixel buffer) (trong trường hợp này là RAM 128 x 8). Các pixel được lấy từ bộ đệm rồi ghi vào trong thanh ghi pixel (pixel register). Mỗi pixel có thể là 1, 2, 4, 8 hoặc 16 bit vì thế nên nội dung của thanh ghi pixel này được dịch sau mỗi xung clock để thay thế pixel hiện tại theo thứ tự các bít có trọng số thấp đến cao. Các bit này được gửi đến colormap circuit để chuyển các pixel này sang các giá trị red, green và blue rồi gửi đến bộ DAC video bên ngoài. Hai mạch tạo xung đồng bộ (pulse generation circuit) được dùng để tạo các xung đồng bộ đứng và nằm ngang (horizontal và vertical). Bộ hirizontalsync generator có đầu ra là tín hiệu gate một chu kì trùng khớp với sườn lên của xung đồng bộ ngang ( horizontal sync pulse), tín hiệu gate này nối với tín hiệu clock-enable của bộ vertical sync generator vì thế nên clock-enable chỉ cập nhật bộ đếm thời gian sau mỗi dòng pixel (line of pixels). Tín hiệu gate của vertical sync generator được dùng như tín hiệu báo kết thúc một frame cho các khối dữ liệu pixel bên ngoài, đồng thời nó cũng reset và xóa toàn bộ nội dung của pixel buffer nên bộ VGA generator luôn khởi động từ trạng thái xóa sạch hoàn toàn với mọi frame. Khai báo thực thể VGA : ENTITY VGA_SYNC IS PORT ( clock_50Mhz,mux : IN std_logic; horiz_sync_out : OUT std_logic; vert_sync_out : OUT std_logic; pixel_clock : OUT std_logic; pixel_row : OUT std_logic_vector(9 downto 0); pixel_column : OUT std_logic_vector(9 downto 0); sync,clock : OUT std_logic ); END VGA_SYNC; R Gán chân VGA Sau đây là tệp UCF lưu trữ cổng ra VGA, bao gồm gán chân IO, với các thông số đi kèm : NET "VGA_RED" LOC = "H14"; NET "VGA_GREEN" LOC = "H15"; NET "VGA_BLUE" LOC = "G15"; NET "VGA_HSYNC" LOC = "F15"; NET "VGA_VSYNC" LOC = "F14"; 3.3 Cổng chuột và bàn phím PS/2 The Spartan®-3E FPGA Starter Kit board có một cổng PS/2 dùng để điều khiển bàn phím và chuột. Cổng này có 6 chân mini-DIN, đánh nhãn J14 trên bo mạch. Hình dưới đây là đầu nối PS/2 và các chân tín hiệu được chú thích ở bảng dưới : Hình 3.10 Biểu đồ thời gian tín hiệu VGA Bảng 3.4 Các chân tín hiệu PS2 PS/2 DIN Pin Tín hiệu FPGA Pin 1 DATA (PS2_DATA) G13 2 Chưa dùng G13 3 GND GND 4 +5V — 5 CLK (PS2_CLK) G14 6 Chưa dùng G13 Hai thiết bị chuột và bàn phím máy tình chỉ dùng 2 dây để gửi tín hiệu để kết nối đến thiết bị khác, trong trường hợp này ta dùng là bo mạch FPGA. Dòng tín hiệu PS/2 bao gồm xung clock và data. Chuột và bàn phím đều sử dụng để gửi đi tín hiệu như nhau là dùng xung gồm 11bit. Trong 11 bit này bao gồm cả tín hiệu start, stop và mã chẵn lẻ. Tuy nhiên, bàn phím và chuột lại sử dụng dữ liệu là khác nhau bằng cách đổi thứ tự bit trong bus gửi đi. Thêm nữa, giao diện bàn phím cho phép truyền tín hiệu hai chiều để thiết bị điều khiển có thể làm sáng hoặc tắt các đèn LED trên bàn phím. Tín hiệu định thời của PS/2 được trình bày ở bảng và hình vẽ sau. Tín hiệu điều khiển chỉ làm việc khi xuất hiện khi có tín hiệu truyền đi, nếu không chúng được giữ ở trạng thái chờ và ở mức logic High. Tín hiệu định thời dùng để xác định tín hiệu đơn của chuột hoặc tín hiệu hai chiều của chuột để đưa đến thiết bị điều khiển. Trong hình vẽ, khi tín hiệu clock ở mức logic cao, thiết bị PS/2 sẽ gửi 1 bit tín hiệu đi, ngược lại thì thiết bị điều khiển sẽ đọc dữ liệu khi nó ở mức logic thấp. Bảng 3.5 Tham số nhận được từ cổng PS2 Symbol Tham số Min Max TCK Clock High or Low Time 30 μs 50 μs TSU Data-to-clock Setup Time 5 μs 25 μs THLD Clock-to-data Hold Time 5 μs 25 μs Hình 3.11 Tín hiệu vào/ra cổng PS2 Khi thiết bị dạng PS/2 là bàn phím, nó sẽ sử dụng mã quét để giao tiếp với thiết bị khác và thông báo phím nào đã được nhấn. Và hiện nay gần như tất cả bàn phím đều dùng chuẩn này. Mỗi phím bấm sẽ gửi đi một mã quét đơn và duy nhất. Sau đây là các phím bấm và mã quét tương ứng nó gửi đi. Hình 3.12 Bảng mã scancode với các phím tương ứng Khi một phím bấm được bấm và giữ, bàn phím sẽ gửi lặp đi lặp lại mã quét đó, mỗi lần gửi cách nhau 100ms hoặc hơn. Khi phím bấm đã được thả ra, có một mã quét với giá trị “F0” sẽ được gửi đi, theo sau đó là mã quét của phím vừa được nhấn. Mỗi khi phím bấm được bấm, cho dù có phím shift hay không thì bàn phím cũng chỉ gửi đi mã quét của phím đó. Máy tính sẽ xác định được phím nào đang nhấn. Một số phím khác, gọi là phím mở rộng sẽ gửi mã quét “F0” trước rồi mới gửi mã quét của nó, vì vậy ta thấy nó gửi đi hơn một mã quét. Khi những phím bấm này thả ra, lại có mã quét “F0 F0” được gửi đi sau khi đã gửi mã quét của phím đó. Thiết bị điều khiển có thể gửi các mã để điều khiển bàn phím. Một số mã lệnh điều khiển cơ bản Bảng 3.6 Các lệnh điều khiển gửi đến bàn phím PS2 Lệnh Diễn giải ED Bật/tắt các đèn Num Lock, Caps Lock, và Scroll Lock. Bàn phím sẽ thông báo nhận được lệnh “ED” bằng cách gửi đi mã quét “FA”, sau đó thiết bị điều khiển sẽ gửi tiếp lệnh tình trạng cho LED . Vị trí bit điều khiển các LED ở bảng sau. Giá trị ‘1’ sẽ làm cho LED tương ứng sáng . 7 6 5 4 3 2 1 0 (Không sử dụng) Caps Lock Num Lock Scroll Lock EE Echo. Khi nhận lệnh echo, bàn phím sẽ trả về cùng mã quét đã nhận “EE”. F3 Thiết lập tốc độ lặp mã quét của phím.Bàn phím sẽ thông báo khi nhận được mã quét của “F3” bằng cách trả về một mã quét “FA”, sau đó thiết bị điều khiển sẽ gửi byte thứ hai để thiết lập tốc độ lặp phím. FE Gửi lại. Khi nhận được lệnh này, bàn phím sẽ gửi lại mã quét vừa gửi đi trước đó. FF Reset. Resets bàn phím. Bàn phím chỉ gửi tín hiệu đi khi mà xung Clock và data đều ở mức logic cao, tức là trạng thái chờ. Dòng bit mà bàn phím gửi đến thiết bị điều khiển gồm 11 bit. Trong đó, có bít bắt đầu là ‘0’, tám bit chứa mã quét tiếp theo (LSB first), sau đó là bit chứa mã chẵn lẻ và kết thúc là bit dừng ‘1’. Khi bàn phím gửi dữ liệu đi, nó tạo và truyền đi khoảng 11 xung clock với tần số từ 20 – 30 kHz, dữ liệu được gửi đi tại xung sườn xuống của tín hiệu clock. Trong đề tài, hệ thống sẽ lấy giá trị Scancode của bàn phím để chuyển về giá trị ASCII tương ứng và dùng để xử lý số liệu sau này : Khai báo thực thể ps2_keyboard_interface : ENTITY PS2_KEYBOARD_INTERFACE IS PORT ( clk : in std_logic; reset : in std_logic; ps2_clk : inout std_logic; ps2_data : inout std_logic; rx_extended : out std_logic; rx_released : out std_logic; rx_shift_key_on : out std_logic; rx_ascii : out std_logic_vector(7 downto 0); rx_data_ready : out std_logic; rx_read : in std_logic; tx_data : in std_logic_vector(7 downto 0); tx_write : in std_logic; tx_write_ack : out std_logic; tx_error_no_keyboard_ack : out std_logic ); END PS2_KEYBOARD_INTERFACE; R Gán chân Keyboard PS2 Trong tệp UCF lưu trữ cổng ra Keyboard PS2, bao gồm gán chân IO, với các thông số đi kèm : NET "ps2_clk" LOC = "G14" ; NET "ps2_data" LOC = "G13" ; NET "reset" LOC = "D18" ; -- Nút bấm CHƯƠNG IV – THIẾT KẾ HỆ THỐNG 4.1 Phân tích bài toán Với đề tài đọc dữ liệu từ bàn phím và hiển thị ký tự lên màn hình CRT. Bài toán gồm 3 module chính : + Giao tiếp dữ liệu với bàn phím qua cổng PS2. + Mã hóa scancode sang ASCII rồi lưu trữ . + Hiển thị hình ảnh lên màn CRT qua cổng VGA. Ta lần lượt thiết kế các module và thực hiện ghép nối thành hệ thống. 4.2 Hiển thị hình ảnh lên màn CRT qua cổng VGA Khối xử lý hình ảnh gồm hai process - Process xử lý tần số quét tại mỗi điểm ảnh là 25 MHz (với độ phân giải 640*480). - Process thứ hai điều khiển tín hiệu quét mành quét dòng. File : VGA_SYNC.vhd -----------------quet vga------------------------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.STD_LOGIC_ARITH.all; USE IEEE.STD_LOGIC_UNSIGNED.all; -- VGA Video Sync generation ENTITY VGA_SYNC IS PORT( clock_50Mhz,mux : IN STD_LOGIC; horiz_sync_out, vert_sync_out,pixel_clock : OUT STD_LOGIC; pixel_row, pixel_column : OUT STD_LOGIC_VECTOR(9 DOWNTO 0); sync,clock : OUT std_logic ); END VGA_SYNC; ARCHITECTURE Behavioral 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(9 DOWNTO 0); signal clock_25mhz : std_logic; BEGIN -- Tao clock 25 MHz process (clock_50mhz) begin if clock_50mhz 'event and clock_50mhz='1' then if (clock_25mhz = '0') then clock_25mhz <= '1'; else clock_25mhz <= '0'; end if; end if; end process; sync <= '0'; clock <= clock_25mhz; -- video_on chi hien thi khi co du lieu RGB vao video_on <= video_on_H AND video_on_V; --Tao quet dong va quet manh PROCESS BEGIN WAIT UNTIL(clock_25Mhz 'EVENT) AND (clock_25Mhz='1'); -- 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 <= "0000000000"; ELSE h_count <= h_count + 1; END IF; --Generate Horizontal Sync Signal using H_count IF (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 <= "0000000000"; ELSIF (h_count = 699) THEN v_count <= v_count + 1; END IF; -- Generate Vertical Sync Signal using V_count IF (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 logic delays that can cause a blurry image horiz_sync_out <= horiz_sync; vert_sync_out <= vert_sync; pixel_clock <= clock_25mhz; END PROCESS; END Behavioral; 4.3 Giao tiếp dữ liệu với bàn phím và mã hóa thành mã ASCII Giao tiếp với bàn phím thường được dùng đến đối với các thiết kế dựa trên bộ vi điều khiển. Nhập từ bàn phím và xuất ra led là sự lựa chọn kinh tế để giao tiếp với người sử dụng và thường thích hợp với các ứng dụng phức tạp. Với các bài toán nhỏ chúng ta thường tự tạo một bàn phím đơn giản với chức năng do ta định nghĩa. Bài toán này đưa ra nhằm giúp chúng ta làm quen với cách thức giao tiếp với bàn phím PS2 bao gồm việc nhập kí tự số từ bàn phím, biến đổi thành mã ASCII, gửi và lưu trữ tại SRAM đã định sẵn. Có thể nói đây là một chương trình rất khó và đòi hỏi phải có sự tổng hợp các kiến thức bao gồm các bài toán giao tiếp với bàn phím PS2 (bàn phím IBM). - Đầu tiên là bảng mã hoá bàn phím PS2 do IBM cung cấp được đưa vào nhằm mục đích giải mã 7 bít sang mã ASCII, bít địa chỉ thứ 7 dành cho phím Caplock, bit thứ 8 dành cho phím Shift. Bảng mã đã được nói đến ở chương trước. Trong quá trình xử lý số liệu, mã scancode sẽ được chuyển thành ASCII. - Các dữ liệu được truyền từ bàn phím theo phương pháp truyền nối tiếp vì vậy cũng giống như bất cứ cách thức thực hiện truyền tin nối tiếp nào, dữ liệu truyền đi đều phải đưa qua bộ đệm truyền, cũng tương tự như vậy, dữ liệu nhận từ bàn phím cũng phải thực hiện đọc lần lượt từ bộ đệm tương ứng.Chính vì vậy cần phải sử dụng một mô hình máy trạng thái để điều khiển thao tác chuyển đổi tuần tự sang song song và từ song song sang tuần tự. Quá trình chuyển đổi tuần tự sang song song để đưa ra đệm truyền ở thao tác quét phím và quá trình ngược lại cho thao tác khôi phục mã ASCII. - Cũng giống như quá trình truyền thông tin nối tiếp khác, ở đây chúng ta cần phải xử dụng các cờ báo hiệu, loạt cờ chức năng bao gồm xác nhận phím ấn, cờ báo cho phép chuyển đổi song song, nối tiếp, cờ báo lỗi trạng thái bàn phím do có quá nhiều phím bị nhấn, cờ báo nhận….đều phải được khai báo để sử dụng. - Ở đây, cũng cần phải lưu ý rằng để tránh tình trạng các phím được ấn đồng loạt, ta xử lý đồng thời hai tín hiệu Ps2_clk và Ps2_data_line thỉnh thoảng được kéo xuống thấp và tương đương với các hàng điện trở đặt ở trạng thái trở kháng cao, đồng nghĩa với việc xác nhận không có dòng dữ liệu nào được phép truyền đi cả. Hơn nữa trong chương trình cũng đặt ra việc xử lý chống rung cho bàn phím bằng cách đưa ra khoảng thời gian hãm “debounce timer”. - Điều cần quan tấm cuối cùng là việc đồng bộ tốc độ quét là xung clock 60us được tạo ra bằng cách chia tần số. Một tham số thứ hai nữa là xung clock 5us được sử dụng cho mục đích chống rung do hiện tượng nẩy phím. File : Banphim.vhd library ieee; use ieee.std_logic_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use ieee.numeric_std.all; entity ps2_keyboard_interface is port( clk : in std_logic; reset : in std_logic; ps2_clk : inout std_logic; ps2_data : inout std_logic; rx_extended : out std_logic; rx_released : out std_logic; rx_shift_key_on : out std_logic; rx_ascii : out std_logic_vector(7 downto 0); rx_data_ready : out std_logic; rx_read : in std_logic; tx_data : in std_logic_vector(7 downto 0); tx_write : in std_logic; tx_write_ack : out std_logic; tx_error_no_keyboard_ack : out std_logic ); end ps2_keyboard_interface; ------------------------------------------------------------------------------- -- Kien truc ------------------------------------------------------------------------------- architecture Behavioral of ps2_keyboard_interface is constant TOTAL_BITS : integer := 11; constant EXTEND_CODE : integer := 16#E0#; constant RELEASE_CODE : integer := 16#F0#; constant LEFT_SHIFT : integer := 16#12#; constant RIGHT_SHIFT : integer := 16#59#; -- Du lieu de tao xung clock 12.5 MHz constant TIMER_60USEC_VALUE_PP : integer := 750; constant TIMER_60USEC_BITS_PP : integer := 10; constant TIMER_5USEC_VALUE_PP : integer := 62; constant TIMER_5USEC_BITS_PP : integer := 6; constant TRAP_SHIFT_KEYS_PP : integer := 0; type m1_type is ( m1_rx_clk_h, m1_rx_clk_l, m1_tx_wait_clk_h, m1_tx_force_clk_l, m1_tx_clk_h, m1_tx_clk_l, m1_tx_wait_keyboard_ack, m1_tx_done_recovery, m1_tx_error_no_keyboard_ack, m1_tx_rising_edge_marker, m1_tx_first_wait_clk_h, m1_tx_first_wait_clk_l, m1_tx_reset_timer, m1_rx_falling_edge_marker, m1_rx_rising_edge_marker ); type m2_type is ( m2_rx_data_ready_ack, m2_rx_data_ready ); signal timer_60usec_done : std_logic; signal timer_5usec_done : std_logic; signal extended : std_logic; signal released : std_logic; signal shift_key_on : std_logic; signal rx_output_event : std_logic; signal rx_output_strobe : std_logic; signal tx_parity_bit : std_logic; signal rx_shifting_done : std_logic; signal tx_shifting_done : std_logic; signal shift_key_plus_code: std_logic_vector(11 dow

Các file đính kèm theo tài liệu này:

  • docDo an tot nghiep Kip 2009 FPGA small.doc