Д О М А Ш Н Е Е ... «Последовательный котроллер» «Московский университет

advertisement
Государственное образовательное учреждение высшего
профессионального образования
«Московский государственный технический
университет
имени Н.Э. Баумана»
(МГТУ им. Н.Э. Баумана)
ФАКУЛЬТЕТ «ИНФОРМАТИКИ И СИСТЕМ УПРАВЛЕНИЯ»
КАФЕДРА ИУ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
Related documents
Download