Tải bản đầy đủ (.pdf) (15 trang)

Thiết kế hệ thống xử lý ảnh video trên FPGA (CycloneII), chương 24 pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (84.21 KB, 15 trang )

Chương 24: Kiểm tra giới hạn trên của
màn hình
IF (cursor_column <128) AND ((NEW_cursor_column >
256)
OR
(NEW_cursor_column < 2)) THEN
cursor_column<=CONV_STD_LOGIC_VECTOR (0,
10);
Kiểm tra giới hạn dưới của màn hình
ELSIF
NEW_cursor_column > 640 THEN
cursor_column<=CONV_STD_LOGIC_VECTOR
(640,10);
ELSE
cursor_column <= NEW_cursor_column;
END IF;
ELSIF PACKET_COUNT = "10" THEN
PACKET_CHAR2 <= SHIFTIN (7 DOWNTO 0);

ELSIF PACKET_COUNT = "11" THEN
PACKET_CHAR3 <= SHIFTIN (7 DOWNTO 0);

END IF;
INCNT <= conv_std_logic_vector (0,4);

IF PACKET_COUNT = "11" THEN
PACKET_COUNT <= "01";
Hoàn tất đóng gói, để xử lý dữ liệu trong gói.
Tín hiệu hai giá trò của thành phần chuyển động mở
rộng X và Y và cộng thêm đòa chỉ con trỏ hiện hành.
Sự chuyển động Y ngược lên là đòa chỉ hàng thấp.



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;
Bảng dữ liệu mouse
L =bit thể trạng thái của nút trái
M =bit thể trạng thái của nút giữa
R =bit thể trạng thái của nút phải
X7-X0= khoảng cách di chuyển của X (0=di chuyển trái,
1=dichuyển phải)
Y7-Y0= khoảng cách di chuyển của Y (0=di chuyển trái,
1=dichuyển phải)
Xo= bit dữ liệu thể hiện X tràn (tràn=1)
Yo= bit dữ liệu thể hiện Y tràn (tràn=1)
….

Từ các bit trong 3 byte của mouse cho ta bit toa độ của
mouse và cho biết nút nào của Mouse được nhấn.
Chương trình kết hợp với giải mã led thể hiện tọa độ của
mouse và nút nào được nhấn thể hiện qua dp của led 7 đoạn. Do
kit chỉ có 2 led 7đoạn nên ta chỉ thể hiện hàng đơn vò hay hàng
chục của toạ độ của mouse.
Chương trình kết hợp này thể hiện tọa độ hàng chục của
chuột:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY
kethop IS
PORT
( clock_25Mhz, reset : IN STD_LOGIC;
dataM,dataL :OUT STD_LOGIC_VECTOR
(6 DOWNTO 0);
mouse_data, mouse_clk : INOUT STD_LOGIC;
left_button, right_button : OUT STD_LOGIC);
END
kethop;
ARCHITECTURE bb OF kethop IS
SIGNAL
mouse_cursor_row :STD_LOGIC_VECTOR (9
DOWNTO 0);
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 và biên dòch lại, rồi nạp file .sof lên Kit UP2 để chạy
chương trình.

VII. Giao tiếp giữa VGA và bàn phím
1. Mô hình
Data : từ bàn phím xuất ra khi ta nhấn phím.
Clk : từ bàn phím khi ta nhấn phím.
Mã scancode được chương trình chuyển đổi (ở phần trước) từ tín
hiệu data của bàn phím. Tín hiệu data và clk được truyền thông
qua cổng PS/2 đến KIT UP2.
Sau đó mã scancode được giải mã thành đòa chỉ của kí tự có mã
scancode đó.
Đòa chỉ được đưa vào chương trình xuất kí tự( ở phần trước) đưa
kí tự lên màn hình. Lúc này chương trình sẽ xuất ra 5 tín hiệu
red, green, blue và hai tín hiệu đồng bộ ngang và dọc. 5 tín hiệu
này được truyền tới monitor thông qua cổng Vga của KIT UP2.
2. Chương trình
a. Chương trình giải mã
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.STD_LOGIC_ARITH.all;
USE IEEE.STD_LOGIC_UNSIGNED.all;
ENTITY
giaima IS
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_outpu
t,
blue=>rom_mux_output,red_out=>red_out
,
green_out=>green_out,blue_out=>blue_ou
t,
vert_sync_out=>vert_sync_out,
horiz_sync_out=>horiz_sync_out,
pixel_column=>pixel_column,
pixel_row=>pixel_row);
x3:char_rom
PORT MAP (character_address=>scan_out,
font_row=>pixel_row (3 downto 1),
font_col=>pixel_column (3 downto 1),
rom_mux_output=>rom_mux_output);
END;
Sau đó chọn linh kiện và gán chân như sau:
Keyboard_clk : 30
Keyboard_data : 31
Read : 40
Reset : 41
Clock_25Mhz : 91

Red_out : 236
Green_out : 237
Blue_out : 238
Vert_sync_out : 239
Horiz_sync_out : 240
Các chân còn lại chương trình tự gán. Lưu và biên dòch lại rồi
nạp lên Kit.
Tuy nhiên chương trình vẫn còn nhiều thiếu xót trong việc hiển
thò, thứ nhất là do ROM của KIT nhỏ không thể hiện được hết
các phím trên bàn phím, thứ hai là do có một số phím có mã
scancode trùng nhau nên ta không thể hiển thò được các kí tự đó
như @=shift + 2
VIII. Giao tiếp với VGA và mouse :
1. Mô hình :
Mouse_clk : xung của mouse phát ra khi ta di chuyển hoặc
nhấp chuột
Mouse_data : dữ liệu của mouse phát ra khi ta di chuyển
hoặc nhấp chuột
Reset :tín hiệu reset chương trình.
Clk_25Mhz : xung cấp cho chương trình VGA_sync.
Horiz_sync : tín hiệu đồng bộ ngang từ KIT truyền cho
monitor.
Vert_sync : tín hiệu đồng bộ dọc từ KIT truyền cho
monitor.
Red_out : tín màu đỏ từ KIT truyền cho monitor.
Green_out : tín màu xanh lá cây từ KIT truyền cho
monitor.
Blue_out : tín màu xanh dương từ KIT truyền cho monitor.
Chương trình liên kết hiển thò con trỏ của chuột lên màn
hình, vì trong bộ nhớ của KIT không hỗ trợ kí hiệu con trỏ nên

ta thay con trỏ như một dấu chấm.
Đầu tiên tín hiệu xung và dữ liệu của mouse được đưa vào
chương trình chuyển đổi(phần trước) nhận biết được nút trái hay
phải được nhấp và cho biết toạ độ của mouse. Tín hiệu toạ độ
của chuột sẽ làm tín hiệu để so sánh với hàng cột của điểm ảnh
do chương trình Vga_sync( phần trước). Nếu thoả điều kiện thì
tín hiệu color_on được đặt lên ‘1’ và nó chính là tín hiệu để hiển
thò con trỏ của chuột màu xanh(RBG=’011’) với màn hình nền
màu đen(RGB=’000’). Màn hình được quét liên tục nhưng chỉ có
tín hiệu con trỏ lại được quét theo vò trí của con trỏ.

×