Ping-Pong game FPGA Page 3 Theo một trình tự nhất định từ trái sang phải trong từng dòng, từ dòng trên xuống dòng dưới trong từng ảnh, màu sắc của các điểm ảnh lần lượt được “đọc” và
Trang 1Ping-Pong game FPGA Page 1
MỤC LỤC
I GIỚI THIỆU TRÒ CHƠI PING-PONG 2
II TÌM HIỂU VỀ VGA……… 2
1 Nguyên lý quét và hiển thị hình ảnh……… 2
2 Tín hiệu VGA……… 4
3 Định thời tín hiệu cho chế độ hiển thị VGA 640x480, 60Hz……… …5
III THIẾT KẾ CHƯƠNG TRÌNH ĐIỀU KHIỂN TRÒ CHƠI PING PONG….9 1 Sơ đồ khối hệ thống……… 9
2 Khối điều khiển VGA……… 10
3 Khối điều khiển trò chơi……….… 14
4 Ghép nối hệ thống……….18
IV TỔNG KẾT……….……20
V TÀI LIỆU THAM KHẢO……….………20
Trang 2Ping-Pong game FPGA Page 2
I GIỚI THIỆU TRÒ CHƠI PING-PONG:
Hình 1: Trò chơi Ping-Pong
Ping-Pong là một trò chơi quen thuộc và rất phổ biến trên thế giới Luật chơi rất đơn giản, người chơi sẽ sử dụng 2 phím trái và phải để điều khiển thanh trượt đỡ trái bóng
II TÌM HIỂU VỀ VGA:
1 Nguyên lý quét và hiện thị hình ảnh:
Chúng ta nhìn thấy và phân biệt được mọi vật là nhờ tính chất phản xạ ánh sáng
khác nhau của vật và của từng chi tiết của vật Khi rọi lên vật một chùm tia sáng trắng, từ mỗi phần (điểm) của vật đều phản xạ lại phía người quan sát Cường độ
và thành phần phổ (màu sắc) của tia phản xạ thể hiện tính chất phản xạ của phần
tử Đó là tin tức thấy được về vật
Mỗi ảnh tĩnh được phân chia thành nhiều dòng, mỗi dòng được chia thành nhiều điểm ảnh (pixel) có diện tích rất nhỏ
Trang 3Ping-Pong game FPGA Page 3
Theo một trình tự nhất định ( từ trái sang phải trong từng dòng, từ dòng trên xuống dòng dưới trong từng ảnh), màu sắc của các điểm ảnh lần lượt được
“đọc” và biến đổi thành tín hiệu điện, hay còn gọi là tín hiệu video
Dựa vào giá trị tức thời của tín hiệu video, tia điện tử trong đèn hình sẽ "vẽ" lại màu sắc của các điểm ảnh theo trình tự để tạo lại ảnh tĩnh Do khả năng phân giải kém của mắt người, vì số điểm ảnh trên mỗi ảnh tĩnh đủ lớn (hay nói cách khác là diện tích điểm ảnh đủ nhỏ), ta không thể phân biệt được các điểm ảnh liên tiếp trên mỗi dòng cũng như không thể phân biệt được các dòng kế tiếp trên mỗi ảnh tĩnh mà chỉ nhìn thấy ảnh tĩnh như là một tổng thể liền lạc, không
bị chia cắt
Các ảnh tĩnh liên tiếp sẽ được đèn hình "vẽ" lại, tạo lại cảm giác về hình ảnh chuyển động trên màn hình, nhờ vào khả năng lưu ảnh trong mắt người
Hình 2: Nguyên lý quét hình ảnh
Quá trình quét bắt đầu từ hàng 0, cột 0 ở góc trên bên trái của màn hình và di chuyển sang bên phải cho đến cuối hàng rồi giật ngược trở lại để quét hàng tiếp theo Quá trình lặp lại cho tới điểm ảnh cuối cùng ở góc dưới bên phải màn hình rồi lại quay về điểm bắt đầu để lặp lại quá trình quét
Do sự lưu ảnh của mắt, nếu ta truyền 24 ảnh/1 giây, khi tái tạo lại hình ảnh người xem sẽ có cảm giác một hình ảnh chuyển động liên tục Tuy nhiên với 24
Trang 4Ping-Pong game FPGA Page 4
ảnh/1 giây, ánh sáng vẫn bị chớp hay nhấp nháy hình (flicker), gây khó chịu cho người xem Đối với điện ảnh, trong thời gian chiếu một ảnh người ta ngắt ánh sáng làm hai lần Điều đó có nghĩa, thay vì chiếu một ảnh liên tục trong thời gian 1/24 giây, người ta chiếu ảnh đó làm hai lần, mỗi lần 1/48 giây Kết quả cho ta cảm giác được xem 48 ảnh/1 giây thay vì 24 ảnh/1 giây Hình ảnh sẽ chuyển động liên tục
và ánh sáng không bị chớp Như vậy, số lưọng ảnh truyền trong một giây càng lớn thì cử động trong ảnh càng thấy liên tục và ảnh tổng hợp không bị nhấp nháy
Tương tự, đối với truyền hình, nhưng để tránh hiện tượng bị rung, lắc hoặc có vết đen trôi trên màn ảnh khi bộ lọc nguồn không đảm bảo chất lượng, người ta có thể truyền 50 ảnh/1 giây đối với những nơi sử dụng điện lưới có tần số 50Hz và 60 ảnh/1 giây đối với những nơi có tần số điện lưới 60Hz Đây còn gọi là tốc độ làm tươi
2 VGA:
VGA (hay Video Graphics Array) là một chuẩn hiển thị máy tính được giới thiệu năm 1987 từ phía IBM cùng loại máy tính PS/2 của họ Nó có thể hiểu là thiết bị xuất đồ họa dưới dạng Video thành từng dãy ra màn hình và có thể hiển thị
256 màu biến đổi liên tục cùng một lúc, với độ phân giải 640 dòng chiều ngang và
480 dòng chiều dọc Chuẩn VGA tương thích lùi với tất cả các chuẩn hiển thị trước
đó, như CGA, MDA và EGA
Chuẩn VGA cao EGA hơn không những chỉ vì độ phân giải cao, mà còn vì công nghệ VGA cho phép giữ vững tỉ lệ co giãn của các hình đồ họa trên màn hình máy tính Chuẩn VGA cũng dùng công nghệ tín hiệu đầu vào dạng tương tự để tạo ra một số lượng không hạn chế các màu sắc biến đổi theo một dải liên tục, trong khi
đó EGA dùng công nghệ màn hình số nên bị giới hạn về số lượng các mức cường
độ màu
Chuẩn VGA của IBM được các hãng sản xuất thiết bị nâng lên cao hơn khi đưa
ra các bộ điều hợp VGA (card màn hình) có khả năng hiển thị thêm các chế độ đồ họa bổ sung Đó là chế độ Super VGA có độ phân giải 800 pixel dòng chiều ngang
và 600 dòng chiều dọc, và các bộ điều hợp cao cấp hơn cho phép hiển thị độ phân giải 1024 x 768 hoặc cao hơn, ở mức độ tối thiểu 256 màu (8 bit)
Trang 5Ping-Pong game FPGA Page 5
Hình 3: Các thông số của tín hiệu VGA
3 Định thời tín hiệu cho chế độ hiển thị VGA 640x480, 60Hz
Trong thiết kế này, sử dụng VGA 640x480 pixel, tốc độ quét mỗi pixel là 25MHz Có 5 tín hiệu điều khiển chính, bao gồm tín hiệu đồng bộ hàng Hsync, cột Vsync Và 3 tín hiệu cho tia màu RGB
Hai tín hiệu đồng bộ Hsync và Vsync dùng để điều khiển tạo ra rạng sóng răng cưa Đây là các tín hiệu số
Trang 6Ping-Pong game FPGA Page 6
Hình 4: CRT display timing
Trang 7Ping-Pong game FPGA Page 7
Ba tín hiệu RGB kết hợp với nhau tạo ra 8 màu sắc cơ bản:
Hình 5: 640x480 Mode VGA timing
Như vậy để tạo ra tín hiệu quét như trên, đơn giản ta tạo ra hai bộ đếm Bộ đếm đến các giá trị tương ứng cho trên bảng thì xuất tín hiệu đó lên mức ‘1’
Trang 8Ping-Pong game FPGA Page 8
Hình 6: Giản đồ thời gian của tín hiệu đồng bộ
Hình 7: Kết nối tín hiệu với cổng DB15
Trang 9Ping-Pong game FPGA Page 9
III.THIẾT KẾ CHƯƠNG TRÌNH ĐIỀU KHIỂN TRÒ CHƠI PING PONG:
1 Sơ đồ khối hệ thống:
Hình 7: Top-module
Hệ thống gồm 2 khối: khối điều khiển VGA và khối điều khiển game
Các lối vào:
clk: lấy xung clock 50Mhz từ hệ thống
start: cho phép hoạt động
reset: khởi động lại hệ thống
button_r, button_l: 2 nút điều khiển trò chơi
Các lối ra:
h_s: tín hiệu quét đồng bộ ngang
v_s: tín hiệu quét đồng bộ dọc
RGB: màu sắc của điểm ảnh đang quét
Trang 10Ping-Pong game FPGA Page 10
2 Khối điều khiển VGA:
Hình 8: VGA module
Nhiệm vụ: tạo ra tín hiệu quét ngang và quét dọc để điều khiển VGA, và đưa tín
tọa độ của pixel đang quét tới khối điều khiển game
Các lối vào:
start: cho phép hoạt động
clk: lấy xung clock từ hệ thống
reset: dùng để khởi động lại hệ thống
Các lối ra:
h_s: tín hiệu quét đồng bộ ngang
v_s: tín hiệu quét đồng bộ dọc
x_control: đếm từ 0 ÷ 639
y_control: đếm từ 0 ÷ 479
video_on: cho phép hiển thị hình ảnh
Cần sử dụng một bộ đếm mod 2 để chia tần 25MHz từ clock 50MHz của hệ thống:
Trang 11Ping-Pong game FPGA Page 11
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity sync_mod is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
start : in STD_LOGIC;
y_control : out STD_LOGIC_VECTOR (9 downto 0); x_control : out STD_LOGIC_VECTOR (9 downto 0); h_s : out STD_LOGIC;
v_s : out STD_LOGIC;
video_on : out STD_LOGIC);
end sync_mod;
architecture Behavioral of sync_mod is
Video Parameters
constant HR:integer := 640; Horizontal Resolution
constant HFP:integer := 16; Horizontal Front Porch constant HBP:integer := 48; Horizontal Back Porch
constant HRet:integer := 96; Horizontal retrace
constant VR:integer := 480; Vertical Resolution
constant VFP:integer := 10; Vertical Front Porch
constant VBP:integer := 33; Vertical Back Porch
constant VRet:integer := 2; Vertical Retrace
sync counter
signal counter_h,counter_h_next : integer range 0 to 799; signal counter_v,counter_v_next : integer range 0 to 524; mod 2 counter
signal counter_mod2, counter_mod2_next : std_logic:='0'; State signals
signal h_end, v_end : std_logic:='0';
Output Signals(buffer)
signal hs_buffer, hs_buffer_next : std_logic:='0';
signal vs_buffer, vs_buffer_next : std_logic:='0';
pixel counter
signal x_counter, x_counter_next : integer range 0 to 900; signal y_counter, y_counter_next : integer range 0 to 900; video_on_off
signal video : std_logic;
Trang 12Ping-Pong game FPGA Page 12
begin
clk register
process(clk,reset,start)
begin
if reset = '1' then
counter_h <= 0;
counter_v <= 0;
hs_buffer <= '0';
hs_buffer <= '0';
counter_mod2 <= '0';
elsif clk'event and clk='1' then
if start = '1' then
counter_h <= counter_h_next;
counter_v <= counter_v_next;
x_counter <= x_counter_next;
y_counter <= y_counter_next;
hs_buffer <= hs_buffer_next;
vs_buffer <= vs_buffer_next;
counter_mod2 <= counter_mod2_next;
end if;
end if;
end process;
video on/off
video <= '1' when (counter_v >= VBP) and
(counter_v < VBP + VR) and (counter_h >= HBP) and
(counter_h < HBP + HR)
else '0';
mod 2 counter
counter_mod2_next <= not counter_mod2;
end of Horizontal scanning
h_end <= '1' when counter_h = 799 else '0';
end of Vertical scanning
v_end <= '1' when counter_v = 524 else '0';
Horizontal Counter
process(counter_h, counter_mod2, h_end)
begin
counter_h_next <= counter_h;
if counter_mod2 = '1' then
if h_end = '1' then
counter_h_next <= 0;
else
Trang 13Ping-Pong game FPGA Page 13
counter_h_next <= counter_h + 1;
end if;
end if;
end process;
Vertical Counter
process(counter_v,counter_mod2, h_end, v_end)
begin
counter_v_next <= counter_v;
if counter_mod2 = '1' and h_end = '1' then
if v_end='1' then
counter_v_next <= 0;
else
counter_v_next <= counter_v + 1;
end if;
end if;
end process;
pixel x counter
process(x_counter, counter_mod2, h_end,video)
begin
x_counter_next <= x_counter;
if video = '1' then
if counter_mod2 = '1' then
if x_counter = 639 then
x_counter_next <= 0;
else
x_counter_next <= x_counter + 1;
end if;
end if;
else
x_counter_next <= 0;
end if;
end process;
pixel y counter
process(y_counter, counter_mod2, h_end, counter_v)
begin
y_counter_next <= y_counter;
if counter_mod2 = '1' and h_end = '1' then
if counter_v > 32 and counter_v < 512 then
y_counter_next <= y_counter + 1;
else
y_counter_next <= 0;
end if;
end if;
end process;
buffer
Trang 14Ping-Pong game FPGA Page 14
(HBP+HGO+HFP)
hs_buffer_next <= '1' when counter_h < 704 else '0';
(VBP+VGO+VFP)
vs_buffer_next <= '1' when counter_v < 523 else '0';
outputs
y_control <= conv_std_logic_vector(y_counter,10);
x_control <= conv_std_logic_vector(x_counter,10);
h_s <= hs_buffer;
v_s <= vs_buffer;
video_on <= video;
end Behavioral;
3 Khối điều khiển game:
Hình 11: Game module
Nhiệm vụ: Nhận thông tin về tọa độ pixel đang quét từ khối VGA và hiển thị vị
trí, màu sắc tương ứng của vật thể trong game
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity img_gen is
Port ( clk : in STD_LOGIC;
x_control : in STD_LOGIC_VECTOR(9 downto 0);
button_l : in STD_LOGIC;
button_r : in STD_LOGIC;
y_control : in STD_LOGIC_VECTOR(9 downto 0);
video_on : in STD_LOGIC;
Trang 15Ping-Pong game FPGA Page 15
rgb : out STD_LOGIC_VECTOR(2 downto 0));
end img_gen;
architecture Behavioral of img_gen is
wall
constant wall_l : integer :=10; the distance between wall and left side of screen
constant wall_t : integer :=10; the distance between wall and top
side of screen
constant wall_k : integer :=10; wall thickness
signal wall_on : std_logic;
signal rgb_wall : std_logic_vector(2 downto 0);
bar
signal bar_l,bar_l_next : integer :=100; the distance between bar
and left side of screen
constant bar_t : integer =420; the distance between bar and top side
of screen
constant bar_k : integer :=10; bar thickness
constant bar_w : integer :=120; bar width
constant bar_v : integer :=10; velocity of the bar
signal bar_on : std_logic;
signal rgb_bar : std_logic_vector(2 downto 0);
ball
signal ball_l,ball_l_next : integer :=100; the distance between ball
and left side of screen
signal ball_t,ball_t_next : integer :=100; the distance between ball
and top side of screen
constant ball_w : integer :=20; ball Height
constant ball_u : integer :=20; ball width
constant x_v,y_v : integer:=3; horizontal and vertical speeds of
the ball
signal ball_on : std_logic;
signal rgb_ball : std_logic_vector(2 downto 0);
refreshing(1/60)
signal refresh_reg,refresh_next : integer;
constant refresh_constant : integer:=830000;
signal refresh_tick : std_logic;
ball animation
signal xv_reg,xv_next : integer:=3; variable of the horizontal speed
signal yv_reg,yv_next : integer:=3; variable of the vertical speed
x,y pixel cursor
signal x,y : integer range 0 to 650;
Trang 16Ping-Pong game FPGA Page 16
mux
signal vdbt : std_logic_vector(3 downto 0);
buffer
signal rgb_reg,rgb_next : std_logic_vector(2 downto 0);
begin
x,y pixel cursor
x <= conv_integer(x_control);
y <= conv_integer(y_control );
refreshing
process(clk)
begin
if clk'event and clk = '1' then
refresh_reg <= refresh_next;
end if;
end process;
refresh_next <= 0 when refresh_reg = refresh_constant
else refresh_reg + 1;
refresh_tick <= '1' when refresh_reg = 0 else '0';
register part
process(clk)
begin
if clk'event and clk='1' then
ball_l <= ball_l_next;
ball_t <= ball_t_next;
xv_reg <= xv_next;
yv_reg <= yv_next;
bar_l <= bar_l_next;
end if;
end process;
bar animation
process(bar_l, refresh_tick, button_r, button_l)
begin
bar_l_next <= bar_l;
if refresh_tick = '1' then
if button_l = '1' and bar_l > bar_v then
bar_l_next <= bar_l- bar_v;
elsif button_r = '1' and bar_l < (639 - bar_v - bar_w) then bar_l_next <= bar_l+ bar_v;
end if;
end if;
end process;