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
149 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2745 | Lượt tải: 1
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:
- Một số ứng dụng trên KIT UP2 hãng Altera.doc