Составим принципиальную схему КА и проведём исследование на СБИС EP2C8F256C-8 в пакете Quartus II.
Рис. 1. Схема КА в пакете Quartus II.

Составим тест для проверки переходов и выходов для всех состояний КА.
Рис. 2. Временная диаграмма работы КА.

|
Установка КА R0 ; На вход е - 00; 0 à 0; На выходе - 00 |
На вход е - 10; 0 à 1; На выходе - 10 |
На вход е - 00; 1 à 1; На выходе - 10 |
На вход е - 11; 1 à 2; На выходе - 11 |
На вход е - 11; 2 à 1; На выходе - 10 |
Установка КА R2 ; На вход е - 10; 2 à 3; На выходе - 01 |
На вход е - 10; 3 à 2; На выходе - 11 |
Установка КА R3 ; На вход е - 00; 3 à 0; На выходе - 00 |
Установка КА R3 ; На вход е - 11; 3 à 0; На выходе - 00 |
Все переходы осуществляются верно.
Рис. 3. Граф-схема КА, построенная средствами Quartus II.

Выполним генерацию VHDL кода.
Листинг файла «Lab4_SM.vhd»
|
LIBRARY ieee; |
|
USE ieee.std_logic_1164.all; |
|
ENTITY Lab4_SM IS |
|
PORT ( |
|
clock : IN STD_LOGIC; |
|
reset : IN STD_LOGIC := '0'; |
|
X1 : IN STD_LOGIC := '0'; |
|
X2 : IN STD_LOGIC := '0'; |
|
Y1 : OUT STD_LOGIC; |
|
Y2 : OUT STD_LOGIC |
|
); |
|
END Lab4_SM; |
|
ARCHITECTURE BEHAVIOR OF Lab4_SM IS |
|
TYPE type_fstate IS (R0,R1,R2,R3); |
|
SIGNAL fstate : type_fstate; |
|
SIGNAL reg_fstate : type_fstate; |
|
SIGNAL reg_Y1 : STD_LOGIC := '0'; |
|
SIGNAL reg_Y2 : STD_LOGIC := '0'; |
|
BEGIN |
|
PROCESS (clock,reg_fstate) |
|
BEGIN |
|
IF (clock='1' AND clock'event) THEN |
|
fstate <= reg_fstate; |
|
END IF; |
|
END PROCESS; |
|
PROCESS (fstate,reset,X1,X2,reg_Y1,reg_Y2) |
|
BEGIN |
|
IF (reset='1') THEN |
|
reg_fstate <= R0; |
|
reg_Y1 <= '0'; |
|
reg_Y2 <= '0'; |
|
Y1 <= '0'; |
|
Y2 <= '0'; |
|
ELSE |
|
reg_Y1 <= '0'; |
|
reg_Y2 <= '0'; |
|
Y1 <= '0'; |
|
Y2 <= '0'; |
|
CASE fstate IS |
|
WHEN R0 => |
|
IF (((X2 = '1') AND NOT((X1 = '1')))) THEN |
|
reg_fstate <= R1; |
|
ELSIF ((NOT((X2 = '1')) AND NOT((X1 = '1')))) THEN |
|
reg_fstate <= R0; |
|
-- Inserting 'else' block to prevent latch inference |
|
ELSE |
|
reg_fstate <= R0; |
|
END IF; |
|
reg_Y1 <= '0'; |
|
reg_Y2 <= '0'; |
|
WHEN R1 => |
|
IF ((NOT((X2 = '1')) AND NOT((X1 = '1')))) THEN |
|
reg_fstate <= R1; |
|
ELSIF (((X2 = '1') AND (X1 = '1'))) THEN |
|
reg_fstate <= R2; |
|
-- Inserting 'else' block to prevent latch inference |
|
ELSE |
|
reg_fstate <= R1; |
|
END IF; |
|
reg_Y1 <= '0'; |
|
reg_Y2 <= '1'; |
|
WHEN R2 => |
|
IF (((X2 = '1') AND (X1 = '1'))) THEN |
|
reg_fstate <= R1; |
|
ELSIF (((X2 = '1') AND NOT((X1 = '1')))) THEN |
|
reg_fstate <= R3; |
|
-- Inserting 'else' block to prevent latch inference |
|
ELSE |
|
reg_fstate <= R2; |
|
END IF; |
|
reg_Y1 <= '1'; |
|
reg_Y2 <= '1'; |
|
WHEN R3 => |
|
IF (((X2 = '1') AND NOT((X1 = '1')))) THEN |
|
reg_fstate <= R2; |
|
ELSIF ((((X2 = '1') AND (X1 = '1')) OR (NOT((X2 = '1')) AND NOT((X1 = '1'))))) THEN |
|
reg_fstate <= R0; |
|
-- Inserting 'else' block to prevent latch inference |
|
ELSE |
|
reg_fstate <= R3; |
|
END IF; |
|
reg_Y1 <= '1'; |
|
reg_Y2 <= '0'; |
|
WHEN OTHERS => |
|
reg_Y1 <= 'X'; |
|
reg_Y2 <= 'X'; |
|
report "Reach undefined state"; |
|
END CASE; |
|
Y1 <= reg_Y1; |
|
Y2 <= reg_Y2; |
|
END IF; |
|
END PROCESS; |
|
END BEHAVIOR; |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.