Моделирование цифрового автомата управления лифтом — Active-HDL


1. Постановка задачи
Необходимо разработать модель устройства управления лифтом. Лифт должен реагировать на нажатие клавиш выбора этажа (всего 9 этажей) внутри кабины, а также клавиш вызова лифта, расположенных на каждом этаже. Лифт без дверей. Для посадки/высадки лифт останавливается на требуемом этаже и находится на этом этаже до тех пор, пока не будет вызван на другой этаж.

2. Процесс разработки
Прежде всего необходимо выбрать инструментарий для разработки. Очевидно, устройство управления лифтом — типичный пример конечного автомата, поэтому в качестве среды разработки удобно применить редактор конечных автоматов. Создадим библиотеку, в которой будут объявлены используемые типы, в случае необходимости в неё также можно поместить функции общего назначения.

3. Библиотека для объявления используемых типов

Первоначально необходимо создать проект, который будет реализовывать модель лифта — elevator. Для этого в меню File надо выбрать опцию New Design затем в появившемся окне выбрать Create new design. В окне просмотра содержимого проекта выбрать пункт Add New File. В появившемся окне необходимо выбрать тип файла (VHDL) и задать его имя (в нашем случае misc.vhd).

В появившемся окне редактора необходимо ввести код

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;

package misc is
type floor is range 0 to 9; — 0 нет нажатых кнопок
end package misc;

Для разрабатываемой модели устройства понадобится один тип данных: этаж (floor). Значения типа «этаж» будут являться входными пара¬метрами для устройства (кнопка в лифте и кнопка на каждом этаже). Кроме того, этот тип также будет иметь значение текущего этажа.

4. Описание устройства в виде конечного автомата
Итак, перейдём к рассмотрению процесс описания устройства в виде конечного автомата. В окне просмотра содержимого проекта выберете пункт Add New File. В появившемся окне необходимо выбрать тип файла (State Diagram) и задать его имя (в нашем случае cabin).

Выделим основные состояния, присущие устройству управления лифтом.
• Бездействие (Idle) — лифт стоит на текущем этаже.
• Остановка (Stop) — при достижении этажа, выбранного кнопкой в кабине или на самом этаже, необходимо остановить лифт на некоторое время. Затем лифт должен перейти в состояние бездействия, проанализировать нажатые кнопки и, в случае вызова, начать движение.
• Движение вверх (Up) — лифт движется вверх (устройство управления выдаёт сигнал go_up).
• Движение вниз (Down) — лифт движется вниз (устройство управления выдаёт сигнал go_down)

Основные сигналы, используемые в автомате:
• синхроимпульсы (CLK);
• сигналы от кнопок (button_lift и button_floor). Эти сигналы являются как входными, так и выходными;
• сигнал текущего этажа (current_floor) — входной для схемы управления. Считается, что некоторая дополнительная схема выдаёт на вход устройства управления номер текущего этажа;
• сигналы движения вверх и вниз (go_up и go_down) — выходные сигналы для устройства управления.

Для того чтобы можно было использовать тип данных floor для сигналов автомата, необходимо подключить библиотеку. Для этого в меню FSM нужно выбрать пункт Code Generation Settings. В открывшемся окне необходимо дополнить описание заголовка.


Окно настроек создаваемого кода

Разработанный автомат (рисунок ниже) получает информацию о нажатых кнопках, анализирует её и при необходимости генерирует сигналы движения вверх или вниз. В тот момент, когда кабина достигает заданного этажа, автомат переходит в состояние остановки, при этом «выключая» кнопку этажа, на который прибыла кабина.


Автомат, представляющий устройство

Над каждым переходом из одного состояния в другое представлено условие, по которому этот переход должен произойти. Следует обратить особое внимание на переходы по условию @else. Такие переходы выполняются в тех случаях, когда ни одно из других условий перехода из текущего состояния не выполняется.

Локальная переменная pause используется для задания интервала времени, в течение которого лифт будет находиться в состоянии Stop. В данной реализации заданно значение pause = 50, что соответствует 50 циклам CLK.

5. Построение тестового примера
Для тестирования устройства необходимо создать «среду», в которой оно будет работать. Очевидно, необходимо смоделировать «движение» лифта, или, другими словами, изменение переменной current_floor во времени.

Для этого необходимо создать ещё один модуль. Значение в 50 мс выбрано для удобства отладки и, естественно, не отражает реальной скорости движения лифтовой кабины.

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
use WORK.cabin;
use WORK.misc.ALL;

entity lift_movement_simulator is
port (
CLK : std_logic;
current_floor : inout floor;
go_up : in std_logic;
go_down : in std_logic);
end;

architecture lift_movement_simulator_arch of
lift_movement_sumulator is
begin
process (CLK)
begin
if (go_up = ‘1’) then
current_floor <= (current_floor + 1) after 50 ms; elsif (go_down = '1') then current_floor <= (current_floor - 1) after 50 ms; else current_floor <= current_floor; end if; end process; end architecture lift_movement_simulator_arch;

Основной задачей после создания этого модуля является его подключение к разработанному устройству. Для этого необходимо создать ещё один файл, в котором две сущности будут собраны воедино согласно структурному описанию, предусмотренному в языке VHDL:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
use WORK.cabin;
use WORK.misc.ALL;

architecture lift_arch of lift is component cabin is
port (
button_floor: inout floor;
button_lift: inout floor;
CLK: in STD_LOGIC;
go_down: out STD_LOGIC;
go_up: out STD_LOGIC;
current_floor: in floor);
end component cabin;

component lift_movement_simulator is
port (
CLK : std_logic;
current_floor : inout floor;
go_up : in std_logic;
go_down : in std_logic;);
end component lift_movement_simulator;

signal button_floor : floor;
signal button_lift : floor;
signal current_floor : floor;
signal go_up : std_logic;
signal go_down : std_logic;
signal CLK : std_logic;
begin
MACHINE: cabin port map (button_floor, button_lift, CLK, go_down, go_up, current_floor);
MOVEMENT: lift_movement_simulator port map (CLK, current_floor, go_up, go_down);
end lift_arch;

Для подключения сущности к описанию системы на более высоком уровне иерархии требуется описать компонент, соответствующий этой сущности (ключевое слово component).

6. Отладка разработанного устройства
Основное внимание при анализе работы устройства уделяется, естественно, временной диаграмме:


Временная диаграмма работы схемы

На ней отражена работа устройства при «нажатии» как кнопки в кабине лифта (этаж 1), так и кнопки вызова на седьмом этаже. Предполагается, что лифт находится на третьем этаже. На представленном рисунке видно, как при «нажатии» кнопки лифт начал «движение» вниз, при этом кабина лифта «переместилась» через 50 мс.

При увеличении масштаба (рисунок ниже) видно, как кабина «перемещается» сначала с третьего на первый этаж, а затем «поднимается» на седьмой.


Временная диаграмма (увеличенный масштаб)

Для построения временной диаграммы основной задачей является задание входных сигналов с помощью так называемых стимуляторов (Stimulator) или функций генерации сигналов (подробнее это рассмотрено в редакторе временных диаграмм).


Комментарии запрещены.




Статистика