В данной статье рассматривается модельно-ориентированное проектирование (МОП). На примере достаточно простых и типичных задач, которые встают каждый день у разработчиков ПЛИС будет показано, как можно упростить те или иные этапы разработки. Рассмотрим задачу проектирования интерфейса UART от этапа построения базовой модели в симуляторе и до тестирования работоспособности в ПЛИС.
В данной статье используется:
− Nios Development Board (Cyclone II, EP2C35F672C6)
− Преобразователь USB-to-UART
− САПР Altera Quartus II
− Matlab Simulink (+HDL-coder)
Рис. 1. Nios Development Board
Концепция модельно-ориентированного проектирования.
Любая современная разработка — результат деятельности многих специалистов из разных областей: схемотехники, конструктора, программисты и тестировщики.
Зачастую возникает ситуация, когда инженеры говорят «на разных языках», т. е. используют внутреннюю терминологию, которая может быть понятна одним специалистам, но не понятна специалистам другой области. В связи с этим возникает недопонимание и, как следствие, задержки при разработке.
Существует 2 очевидных решения подобных проблем:
- Выучить «все языки»: заставить математиков изучать схемотехнику, а программистов топологию. Очевидно, что подобное решение нерационально и затратно.
- Сформировать единую междисциплинарную систему представления проектов и решений, которая была бы понятна всем. Иными словами, сформировать модель, которая была бы интуитивно понятна всем.
Заставить инженеров общаться на одном «стандартном» языке — это и есть концепция МОП.
Перечислим основные достоинства МОП:
− Позволяет нескольким инженерным командам эффективнее взаимодействовать друг с другом.
− Помогает избежать ошибки на ранних стадиях разработки.
− Позволяет обосновать дополнения и изменения системы заказчику.
− Является важным компонентом для валидации и верификации производительности системы.
В дальнейшем система МОП рассматривается на примере графической среды имитационного моделирования Simulink.
Задача: Разработать блок приёма данных UART_RX с последовательного канала.
Будем использовать следующий формат посылки:
По умолчанию шина находится в состоянии логической 1.
Двоичное представление числа 14510=(1001 0001)2
Младшие разряды идут первыми, меняем последовательность битов
(1001 0001=1000 1001) и добавляем старт и стоп бит: 0_1000 1001_1.
Итоговый вид посылки представлен на рисунке
Рис. 2. Посылка на экране осциллографа
Построим модель в среде Simulink (рисунок 4) и поясним ключевые её моменты и принцип работы:
InTX-вход в модуль с последовательного канала.
Spad (детектор фронта) — получает на вход данные InTX и выдает на выход 1 каждый раз, когда происходит перепад из 1 в 0 (необходимо для того, чтобы вычислить start-бит).
StateRX — машина состояний (рисунок 3), которая работает следующим образом:
− На входе в блок поступает сигнал Spad.
− Пока сигнал spad равен 0, автомат находится в состоянии ожидания (IDLE).
− Как только сигнал spad становится равным 1 — происходит переход из состояния ожидания в состояние работы (WORK).
− Стартует счетчик i=0, увеличивающий свое значение с каждым тактом. Как только i=7, происходит переход в состояние IDLE. Это происходит по причине того, что были переданы все данные (от 0 бита и до 7). После этого автомат считает, что пришел стоп-бит, а затем и ожидание старта следующих данных. При этом выходному сигналу receive присваивается значение 1, а внутренний счетчик i обнуляется.
Receive — внутренний сигнал конца посылки, по которому необходимо защелкнуть выходные данные из сдвигового регистра
Data Type Conversion — преобразует тип данных.
Ready — функция конкатенации сдвигового регистра.
Extract Bits — функция извлечения битов.
OutRX — выходное значение приёмника.
Рис. 3. Машина состояний
Рис. 4. Модель UART_RX в Simulink
Проведем моделирование схемы в Simulink и посмотрим результат работы блока:
Рис. 5. Результат моделирования в Simulink
Значение сформировалось при выставлении сигнала ready. Видим, что это 145, т. е. наша исходная посылка.
Итак, имеется готовая модель, которую можно просмотреть, отладить, протестировать и даже модернизировать. Модель интуитивно понятна всем инженерам, которые вовлечены в работу над задачей. Здесь нет в явном виде вещей из программирования или принципиальных электрических схем. Простота и гибкость — залог успеха в МОП.
Теперь используем эту модель и произведем генерацию аппаратного кода при помощи внутреннего пакета Matlab (HDL-coder).
Важно помнить, что HDL кодер не воспринимает такие типы данных, как char, double и т. д. Поэтому, если встретит подобные типы данных в модели, то известит нас об этом, выдав ошибку кодера.
Стоит сразу позаботиться и преобразовать типы данных в uint или Boolean.
После генерации кода, если все прошло успешно-вам выдадут сообщение о том, что код сгенерирован и в папке с размещением проекта вы получите файлы с синтезируемым аппаратным кодом. В нашем случае, имеем дело с Verilog-описанием.
Если же есть какие-то ошибки-выйдет предупреждение с указанием модулей и блоков внутри него, которые нужно заменить или исправить.
Фрагмент кода, сгенерированного HDL-кодером.
Произведем встраивание полученного кода в проект Altera Quartus(рисунок 6).
Опустим процесс создания проекта, т. к. в зависимости от модели ПЛИС различаются настройки.
В нашем случае на рисунке изображен готовый BDF-файл, который является файлом верхнего уровня для Quartus-проекта.
UART_TX-спроектированный наш модуль. Можно заметить, что помимо оговоренных ранее InTX добавились ряд выходов, которые объявил кодер по умолчанию, а именно:
Clk — вход тактирования модуля.
Reset — сигнал сброса (в нашем случае заведен на GND)
Enb — разрешение работы модуля (в нашем случае заведен на VCC)
Количество выходных пинов же не изменилось.
Universal prescaller — готовый модуль, который делит входную частоту по 2 параметрам:
In_Prescaller — Частота работы кварца (в нашем случае 50МГц) на него приходит входной сигнал clk_in
Speed — скорость работы UART в нашем случае (115200 бод)
Clk — выход сигнала. От него тактируется вся остальная схема.
DFFE — триггер, защелкивающий данные OutRX по управляющему сигналу recv.
Модули Crtch+hex_decoder+набор pinout — система выдачи информации на 7-сегментный дисплей.
Рис. 6. Модель UART_RX в Quartus
Вся модель в целом работает следующим образом:
- С терминала через преобразователь USB to UART (Input pin proto2_io38) приходит последовательный код.
- Последовательный код заходит в модуль Uart_RX.
- Модуль забирает данные.
- Uart_RX передает данные в систему ввода/вывода, которая выводит данные на дисплей.
Скомпилируем проект.
Загружаем скомпилированный файл в ПЛИС. И проверяем работоспособность.
Для отправки данных используется терминал на компьютере:
Рис. 7. Внешний вид терминала
Рис. 8. Таблица ASCII-кодов
Работает она следующий образом:
В самой таблице находится число(буква) — которая является посылкой (в нашем случае 5).
Смотрим по таблице соответствия по столбцу (0..7),а затем по строкам (0..F).
В нашем случае, число 58=35ASCII
Значит, если мы отправим посылку 5, то на выход приемника придет число 35.
Проверяем:
Рис. 9. Результат работы UART_RX
По рисунку видно, что значение, отправленное с терминала, соответствует тому, что выдал на выход UART_RX.
Принципы МОП существенно отличаются от традиционной методологии проектирования.
Вместо создания сложных программных кодов разработчики могут применять МОП для улучшения характеристик модели, используя стандартные функциональные блоки. Построенные таким образом модели вместе с использованием инструментов для моделирования могут быстро привести к созданию прототипа системы управления, тестированию и верификации программного обеспечения.
В некоторых случаях аппаратно-программное моделирование может быть использовано в качестве инструмента проектирования для более быстрого и эффективного тестирования динамических воздействий на систему, в отличие от традиционного метода проектирования.
Мы убедились, что МОП может является не только удобным средством абстракции для инженеров из разных областей, а еще и мощным средством для разработки и, самое главное, реализации запланированных задач.