Nghiên cứu Khoa học
Trò chơi trên led 7 đoạn dùng FPGA
Chúng ta thiết kế trò chơi với SSD (seven – segment display). Sơ đồ của
mạch được chỉ ra trong hình 9.17. Nó bao gồm 2 đầu vào là clk và stop, và một
đầu ra là dout(6:0), đầu ra này sẽ được hiển thị trên SSD. Chúng ta phải đảm
bảo rằng fdk = 1khz
Mạch của chúng ta sẽ tạo ra một sự chuyển động liên tục theo chiều kim
đồng hồ của các đoạn SSD. Đồng thời nó còn tạo ra sự dịch chuyển chồng lắp
giữa các thanh kề nhau. Chúng ta có thể biểu diễn quy trình của nó như sau:
a->ab->b->bc->c->cd->d->de->e->ef->f->fa->a.
Quá trình sẽ dừng lại khi có tín hiệu Stop, và khi đó mạch sẽ trở lại trạng
thái a và chờ cho đến khi stop xuống thấp trở lại. Hệ thống của chúng ta sẽ giữ
lại ở các trạng thái a, b, c, d , e, f trong khoảng thời gian time1 = 80ms và ở các
trạng thái ab, bc, cd, de, ef, fa là time2 = 30ms.
Mã chương trình của chúng ta sẽ như sau:
--------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--------------------------------------------------------
ENTITY Trochoiled7thanh IS
PORT ( clk, stop: IN BIT;
dout: OUT BIT_VECTOR (6 DOWNTO 0));
END Trochoiled7thanh;
--------------------------------------------------------
ARCHITECTURE arc OF Trochoiled7thanh IS
CONSTANT time1: INTEGER := 4; -- Gia tri thuc te hien thi la
80
CONSTANT time2: INTEGER := 2; -- Gia tri thuc te hien thi is
30
TYPE states IS (a, ab, b, bc, c, cd, d, de, e, ef, f, fa);
SIGNAL present_state, next_state: STATES;
SIGNAL count: INTEGER RANGE 0 TO 5;
SIGNAL flip: BIT;
BEGIN
------- Phan mach day cua arc : ------------
PROCESS (clk, stop)
BEGIN
IF (stop='1') THEN
present_state <= a;
ELSIF (clk'EVENT AND clk='1') THEN
IF ((flip='1' AND count=time1) OR
(flip='0' AND count=time2)) THEN
count <= 0;
present_state <= next_state;
ELSE count <= count + 1;
END IF;
END IF;
END PROCESS;
------- Phan mach to hop: ------------
PROCESS (present_state)
BEGIN
CASE present_state IS
WHEN a =>
dout <= "1000000"; -- Decimal 64
flip<='1';
next_state <= ab;
WHEN ab =>
dout <= "1100000"; -- Decimal 96
flip<='0';
next_state <= b;
WHEN b =>
dout <= "0100000"; -- Decimal 32
flip<='1';
next_state <= bc;
WHEN bc =>
dout <= "0110000"; -- Decimal 48
flip<='0';
next_state <= c;
WHEN c =>
dout <= "0010000"; -- Decimal 16
flip<='1';
next_state <= cd;
WHEN cd =>
dout <= "0011000"; -- Decimal 24
flip<='0';
next_state <= d;
WHEN d =>
dout <= "0001000"; -- Decimal 8
flip<='1';
next_state <= de;
WHEN de =>
dout <= "0001100"; -- Decimal 12
flip<='0';
next_state <= e;
WHEN e =>
dout <= "0000100"; -- Decimal 4
flip<='1';
next_state <= ef;
WHEN ef =>
dout <= "0000110"; -- Decimal 6
flip<='0';
next_state <= f;
WHEN f =>
dout <= "0000010"; -- Decimal 2
flip<='1';
next_state <= fa;
WHEN fa =>
dout <= "1000010"; -- Decimal 66
flip<='0';
next_state <= a;
END CASE;
END PROCESS;
END arc;