Скачиваний:
4
Добавлен:
10.08.2024
Размер:
150.41 Кб
Скачать
    1. Разработка диаграммы

Смена состояний светофора:

  1. Состояние S0 – начальное.

  2. Состояние S1 – состояние выхода светофора R (Красный). Время удержания 3 такта. Состояние переходит в следующее после истечения 3 тактов ожидания.

  3. Далее, автомат переходит в состояние ввода S2. Состояние выхода Y (Жёлтый). Время удержания состояния ввода – 1 такт.

  4. Автомат переходит в состояние вывода S3. Состояние выхода G- (Зелёный + правый поворот). Время удержания состояния ввода – 2 такта.

  5. Автомат переходит в состояние вывода S4. Состояние выхода G (Зелёный) Время удержания состояния ввода – 2 такта.

  6. Автомат переходит в состояние S1 и цикл работы начинается сначала.

Рисунок 2 - Диаграмма состояний конечного автомата

    1. Описание работы программы

Работа конечного автомата реализована с помощью языка программирования Verilog, применяются способы последовательной передачи данных с помощью сдвига регистра и присвоению счетчику определенных значений, исходя из которых происходит переход из одного состояния в следующее.

Первый блок программы отвечает за подготовку к работе программы: ввод данных и принятие синхроимпульса, объявление регистров и их перенос, параметризацию состояний, также идет сохранение данных для их дальнейшего использования, сохранение состояний и подсчет необходимого количества тактов, подсоединения шин и объявления состояний и присвоение им имен.

Первая часть в блоке программы переходов показывает, что изначально автомат находится в S0 (начальное состояние), переход к следующему состоянию обуславливается началом работы автомата (запуск), после он переходит в состояние ожидания ввода данных: начинает работать счетчик, который сдвигается в соответствие с тактами (интервалы времени, за которые мы должны отправить данные), после чего происходит переход к S1.

module Traffic_light

(input reset,

input clk,

output reg [3:0] light = 0,

output reg [3:0] cnt = 0);

// состояния режима светофора

localparam [3:0]

RED = 0,

YELLOW = 1,

GREEN_RIGHT = 2,

GREEN = 3;

// состояний переходов

localparam [3:0]

STATE_1 = 0,

STATE_2 = 1,

STATE_3 = 2,

STATE_4 = 3;

// количество тактов cnt ожидания перехода

localparam [3:0] N_STATE_1 = 3;

localparam [3:0] N_STATE_2 = 1;

localparam [3:0] N_STATE_3 = 2;

localparam [3:0] N_STATE_4 = 2;

// инициализация регистра

reg [3:0] State = STATE_1;

always @(posedge clk)

begin

if (!reset)

begin

cnt <= 0 ;

light <= RED;

State <= STATE_1;

end

else

begin

cnt <= cnt+1;

Вторая часть в блоке переходов отвечает за ожидание ввода данных, при котором автомат ожидает 3 такт, после изменения значения счетчика в большую сторону, происходит переход к S2.

case (State)

STATE_1 :

begin

if (cnt == N_STATE_1)

begin

cnt <= 1;

light <= YELLOW;

State <= STATE_2;

end

end

Третья часть в блоке переходов отвечает за ожидание ввода данных, при котором автомат ожидает 1 такт, после изменения значения счетчика в большую сторону, происходит переход к S3.

STATE_2 :

begin

if (cnt == N_STATE_2)

begin

cnt <= 1;

light <= GREEN_RIGHT;

State <= STATE_3;

end

end

Четвёртая часть в блоке переходов отвечает за ожидание ввода данных, при котором автомат ожидает 2 такта, после изменения значения счетчика в большую сторону, происходит переход к S4.

STATE_3 :

begin

if (cnt == N_STATE_3)

begin

cnt <= 1;

light <= GREEN;

State <= STATE_4;

end

end

В пятой части перехода происходит сдвиг регистров и сброс данных для корректной работы автомата, и мы возвращаемся в состояние ожидания ввода данных S1, автомат ожидает 2 такта.

STATE_4 :

begin

if (cnt == N_STATE_4)

begin

cnt <= 1;

light <= RED;

State <= STATE_1;

end

end

В конце программы предусмотрен режим работы на случай, если состояние оператора case «по умолчанию» (то есть регистр State), примет значение, которое не указано в case, то аппарат перейдет в состояние S1 и включится красный сигнал.

default :

begin

cnt <= 1;

light <= RED;

State <= STATE_1;

end