Главная » » На основе FPGA / CPLD Проектирование и внедрение UART (VHDL)
00:57
На основе FPGA / CPLD Проектирование и внедрение UART (VHDL)
Твитнуть
1 Введение Как микроэлектроники и вычислительной техники развивается быстро, чтобы EDA (Electronic Design автоматизации) промышленности принес большие изменения. Особенно в начале 20-го века, 90 лет, электронная система была интегрирована с платы на уровне системы становятся, в том числе ASIC, FPGA / CPLD и многорежимный встраиваемых систем. EDA промышленности можно сказать, что электронные информационные продукты стала основным промышленности. EDA смогла процветать одним из ключевых факторов является использование языка описания аппаратных средств (HDL) описание электронных схем. О развитии FPGA и CPLD, более популярным основном HDL Verilog HDL, VHDL, Абель-HDL, AHDL и т.д., в которых VHDL и Verilog HDL из-за направление для разработки стандартизированных в конечном итоге стать IEEE стандартов. Следующий проект реализуется с помощью VHDL, чтобы закончить.
2 UART дизайн пример Наиболее часто используемые схемы цифрового дизайна системы сверху вниз слоя, разделенные функции иерархического метода проектирования, который снизу вверх, чем традиционный дизайн EDA более очевидное преимущество (во время основного файла конструкция схемы.) Потому что сверху вниз процесс проектирования можно увидеть от начала и до окончательного проекта общее поведение логика синтеза, формирования сети таблицы до сих пор. Для моделирования каждом шагу экспертизы, это поможет раннего выявления проблем в проектировании системы, которая может значительно уменьшить дизайн системы аппаратного цикла. Ниже для иллюстрации того, как дизайн UART: (дизайн только дизайн общий модуль, чтобы сделать все виды MAX + PLUS II на различные обстоятельства, для суб-модуль только, чтобы сделать некоторые необходимые инструкции.) UART (универсальный асинхронный приемник передатчик или UART) является широко используемым ближнего последовательный интерфейс передачи. UART позволяет полнодуплексный последовательный канал связи. Последовательный периферийный использовать RS232-C асинхронный последовательный интерфейс, как правило, с помощью специального UART интегральная схема, которая реализуется. Такие, как 8250,8251, NS16450 и другие чипы распространенных устройств UART, таких чипов является довольно сложным, и некоторые содержат ряд вспомогательных модулей (например, FIFO), иногда мы не должны использовать полный функции UART и эти вспомогательные функции. Или конструкция используется в FPGA / CPLD устройств, то мы должны быть интегрированы в FPGA функции внутреннего UART. Основные UART использованием VHDL функционального интегрирования, так что весь дизайн более компактным, стабильной и надежной. В данной работе, EDA, основанный на FPGA / CPLD дизайн устройства и реализации UART.
Около 2,1 UART 2.1.1 UART структуры UART основном интерфейса шины данных, логика управления, бод генератора скорости, отправка и получение части часть других компонентов. Основной дизайн UART дизайн самой важной частью отправки и получения части, другие части конструкции не повторять их здесь. Функций, включая передачу буфера (TBR), передавать регистра сдвига (TSR), рамка поколения, четность и передачи последовательных данных приемного буфера (RBR), получать регистра сдвига (RSR), рамка поколения, четности , струнных и очереди. Рисунок 1 является типичным применением UART. Рисунок 1 2.1.2 UART формат кадра UART формат кадра показано на рисунке 2. Рисунок 2 В том числе линии состоянии простоя (в режиме ожидания, высокий), стартовый бит (стартовый бит, низкий), от 5 до 8 бит данных (бит данных), бит четности (бит, опционально) и стоп-бит (остановка бит, бит для 1,1.5,2 бит). Этот формат запуска и остановки бит для достижения характер синхронизации. UART регистров конфигурации в целом, вы можете настроить бит данных (5 до 8), независимо от типа бит паритета и равенства, стоп-биты (1,1.5,2), и другие параметры. Конструкция без проверки четности, паритета устанавливается, если есть нечетное число тестовых данных или даже 1. Биты данных составляет 8 бит, 1 стоп-бит.
2,2 Дизайн UART и реализация 2.2.1 UART передатчика Передатчик каждые 16 CLK16 выход один такт, порядка следует стартовый бит, 8 бит данных, 1 стоп-бит. Процессора, когда он может записать данные в буфер передачи TBR, TBR, что запись данных на центральный процессор должен определить, является ли текущий можно записать, если не приговорили к условиям, отправка данных не так. Дизайн WRN управления. Передача данных контролируется микропроцессором, микропроцессор дает WRN сигнала передатчика параллельные данные, основанные на этот сигнал шум [7 .. 0] запертом в буфер передачи TBR [7 .. 0], и, отправив регистр сдвига TSR [7 .. 0] Отправить последовательной передачи данных к последовательному SDO выходных данных. В процессе передачи данных с использованием tbre выходной сигнал, tsre как символ сигнала, когда буфер данных по отправке TBR [7 .. 0], чтобы передать передать регистра сдвига TSR [7 .. 0] время, tbre сигнала 1 и данные из регистра сдвига передать TSR [7 .. 0], когда сериал был отправлен, tsre сигнал 1, уведомляет загрузка процессора новые данные следующей часов. Порт сигнала передатчика показано на рисунке 3. Рисунок 3 Длина символа и отправить введение порядка отправки счетчик no_bits_sent, для осуществления дизайн источника следующим образом.
Библиотека IEEE; использование ieee.std_logic_1164.all; использование ieee.std_logic_arith.all; лица txmit является порт (RST, clk16x, WRN: в std_logic; DIN: в std_logic_vector (7 downto 0); tbre: из std_logic; tsre: из std_logic; SDO: из std_logic); конце txmit;
архитектуры v1 из txmit является Сигнал clk1x_enable: std_logic; Сигнал TSR: std_logic_vector (7 downto 0); Сигнал TBR: std_logic_vector (7 downto 0); сигнала четности: std_logic; Сигнал clkdiv: неподписанные (3 downto 0); - используется для управления данными выборки часы Сигнал clk1x: std_logic; Сигнал no_bits_sent: неподписанные (3 downto 0); Сигнал wrn1: std_logic; Сигнал wrn2: std_logic; начать
процесса (первого, clk16x) - ширина WRN лечение для предотвращения ошибок в данных полученных начать если первое = '1 ', то wrn1 <= '1 '; wrn2 <= '1 '; clk16x'event ELSIF и clk16x = '1 ', то wrn2 <= wrn1; wrn1 <= WRN; конец, если; Завершить процесс;
процесса (первого, clk16x) - контроль clk1x_enable начать если первое = '1 ', то clk1x_enable <= "0"; tbre <= '1 '; clk16x'event ELSIF и clk16x = '1 ', то если wrn1 = "0" и wrn2 = '1 ', то tbre <= "0"; clk1x_enable <= '1 '; ELSIF std_logic_vector (no_bits_sent) = "0010", а затем tbre <= '1 '; ELSIF std_logic_vector (no_bits_sent) = "1101", а затем clk1x_enable <= "0"; конец, если; конец, если; Завершить процесс;
процесса (первого, WRN) - получить данные из TBR начать если первое = '1 ', то TBR <= (другие => '0 '); wrn'event ELSIF и WRN = "0", то TBR <= DIN; конец, если; Завершить процесс; процесса (первого, clk16x, clk1x_enable) начать если первое = '1 ', то clkdiv <= "0000"; clk16x'event ELSIF и clk16x = '1 ', то если clk1x_enable = '1 ', то clkdiv <= clkdiv + "0001"; конец, если; конец, если; Завершить процесс;
clk1x <= clkdiv (3); - у clk1x часы
процесса (первого, clk1x, no_bits_sent, TBR) начать если первое = '1 ', то SDO <= '1 '; tsre <= '1 '; TSR <= "00000000"; четности <= '1 '; clk1x'event ELSIF и clk1x = '1 ', то если std_logic_vector (no_bits_sent) = "0001", а затем TSR <= TBR; - TBR данных буфера передачи в передачу регистра сдвига TSR tsre <= "0", - передает регистра сдвига пустой флаг установлен на "0" ELSIF std_logic_vector (no_bits_sent) = "0010", а затем SDO <= "0"; - послать сигнал начала немного "0" ELSIF std_logic_vector (no_bits_sent)> = "0011" и std_logic_vector (no_bits_sent) <= "1010", а затем TSR <= TSR (6 downto 0) & "0"; - переход от низкого до высокого выхода в серийное производство SDO SDO <= TSR (7); четности <= четности XOR TSR (7); - 1 проверить бит в конец, если; конец, если; Завершить процесс;
процесса (первого, clk1x, clk1x_enable) - создать и отправить того, чтобы отправить характер счетчик длины начать если первое = '1 'или clk1x_enable = "0", то no_bits_sent <= "0000"; clk1x'event ELSIF и clk1x = '1 ', то если clk1x_enable = '1 ', то no_bits_sent <= no_bits_sent + "0001"; конец, если; конец, если; Завершить процесс; конец;
2.2.2 UART приемника Рамка и получать серийные часы данные асинхронно данных, передаваемых по логической 1 в 0 можно рассматривать как начало кадра данных. Приемник должен сначала захватить стартовый бит, чтобы определить RXD вход от 1 до 0, логики 0 до 8 CLK16 тактов, является нормальной стартовый бит, а затем каждые 16 CLK16 тактов для получения данных образцов, сдвига входного Получить регистра сдвига RSR, окончательный вывод данных Даут. Также выход данных, полученных флаг сигнала флаг приема данных конца. Порт приемника сигнала показано на рисунке 4.
Рисунок 4 Введение порядка получили и получают характер счетчик длины no_bits_rcvd, для осуществления дизайн источника следующим образом. Некоторые из инструкций и передатчик похожие на не повторять ее здесь.
Библиотека IEEE; использование ieee.std_logic_1164.all; использование ieee.std_logic_arith.all; лица rcvr является порт (RST, clk16x, RXD, RDN: в std_logic; Даут: из std_logic_vector (7 downto 0); data_ready: из std_logic; framing_error: из std_logic; parity_error: из std_logic); конце rcvr; архитектуры v1 из rcvr является Сигнал rxd1: std_logic; Сигнал RxD2: std_logic; Сигнал clk1x_enable: std_logic; Сигнал clkdiv: неподписанные (3 downto 0); Сигнал RSR: неподписанные (7 downto 0); Сигнал RBR: неподписанные (7 downto 0); Сигнал no_bits_rcvd: неподписанные (3 downto 0); сигнала четности: std_logic; Сигнал clk1x: std_logic; начать
процесса (первого, clk16x) начать если первое = '1 ', то rxd1 <= '1 '; RxD2 <= '1 '; clk16x'event ELSIF и clk16x = '1 ', то RxD2 <= rxd1; rxd1 <= RXD; конец, если; Завершить процесс;
процесса (первого, clk16x, rxd1, RxD2, no_bits_rcvd) начать если первое = '1 'или std_logic_vector (no_bits_rcvd) = "1100", а затем clk1x_enable <= "0"; clk16x'event ELSIF и clk16x = '1 ', то если rxd1 = "0" и RxD2 = '1 ', то clk1x_enable <= '1 '; конец, если; конец, если; Завершить процесс;
процесса (первого, clk16x, RDN, no_bits_rcvd) начать если первое = '1 'или RDN = "0", то data_ready <= "0"; clk16x'event ELSIF и clk16x = '1 ', то если std_logic_vector (no_bits_rcvd) = "1100", а затем data_ready <= '1 '; конец, если; конец, если; Завершить процесс;
процесса (первого, clk16x, clk1x_enable) начать если первое = '1 ', то clkdiv <= "0000"; clk16x'event ELSIF и clk16x = '1 ', то если clk1x_enable = '1 ', то clkdiv <= clkdiv + "0001"; конец, если; конец, если; Завершить процесс;
clk1x <= clkdiv (3);
процесса (clk1x, RST) начать если первое = '1 ', то RSR <= "00000000"; RBR <= "00000000"; четности <= '1 '; framing_error <= "0"; parity_error <= "0"; clk1x'event ELSIF и clk1x = '1 ', то если std_logic_vector (no_bits_rcvd)> = "0001" и std_logic_vector (no_bits_rcvd) <"1001", а затем --- данных кадра данных по приемном конце последовательных данных смещен в получают регистр сдвига RSR (0) <= RxD2; RSR (7 downto 1) <= RSR (6 downto 0); четности <= четности XOR RSR (0); ELSIF std_logic_vector (no_bits_rcvd) = "1010", а затем RBR <= RSR; - получать регистра сдвига данных в приемном буфере ELSIF четности = "0", то parity_error <= '1 '; ELSIF std_logic_vector (no_bits_rcvd) = "1001" и RxD2 = "0", то framing_error <= '1 '; конец, если; конец, если; Завершить процесс;
процесса (первого, clk1x, clk1x_enable, no_bits_rcvd) начать если первое = '1 'или (std_logic_vector (no_bits_rcvd) = "1100" и clk1x_enable = "0"), то no_bits_rcvd <= "0000"; clk1x'event ELSIF и clk1x = '1 ', то если clk1x_enable = '1 ', то no_bits_rcvd <= no_bits_rcvd + "0001"; конец, если; конец, если; Завершить процесс; Даут <= std_logic_vector (RBR), когда RDN = "0" другое "ZZZZZZZZ"; конец;
2.2.3 UART общая конструкция модуля Передатчик и приемник модулей собраны, вы можете легко достичь общего универсальный асинхронный приемопередатчик модули, и аппаратная реализация не требует много ресурсов, в частности, может быть встроен в более гибкой FPGA / CPLD на развитие. Ниже приведен исходный код из модуля:
Библиотека IEEE; использование ieee.std_logic_1164.all; использование ieee.std_logic_arith.all; использование ieee.std_logic_unsigned.all; лица UART является ПОРТ (RST, clk16x, RXD, RDN, WRN: в std_logic; DIN: в std_logic_vector (7 downto 0); Даут: из std_logic_vector (7 downto 0); data_ready: из std_logic; parity_error: из std_logic; framing_error: из std_logic; tbre: из std_logic; tsre: из std_logic; SDO: из std_logic); конце UART; архитектуры v1 из UART является Компонент txmit порт (RST, clk16x, WRN: в std_logic; DIN: в std_logic_vector (7 downto 0); tbre, tsre, SDO: из std_logic); конце компонента; Компонент rcvr порт (RST, clk16x, RXD, RDN: в std_logic; data_ready, parity_error, framing_error: из std_logic; Даут: из std_logic_vector (7 downto 0)); конце компонента; начать U1: txmit ПОРТ НА КАРТЕ (RST => RST, clk16x => clk16x, DIN => DIN, tbre => tbre, tsre => tsre, SDO => SDO); U2: rcvr ПОРТ НА КАРТЕ (RST => RST, clk16x => clk16x, RXD => RxD, RDN => RDN, data_ready => data_ready, framing_error => framing_error, parity_error => parity_error, Даут => Даут); конце v1;