20.02.2017

Simtera. Соединяя Миры. Работа с UART

Добрый день!

Продолжая серию рассказов о HDL-симуляторе, я, как обещал в прошлый раз,  расскажу о создании мультиязычного проекта (Verilog/VHDL). В качестве демонстрации покажу как реализована работа UART в нашем симуляторе. То есть на одном примере мы увидим сразу несколько достоинств Simter'ы.

Итак...

UART - это асинхронный последовательный приемо-передатчик.  Он является довольно распространенным способом обмена данными между различными устройствами. Также как и Simtera, он соединяет различные "миры". Разница лишь в том, что наш симулятор объединяет в себе разные миры двух, непохожих друг на друга, языков описания аппаратуры - VHDL и Verilog.

Моделируемое устройство состоит из топового (головного) модуля TestBench, передатчика UART Transmitter и приемника UART Receiver. Головной модуль передает сигнал на передатчик. Приемник принимает сигнал и передает его обратно в головной модуль. Далее в головном модуле происходит сравнения отправленного и полученного пакетов данных. Если проверка прошла успешно, то головной модуль отправляет на передатчик следующий пакет.  

Приемник релизован на Verilog, передатчик - на VHDL. Топовый модуль также сконструирован на Verilog. Код, описывающий работу модулей я поместил в конце поста.

Структура представлена на рисунке, толстыми линии обозначают 8-битные шины передачи данных, тонкие - однобитные.

Характеристики устройства:

  1. Тактовая частота схемы - 20 МГц
  2. Скорость  UART: 115200 бод
  3. Используются только стартовый и стоповый биты

Назначение шин:

  • data8_i - 8-битная шина передачи данных на UART Transmitter
  • data8_o - 8-битная шина с получения данных, принятых UART Receiver'ом
  • rdytr - сигнал о готовности работы UART Transmitter
  • rdy_i - сигнал для UART Transmitter о старте передачи данных с шины data8_i
  • rdy - сигнал для TestBench для чтения данных с шины data8_o
  • error - сигнал для TestBench об ошибке в данных, передаваемых по шине data8_o
  • clk - тактовый сигнал

Следующая gif'ка- демонстрирует работу устройста, промоделированную с помощью Simter'ы. Отдельно отмечу плавность работы осциллографа. При отрисовке сигналов и их масштабировании (по мере поступления новых даных) изображение изменяется постепенно,  без всяких "дерганий", в отличии от, например, ModelSim. Другим преймуществом является скорость отображения данных - изменения происходят в реальном времени.

В каждой статье про Simter'у я постараюсь максимально подробно рассказывать о работе с системой и приводить исходный код демонстрационных примеров. Данная статья не является исключением - ниже код для каждого из модулей.  Буду рад ответить на ваши вопросы.

Verilog код работы модуля UART Receiver приведен в листинге №1.
VHDL код работы модуля UART Transmitter приведен в листинге №2.
Verilog код работы модуля TestBench модуля представлен в листинге №3.

После того, как мы просимулировали проект - синтезируем его и "прошьем" в ПЛИС (FPGA). Для этого воспользуемся отладочной платой (development kit) от Microsemi.

Данные отправляются с ПК, ПЛИС принимает их, обрабатывает и передает обратно.

Схема проекта в Microsemi Libero SoC представлена на рисунке ниже.

После того, как чип "прошит", попробуем пообщаться с ним. Для этого воспользуемся консолью COM - порта, например, Putty, настроенному на нашу скорость UART (115200 бод). Для визуализации работы, transmitter постоянно передает данные, принятые receiver'ом. 

С уважением, Малыш.

Нет комментариев

Вы должны быть аутентифицированы для добавления комментария.