Государственное образовательное учреждение высшего профессионального образования «Московский государственный технический университет имени Н.Э. Баумана» (МГТУ им. Н.Э. Баумана) ФАКУЛЬТЕТ «ИНФОРМАТИКИ И СИСТЕМ УПРАВЛЕНИЯ» КАФЕДРА ИУ4 «ПРОЕКТИРОВАНИЕ И ТЕХНОЛОГИЯ ПРОИЗВОДСТВА ЭА» ДОМАШНЕЕ ЗАДАНИЕ №4 «Последовательный котроллер» по курсу: Системотехника ЭВС, комплексы и сети Студенты: Маруныч К.В., Новиков П.В. Группа: ИУ4-102 Руководитель: Шпиев В.А. Москва 2012 АННОТАЦИЯ В данной работе рассмотрен контроллер последовательного порта, основные принципы его работы, режимы передачи, микросхемы приёмопередатчиков, а также методы его конфигурирования. В заключении данной работы были представлены осциллограммы инициализации последовательного микроконтроллера, а так же осциллограммы исследования режимов приёма и передачи информации. ABSTRACT In this paper we consider the controller serial port, the main principles of its operation, modes of transmission, chip transceivers, as well as methods for its configuration. At the conclusion of this work were presented waveforms consistent initialization of the microcontroller, as well as research waveform modes of reception and transmission of information. 2 ОГЛАВЛЕНИЕ ОГЛАВЛЕНИЕ ................................................................................................................................................................ 3 СПИСОК УСЛОВНЫХ ОБОЗНАЧЕНИЙ, СОКРАЩЕНИЙ И ТЕРМИНОВ .................................................... 4 1 ПРАКТИЧЕСКИЕ УКАЗАНИЯ ПО РАЗРАБОТКЕ ПРОЕКТА В СРЕДЕ XILINX ISE WEBPACK ............ 5 1.1 ОБЩИЙ ВИД СРЕДЫ XILINX ISE WEBPACK. СОЗДАНИЕ ПРОЕКТА ...................................................... 5 1.2 РЕАЛИЗАЦИЯ ПРОЕКТА ПРИ ПОМОЩИ ГРАФИЧЕСКОГО РЕДАКТОРА СХЕМ ......................................... 7 1.3 РЕАЛИЗАЦИЯ ПРОЕКТА ПРИ ПОМОЩИ ЯЗЫКА VHDL .......................................................................... 9 1.4 МОДЕЛИРОВАНИЕ ПРОЕКТА В СРЕДЕ MODELSIM SE .......................................................................... 13 2 РЕАЛИЗАЦИЯ ПОСЛЕДОВАТЕЛЬНОГО КОНТРОЛЛЕРА НА ЯЗЫКЕ VHDL .........................................17 3 МОДЕЛИРОВАНИЕ ПОСЛЕДОВАТЕЛЬНОГО КОНТРОЛЛЕРА В СРЕДЕ XILINX ISE WEBPACK ....24 ВЫВОДЫ ........................................................................................................................................................................32 ЗАКЛЮЧЕНИЕ .............................................................................................................................................................33 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ .................................................................................................34 3 СПИСОК УСЛОВНЫХ ОБОЗНАЧЕНИЙ, СОКРАЩЕНИЙ И ТЕРМИНОВ AT — (англ. Advanced Technology) — первый широко использовавшийся формфактор в персональных компьютерах BIOS — (англ. basic input/output system — «базовая система ввода-вывода») — реализованная в виде микропрограмм часть системного программного обеспечения, которая предназначается для предоставления операционной системе API для доступа к аппаратуре компьютера и подключенным к нему устройствам. СОМ — После́довательный порт, англ. serial port (а также серийный порт или COMпорт, англ. communications port) — двунаправленный последовательный интерфейс. CPU — (англ. Сentral Processing Unit, CPU – «Центра́льный проце́ссор») — электронный блок либо микросхема — исполнитель машинных инструкций (кода программ), главная часть аппаратного обеспечения компьютера или программируемого логического контроллера. DMA — (англ. Direct Memory Access, DMA – «Прямой доступ к памяти»)— режим обмена данными между устройствами или же между устройством и основной памятью (RAM) без участия Центрального Процессора (ЦП) DOS — (англ. Disk Operating System — дисковая операционная система, ДОС) — семейство операционных систем для персональных компьютеров. UART — (англ. Universal Asynchronous Receiver-Transmitter) — асинхронный приемопередатчик RS-232 — (англ. Recommended Standard 232) — в телекоммуникациях, стандарт последовательной асинхронной передачи двоичных данных между терминалом и коммуникационным устройством. ПК — Персональный компьютер (англ. personal computer, PC) — компьютер, предназначенный для эксплуатации одним пользователем, то есть для личного использования. ТТЛ — Транзисторно-транзисторная логика (TTL) — разновидность цифровых логических микросхем, построенных на основе биполярных транзисторов и резисторов. 4 универсальный 1 ПРАКТИЧЕСКИЕ УКАЗАНИЯ ПО РАЗРАБОТКЕ ПРОЕКТА В СРЕДЕ XILINX ISE WEBPACK 1.1 общий вид среды Xilinx ISE WebPACK. Создание проекта Итак, первым делом запускаем среду, в результате чего появляется окно, как на рисунке 1.1.1 (все скриншоты в данном методическом пособии сделаны для версий WebPACK 9.1 и ModelSim SE 6.0). Рисунок 1.1.1 – окно программы Xilinx ISE WebPACK Внутри окна содержатся: сверху – главное меню и различные иконки, слева – окно с исходными файлами проекта (“Sources”) и окно управления проектом (“Processes”). Основную же часть окна занимает рабочая область (на рисунке она пустая, т.к. не открыт проект, с которым нужно работать). Выбираем пункт меню File->New Project…, появляется диалоговое окно, в котором вводим имя проекта, его размещение на жестком диске и тип исходника верхнего уровня (как уже говорилось выше, проект можно выполнять в виде схемы в графическом редакторе или в виде кода на VHDL), см. рисунок 1.1.2. 5 Рисунок 1.1.2 – диалоговое окно создания проекта Нажимаем кнопку Next. В следующем диалоговом окне выбираем семейство Spartan3E, кристалл XC3S100E, тип корпуса VQ100, быстродействие кристалла -4, симулятор ModelSim-SE VHDL и язык VHDL, см. рисунок 1.1.3. Рисунок 1.1.3 – диалоговое окно выбора свойств устройства Нажимаем кнопку Next. В следующем диалоговом окне предлагается сразу добавить в проект новые файлы-исходники. Учтём эту возможность, но не воспользуемся ею и снова нажмём кнопку Next. В следующем диалоговом окне предлагается добавить в проект уже существующие исходники. Поступим аналогично предыдущей ситуации. И наконец, в заключительном окне будет представлена краткая информация о создаваемом проекте, см. рисунок 1.1.4. 6 Рисунок 1.1.4 – диалоговое окно с краткой информкцией о создаваемом проекте Нажимаем проектированию. кнопку Finish. Проект создан. Переходим непосредственно к 1.2 Реализация проекта при помощи графического редактора схем Итак, прежде всего, добавим в наш проект файл-схему (далее будем называть его и подобные ему файлы, включая vhdl-файлы словом «исходник»). Сделать это можно либо через главное меню (Project->New Source…), либо щелкнув правой кнопкой в окне Sources и в появившемся контекстном меню выбрав пункт New Source…, после чего появится диалоговое окно с полями выбора типа и ввода названия файла, см. рисунок 1.2.1. Рисунок 1.2.1 – диалоговое окно с полями выбора типа файла и ввода его названия 7 После того как необходимые действия выполнены, нажимаем кнопку Next. В следующем диалоговом окне будут представлены краткие сведения о добавляемом в проект файле, убедившись в правильности которых необходимо нажать кнопку Finish. После выполнения этих действий автоматически в рабочей области появятся вкладки Design Summary и наш main_scheme.sch. Вручную открыть любой исходник можно из вкладки Sources окна Sources. Теперь приступим к рисованию схемы. Для примера, реализуем схему, которая будет по нажатию кнопки инкрементировать счетчик, значение с которого после дешифрации попадёт на семисегментный индикатор. Для простоты возьмем диапазон цифр от 0 до 3, т.к. дело осложняется тем, что в среде нет семисегментного дешифратора и его придется сделать вручную. Выберем вкладку main_scheme.sch в рабочей зоне, а в окне Sources – вкладку Symbols. В окне Sources можно выбирать всевозможные логические символы и устанавливать их в схему, которая теперь находится в рабочей зоне. Соединять выводы элементов можно различными способами, самый удобный из них – нажатием комбинации клавиш ctrl+W. Искомая схема представлена на рисунке 1.2.2. Рисунок 1.2.2 – электричекая схема устройства, разработанная в Xilinx ISE WebPACK Схема работает следующим образом. Сигнал с кнопки представляет собой довольно продолжительный сигнал относительно тактовой частоты, поэтому, чтобы по каждому нажатию осуществлялся переход счетчика только на одно значение вперед, применена схема преобразования фронта в импульс, состоящая из D-триггера (на рисунке – FD) и элемента «И» с одним инвертированным входом. Сигнал с кнопки задерживается триггером на один такт и инвертируется, после чего логически умножается на исходный сигнал. Другие два Dтриггера служат для защиты синхронизации сигнала и защиты от метастабильности. Полученный короткий импульс поступает на разрешающий сигнал двухразрядного двоичного счетчика (на рисунке – CB2CE). Выходы счетчика дешифрируются в значения сегментов семисегментного индикатора простыми логическими элементами (на рисунке находятся справа, расположены в столбиком). Сигнал сброса счетчика подключен к земле, т.к. счетчик сбрасывается автоматически, когда достигает значения больше 3. Сигнал переполнения счетчика (TC) и выходной сигнал разрешения работы счетчика для каскадирования (CEO) не используются. Схема имеет два входных вывода, Clock и Button, и 7 выходных, по количеству сегментов индикатора – Segment_A, Segment_B, Segment_C, Segment_D, Segment_E, Segment_F и Segment_G. 8 1.3 Реализация проекта при помощи языка VHDL В этом разделе мы реализуем проект, аналогичный по функциональности проекту предыдущего раздела, но на этот раз – с применением VHDL. Итак, создадим второй проект, который назовем VHDL_Project. Добавим в него исходник VHDL-кода, для этого в уже известном нам диалоговом окне укажем параметры, как на рисунке 1.3.1. Рисунок 1.3.1 – добавление VHDL-модуля к проекту Нажимаем кнопку Next. Появляется диалоговое окно, в котором нужно указать входы и выходы создаваемого блока. Укажем их в соответствии со схемой из предыдущего раздела, см. рисунок 1.3.2. Рисунок 1.3.2 – назначение выводов схемы 9 После этого нажимаем Next и убедившись в следующем диалоговом окне с краткой информацией о создаваемом файле, что всё верно, нажимаем Finish. В результате будет создан код, представленный на листинге (таблица 1.3.1). Таблица 1.3.1 – Первоначальный листинг кода проекта ----------------------------------------------------------------------------------- Company: -- Engineer: --- Create Date: 14:55:56 03/06/2009 -- Design Name: -- Module Name: main_vhdl - Behavioral -- Project Name: -- Target Devices: -- Tool versions: -- Description: --- Dependencies: --- Revision: -- Revision 0.01 - File Created -- Additional Comments: ----------------------------------------------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity main_vhdl is Port ( Clock : in STD_LOGIC; Button : in STD_LOGIC; Segment_A : out STD_LOGIC; Segment_B : out STD_LOGIC; Segment_C : out STD_LOGIC; Segment_D : out STD_LOGIC; Segment_E : out STD_LOGIC; Segment_F : out STD_LOGIC; Segment_G : out STD_LOGIC); end main_vhdl; architecture Behavioral of main_vhdl is begin end Behavioral; Чтобы реализовать нужную нам функциональность, нужно ввести код, представленный на листинге (таблица 1.3.2). В коде даны комментарии, проводящие параллель между описанием схемы из предыдущего раздела и непосредственно самим кодом. 10 Таблица 1.3.2 – Листинг кода проекта, реализующего работу счётчика library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity main_vhdl is Port ( Clock : in STD_LOGIC; Button : in STD_LOGIC; Segment_A : out STD_LOGIC; Segment_B : out STD_LOGIC; Segment_C : out STD_LOGIC; Segment_D : out STD_LOGIC; Segment_E : out STD_LOGIC; Segment_F : out STD_LOGIC; Segment_G : out STD_LOGIC); end main_vhdl; architecture Behavioral of main_vhdl is signal Button_Sync: std_logic; signal Button_Sync_NoMS: std_logic; signal Button_Sync_NoMS_Delayed: std_logic; signal Button_Pulse: std_logic; signal Count: integer range 0 to 4; signal Reset: std_logic; signal Count_Bus: std_logic_vector (1 downto 0); begin -- Три D-триггера: для синхронизации, защиты от метастабильности и задержки сигнала process (Clock) begin if rising_edge(Clock) then -- условие переднего фронта сигнала Clock Button_Sync <= Button; Button_Sync_NoMS <= Button_Sync; Button_Sync_NoMS_Delayed <= Button_Sync_NoMS; end if; end process; -- Преобразование фронта в короткий импульс Button_Pulse <= Button_Sync_NoMS and not Button_Sync_NoMS_Delayed; -- Двоичный счетчик process (Clock) begin if (Reset = '1') then -- асинхронный сброс счетчика, здесь его нужно сделать вручную Count <= 0; elsif rising_edge(Clock) then if (Button_Pulse = '1') then -- сигнал разрешения работы счетчика Count <= Count + 1; end if; 11 end if; end process; -- Компаратор (проверяет, досчитал ли счетчик до 3 и выдает сигнал сброса) process (Clock) begin if rising_edge(Clock) then if (Count > 3) then Reset <= '1'; else Reset <= '0'; end if; end if; end process; -- преобразовываем переменную Count в двухразрядную шину Count_Bus <= CONV_STD_LOGIC_VECTOR(Count, 2); -- Семисегментный дешифратор, здесь он выполняется простым case process (Clock) begin case (Count_Bus) is when "00" => Segment_A <= '1'; Segment_B <= '1'; Segment_C <= '1'; Segment_D <= '1'; Segment_E <= '1'; Segment_F <= '1'; Segment_G <= '0'; when "01" => Segment_A <= '0'; Segment_B <= '1'; Segment_C <= '1'; Segment_D <= '0'; Segment_E <= '0'; Segment_F <= '0'; Segment_G <= '0'; when "10" => Segment_A <= '1'; Segment_B <= '1'; Segment_C <= '0'; Segment_D <= '1'; Segment_E <= '1'; Segment_F <= '0'; Segment_G <= '1'; when "11" => Segment_A <= '1'; Segment_B <= '1'; Segment_C <= '1'; Segment_D <= '1'; Segment_E <= '0'; Segment_F <= '0'; Segment_G <= '1'; when others => end case; end process; end Behavioral; 12 1.4 Моделирование проекта в среде ModelSim SE Теперь перейдем к процессу отладки наших проектов. Для этого нужно создать так называемый испытательный стенд, или TestBench, суть которого в том, что он будет подавать на блок, который мы создали путём использования графического редактора или кода VHDL, определенные сигналы, позволяющие проверить его работу посредством анализа получающихся временных диаграмм. Итак, вызываем пункт меню New Source…, в появившемся диалоговом окне указываем параметры, как на рисунке 1.4.1. Рисунок 1.4.1 – добавление к проекту тестового стенда Нажимаем кнопку Next, в следующем диалоговом окне будет предложено выбрать файл, к которому следует прикрепить наш испытательный стенд. Выбираем файл main_vhdl и нажимаем Next. В следующем диалоговом окне содержится краткая информация о создаваемом файле, убедившись в правильности которой нажимаем кнопку Finish. В результате получаем файл main_vhdl_tb.vhd, с исходным кодом, который представлен в листинге (таблица 1.4.1). Таблица 1.4.1 – Листинг кода испытательного стенда --------------------------------------------------------------------------------- Company: -- Engineer: --- Create Date: 15:43:38 03/06/2009 -- Design Name: main_vhdl -- Module Name: D:/TestProjects/VHDL_Project/main_vhdl_tb.vhd -- Project Name: VHDL_Project -- Target Device: -- Tool versions: -- Description: --- VHDL Test Bench Created by ISE for module: main_vhdl 13 --- Dependencies: --- Revision: -- Revision 0.01 - File Created -- Additional Comments: --- Notes: -- This testbench has been automatically generated using types std_logic and -- std_logic_vector for the ports of the unit under test. Xilinx recommends -- that these types always be used for the top-level I/O of a design in order -- to guarantee that the testbench will bind correctly to the post-implementation -- simulation model. -------------------------------------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; ENTITY main_vhdl_tb_vhd IS END main_vhdl_tb_vhd; ARCHITECTURE behavior OF main_vhdl_tb_vhd IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT main_vhdl PORT( Clock : IN std_logic; Button : IN std_logic; Segment_A : OUT std_logic; Segment_B : OUT std_logic; Segment_C : OUT std_logic; Segment_D : OUT std_logic; Segment_E : OUT std_logic; Segment_F : OUT std_logic; Segment_G : OUT std_logic ); END COMPONENT; --Inputs SIGNAL Clock : std_logic := '0'; SIGNAL Button : std_logic := '0'; --Outputs SIGNAL Segment_A : std_logic; SIGNAL Segment_B : std_logic; SIGNAL Segment_C : std_logic; SIGNAL Segment_D : std_logic; SIGNAL Segment_E : std_logic; SIGNAL Segment_F : std_logic; SIGNAL Segment_G : std_logic; BEGIN -- Instantiate the Unit Under Test (UUT) uut: main_vhdl PORT MAP( Clock => Clock, Button => Button, Segment_A => Segment_A, 14 Segment_B => Segment_B, Segment_C => Segment_C, Segment_D => Segment_D, Segment_E => Segment_E, Segment_F => Segment_F, Segment_G => Segment_G ); tb : PROCESS BEGIN -- Wait 100 ns for global reset to finish wait for 100 ns; -- Place stimulus here wait; -- will wait forever END PROCESS; END; Дописываем код в соответствии с листингом 1.4.2. Таблица 1.4.2 – Листинг кода испытательного стенда (продолжение) … <предыдущую часть оставляем без изменений> BEGIN -- Instantiate the Unit Under Test (UUT) uut: main_vhdl PORT MAP( Clock => Clock, Button => Button, Segment_A => Segment_A, Segment_B => Segment_B, Segment_C => Segment_C, Segment_D => Segment_D, Segment_E => Segment_E, Segment_F => Segment_F, Segment_G => Segment_G ); Clock <= not Clock after 10 ns; tb : PROCESS BEGIN -- Wait 100 ns for global reset to finish wait for 100 ns; Button <= '0'; wait for 500 ns; Button <= '1'; wait for 300 ns; Button <= '0'; wait for 700 ns; Button <= '1'; 15 wait for 150 ns; Button <= '0'; wait for 400 ns; Button <= '1'; wait for 200 ns; Button <= '0'; wait for 600 ns; Button <= '1'; wait for 250 ns; wait; -- will wait forever END PROCESS; END; Как можно сообразить, здесь мы задаем частоту изменения сигнала Clock (50МГц в данном случае), а также имитируем нажатия на кнопку, различные по длительности. Теперь в окне Sources в поле Sources for: выбираем значение Behavorial Simulation. Выбираем наш испытательный стенд в окне Sources и в окне Procsesses дважды щелкаем по надписи Simulate Behavorial Model. В результате этих действий загрузится среда ModelSim. Установите в поле ввода время 10000 ns, нажмите кнопку (Restart), в появившемся диалоговом окне нажмите Restart, затем нажмите кнопку (Run). В результате Вы получите временную диаграмму, как на рисунке 3.4.2, из которой ясно видно работу нашего проекта. Рисунок 1.4.2 – временные диаграммы работы разработанного счётчика Аналогичные действия следует провести и с проектом, реализованном в графическом редакторе, чтобы убедиться в совпадении его временной диаграммы с временной диаграммой проекта на VHDL. 16 2 РЕАЛИЗАЦИЯ ПОСЛЕДОВАТЕЛЬНОГО КОНТРОЛЛЕРА НА ЯЗЫКЕ VHDL Модуль последовательного асинхронного передатчика выполняет параллельнопоследовательное преобразование данных и передает их по асинхронному каналу. Во время передачи данные хранятся в буферном регистре. Начало Установка скорости обмена данными Установка количества бит данных в сообщении Установка количества стоп-бит Установка флага использования бита чётности Нет Передача разрешена? Да Загрузка данных в буферный регистр Вычисление бита чётности Да Используется бит чётности? Нет Передача старт-бита Передача бит данных Передача бита чётности Да Используется бит чётности? Нет Передача стоп-бит(а) Передача завершена Конец Рисунок 2.1.1 – Алгоритм передачи 17 Начало Установка скорости обмена данными Установка количества бит данных в сообщении Установка количества стоп-бит Установка флага использования бита чётности Нет Приём разрешен? Да Приём старт-бита Старт-бит = 0? Нет Ошибка: ложный приём данных Да Приём бит данных Приём бита чётности Да Используется бит чётности? Нет Приём стоп-бит(а) Контроль четности пройден? Да Да Нет Ошибка чётности Используется бит чётности? Нет Загрузка данных в буферный регистр Приём завершён Конец Рисунок 2.1.2 – Алгоритм приема 18 Sys_CLK 99h w Код скорости Генератор синхро импульсов SPBRG[7:0] Управление скоростью обмена Тактовый Сигнал UART CLK Счетчик [15:0] 98h w/r Передатчик TXSTA[7:0] Регистр состояния и инициализации Данные инициализации 19h CSRC TX9 TXEN SYNC - BRGH TRMT Разрешение четности TXREG[7:0] Шина Данных Шина Адреса Шина Управления w TX9D Бит четности Разрешение передачи TX Выход передатчика 1 10 Сдвиговый регистр TSR[10:0] Старт бит 0 0 Стоп бит Приемник Сдвиговый регистр RSR[10:0] w Бит четности RXREG[7:0] Разрешение приема Прерывание SPEN 04h RX9 SREN CREN ADEN FERR OERR RXSTA[7:0] Регистр состояния и инициализации w/r 18h Рисунок 2.1.3 – Структура последовательного контроллера Реализация на VDHL: Таблица 2.1.1 – Листинг кода library ieee; use ieee.Std_Logic_1164.all; USE IEEE.numeric_std.ALL; entityUART is generic(System_CLK :integer :=20000000); port( DATA_BUS :in Std_Logic_Vector(7downto0); --Pins:P91,P92,P94,P95,P98,P99,P2,P3 --Data Bus ADRESS_BUS : in Std_Logic_Vector(7downto 0); --Pins:P78,P79,P83,P84,P85,P86,P89,P90 CONTROL_BUS :in Std_Logic_Vector(7downto 0); --Pins:P4,P5,P9,P10,P11,P12,P13,P15 -- Adress Bus -- ControlBus ("00000000"-nothing,X"01"-read,X"02"-write) 19 RX9D RX Вход приемника CLK : in Std_Logic; --Pins:P88 --SystemClock signal TXD :outStd_Logic; --Pins:P16 RXD ); end UART; : in Std_Logic --OutputSignal --InputSignal architecturertlofUART is signalSPBRG signalTXSTA signalRCSTA signalTXREG signalRCREG : Std_Logic_Vector(7downto0):= (others=>'0'); : Std_Logic_Vector(7downto0); : Std_Logic_Vector(7downto0); : Std_Logic_Vector(7downto0); : Std_Logic_Vector(7downto0); signalUART_Speed: integer:=0; --Скоростьпередачи signalCntTX :integer; -- Скоростьпередачи signalTxBitCnt: integerrange0to10 :=10; --Номеротправленного бита signalTXRead:integerrange 0to1 :=0; --Передачав процессе signalTXFirst:Std_Logic:='0'; -- Первыйбит при передаче signalEveryCLK:integer:=16667; --Количествосистемныхтактов для однногго сигнала UART signalRcBitCnt:integerrange 0to 10:=0; signalCntRC :integer; -- Скоростьпередачи signalRCRead :integerrange 0to 1:=0; --Передачавпроцессе signalRCFirst:Std_Logic:='0'; -- Первыйбит припередаче signalRCParity: Std_Logic:='0';-- Бит четности принятый begin -- ======================================================= -- =====================Инициализация===================== -- ========================Start========================== UART_INIT:process(CLK,DATA_BUS,ADRESS_BUS,CONTROL_BUS) begin ifADRESS_BUS=X"98" then if CONTROL_BUS="00000010"and(rising_edge(CLK))then TXSTA<=DATA_BUS; --elsif CONTROL_BUS="00000001" then --DATA_BUS<=TXSTA; endif; endif; 20 ifADRESS_BUS=X"99" andCONTROL_BUS="00000010"and (rising_edge(CLK)) then SPBRG<=DATA_BUS; case SPBRGis when X"FF"=> UART_Speed <=1200; EveryCLK <=16667; when X"81"=> UART_Speed <= 2400; EveryCLK <=8333; when X"1F"=> UART_Speed <= 9600; EveryCLK <=2083; when X"0F"=> UART_Speed <= 19200; EveryCLK <=1041; when X"09"=> UART_Speed <= 28800; EveryCLK <=694; when X"08"=> UART_Speed <= 33600; EveryCLK <=595; when X"04"=> UART_Speed <= 57600; EveryCLK <=347; when others => endcase; --TXD<='1'; endif; ifADRESS_BUS=X"18" and(rising_edge(CLK))then if CONTROL_BUS="00000010"then RCSTA<=DATA_BUS; --TXD<='1'; --elsif CONTROL_BUS="00000001" then --DATA_BUS<=RCSTA; endif; endif; endprocess UART_INIT; -- =========================Stop========================== -- =====================Инициализация===================== -- ======================================================= -- ======================================================= -- ========================Передача======================= -- ========================Start========================== UART_TRANSMIT :process(CLK,DATA_BUS,ADRESS_BUS,CONTROL_BUS) begin if(rising_edge(CLK)) then ifnot(TXRead=1)then TXD<='1'; endif; if ADRESS_BUS=X"19"and CONTROL_BUS=X"02" andnot(TXRead=1)then 21 TXREG<=DATA_BUS; --TXSTA(1)<='0'; TxBitCnt<=0; CntTX<=0; TXRead<=1; TXFirst<='1'; endif; if TXRead=1or (TXSTA(1)='0'andTXSTA(5)='1') then if TXFirst='1'or CntTX>=EveryCLK then CntTX<=0; case TxBitCntis when 0=> TXD <='0'; --Start Bit TXFirst<='0'; TxBitCnt <=TxBitCnt+1; when 1|2|3|4|5|6|7|8=> TXD <= TXREG(0); --SendData Bit TXREG <= '0'& TXREG(7downto 1);--ShiftTXREG TxBitCnt <= TxBitCnt+1; when 9=> ifTXSTA(6)='1' then TXD <= TXSTA(0); --ParityBit else TXD <= '1'; --StopBit TXREG<=(others=>'0'); TXRead<=0; --TXSTA(1)<='1'; endif; TxBitCnt <= TxBitCnt+1; when 10=> TXD <= '1'; --StopBit TXREG<=(others=>'0'); TXRead<=0; --TXSTA(1)<='1'; endcase; else CntTX<=CntTX+1; endif; endif; endif; endprocess UART_TRANSMIT; -- =========================Stop========================== -- =======================Передача======================== -- ======================================================= -- ======================================================= -- ========================Прием========================== -- ========================Start========================== UART_RECIEVE :process(CLK, DATA_BUS,ADRESS_BUS,CONTROL_BUS,RXD) begin if(rising_edge(CLK)) then if RCSTA(7)='1'and RCSTA(4)='1'then ifRXD='1' and(not (RCRead=1)) and(not(RCFirst='1'))then RCRead<=1; RCFirst<='1'; 22 RcBitCnt<=0; endif; if RCRead=1and ((RCFirst='1'andRXD='0')or (CntRC>=EveryCLKandnot(RCFirst='1'))) then CntRC<=0; case RcBitCnt is when 0=> RCFirst<='0'; --Start Bit RCREG<="00000000"; RcBitCnt <=1; when 1|2|3|4|5|6|7|8=> --Recieve Data Bit RCREG <= RXD&RCREG(7 downto1);--ShiftTXREG RcBitCnt <=RcBitCnt+1; when 9=> ifRCSTA(6)='1'then --Recieve Parity Bit RCParity<=RXD; else RCRead<=0; --StopBit endif; RcBitCnt <=RcBitCnt+1; when 10=> ifRCSTA(6)='1'then --RCSTA(0)<=RCParity; --RecieveParity Bit endif; --Stop Bit RCRead<=0; endcase; else CntRC<=CntRC+1; endif; endif; endif; endprocess UART_RECIEVE; -- =========================Stop========================== -- =======================Прием=========================== -- ======================================================= endrtl; UART_TRANSMIT – процесс передачи; UART_RECIEVE – процесс приема. DATA_BUS – шина данных 8 бит, ADRESS_BUS – шина адреса 8 бит, CONTROL_BUS – шина управления 8 бит. TXD,RXD – сигналы передачи/приема. CLK – системный таймер 20 МГц. 23 3 МОДЕЛИРОВАНИЕ ПОСЛЕДОВАТЕЛЬНОГО КОНТРОЛЛЕРА В СРЕДЕ XILINX ISE WEBPACK Так как прием и передача осуществляются независимо (асинхронно), для тестирования можно сигнал с выхода передатчика направлять сразу на приемник. Для имитации реальной работы можно добавить задержку. Таблица 3.1.1 – Код тестирования на VDHL LIBRARYieee; USEieee.std_logic_1164.ALL; --Uncommentthefollowinglibrarydeclarationifusing --arithmeticfunctionswithSignedorUnsignedvalues --USEieee.numeric_std.ALL; ENTITYtstIS ENDtst; ARCHITECTUREbehaviorOFtstIS COMPONENTUART PORT( DATA_BUS :inoutStd_Logic_Vector(7downto0); --DataBus ADRESS_BUS :in Std_Logic_Vector(7downto0); --AdressBus CONTROL_BUS :in Std_Logic_Vector(7downto0); --ControlBus("00000000"-nothing,X"00000001"-read,X"00000010"-write) CLK :in Std_Logic; --SystemClocksignal TXD :outStd_Logic; --OutputSignal RXD :inStd_Logic --InputSignal ); ENDCOMPONENT; --Inputs --signalCLK:std_logic:='1'; --signalRST_N:std_logic:='0'; --signalDATA_IN:std_logic_vector(7downto0):=(others=>'0'); --signalTX_VALID:std_logic:='0'; --signalRXD:std_logic:='0'; signalDATA_BUS : Std_Logic_Vector(7downto0):=(others=>'0'); -- DataBus signalADRESS_BUS : Std_Logic_Vector(7downto0):=(others=>'0'); --AdressBus signal CONTROL_BUS : Std_Logic_Vector(7 downto 0):= (others => '0'); -- Control Bus ( "00000000"-nothing,X"00000001"read,X"00000010"-write) signalCLK : Std_Logic:='1'; --SystemClocksignal signalTXD : Std_Logic; --OutputSignal signalRXD :Std_Logic:='1'; --InputSignal --Outputs --signalDATA_OUT:std_logic_vector(7downto0); --signalRX_VALID:std_logic; --signalTXD:std_logic; --signalTX_BUSY:std_logic; --signalRX_BUSY:std_logic; --Clockperioddefinitions constantCLK_period:time:=50ns; BEGIN uut:UARTPORTMAP( 24 DATA_BUS =>DATA_BUS , ADRESS_BUS =>ADRESS_BUS , CONTROL_BUS=>CONTROL_BUS , CLK =>CLK , TXD =>TXD , RXD =>RXD ); CLK<=notCLKafterCLK_period/2; RXD<=TXD; INIT:process begin waitforCLK_period; --======================================================= --========================RCSTA========================== --==================Региструправления=================== DATA_BUS<="10111111"; --waitforCLK_period; ADRESS_BUS<=X"18"; --waitforCLK_period; CONTROL_BUS<=X"02"; waitforCLK_period*3; --======================================================= --========================SPBRG========================== --==================Скоростьпередачи==================== DATA_BUS<=X"04"; --waitforCLK_period; ADRESS_BUS<=X"99"; --waitforCLK_period; CONTROL_BUS<=X"02"; waitforCLK_period*3; --======================================================= --========================TXSTA========================== --==================Регииструправления================== DATA_BUS<="00100010"; --waitforCLK_period; ADRESS_BUS<=X"98"; --waitforCLK_period; CONTROL_BUS<=X"02"; waitforCLK_period*3; --======================================================= --========================TXREG========================== --===================Регистрданных====================== DATA_BUS<="01101010"; --waitforCLK_period; ADRESS_BUS<=X"19"; --waitforCLK_period; CONTROL_BUS<=X"02"; waitforCLK_period*3; 25 --======================================================= --======================================================= --==================Очисткашин========================== ADRESS_BUS<=X"00"; CONTROL_BUS<=X"00"; DATA_BUS<="00000000"; wait; endprocess; END; В ходе тестирования генерируется входной сигнал с частотой 20МГц. После чего Происходит инициализация всех регистров необходимых как для работы приемника так и для работы передатчика. И выходной сигнал с передатчика подается на вход приемнику. После инициализации шины обнулются Таблица 3.1.2 – Суммарная информация о созданном проекте UART UART Project Status (05/24/2012 - 12:03:38) Placed and Routed Current State: Project File: UART.ise Module Name: UART Target Device: xc3s100e-4vq100 Product Version: ISE 10.1 - WebPACK Design Goal: Balanced Design Strategy: Xilinx Default (unlocked) Errors: No Errors Warnings: 18 Warnings (2 new, 0 filtered) Routing Results: All Signals Completely Routed Timing Constraints: Final Timing Score: All Constraints Met 0 (Timing Report) Таблица 3.1.3 – Суммарная информация о использованных ресурсах UART Device Utilization Summary Logic Utilization Used Available Utilization Number of Slice Flip Flops 129 1,920 6% Number of 4 input LUTs 234 1,920 12% 158 960 16% 158 158 100% 0 158 0% 296 1,920 15% 66 40% 24 4% Logic Distribution Number of occupied Slices Number of Slices containing only related logic Number of Slices containing unrelated logic Total Number of 4 input LUTs Number used as logic 234 Number used as a route-thru 62 Number of bonded IOBs 27 IOB Flip Flops 1 Number of BUFGMUXs 1 26 [-] Note(s) Таблица 3.1.4 – Спецификация характеристик выводов микросхемы UART IOB Name ADRESS_BUS<0> ADRESS_BUS<1> ADRESS_BUS<2> ADRESS_BUS<3> ADRESS_BUS<4> ADRESS_BUS<5> ADRESS_BUS<6> ADRESS_BUS<7> CLK CONTROL_BUS<0> CONTROL_BUS<1> CONTROL_BUS<2> CONTROL_BUS<3> CONTROL_BUS<4> CONTROL_BUS<5> CONTROL_BUS<6> CONTROL_BUS<7> DATA_BUS<0> DATA_BUS<1> DATA_BUS<2> DATA_BUS<3> DATA_BUS<4> DATA_BUS<5> DATA_BUS<6> DATA_BUS<7> RXD TXD Type IBUF IBUF IBUF IBUF IBUF IBUF IBUF IBUF IBUF IBUF IBUF IBUF IBUF IBUF IBUF IBUF IBUF IOB IOB IOB IOB IOB IOB IOB IOB IBUF IOB Direction IO Standard INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 INPUT LVCMOS25 OUTPUT LVCMOS25 OUTPUT LVCMOS25 OUTPUT LVCMOS25 OUTPUT LVCMOS25 OUTPUT LVCMOS25 OUTPUT LVCMOS25 OUTPUT LVCMOS25 OUTPUT LVCMOS25 INPUT LVCMOS25 OUTPUT LVCMOS25 Drive Strength Slew Rate Reg (s) 12 12 12 12 12 12 12 12 SLOW SLOW SLOW SLOW SLOW SLOW SLOW SLOW 12 SLOW OFF1 Таблица 3.1.5 – Спецификация выводов микросхемы UART Pin Number P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15 P16 P17 Signal Name Pin Usage ADRESS_BUS<0> CONTROL_BUS<4> DATA_BUS<4> ADRESS_BUS<1> IBUF IBUF IOB IBUF ADRESS_BUS<2> ADRESS_BUS<3> TXD ADRESS_BUS<5> ADRESS_BUS<6> ADRESS_BUS<4> ADRESS_BUS<7> Pin Name PROG_B IO_L01P_3 IO_L01N_3 IO_L02P_3 IO_L02N_3/VREF_3 VCCINT GND VCCO_3 IBUF IO_L03P_3/LHCLK0 IBUF IO_L03N_3/LHCLK1 IOB IO_L04P_3/LHCLK2 IBUF IO_L04N_3/LHCLK3/IRDY2 IBUF IP GND IBUF IO_L05P_3/LHCLK4/TRDY2 IBUF IO_L05N_3/LHCLK5 DIFFM IO_L06P_3/LHCLK6 27 Direction IO Standard IO Bank Voltage Number INPUT INPUT OUTPUT INPUT 3 3 3 3 LVCMOS25* LVCMOS25* LVCMOS25* LVCMOS25* 1.2 INPUT INPUT OUTPUT INPUT INPUT LVCMOS25* LVCMOS25* LVCMOS25* LVCMOS25* LVCMOS25* 3 3 3 3 3 3 INPUT LVCMOS25* 3 INPUT LVCMOS25* 3 UNUSED 3 2.50 P18 P19 P20 P21 P22 P23 P24 P25 P26 P27 P28 P29 P30 P31 P32 P33 P34 P35 P36 P37 P38 P39 P40 P41 P42 P43 P44 P45 P46 P47 P48 P49 P50 P51 P52 P53 P54 P55 P56 P57 P58 P59 P60 P61 P62 P63 P64 P65 P66 DIFFS DIFFM DIFFS DIFFM DIFFS DIFFM DIFFS DIFFSI DIFFM DIFFS IOB DIFFM DIFFS DIFFMI DIFFSI DIFFM DIFFS IOB DIFFM DIFFS DIFFM DIFFS DIFFM DIFFS DIFFM DIFFS DIFFM DIFFS DIFFM DIFFS DIFFM DIFFS DIFFM DIFFS IO_L06N_3/LHCLK7 GND VCCO_3 VCCAUX IO_L07P_3 IO_L07N_3 IO_L01P_2/CSO_B IO_L01N_2/INIT_B IO_L02P_2/DOUT/BUSY IO_L02N_2/MOSI/CSI_B VCCINT GND IP/VREF_2 VCCO_2 IO_L03P_2/D7/GCLK12 IO_L03N_2/D6/GCLK13 IO/D5 IO_L04P_2/D4/GCLK14 IO_L04N_2/D3/GCLK15 GND IP_L05P_2/RDWR_B/GCLK0 IP_L05N_2/M2/GCLK1 IO_L06P_2/D2/GCLK2 IO_L06N_2/D1/GCLK3 IO/M1 IO_L07P_2/M0 IO_L07N_2/DIN/D0 VCCO_2 VCCAUX IO_L08P_2/VS2 IO_L08N_2/VS1 IO_L09P_2/VS0 IO_L09N_2/CCLK DONE GND IO_L01P_1 IO_L01N_1 VCCO_1 VCCINT IO_L02P_1 IO_L02N_1 GND IO_L03P_1/RHCLK0 IO_L03N_1/RHCLK1 IO_L04P_1/RHCLK2 IO_L04N_1/RHCLK3/TRDY1 GND IO_L05P_1/RHCLK4/IRDY1 IO_L05N_1/RHCLK5 28 UNUSED 3 3 UNUSED UNUSED UNUSED UNUSED UNUSED UNUSED 2.50 2.5 3 3 2 2 2 2 1.2 UNUSED UNUSED UNUSED UNUSED UNUSED UNUSED UNUSED UNUSED UNUSED UNUSED UNUSED UNUSED UNUSED 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 UNUSED UNUSED UNUSED UNUSED 2 2 2 2 UNUSED UNUSED 1 1 1 UNUSED UNUSED 1 1 UNUSED UNUSED UNUSED UNUSED 1 1 1 1 UNUSED UNUSED 1 1 any****** any****** 2.5 2.50 1.2 P67 P68 P69 P70 P71 P72 P73 P74 P75 P76 P77 P78 P79 P80 P81 P82 P83 P84 P85 P86 P87 P88 P89 P90 P91 P92 P93 P94 P95 P96 P97 P98 P99 P100 RXD DIFFM DIFFS IBUF DIFFM DIFFS CONTROL_BUS<0> IBUF CONTROL_BUS<1> IBUF CONTROL_BUS<2> CONTROL_BUS<3> DATA_BUS<6> DATA_BUS<0> IBUF IBUF IOB IOB CLK CONTROL_BUS<5> DATA_BUS<1> CONTROL_BUS<6> DATA_BUS<7> IBUF IBUF IOB IBUF IOB DATA_BUS<2> DATA_BUS<3> IOB IOB CONTROL_BUS<7> IBUF DATA_BUS<5> IOB IO_L06P_1/RHCLK6 IO_L06N_1/RHCLK7 IP/VREF_1 IO_L07P_1 IO_L07N_1 GND VCCO_1 VCCAUX TMS TDO TCK IO_L01P_0 IO_L01N_0 VCCINT GND VCCO_0 IO_L02P_0/GCLK4 IO_L02N_0/GCLK5 IO_L03P_0/GCLK6 IO_L03N_0/GCLK7 GND IP_L04P_0/GCLK8 IP_L04N_0/GCLK9 IO_L05P_0/GCLK10 IO_L05N_0/GCLK11 IO GND IO_L06P_0 IO_L06N_0/VREF_0 VCCAUX VCCO_0 IO_L07P_0 IO_L07N_0/HSWAP TDI UNUSED 1 UNUSED 1 INPUT LVCMOS25* 1 UNUSED 1 UNUSED 1 1 INPUT INPUT 2.50 2.5 LVCMOS25* 0 LVCMOS25* 0 1.2 INPUT INPUT OUTPUT OUTPUT LVCMOS25* LVCMOS25* LVCMOS25* LVCMOS25* 0 0 0 0 0 INPUT INPUT OUTPUT INPUT OUTPUT LVCMOS25* LVCMOS25* LVCMOS25* LVCMOS25* LVCMOS25* 0 0 0 0 0 2.50 OUTPUT LVCMOS25* 0 OUTPUT LVCMOS25* 0 0 INPUT LVCMOS25* 0 OUTPUT LVCMOS25* 0 2.5 2.50 Рисунок 3.1.2 – Схематическое представление конечного контроллера UART 29 Временная диаграмма инициализации UART для передачи представлена на рисунке 3.1.2. Рисунок 3.1.2 – Временная диаграмма инициализации UART для передачи Временная диаграмма инициализации UART для приема на рисунке 3.1.3. Рисунок 3.1.3 – Временная диаграмма инициализации UART для приема Передача по UART (Данные:01101010, Скорость:57600 бит/с, бит четности отключен, количество стоп байт:1): Рисунок 3.1.4 – Временная диаграмма передачи 30 Окончание передачи: Рисунок 3.1.5 – Временная диаграмма приема Рисунок 3.1.6 – Временная диаграмма передачи и приема самому себе 31 ВЫВОДЫ В результате работы был освоен САПР Xilinx WebPack, разработан последовательный передатчик на ПЛИС, проведено схемотехническое моделирование устройства, что показало его работоспособность и возможность реализации на ПЛИС. 32 ЗАКЛЮЧЕНИЕ В данной работе приводится подробное исследование последовательного контроллера на основе UART. Универсальный асинхронный приёмопередатчик (UART) – узел вычислительных устройств, предназначенный для связи с другими цифровыми устройствами. Преобразует заданный набор данных в последовательный вид так, чтобы было возможно передать их по однопроводной цифровой линии другому аналогичному устройству. Метод преобразования хорошо стандартизован и широко применялся в компьютерной технике. В ходе данной работы был разработан код программы на языке ассемблера, реализующий функции: Инициализации; Приёма; Ответной передачи символов. Затем разработанный код был инсталлирован на отладочный экспериментальный комплект, на котором проводились экспериментальные исследования. Экспериментальные исследования заключались в инициализации, приеме и передачи символов посредством исследуемого последовательного контроллера. В ходе работы с данными режимами были сняты осциллограммы, поясняющие структуру последовательного контроллера. В заключении данной работы были проведены экспериментальные исследования пересылки числовых символов, подтверждающие принцип приема-передачи информации посредство последовательного интерфейса. 33 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. Передача данных через порт PORTB. Практика. (Часть 2), – Электронный ресурс. Режим доступа: http://www.pcports.ru/articles/usb13.php - Проверено 28.02.2012. 2. Однокристальные 8-разрядные FLASH CMOS микроконтроллеры компании Microchip Technology Incorporated, – Электронный ресурс. Режим доступа: http://www.microchip.ru/files/d-sheets-rus/pic16f87x.pdf - Проверено 26.03.2012. 3. Программирование на аппаратном уровне :: RS-232 , – Электронный ресурс. Режим доступа: http://bugtraq.ru/library/programming/rs232.html - Проверено 26.03.2012. 4. Леонидов В.В. Методические указания по выполнению лабораторных работ по курсу «Цифровые сигнальные процессоры и микроконтроллеры». / В.В.Леонидов. М.: МГТУ им. Н.Э.Баумана, 2012. 34