Реализация UART на CPLD |
![]() |
Добавил(а) microsin | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
В этом апноуте приведено функциональное описание исходного кода VHDL и Verilog для создания UART. Код может использоваться для микросхем CPLD XC95144, XCR3128XL или XC2C128. Получить исходный код VHDL или Verilog можно на сайте Xilinx, или по ссылке [2]. Универсальный асинхронный приемопередатчик (Universal Asynchronous Receiver Transmitter, UART) всегда максимально широко использовался для последовательного обмена данными в электронной аппаратуре. UART позволяет создать полнодуплексное соединение через физические линки наподобие RS232. Порты UART доступны в большинстве недорогих стандартных изделиях большинство производителей микроконтроллеров. Описанный здесь демонстрационный код VHDL и Verilog показывает реализацию UART на чипах Xilinx CPLD начального уровня, что само по себе довольно полезно для практического применения как на младших моделях CPLD, так и на более старших микросхемах логики FPGA. Базовые функции аппаратуры UART как микропроцессорного интерфейса - двойная буферизация данных передатчика, генерация фрейма, битов четности, преобразование последовательных данных в параллельные и наоборот. Используемый формат фрейма UART: стартовый бит лог. 0, 5..8 бит данных, генерируемый по выбору бит четности и 1 или 2 стоп-бита. Некоторые порты UART включают дополнительные сигналы для интерфейса модема. В этом дизайне дополнительные сигналы не реализованы. Формат фрейма для передаваемых/принимаемых данных UART показан на рис. 1. Фрейм обрамлен состоянием ожидания, когда уровень сигнала достаточно долгое время равен лог. 1. Передаваемый символ в фрейме состоит из 5 - 8 бит данных. Стартовый бит имеет значение лог. 0, и одиночный стоповый бит имеет значение лог. 1. Рис. 1. Формат фрейма UART (показан самый популярный фрейм из 8 бит данных). [Приемник] Сигналы, используемые в приемнике, показаны в таблице 1. Приемник выдает данные через параллельную шину dout[7:0] с сигналом rdn. Контроллер может генерировать строб rdn, если data_ready равен true. Приемник снабжен двойной буферизацией, что позволяет удерживать данные в буферном регистре rbr[7:0], пока данные последовательно вдвигаются в регистр сдвига приемника rsr[7:0]. Это дает контроллеру гибкость при операциях чтения шины. Приемник детектирует фрейм символа по битам старта и стопа, выделяя из фрейма биты данных. Переменная no_bits_rcvd управляет размером слова. Регистр clkdiv[3:0] используется для управления временем, за которое декодируются данные. Приемник использует 16x локальных тактовых импульсов и декодирует значение значение бит старта, данных и стоп-бита посередине их интервалов. Для этой цели стартовый бит инициализирует работу счетчика с помощью clkdiv[3:0]. После детектирования перепада в лог. 0 стартового бита приемник считает 16x такты до 8 и декодирует уровень, или делает выборки значения уровня сигнала. Затем регистр clkdiv[3:0] сбрасывается в 0, и далее считает 16x такты до 16. Это обеспечивает центрирование выборки для бит данных и стоп-бита. Рис. 2. Принцип оцифровки бит принимаемых данных. Обычно в UART используется три сигнала детектирования ошибки. Ошибка четности (Parity Error) показывает, четное или нечетное количество единичек присутствовало в обработанных данных. Ошибка переполнения (Overrun Error) показывает, были ли данные в буферном регистре приема перезаписаны данными из регистра сдвига до того, как контроллер прочитал их. Обработка этого вида ошибки не реализована в исходном коде VHDL/Verilog. Ошибка фрейма (Framing Error) показывает, что стоп-бит не был равен лог. 1. Таблица 1. Логические сигналы приемника.
[Передатчик] Сигналы, используемые передатчиком, показаны в таблице 2. Передатчик подключается к шине данных с сигналом опустошения буфера передатчика (transmitter buffer register empty, tbre) и сигналом wrn. Контроллер может генерировать строб wrn, если tbre равен лог. 1. Передатчик снабжен двойной буферизацией, что позволяет данным din[7:0] быть записанными в регистр буфера tbr[7:0], когда данные выдвигаются из регистра сдвига tsr[7:0]. Передатчик генерирует фрейм, состоящий из состояния ожидания (idle state, лог. 1 на sdo), лог. 0 на старт-бите, восьми бит данных и стоп-бита. Значение no_bits_sent управляет размером слова и последовательностью операций передатчика. Чтобы поменять размер слова, измените значение no_bits_sent в исходном коде. Таблица 2. Логические сигналы передатчика.
[Ссылки] 1. XAPP341 UARTs in Xilinx CPLDs site:xilinx.com. |