Nghiên cứu Khoa học
Xây dựng trò chơi trên led 7 đoạn trên FPGA dùng FSM
Chúng ta thiết kế trò chơi với SSD (seven – segment display). 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.
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;
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;