Рис. 3. Диаграмма состояний конечного автомата
Пример проектирования автомата Мили (Mealy) с использованием пакета расширения Stateflow системы
Matlab/Simulink и САПР ПЛИС Xilinx ISE Design Suite.
Система Matlab/Simulink содержит встроенный генератор кода языка описания аппаратных средств HDL (Simulink HDL Coder. Simulink HDL Coder – программный продукт для генерации VHDL-кода без привязки к конкретной архитектуре ПЛИС и платформе по Simulink-моделям и графавтоматам (Stateflow-диаграммы).
Дополнительную информацию по применению системы
Matlab/Simulink с пакетом расширения Stateflow и САПР
Quartus II для разработки простейшего торгового автомата можно посмотреть в работе [3].
Разработаем имитационную модель 2-разрядного синхронного суммирующего счетчика. В дальнейшем такую схему будем называть конечный автомат. Входной сигнал EN на диаграмме переходов обозначается следующим образом: [EN==1]. Выходной сигнал MAX кодируется следующим образом:
{MAX=0} – счетчик находится в процессе счета;
4
{MAX=1} – счетчик досчитал до трех, “готов”. Квадратные скобки [] обозначают условие, фигурные {}
– действие по условию. Запись [EN==1]{MAX=0} говорит о том, что выход автомата Мили является функцией, как текущего состояния, так и начального внешнего воздействия, т.е. от сигнала EN.
Автомат может принимать четыре состояния (рис. 4): st0, st1, st2 и st3 в соответствии с рис. 3. На вход автомата EN задается тестовая последовательность из набора единиц. Для того чтобы извлечь VHDL-код из диаграммы переходов необходимо в свойствах диаграммы Properties (правый клик мышки) в поле Execute (enter) Chart At Initialization
поставить галочку (рис. 4г).
После того как, будет создана модель конечного автомата, необходимо выбрать численный метод решения системы дифференциальных уравнений. C помощью проводника модели (Model Explorer) выбираем дискретный метод решения (discrete) дифференциальных уравнений в настройках Solver и настраиваем генератор кода языка VHDL в меню HDL coder. Результат имитационного моделирования показан на рис. 4. На рис. 5 показано имитационное моделирование конечного автомата.
Пример 1 демонстрирует код автомата Мили с регистерным выходом на языке VHDL, полученный с использованием Simulink HDL Coder системы Matlab/Simulink.
Анализируя полученный VHDL-код в автоматическом режиме можно сделать вывод, что используется двухпроцессный шаблон описания конечного автомата и перечисляемый тип данных (Enumerated type) T_state_type_is_Chart, который описан в пакете USE work.Avt_pkg (пример 2).
Перечисляемый тип – это такой тип данных, при котором количество всех возможных состояний конечно. Такой тип наиболее часто используется для обозначений состояний конечных автоматов. Любой перечисляемый тип имеет внутреннюю нумерацию: первый элемент всегда имеет номер 0, второй - 1 и т.д. Первый оператор PROCESS со
5
списком чувствительности (clk, reset) описывает память состояний конечного автомата, а второй оператор PROCESS со списком чувствительности (is_Chart, En, MAX_reg) описывает логику переходов и логику формирования выхода.
Для того чтобы на базе этого кода создать проект в САПР ISE необходимо тип real относящийся к внешним сигналам En, MAX и внутренним MAX_1, MAX_reg, MAX_reg_next заменить на тип std_logic при этом также обеспечить замену 0.0 на '0' и 1.0 на '1' (пример 3). Далее необходимо разработать испытательный стенд (пример 4). На рис.6 показано функциональное моделирование конечного автомата.
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL; |
|
||
USE IEEE.numeric_std.ALL; |
|
|
|
USE work.Avt_pkg.ALL; |
|
|
|
ENTITY Avt IS |
|
|
|
PORT( clk |
: |
IN |
std_logic; |
reset |
: |
IN |
std_logic; |
clk_enable |
: |
IN |
std_logic; |
En |
: |
IN |
real; -- double |
ce_out |
: |
OUT std_logic; |
|
MAX |
: OUT |
real -- double |
|
); |
|
|
|
END Avt; |
|
|
|
ARCHITECTURE rtl OF Avt IS |
|
||
-- Signals |
|
|
|
SIGNAL enb |
|
: std_logic; |
|
SIGNAL is_Chart |
|
: T_state_type_is_Chart; -- uint8 |
|
SIGNAL MAX_1 |
|
: real := 0.0; -- double |
|
SIGNAL MAX_reg |
|
: real := 0.0; -- double |
|
SIGNAL is_Chart_next |
|
: T_state_type_is_Chart; -- enumerated |
|
type (4 enums) |
|
|
|
SIGNAL MAX_reg_next |
|
: real := 0.0; -- double |
|
BEGIN |
|
|
|
enb <= clk_enable;
Chart_process : PROCESS (clk, reset)
6
BEGIN
IF reset = '1' THEN MAX_reg <= 0.0; is_Chart <= IN_st0;
ELSIF clk'EVENT AND clk = '1' THEN IF enb = '1' THEN
is_Chart <= is_Chart_next; MAX_reg <= MAX_reg_next; END IF;
END IF;
END PROCESS Chart_process;
Chart_output : PROCESS (is_Chart, En, MAX_reg) BEGIN
is_Chart_next <= is_Chart; MAX_reg_next <= MAX_reg; CASE is_Chart IS
WHEN IN_st0 => IF En = 1.0 THEN
MAX_reg_next <= 0.0; is_Chart_next <= IN_st1; END IF;
WHEN IN_st1 => IF En = 1.0 THEN
MAX_reg_next <= 0.0; is_Chart_next <= IN_st2; END IF;
WHEN IN_st2 => IF En = 1.0 THEN
MAX_reg_next <= 0.0; is_Chart_next <= IN_st3; END IF;
WHEN OTHERS =>
IF En = 1.0 THEN MAX_reg_next <= 1.0; is_Chart_next <= IN_st0; END IF;
END CASE;
END PROCESS Chart_output; MAX_1 <= MAX_reg_next;
7
ce_out <= clk_enable; MAX <= MAX_1; END rtl;
Пример 1. Код автомата Мили с регистерным выходом на языке VHDL полученный с использованием Simulink HDL Coder системы Matlab/Simulink
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL; PACKAGE Avt_pkg IS
TYPE T_state_type_is_Chart IS (IN_st0, IN_st1, IN_st2, IN_st3); END Avt_pkg;
Пример 2. Пакет, в котором описан перечисляемый тип данных
T_state_type_is_Chart
LIBRARY IEEE; |
|
|
|
USE IEEE.std_logic_1164.ALL; |
|
||
USE IEEE.numeric_std.ALL; |
|
|
|
USE work.Avt_pkg.ALL; |
|
|
|
ENTITY Avt IS |
|
|
|
PORT( clk |
: |
IN |
std_logic; |
reset |
: |
IN |
std_logic; |
clk_enable |
: |
IN |
std_logic; |
En |
: |
IN |
std_logic; |
ce_out |
: |
OUT std_logic; |
|
MAX |
: |
OUT |
std_logic); |
END Avt; |
|
|
|
ARCHITECTURE rtl OF Avt IS |
|
||
-- Signals |
|
|
|
SIGNAL enb |
|
: std_logic; |
|
SIGNAL is_Chart |
|
: T_state_type_is_Chart; |
|
SIGNAL MAX_1 |
|
: std_logic; |
|
SIGNAL MAX_reg |
|
: std_logic; |
|
SIGNAL is_Chart_next |
|
: T_state_type_is_Chart; |
|
SIGNAL MAX_reg_next |
|
: std_logic; |
|
BEGIN |
|
|
|
enb <= clk_enable;
Chart_process : PROCESS (clk, reset)
8