Một số ứng dụng trên KIT UP2 hãng Altera

TÀI LIỆU THAM KHẢO 1. www.Xilinx.com 2. www.Altera.com 3. Rapid Prototyping Pf Digital Systems James O.Hamblen Michael D. Furman KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Kết luận Qua quá trình tìm hiểu và thực hiện đề tài cùng với các kiến thức mà thầy cô truyền đạt, chúng em nhận thấy rằng FPGAs XC4005XL hãng Xilinx và các chip MAX7000S, chip FLEX10K hãng Altera có khả năng lập trình rất linh hoạt. Ta có thể lập trình để thực hiện các mô hình điều khiển từ đơn giản đến phức tạp như điều khiển tốc độ của động cơ, điều khiển nhiệt độ trong lò vi ba sóng, máy giặt, tủ lạnh, Trong đề tài này, chúng em đã thực hiện được một số ứng dụng trên KIT UP2 hãng Altera như chương trình dịch led từ phải sang trái và ngược lại, chương trình đếm và hiển thị trên LED 7 đoạn, mạch hiển thị nhiệt độ điều khiển động cơ bên ngoài để giao tiếp với KIT UP2, các chương trình giao tiếp với VGA, Keyboard, mouse. Trong quá trình thực hiện đề tài, chúng em gặp khó khăn về phần mềm của XILINX. Vì khi biên dịch chương trình thì linh kiện sẽ được gán chân một cách ngẫu nhiên, không phù hợp với thiết kế nên ta phải gán chân lại cho linh kiện, nhưng phần mềm XILINX lại không hỗ trợ cho phần này nên chúng em phải chuyển sang tìm hiểu và thực hiện trên KIT UP2 của Altera. Tuy nhiên do thời gian và kiến thức có hạn nên chúng em chưa thể thực hiện được những chương trình phức tạp hơn. Kính mong sự đóng góp ý kiến của thầy cô và các bạn để đề tài được hoàn thiện hơn. Hướng phát triển: Nếu như áp dụng điều khiển này bằng logic mờ, ta có thể điều chỉnh tốc độ quay tùy ý theo tín hiệu số thông qua mạch điều biến xung. Ứng với nhiệt độ trong khoảng yêu cầu cùng với tốc độ quạt hồi tiếp về mà ta dùng các luật hợp thành của logic mờ để đưa ra một tín hiệu điều khiển. Từ tín hiệu đó, thông qua mạch chuyển đổi A/D để chuyển đổi tín hiệu analog đó thành số. Từ tín hiệu số ta qua mạch điều biến xung để điều khiển tốc độ quạt nhanh chậm theo tín hiệu. Mô hình điều khiển tốc độ quạt tự động theo nhiệt độ môi trường

doc149 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2755 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Một số ứng dụng trên KIT UP2 hãng Altera, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
(IN HI) ñöôïc noái ñeán analog COMMON vaø ngoõ vaøo cao ñöôïc noái baêng qua tröôùc tuï thay ñoåi Cref. Maïch trong chip chaéc raèng tuï seõ ñöôïc noái ñuùng cöïc. Ñoù laø nguyeân nhaân laøm cho ngoõ ra cuûa maïch tích phaân trôû veà 0. Thôøi gian cho ngoõ ra trôû veà 0 töông öùng vôùi tín hieäu ngoõ vaøo. Tín hieäu soá ra laø: DISPLAY COUNT=1000(). Hình: Phaàn analog cuûa ICL7107 Töø tín hieäu soá treân, ta ñi vaøo phaàn hieån thò: Phaàn hieån thò : Hình: Phaàn hieån thò cuûa ICL7107 Chaân 38, 39, 40 laø chaân cung caáp xung cho IC. Tín hieäu soá töø maïch so saùnh seõ ñi vaøo LOGIC CONTROL ñeå ñieàu khieån tín hieäu soá treân LED thoâng qua maïch choát, taàn soá cung caáp cho maïch seõ laø tín hieäu xung ñeå caáp cho maïch ñeám. IC 7107 laø loaïi ñieån hình ñeå hieån thò LED anod. Duøng IC naøy ta coù theå deã daøng tröïc tieáp ñeå hieån thò nhieät ñoä töø maïch chuyeån ñoåi cuûa IC LM 335. 2. Caùch hoaït ñoäng cuûa maïch Nhieät ñoä moâi tröôøng seõ taùc ñoäng leân caûm bieán nhieät LM335. ÖÙng vôùi moãi nhieät ñoä maø LM335 seõ cho ra moät möùc ñieän theá töông öùng trong khoaûng 2230mV ñeán 3730mV. Töø möùc ñieän theá ñoù, ta cho qua maïch chuyeån ñoåi duøng op_amp TL084 ñeå taïo ra moät möùc ñieän theá töông öùng töø 2.33V ñeán 3.73 V laø tín hieäu vaøo cuûa ICL7107 laø boä bieán ñoåi A/D vaø boä giaûi maõ nhieät ñoä. Sau moät chu kyø bieán ñoåi, IC seõ giaûi maõ vaø hieån thò nhieät ñoä ra LED. Töø caùc ngoõ ra soá cuûa caùc LED, ta thay thaønh caùc header ñeå truyeàn tín hieäu soá vaøo KIT UP2. Töø ñoù thoâng qua chöông trình giaûi maõ LED ñöôïc vieát baèng ngoân ngöõ VHDL ñeå hieån thò nhieät ñoä treân KIT. 3. Chöông trình a. Chöông trình ñeäm led: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY dem2chieu IS PORT ( A : STD_LOGIC_VECTOR (6 DOWNTO); B : INOUT STD_LOGIC_VECTOR (6 DOWNTO 0); C : IN STD_LOGIC); END dem2chieu; ARCHITECTURE xuly OF dem2chieu IS BEGIN TARGETOP : PROCESS (A, B, C) VARIABLE Ai : STD_LOGIC_VECTOR (6 DOWNTO 0); VARIABLE Bi : STD_LOGIC_VECTOR (6 DOWNTO 0); VARIABLE Ci : STD_LOGIC; BEGIN Ai := A; Ci := C; IF (Ci='0') THEN Bi := Ai; END IF; B<=Bi END PROCESS; END xuly; Caùc chaân cuûa LED ñaõ ñöôïc noái saün vôùi MAX7128S neân ta chæ caàn assigment pin cho ñuùng roài taûi chöông trình vaøo IC, maïch seõ hieån thò nhieät ñoä. Cuõng töø tín hieäu ra cuûa ñeäm cho qua chöông trình so saùnh vôùi nhieät ñoä ñaët saün.  b. Chöông trình so saùnh: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY sosanh IS PORT ( A, E : IN STD_LOGIC_VECTOR (6 DOWNTO 0); B, D : IN STD_LOGIC_VECTOR (6 DOWNTO 0); C : OUT STD_LOGIC_VECTOR (2 DOWNTO 0)); END sosanh; ARCHITECTURE xuly OF sosanh IS BEGIN TARGETOP : PROCESS (A, B, E, D) VARIABLE Ai : STD_LOGIC_VECTOR (6 DOWNTO 0); VARIABLE Bi : STD_LOGIC_VECTOR (6 DOWNTO 0); VARIABLE Di : STD_LOGIC_VECTOR (6 DOWNTO 0); VARIABLE Ei : STD_LOGIC_VECTOR (6 DOWNTO 0); VARIABLE Ci : STD_LOGIC_VECTOR (2 DOWNTO 0); BEGIN Ai := A; Bi := B; Di := D; Ei := E; IF (Ai < Bi) THEN Ci :="100"; ELSIF (Ai = Bi) THEN IF (Di<Ei) THEN Ci := "100"; ELSIF (Di = Ei) THEN Ci:= "010"; ELSE Ci:= "001"; END IF; ELSE Ci := "001"; END IF; C <= Ci; END PROCESS; END; Ta seõ ñaët nhieät ñoä yeâu caàu ñeå so saùnh thoâng qua coâng taéc SWITCH (tuøy yù). Chöông trình seõ so saùnh xem nhieät ñoä cuûa moâi tröôøng vôùi nhieät ñoä yeâu caàu nhö theá naøo maø xuaát ra tín hieäu töông öùng ñeå ñieàu khieån. Tín hieäu nhieät ñoä vaøo qua ñeäm laø tín hieäu: A: nhieät ñoä haøng ñôn vò. B: nhieät ñoä haøng chuïc. E: nhieät ñoä yeâu caàu haøng ñôn vò. F: nhieät ñoä yeâu caàu haøng chuïc. Giaû söû: nhieät ñoä moâi tröôøng lôùn hôn nhieät ñoä yeâu caàu thì tín hieäu xuaát ra Ci(0)= ‘1’ seõ ñieàu khieån cho ñoäng cô quay. Coøn neáu nhieät ñoä moâi tröôøng nhoû hôn hoaëc baèng vôùi nhieät ñoä yeâu caàu thì KIT seõ xuaát ra tín hieäu 0 khoâng laøm ñoäng cô quay. c. Chöông trình keát hôïp giöõa ñeäm vaø so saùnh: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY demsosanh IS PORT ( A, B : IN STD_LOGIC_VECTOR (6 DOWNTO 0); E, F : IN STD_LOGIC_VECTOR (6 DOWNTO 0); G, H : OUT STD_LOGIC_VECTOR (6 DOWNTO 0); C1 : OUT STD_LOGIC_VECTOR (2 DOWNTO 0); C : IN STD_LOGIC); END demsosanh; ARCHTECTURE xuly OF demsosanh IS SIGNAL B0, B2 : STD_LOGIC_VECTOR (6 DOWNTO 0); COMPONENT dem2chieu PORT ( A : IN STD_LOGIC_VECTOR (6 DOWNTO 0); B : INOUT STD_LOGIC_VECTOR (6 DOWNTO 0); C : IN STD_LOGIC); END COMPONENT; COMPONENT sosanh PORT ( A, E : IN STD_LOGIC_VECTOR (6 DOWNTO 0); B, D : IN STD_LOGIC_VECTOR (6 DOWNTO 0); C : OUT STD_LOGIC_ECTOR (2 DOWNTO 0)); END COMPONENT; BEGIN x1: dem2chieu PORT MAP (A => A, B => B0, C => C); x2: dem2chieu PORT MAP(A => B, B => B2, C => C); G <= B0; H <= B2; x5:sosanh PORT MAP(A => B2, D => B0, B => F, E=>E ,C => C1); END; *Gaùn chaân cho linh kieän ñeå thöïc hieän chöông trình keát hôïp giöõa ñeän vaø so saùnh Teân tín hieäu Chaân chip EPM7128S Teân tín hieäu Chaân chip EPM7128S Teân tín hieäu Chaân chip EPM7128S A0 8 B0 6 E0 29 A1 10 B1 9 E1 31 A2 12 B2 11 E2 33 A3 16 B3 15 E3 35 A4 18 B4 17 E4 37 A5 21 B5 20 E5 39 A6 25 B6 22 E6 44 F0 30 G0 69 H0 58 F1 34 G1 70 H1 60 F2 36 G2 73 H2 61 F3 40 G3 74 H3 63 F4 41 G4 76 H4 64 F5 46 G5 75 H5 65 F6 48 G6 77 H6 67 C 50 4. Ñoäng cô: Khi coù tín hieäu ñieàu khieån töø KIT UP2, opto led quang ñöôïc baät laøm cho trasistor daãn, luùc ñoù seõ coù ñieän theá kích vaøo chaân B cuûa trasistor Q2 laøm Q2 daãn vaø chaân C cuûa Q2 ôû möùc 0, laøm ñoäng cô quay. Q2: transistor coâng suaát. Chuù yù: chaân mass cuûa tín hieäu khaùc chaân mass cuûa ñoäng cô. IV. Giao tieáp VGA: Ñeå monitor hoaït ñoäng ta phaûi cung caáp cho noù 5 tín hieäu, goàm  2 tín hieäu ñoàng boä ngang vaø ñoàng boä doïc, 3 tín hieäu maøu red, blue, green(RGB). Töø yeâu caàu ñoù chöông trình VGA phaûi caàn moät xung ñeå phaùt ra tín hieäu ñoàng boä ngang vaø ñoàng boä doïc. Theo nhö caùch hoaït ñoäng VGA, ñeå queùt maøn hình moät laàn thì taàn soá caàn thieát cuûa xung ñoàng boä ngang laø: fROW= 31KHz Taàn soá cuûa maøn hình : fScreen=6Hz. Vaø do maét ngöôøi coù khaû naêng caûm nhaän ñöôïc chu kyø laøm töôi nhoû hôn 30Hz, vì vaäy ta phaûi naïp laøm töôi maøn hình lieân tuïc ñeå giaûm söï laäp loeø. Do ñoù toác ñoä laøm töôi phaûi cao hôn 60Hz nghóa laø trong cheá ñoä 640x480 thì thôøi gian veõ 1 pixel laø 40ns töông öùng vôùi taàn soá laø : ftoaøncuïc= 25Mhz. Theâm vaøo ñoù ta coøn söû duïng boä ñeám ñeå phaùt ra haøng vaø coät , moãi laàn moät ñòa chæ haøng vaø coät ñöôïc xaùc ñònh cuõng laø luùc tín hieäu ñoàng boä ngang vaø doïc ñöôïc phaùt cho pheùp veõ pixel leân maøn hình. Trong cheá ñoä 640x480 coù nghóa laø haøng coù 640 coät vaø 480 doøng neân ta duøng boä ñeám 10 bit thì môùi ñuû ñeå xaùc ñònh soá haøng vaø coät. *Moâ hình: Caùc loái vaøo cuûa VGA_SYNC ñöôïc keát noái vôùi caùc chaân cuûa FLEX10K70 cuûa KIT, coøn caùc loái ra cuøa VGA_SYNC ñöôïc truyeàn ñeán moät monitor khaùc ñeå hieån thò 1.Chöông trình hieån thò maøu theo tín hieäu red, green, blue 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 : IN 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 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(9 DOWNTO 0); BEGIN -- Video_on ñöôïc baät khi tín hieäu RGB ñöôïc hieån thò. video_on <= video_on_H AND video_on_V; PROCESS BEGIN WAIT UNTIL(clock_25Mhz'EVENT AND clock_25Mhz='1'); -Phaùt xung ñoàng boä ngang vaø ñoàng boä doïc cho Video Signal -- H_count ñeå ñeám ñieåm aûnh(ngoaøi 640 ñieåm aûnh+ thôøi gian cho xung ñoàng boä) -- Soá ñieåm aûnh töông öùng vôùi thôøi gian phaùt xung ñoàng boä ngang -- ------------------------------------__________-------- -- H_count 0 640 659 755 799 IF (h_count = 799) THEN h_count <= "0000000000"; ELSE h_count <= h_count + 1; END IF; --Phaùt xung ñoàng boä ngang vôùi tín hieäu ñeám H_count IF (h_count = 659) THEN horiz_sync <= '0'; ELSE horiz_sync <= '1'; END IF; -- V_count ñeå ñeám ñieåm aûnh(ngoaøi 480 ñieåm aûnh+ thôøi gian cho xung ñoàng boä) -- Soá ñieåm aûnh töông öùng vôùi thôøi gian phaùt xung ñoàng boä doïc -- -----------------------------------------------_______------------ -- 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; --Phaùt xung ñoàng boä doïc vôùi tín hieäu ñeám V_count IF (v_count = 493) THEN vert_sync <= '0'; ELSE vert_sync <= '1'; END IF; --Phaùt tín hieäu video treân maøn hình cho döõ lieäu pixel 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; 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; Sau ñoù bieân dòch vaø tieán haønh choïn linh kieän vaø gaùn chaân. Ta choïn chip EMP10K70. Ñeå gaùn chaân ñuùng ta phaûi bieát moät soá chaân caàn thieát (ngoaøi caùc chaân môû roäng ôû caùc expansion) ñaõ ñöôïc noái saün vôùi chip Ta seõ gaùn chaân nhö sau: + Red_out vôùi chaân 236 + Green_out vôùi chaân 237 + Blue_out vôùi chaân 238 + Vert_sync_out vôùi chaân 239 + Horiz_sync_out vôùi chaân 240 + Red gaùn vôùi switch1 ôû chaân 41 + Green vôùi switch1 ôû chaân 40 + Blue vôùi switch1 ôû chaân 39 Sau ñoù löu vaø bieân dòch laïi. Roài naïp file .sof leân board UP2. Keát quaû: RED GREEN BLUE MAØU 0 0 0 ÑEN 0 0 1 XANH DÖÔNG 0 1 0 XANH LAÙ CAÂY 0 1 1 XANH DA TRÔØI 1 0 0 ÑOÛ 1 0 1 TÍM 1 1 0 VAØNG 1 1 1 TRAÉNG Baûng maøu treân monitor sau khi naïp chöông trình vôùi caùc tín hieäu RGB : 2. Chöông trình hieån thò kí töï leân monitor CHAR ADDRESS CHAR ADDRESS CHAR ADDRESS CHAR ADDRESS @ 00 P 20 Space 40 0 60 A 01 Q 21 ! 41 1 61 B 02 R 22 ‘’ 42 2 62 C 03 S 23 # 43 3 63 D 04 T 24 $ 44 4 64 E 05 U 25 % 45 5 65 F 06 V 26 & 46 6 66 G 07 W 27 ‘ 47 7 67 H 10 X 30 { 50 8 70 I 11 Y 31 } 51 9 71 J 12 Z 32 * 52 A 72 K 13 [ 33 + 53 B 73 L 14 Dn Arrow 34 , 54 C 74 M 15 ] 35 - 55 D 75 N 16 Up Arrow 36 . 56 E 76 O 17 Lft Arrow 37 / 57 F 77 Baûng ñòa chæ kí töï trong ROM Ñeå hieån thò kí töï leân maøn hình ta phaûi taïo moät baûng kí töï trong ROM. Alterra coù hoã trôï baûng ROM treân kit, vôùi moät file khôûi taïo tcgrom.mif ñeå khôûi taïo ROM trong suoát quaù trình taûi. Moãi vò trí treân ROM chöùa ñòa chæ baét ñaàu cuûa cuûa font kí töï. Ví duï : ñeå xuaát chöõ A ra maøn hình : theo baøng ñòa chæ trong ROM thì ñòa chæ baét ñaàu laø 000001, söû duïng 8bit nhôù neân öùng vôùi ñòa chæ seõ coù font data : Address Font data 000001000 00011000 000001001 00111100 000001010 01100110 000001011 01111110 000001100 01100110 000001101 01100110 000001110 01100110 000001111 00000000 Vì ñòa chæ cuûa font kí töï ñöôïc taïo trong ROM laø byte 10bit. Maø ñòa chæ kí töï chöùa 6bit keát hôïp vôùi ñòa chæ font row laø 3bit taïo thaønh ñòa chæ töông öùng trong ROM vaø xuaát ra kí töï ôû ñòa chæ ñoù. *Moâ hình: Vì ñòa chæ cuûa font kí töï ñöôïc taïo trong ROM laø byte 10bit. Maø ñòa chæ kí töï chöùa 6bit keát hôïp vôùi ñòa chæ font row laø 3bit taïo thaønh ñòa chæ töông öùng trong ROM vaø xuaát ra ñòa chæ baét ñaàu cuûa kí töï ñoù. *Chöông trình: 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 : IN STD_LOGIC_VECTOR(5 DOWNTO 0); font_row, font_col : IN STD_LOGIC_VECTOR(2 DOWNTO 0); rom_mux_output : OUT STD_LOGIC); END Char_ROM; ARCHITECTURE a OF Char_ROM IS SIGNAL rom_data: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL rom_address: STD_LOGIC_VECTOR(8 DOWNTO 0); BEGIN -- Phaùt matraän kí töï 8x8 trong Rom ra maøn hình video -- Moãi kí töï laø 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", -- Ñoïc trong file .mif cho caùc kí töï phaùt font data lpm_file => "tcgrom.mif", lpm_width => 8) PORT MAP ( address => rom_address, q => rom_data); rom_address <= character_address & font_row; -- Ña hôïp ñeå bit loãi rom döõ lieäu töø 8 bit word -- Phaùt kí töï cho maøn hình rom_mux_output <=rom_data((CONV_INTEGER(NOT font_col(2 downto 0)))); END a; 3. Chöông trình keát hôïp vôùi VGA ñeå xuaát kí töï ra maøn hình *Moâ hình: *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 kitu IS PORT(clock_25Mhz : IN STD_LOGIC; red_out, green_out, blue_out, horiz_sync_out, vert_sync_out :OUT STD_LOGIC); END kitu; ARCHITECTURE a OF kitu IS SIGNAL rom_mux_output,green,blue : STD_LOGIC; SIGNAL pixel_row,pixel_column : STD_LOGIC_VECTOR (9 DOWNTO 0); COMPONENT VGA_SYNC PORT (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 PORT(character_address : IN STD_LOGIC_VECTOR(5 DOWNTO 0); font_row, font_col : IN STD_LOGIC_VECTOR(2 DOWNTO 0); rom_mux_output : OUT STD_LOGIC); END COMPONENT; BEGIN x1:VGA_SYNC PORT MAP (clock_25Mhz=>clock_25Mhz, green=>rom_mux_output,blue=>rom_mux_output, red_out=>red_out,green_out=>green_out, blue_out=>blue_out,vert_sync_out=>vert_sync_out, horiz_sync_out=>horiz_sync_out,pixel_column=>pixel_column, pixel_row=>pixel_row); x2: char_rom PORT MAP (character_address=>pixel_row (9 DOWNTO 4), font_row=>pixel_row(3 DOWNTO 1), font_col=>pixel_column(3 DOWNTO 1), rom_mux_output=>rom_mux_output); END; Ta seõ gaùn chaân: + Red_out vôùi chaân 236. + Green_out vôùi chaân 237 + Blue_out vôùi chaân 238 + Vert_sync_out vôùi chaân 239 + Horiz_sync_out vôùi chaân 240. + Red gaùn vôùi switch1 ôû chaân 41, + Green vôùi switch1 ôû chaân 40. + Blue vôùi switch1 ôû chaân 39 Sau ñoù löu vaø bieân dòch laïi. Roài naïp file .sof leân board UP2. V. Giao tieáp vôùi keyboard 1. Caùch hoaït ñoäng  Baøn phím noái keát vôùi maïch UP2 qua coång PS/2, theo cheá ñoä handshaking. Nhöõng maõ queùt ñöôïc gôûi moät caùch noái tieáp söû duïng 11 bit treân ñöôøng truyeàn döõ lieäu chính xaùc. Ngay caû khi baøn phím coù hay khoâng, maùy tính cuõng caàn gôûi döõ lieäu , ñöôøng döõ lieäu vaø ñöôøng xung thì cao. Maõ queùt goàm 11 bit: 1: Moät start bit (‘0’) 2: 8 bit döõ lieäu chöùa ñöïng maõ queùt phím theo thöù töï töø thaáp ñeán cao 3: Bit leû ngang haøng nhö laø 8 bit döõ lieäu coäng vôùi bit ngang haøng thì ñöôïc moät con soá leû 4: Moät stop bit (‘1’), thoâng thöôøng ngay caû nhöõng vaán ñeà dieãn ra trong suoát quaù trình chuyeån dòch ñöôïc yeâu caàu töø baøn phím . Khi hoaït ñoäng baøn phím caáp ñöôøng xung xuoáng thaáp trong khoaûng 35ms vaø baøn phím seõ ñöa xung ra 10 bit côõ 70ms. Baøn phím ñieàu khieån caû ñöôøng döõ lieäu vaø xung. Khi baét ñaàu truyeàn, start bit seõ ñöôïc truyeàn, maïch nhaän tín hieäu xung vaø nhaän döõ lieäu vaøo noái tieáp. Khi hoaøn taát quaù trình truyeàn maø baøn phím khoâng göûi tieáp thì ñöôøng xung ñöôïc traû laïi traïng thaùi cao. 2. Chöông trình xuaát maõ scancode cuûa caùc phím khi ñöôïc nhaán ra led Key # Make Code Break Code Key# Make Code Break Code Key# Make Code Break Code 1 0E F0 0E 31 1C F0 1C 90 77 F0 77 2 16 F0 16 32 1B F0 1B 91 6C F0 6C 3 1E F0 1E 33 23 F0 23 92 6B F0 6B 4 26 F0 26 34 2B F0 2B 93 69 F0 69 5 25 F0 25 35 34 F0 34 96 75 F0 75 6 2E F0 2E 36 33 F0 33 97 73 F0 73 7 36 F0 36 37 3B F0 3B 98 72 F0 72 8 3D F0 3D 38 42 F0 42 99 70 F0 70 9 3E F0 3E 39 4B F0 4B 100 7C F0 7C 10 46 F0 46 40 4C F0 4C 101 7D F0 7D 11 45 F0 45 41 52 F0 52 102 74 F0 74 12 4E F0 4E 43 5A F0 5A 103 7A F0 7A 13 55 F0 55 44 12 F0 12 104 71 F0 71 15 66 F0 66 46 1A F0 1A 105 7B F0 7B 16 0D F0 0D 47 22 F0 22 106 79 F0 79 17 15 F0 15 48 21 F0 21 110 76 F0 76 18 1D F0 1D 49 2A F0 2A 112 05 F0 05 19 24 F0 24 50 32 F0 32 113 06 F0 06 20 2D F0 2P 51 31 F0 31 114 04 F0 04 21 2C F0 2C 52 3A F0 3A 115 0c F0 0C 22 35 F0 35 53 41 F0 41 116 03 F0 03 23 3C F0 3C 54 49 F0 49 117 0B F0 0B 24 43 F0 43 55 4A F0 4A 118 83 F0 83 25 44 F0 44 57 59 F0 59 119 0A F0 0A 26 4D F0 4D 58 14 F0 14 120 01 F0 01 27 54 F0 54 60 11 F0 11 121 09 F0 09 28 5B F0 5B 61 29 F0 29 121 78 F0 78 29 5D F0 5D 62 E0 11 E0 F0 11 123 07 F0 07 Baûng maõ scandscode cuûa baøn phím a. Chöông trình xuaát maõ scancode 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 : IN STD_LOGIC; scan_code : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); scan_ready : OUT STD_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; --Chöông trình xöû lyù loïc cho tín hieäu xung töø baøn phím söû duïng thanh ghi dòch vaø 2 coång AND ñeå giaûm nhieãu vaø söï phaûn xaï. 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; --Chöông trình ñoïc döõ lieäu vaøo noái tieáp 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 -- Dòch 8 bit döõ lieäu keá tieáp ñeå thu maõ scancode 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'; --Maõ scancode cuoái cuûa kítöï, baät côø vaø thoaùt khoûi voøng laëp 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; Baøn phím phaùt xung ñeå chuaån bò göûi döõ lieäu, qua chöông trình loïc xung, töø xung ñaõ loïc seõ laøm tín hieäu ñoïc döõ lieäu vaø chuyeån döõ lieäu ñaõ ñoïc töø daïng noái tieáp sang song song, vaø xuaát döõ lieäu song song chính laø maõ scancode vaø töø maõ scancode ta ñöa vaøo chöông trình giaûi maõ led ñeå xuaát maõ scancode ra led. b. 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 ñoù ta gaùn chaân theo caùc chaân ñaõ ñöôïc noái vôùi chip saü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 tieáp vôùi mouse a. Caùch hoaït ñoäng Mouse chöùa quaû banh ñeå cuoän 2 slotted wheels. Wheels ñöôïc noái ñeán hai con maõ hoaù quang hoïc. Hai ñaàu doø maõ hoùa x vaø y hoaït ñoäng do vieäc ñeám xung khi wheels di chuyeån. Mouse chöùa 2 hay 3 nuùt nhaán coù theå ñöôïc ñoïc bôûi heä thoáng vaø chip ñieàu khieån. Vi ñieàu khieån seõ göûi tín hieäu ñeán maùy tính thoâng baùo tình traïng nuùt nhaán vaø yeâu caàu hoaït ñoäng. Döõ lieäu cuûa mouse truyeàn nhö baøn phím thoâng qua coång PS/2. nhöng khi khoâng truyeàn thì ñöôøng xung cuûa mouse seõ ñöôïc keùo leân cao coøn ñöôøng döõ lieäu ôû traïng thaùi naøo cuõng ñöôïc. Vaø quaù trình truyeàn phöùc taïp hôn vì moät leänh cuûa mouse tröôùc khi truyeàn phaûi göûi maõ töï kieåm tra töông öùng vôùi maõ AA hay 00, roài göûi leänh Acknowledge töông öùng vôùi maõ FA. Roài môùi baét ñaà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 ñieàu khieån ñöôøng xung vaø ñöôøng döõ lieä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 traïng maïch khi göûi leänh caám vaø xöû lyù tín hieäu nhaä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 baät vaø göûi maõ töï kieåm tra, AA vaø 00 tröôùc khi maïch downloaded --Ñöôøng xung keùo leân cao caám baát kyø tín hieäu truyeàn töø mouse. -- Caàn ít nhaát 60us ñeå döøng vieäc truyeàn trong khi tieán haønh. -- Luùc naøy caûm bieán quang cuûa mouse seõ khoâng truyeà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 pheùp Streaming Mode Command, F4 charout <= "11110100"; -- Keùo ñöôøng döõ lieäu cuûa mouse xuoáng ñeå tín hieäu döõ lieäu coù giaù trò. WHEN LOAD_COMMAND => SEND_DATA <= '1'; mouse_state <= LOAD_COMMAND2; WHEN LOAD_COMMAND2 => SEND_DATA <= '1'; mouse_state <= WAIT_OUTPUT_READY; -- Chôø cho ñeán khi Mouse phaùt xung leänh. -- Leänh göûi laø F4, cho pheùp Streaming Mode -- Mouse baét ñaàu göûi 3-byte packets vôùi caùc data hoaït ñoäng cuûa mouse. WHEN WAIT_OUTPUT_READY => SEND_DATA <= '0'; -- Tín hieäu Output Ready cho taát caû döõ lieäu laø xung ra cuû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 traû leänh Acknowledge, FA WHEN WAIT_CMD_ACK => SEND_DATA <= '0'; IF IREADY_SET='1' THEN mouse_state <= INPUT_PACKETS; END IF; -- Thaùo boû ñöôøng clock_25Mhz vaø döõ lieäu vaø môû cheá ñoä ngoõ vaøo mouse. -- Trong traïng thaùi naøy vaø nhaän 3-byte mouse data packets -- Toác ñoä xaùc ñònh laø 100 packets per second WHEN INPUT_PACKETS => mouse_state <= INPUT_PACKETS; END CASE; END IF; END PROCESS; WITH mouse_state SELECT --Ñöôøng döõ lieäu mouse naèm treân ñöôøng ñieàu khieån Tri-state: '1' FLEX Chip phaùt ñoäng, '0'=Mouse phaùt ñoä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 naèm treân ñöôøng ñieàu khieån Tri-state : '1' FLEX Chip phaùt ñoäng, '0'=Mouse phaùt ñoä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 -- Ngoõ vaøo tri-state töø FLEX chip ñeä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; -- Loïc tín hieäu xung cuøa mouse cho khoûi nhieãu PROCESS BEGIN WAIT UNTIL clock_25Mhz ‘EVENT AND clock_25Mhz = '1'; filter(7 DOWNTO 1) <= filter(6 DOWNTO 0); filter(0) <= MOUSE_CLK; IF filter = "11111111" THEN MOUSE_CLK_FILTER <= '1'; ELSIF filter = "00000000" THEN MOUSE_CLK_FILTER <= '0'; END IF; END PROCESS; --Quaù trình xöû lyù naøy seõ göûi döõ lieäu noái tieáp töø mouse. SEND_UART: PROCESS (send_data, Mouse_clK_filter) BEGIN IF SEND_DATA = '1' THEN OUTCNT <= "0000"; SEND_CHAR <= '1'; OUTPUT_READY <= '0'; -- Send out Start Bit (0) + Command (F4) + Parity Bit (0) + Stop Bit(1) SHIFTOUT (8 DOWNTO 1) <= CHAROUT; -- START BIT SHIFTOUT (0) <= '0'; -- COMPUTE ODD PARITY BIT SHIFTOUT (9) <= not (charout(7) xor charout(6) xor charout(5) xor Charout (4) xor Charout (3) xor charout (2) xor charout(1) xor charout (0)); -- STOP BIT SHIFTOUT (10) <= '1'; -- Giaù trò döõ lieäu côø töø Mouse -- Yeâu caàu mouse ra leänh phaùt xung döõ lieäu (keå caû start bit) MOUSE_DATA_BUF <= '0'; ELSIF(MOUSE_CLK_filter ’EVENT AND MOUSE_CLK_filter='0') THEN IF MOUSE_DATA_DIR='1' THEN -- Dòch chuyeån ra ngoaøi caùc bit noái tieáp keá caän IF SEND_CHAR = '1' THEN -- Laëp taát caû caùc bit thoâng qua thanh ghi dòch. IF OUTCNT <= "1001" THEN OUTCNT <= OUTCNT + 1; -- Dòch chuyeån ra ngoaøi bit noái tieáp keá caän töø mouse SHIFTOUT (9 DOWNTO 0) <= SHIFTOUT(10 DOWNTO 1); SHIFTOUT (10) <= '1'; MOUSE_DATA_BUF <= SHIFTOUT (1); OUTPUT_READY <= '0'; --kí töï cuoái cuøng ELSE SEND_CHAR <= '0'; -- Tín hieäu cuûa kítöï ñaõ ñöôïc xuaát ra. OUTPUT_READY <= '1'; OUTCNT <= "0000"; END IF; END IF; END IF; END IF; END PROCESS SEND_UART; RECV_UART: PROCESS (reset, mouse_clk_filter) BEGIN IF RESET='1' THEN INCNT <= "0000"; READ_CHAR <= '0'; PACKET_COUNT <= "00"; LEFT_BUTTON <= '0'; RIGHT_BUTTON <= '0'; CHARIN <= "00000000"; ELSIF MOUSE_CLK_FILTER 'EVENT AND MOUSE_CLK_FILTER='1' THEN IF MOUSE_DATA_DIR='0' THEN IF MOUSE_DATA='0' AND READ_CHAR='0' THEN READ_CHAR<= '1'; IREADY_SET<= '0'; ELSE -- Dòch vaøo bit noái tieáp keá caän IF READ_CHAR = '1' THEN IF INCNT < "1001" THEN INCNT <= INCNT + 1; SHIFTIN (7 DOWNTO 0) <= SHIFTIN (8 DOWNTO 1); SHIFTIN (8) <= MOUSE_DATA; IREADY_SET <= '0'; --Kí töï cuoái cuøng ELSE CHARIN <= SHIFTIN (7 DOWNTO 0); READ_CHAR <= '0'; IREADY_SET <= '1'; PACKET_COUNT <= PACKET_COUNT + 1; -- PACKET_COUNT = "00" ôû leänh ACK IF PACKET_COUNT = "00" THEN -- Ñaët con troû giöõa maøn hình. cursor_column <= CONV_STD_LOGIC_VECTOR (320, 10); cursor_row <= CONV_STD_LOGIC_VECTOR (240, 10); NEW_cursor_column <= CONV_STD_LOGIC_VECTOR (320, 10); NEW_cursor_row <= CONV_STD_LOGIC_VECTOR (240, 10); ELSIF PACKET_COUNT = "01" THEN PACKET_CHAR1 <= SHIFTIN (7 DOWNTO 0); -- Giôùi haïn cuûa con troû ôû caïnh maøn hình. -- Kieåm tra giôùi haïn traùi cuûa maøn hình. -- Taát caû caùc soá laø soá döông, vaø caàn phaûi kieåm tra cho ñieåm 0 ôû trong voøng. -- Ñaët giôùi haïn ôû cao ñeå mouse coù theå di chuyeån leân ñeán 128 pixels trong 1 packet IF (cursor_row 256) OR (NEW_cursor_row < 2)) THEN cursor_row<= CONV_STD_LOGIC_VECTOR (0, 10); -- Kieåm tra giôùi haïn phaûi cuûa maøn hình ELSIF NEW_cursor_row > 480 THEN cursor_row<=CONV_STD_LOGIC_VECTOR (480, 10); ELSE cursor_row <= NEW_cursor_row; END IF; -- Kieåm tra giôùi haïn treân cuûa maøn hình IF (cursor_column 256) OR (NEW_cursor_column < 2)) THEN cursor_column<=CONV_STD_LOGIC_VECTOR (0, 10); -- Kieåm tra giôùi haïn döôùi cuûa maø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); END IF; INCNT <= conv_std_logic_vector (0,4); IF PACKET_COUNT = "11" THEN PACKET_COUNT <= "01"; -- Hoaøn taát ñoùng goùi, ñeå xöû lyù döõ lieäu trong goùi. -- Tín hieäu hai giaù trò cuûa thaønh phaàn chuyeån ñoäng môû roäng X vaø Y vaø coäng theâm ñòa chæ con troû hieän haønh. --Söï chuyeån ñoäng Y ngöôïc leân laø ñòa chæ haøng thaáp. 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 IF; END IF; END PROCESS RECV_UART; END behavior; Baûng döõ lieäu mouse  L =bit theå traïng thaùi cuûa nuùt traùi M =bit theå traïng thaùi cuûa nuùt giöõa R =bit theå traïng thaùi cuûa nuùt phaûi X7-X0= khoaûng caùch di chuyeån cuûa X (0=di chuyeån traùi, 1=dichuyeån phaûi) Y7-Y0= khoaûng caùch di chuyeån cuûa Y (0=di chuyeån traùi, 1=dichuyeån phaûi) Xo= bit döõ lieäu theå hieän X traøn (traøn=1) Yo= bit döõ lieäu theå hieän Y traøn (traøn=1) …. Töø caùc bit trong 3 byte cuûa mouse cho ta bit toa ñoä cuûa mouse vaø cho bieát nuùt naøo cuûa Mouse ñöôïc nhaán. Chöông trình keát hôïp vôùi giaûi maõ led theå hieän toïa ñoä cuûa mouse vaø nuùt naøo ñöôïc nhaán theå hieän qua dp cuûa led 7 ñoaïn. Do kit chæ coù 2 led 7ñoaïn neân ta chæ theå hieän haøng ñôn vò hay haøng chuïc cuûa toaï ñoä cuûa mouse. Chöông trình keát hôïp naøy theå hieän toïa ñoä haøng chuïc cuûa chuoä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); SIGNAL mouse_cursor_column: STD_LOGIC_VECTOR (9 DOWNTO 0); COMPONENT mouse 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(9DOWNTO 0)); END COMPONENT; COMPONENT dec_7seg1 PORT(hex_digit : IN STD_LOGIC_VECTOR(3 DOWNTO 0); Data : OUT STD_LOGIC_VECTOR (6 DOWNTO 0)); END COMPONENT; BEGIN x1: mouse port 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); x2: 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 ñoù ta gaùn chaân nhö sau: Tín hieäu Chaâ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 Löu vaø bieân dòch laïi, roài naïp file .sof leân Kit UP2 ñeå chaïy chöông trình. VII. Giao tieáp giöõa VGA vaø baøn phím 1. Moâ hình Data : töø baøn phím xuaát ra khi ta nhaán phím. Clk : töø baøn phím khi ta nhaán phím. Maõ scancode ñöôïc chöông trình chuyeån ñoåi (ôû phaàn tröôùc) töø tín hieäu data cuûa baøn phím. Tín hieäu data vaø clk ñöôïc truyeàn thoâng qua coång PS/2 ñeán KIT UP2. Sau ñoù maõ scancode ñöôïc giaûi maõ thaønh ñòa chæ cuûa kí töï coù maõ scancode ñoù. Ñòa chæ ñöôïc ñöa vaøo chöông trình xuaát kí töï( ôû phaàn tröôùc) ñöa kí töï leân maøn hình. Luùc naøy chöông trình seõ xuaát ra 5 tín hieäu red, green, blue vaø hai tín hieäu ñoàng boä ngang vaø doïc. 5 tín hieäu naøy ñöôïc truyeàn tôùi monitor thoâng qua coång Vga cuûa KIT UP2. 2. Chöông trình a. Chöông trình giaûi maõ  LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.STD_LOGIC_ARITH.all; USE IEEE.STD_LOGIC_UNSIGNED.all; ENTITY giaima IS PORT( 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"; WHEN "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"; WHEN "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"; WHEN "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"; WHEN "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 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 kh IS PORT(clock_25Mhz : IN STD_LOGIC; keyboard_clk, keyboard_data, reset, read : IN STD_LOGIC; red_out, green_out, blue_out, horiz_sync_out, vert_sync_out : OUT STD_LOGIC); END kh; ARCHITECTURE a OF kh IS SIGNAL 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 PORT( clock_25Mhz,green, blue,red : IN 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 PORT(character_address : IN STD_LOGIC_VECTOR (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; COMPONENT 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); x1: giaima PORT MAP (scan_in=>scan_code,scan_out=>scan_out); x2: vga_sync PORT MAP (clock_25Mhz=>clock_25Mhz, red=>scan_ready,green=>rom_mux_output, blue=>rom_mux_output,red_out=>red_out, green_out=>green_out,blue_out=>blue_out, 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); END; Sau ñoù choïn linh kieän vaø gaùn chaâ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 Caùc chaân coøn laïi chöông trình töï gaùn. Löu vaø bieân dòch laïi roài naïp leân Kit. Tuy nhieân chöông trình vaãn coøn nhieàu thieáu xoùt trong vieäc hieån thò, thöù nhaát laø do ROM cuûa KIT nhoû khoâng theå hieän ñöôïc heát caùc phím treân baøn phím, thöù hai laø do coù moät soá phím coù maõ scancode truøng nhau neân ta khoâng theå hieån thò ñöôïc caùc kí töï ñoù nhö @=shift + 2 VIII. Giao tieáp vôùi VGA vaø mouse : 1. Moâ hình : Mouse_clk : xung cuûa mouse phaùt ra khi ta di chuyeån hoaëc nhaáp chuoät Mouse_data : döõ lieäu cuûa mouse phaùt ra khi ta di chuyeån hoaëc nhaáp chuoät Reset :tín hieäu reset chöông trình. Clk_25Mhz : xung caáp cho chöông trình VGA_sync. Horiz_sync : tín hieäu ñoàng boä ngang töø KIT truyeàn cho monitor. Vert_sync : tín hieäu ñoàng boä doïc töø KIT truyeàn cho monitor. Red_out : tín maøu ñoû töø KIT truyeàn cho monitor. Green_out : tín maøu xanh laù caây töø KIT truyeàn cho monitor. Blue_out : tín maøu xanh döông töø KIT truyeàn cho monitor. Chöông trình lieân keát hieån thò con troû cuûa chuoät leân maøn hình, vì trong boä nhôù cuûa KIT khoâng hoã trôï kí hieäu con troû neân ta thay con troû nhö moät daáu chaám. Ñaàu tieân tín hieäu xung vaø döõ lieäu cuûa mouse ñöôïc ñöa vaøo chöông trình chuyeån ñoåi(phaàn tröôùc) nhaän bieát ñöôïc nuùt traùi hay phaûi ñöôïc nhaáp vaø cho bieát toaï ñoä cuûa mouse. Tín hieäu toaï ñoä cuûa chuoät seõ laøm tín hieäu ñeå so saùnh vôùi haøng coät cuûa ñieåm aûnh do chöông trình Vga_sync( phaàn tröôùc). Neáu thoaû ñieàu kieän thì tín hieäu color_on ñöôïc ñaët leân ‘1’ vaø noù chính laø tín hieäu ñeå hieån thò con troû cuûa chuoät maøu xanh(RBG=’011’) vôùi maøn hình neàn maøu ñen(RGB=’000’). Maøn hình ñöôïc queùt lieân tuïc nhöng chæ coù tín hieäu con troû laïi ñöôïc queùt theo vò trí cuûa con troû. 2. Chöông trình lieân keát : 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 vga_sync PORT(clock_25Mhz, red, green, blue : IN STD_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(9 DOWNTO 0)); 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 :OUT STD_LOGIC_VECTOR ( 9 DOWNTO 0); mouse_cursor_column : OUT STD_LOGIC_VECTOR (9 DOWNTO 0)); END COMPONENT; END up1core; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_SIGNED.ALL; LIBRARY work; USE work.up1core.ALL; ENTITY vmouse IS Generic(ADDR_WIDTH: integer := 12; DATA_WIDTH: integer := 1); PORT(SIGNAL Clock,reset : 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; signal mouse_data : INOUT STD_LOGIC; signal mouse_clk : INOUT STD_LOGIC); END vmouse; ARCHITECTURE behavior OF vmouse IS SIGNAL Red_Data, Green_Data, Blue_Data, vert_sync_int, color_on, Direction : STD_LOGIC; SIGNAL Size : STD_LOGIC_VECTOR (9 DOWNTO 0); SIGNAL mouse_cursor_row, mouse_cursor_column: STD_LOGIC_VECTOR (9 DOWNTO 0); SIGNAL pixel_row, pixel_column : STD_LOGIC_VECTOR (9 DOWNTO 0); SIGNAL LSB,MSB : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL LSB_7SEG,MSB_7SEG :STD_LOGIC_VECTOR (6 DOWNTO 0); SIGNAL left_button, right_button : 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); 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 ); mous:mouse PORT MAP(clock_25Mhz=>clock, 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 ); Size <= CONV_STD_LOGIC_VECTOR(8,10); Red_Data <= '0'; Green_Data <= color_on; Blue_Data <= color_on; LSB_dp <= left_button; MSB_dp <= right_button; MSB <= mouse_cursor_row(7 DOWNTO 4); LSB <= mouse_cursor_column(7 DOWNTO 4); --Chöông trình choïn tín hieäu RGB hieån thò RGB_Display: Process (mouse_cursor_row, mouse_cursor_column, pixel_column, pixel_row,size) BEGIN IF ( '0'&mouse_cursor_column <= pixel_column +size) AND (mouse_cursor_column+size >= '0'&pixel_column) AND ( '0'&mouse_cursor_row <= pixel_row +size) AND (mouse_cursor_row +size >= '0'& pixel_row ) THEN color_on <= '1'; ELSE color_on <= '0'; END IF; END process RGB_Display; END behavior; Sau ñoù löu laïi vaø bieân dòch. Roài choïn linh kieän vaø gaùn chaân nhö sau : MSB_a : 6 MSB_b : 7 MSB_c : 8 MSB_d : 9 MSB_e : 11 MSB_f : 12 MSB_g : 13 MSB_dp : 14 LSB_a : 17 LSB_b : 18 LSB_c : 19 LSB_d : 20 LSB_e : 21 LSB_f : 23 LSB_g : 24 LSB_dp : 25 mouse_clk : 30 mouse_data : 31 reset : 41 Clock : 91 Red : 236 Green : 237 Blue : 238 Vert_sync : 239 Horiz_sync : 240 Löu vaø bieân dòch laïi chöông trình roài naïp leân KIT. Tuy nhieân keát quaû chöa hoaøn chænh, con troû vaãn chöa theå di chuyeån heát toaøn boä maøn hình. Do kich thöôùc cuûa ROM vaø cuûa con troû chuoät khoâng phuø hôïp vôùi kích thöôùc cuûa maøn hình. KEÁT LUAÄN VAØ HÖÔÙNG PHAÙT TRIEÅN Keát luaän Qua quaù trình tìm hieåu vaø thöïc hieän ñeà taøi cuøng vôùi caùc kieán thöùc maø thaày coâ truyeàn ñaït, chuùng em nhaän thaáy raèng FPGAs XC4005XL haõng Xilinx vaø caùc chip MAX7000S, chip FLEX10K haõng Altera coù khaû naêng laäp trình raát linh hoaït. Ta coù theå laäp trình ñeå thöïc hieän caùc moâ hình ñieàu khieån töø ñôn giaûn ñeán phöùc taïp nhö ñieàu khieån toác ñoä cuûa ñoäng cô, ñieàu khieån nhieät ñoä trong loø vi ba soùng, maùy giaët, tuû laïnh,… Trong ñeà taøi naøy, chuùng em ñaõ thöïc hieän ñöôïc moät soá öùng duïng treân KIT UP2 haõng Altera nhö chöông trình dòch led töø phaûi sang traùi vaø ngöôïc laïi, chöông trình ñeám vaø hieån thò treân LED 7 ñoaïn, maïch hieån thò nhieät ñoä ñieàu khieån ñoäng cô beân ngoaøi ñeå giao tieáp vôùi KIT UP2, caùc chöông trình giao tieáp vôùi VGA, Keyboard, mouse. Trong quaù trình thöïc hieän ñeà taøi, chuùng em gaëp khoù khaên veà phaàn meàm cuûa XILINX. Vì khi bieân dòch chöông trình thì linh kieän seõ ñöôïc gaùn chaân moät caùch ngaãu nhieân, khoâng phuø hôïp vôùi thieát keá neân ta phaûi gaùn chaân laïi cho linh kieän, nhöng phaàn meàm XILINX laïi khoâng hoã trôï cho phaàn naøy neân chuùng em phaûi chuyeån sang tìm hieåu vaø thöïc hieän treân KIT UP2 cuûa Altera. Tuy nhieân do thôøi gian vaø kieán thöùc coù haïn neân chuùng em chöa theå thöïc hieän ñöôïc nhöõng chöông trình phöùc taïp hôn. Kính mong söï ñoùng goùp yù kieán cuûa thaày coâ vaø caùc baïn ñeå ñeà taøi ñöôïc hoaøn thieän hôn. Höôùng phaùt trieån: Neáu nhö aùp duïng ñieàu khieån naøy baèng logic môø, ta coù theå ñieàu chænh toác ñoä quay tuøy yù theo tín hieäu soá thoâng qua maïch ñieàu bieán xung. ÖÙng vôùi nhieät ñoä trong khoaûng yeâu caàu cuøng vôùi toác ñoä quaït hoài tieáp veà maø ta duøng caùc luaät hôïp thaønh cuûa logic môø ñeå ñöa ra moät tín hieäu ñieàu khieån. Töø tín hieäu ñoù, thoâng qua maïch chuyeån ñoåi A/D ñeå chuyeån ñoåi tín hieäu analog ñoù thaønh soá. Töø tín hieäu soá ta qua maïch ñieàu bieán xung ñeå ñieàu khieån toác ñoä quaït nhanh chaäm theo tín hieäu. Moâ hình ñieàu khieån toác ñoä quaït töï ñoäng theo nhieät ñoä moâi tröôøng TAØI LIEÄU THAM KHAÛO 1. www.Xilinx.com 2. www.Altera.com 3. Rapid Prototyping Pf Digital Systems James O.Hamblen Michael D. Furman

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

  • docMột số ứng dụng trên KIT UP2 hãng Altera.doc