Разработка программного обеспечения для систем управления устройств цифрового синтеза сигналов

УДК 004.421

РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ДЛЯ СИСТЕМ УПРАВЛЕНИЯ УСТРОЙСТВ ЦИФРОВОГО СИНТЕЗА СИГНАЛОВ

Д.Н. Донских, С.А. Попов, А.В. Юрьев, В.Ф. Барабанов, С.В. Тюрин

В статье предложена структурная схема синтезатора сигналов произвольной формы, состоящая из управляющего модуля и модуля формирования сигналов. Основными компонентами управляющего модуля являются постоянное запоминающее устройство, в качестве которого была использована микросхема NAND Flash памяти, и процессор фирмы ST Microelectronics STM32F439. Процессор STM32F439 используется для управления модулем формирования сигналов, а также для организации работы сетевого интерфейса. Модуль формирования сигналов построен с использованием программируемой логической интегральной схемы XC7K70T фирмы Xilinx, модуля памяти DDR3, цифро-аналогового преобразователя AD9739 фирмы Analog Devices и полосового фильтра.

Значительное внимание уделено описанию программного обеспечения синтезатора сигналов. Предложен один из возможных вариантов реализации программного обеспечения для модуля формирования сигналов, которое представляет собой конечный автомат, обеспечивающий взаимодействие с цифро-аналоговым преобразователем и возможность использования модуля памяти SDRAM DDR3 в качестве оперативного запоминающего устройства для хранения отсчетов формируемого сигнала. Также представлен возможный подход к разработке программного обеспечения управляющего модуля синтезатора сигналов, основной задачей которого является организация хранения формируемых сигналов в памяти и обслуживание сетевого интерфейса

Ключевые слова: цифровой синтез сигналов, формирование сигналов, ПЛИС, Verilog HDL

Введение

Синтезаторы сигналов произвольной формы находят широкое применение в таких областях науки и техники как связь, радиолокация, навигация, цифровое телевидение и многих других.

Одним из методов построения синтезаторов сигналов произвольной формы является так называемый метод прямого цифрового синтеза (DDS - Direct Digital Synthesis). В данном методе используется аккумулятор фазы (в качестве которого обычно выступает двоичный счетчик), значение которого на каждом такте опорной частоты увеличивается на некоторую величину, определяемую значением регистра приращения фазы. Затем, с помощью специальной таблицы зависимости амплитуды формируемого сигнала (например, синусоидального) от фазы рассчитывается текущее значение амплитуды и передается на цифро-аналоговый преобразователь (ЦАП), а результат преобразования затем фильтруется полосовым фильтром [1].

Прямой цифровой синтез позволяет генерировать сигналы различной формы со свойственной цифровым системам точностью. К основным преимуществам данного метода можно отнести высокое разрешение по частоте и фазе, быстрый переход на другую частоту и фазу, а

Донских Дмитрий Николаевич - ВГТУ, аспирант, e-mail: dndonskih@gmail.com

Попов Сергей Александрович - ВГТУ, аспирант, e-mail: sergey.a.popov@yandex.ru

Юрьев Александр Васильевич - ЦСИР НТЦ РЭБ, начальник отдела, e-mail: ayuryev@bk.ru Барабанов Владимир Федорович - ВГТУ, д-р техн. наук, профессор, e-mail: bvf@list.ru

Тюрин Сергей Владимирович - ВГТУ, канд. техн. наук, профессор, e-mail: svturin@mail.ru

также возможность перестройки частоты без разрыва фазы [4].

Данный метод широко применяется при построении измерительной техники [2], обучающих платформ [3], QPSK модуляторов [5,6], в радиолокации для формирования зондирующих линейно частотно модулированных сигналов [1,7] и во множестве других областей.

Также известен метод, при котором отсчеты формируемого сигнала рассчитываются заранее, а для их хранения используется постоянное запоминающее устройство (ПЗУ) [1].

В данном методе используется указатель адреса, значение которого на каждом такте опорной частоты увеличивается на единицу. Далее, по полученному адресу из ПЗУ считывается текущее значение амплитуды сигнала, которое передается на ЦАП. Результат преобразования, затем фильтруется полосовым фильтром.

Цель данной работы - рассмотреть один из возможных подходов к разработке программного обеспечения для цифровых синтезаторов сигналов данного типа.

Структурная схема синтезатора сигналов

Структурная схема и внешний вид синтезатора сигналов представлены на рис. 1 и 2 соответственно.

Цифрой 1 на рисунке обозначен микроконтроллер STM32F439. Данный микроконтроллер является основой управляющего модуля и используется для управления и организации взаимодействия между всеми другими модулями формирователя, а также для взаимодействия с пользователем посредством интерфейса Ethernet. STM32F439 основан на 32-х битном ARM ядре Cortex-M4, имеет 256 Кбайт ОЗУ, 2 Мб ПЗУ и работает на частоте 180 МГц [11].

ПК

TEthernet

Физический уровень Ethernet

SPI

SPI

Управляющий модуль

МК STM32F439

ПЗУ

ПЛИС Xilinx Kintex7

Управляющий КА

Контроллер DDR3

FIFO

Синтезатор тактовой частоты

Формирователь сигналов

ОЗУ

Fdac/4

ЦАП

AD9739

Фильтр

Сигнал

Рис. 1. Структурная схема синтезатора сигналов

5_ \ 4

Рис. 2. Внешний вид синтезатора сигналов

Цифрой 2 отмечена микросхема NAND FLASH памяти, которая используется в качестве ПЗУ для хранения отсчетов формируемых сигналов. Объем памяти одной микросхемы составляет 4 Гигабайта.

При формировании сигнала, для хранения отсчетов используется быстрая оперативная память DDR3 (обозначена на рисунке цифрой 3). Формирователь поддерживает работу с модулями памяти объемом до 8 Гбайт, работающими на частоте 400 МГц (DDR3-800).

Цифрой 4 отмечены кварцевый генератор и синтезатор тактовой частоты ЦАП.

Цифрой 5 отмечен ЦАП AD9739 [10]. Данный ЦАП позволяет синтезировать высококачественные широкополосные сигналы в полосе частот до 1.25 ГГц в первой и второй зонах Найквиста. Разрешение одного отчета - 14 бит.

Частотный спектр реального выходного сигнала содержит набор побочных зеркальных спектральных составляющих. Так, например, при формировании синусоидального сигнала на частоте 400 МГц, при частоте дискретизации 2000 МГц в частотном спектре сигнала на выходе ЦАП появятся также его зеркальные составляющие во второй (1600 МГц) и в третьей (2400 МГц) зонах Найквиста. Для подавления частотных составляющих за пределами интересующей полосы частот необходимо использовать фильтрацию.

В данном случае был использован аналоговый фильтр (обозначен цифрой 6 на рис. 2) с полосой пропускания 1000-1800 МГц. Частотный спектр формируемого сигнала до фильтрации и после неё представлен на рис. 3. и

Рис. 3. Результат применения полосового фильтра

Цифрой 7 на рисунке обозначена программируемая логическая интегральная схема (ПЛИС) XC7K70T. С помощью данной ПЛИС реализован контроллер памяти DDR3, конечный автомат для управления контроллером памяти DDR3, а также интерфейс для взаимодействия с ЦАП.

В качестве контроллера памяти DDR3 было использовано IP ядро MIG 7 Series [12].

Так как память DDR3 в качестве запоминающих устройств использует емкостные элементы, контроллер памяти для обеспечения сохранности данных должен периодически запускать процедуру их регенерации (refresh). Следствием этого является то, что скорость считывания данных из памяти не постоянна во времени. Поэтому данные, считанные из ОЗУ формирователя, не подаются напрямую на ЦАП, а предварительно собираются в небольшом буфере FIFO.

Наличие FIFO также накладывает ограничение на возможность быстрой смены излучаемого сигнала (до начала воспроизведения сигнала необходимо иметь в FIFO некоторый минимальный запас отсчетов).

Управляющий конечный автомат

Основным назначением управляющего конечного автомата (УКА) является организация взаимодействия между микроконтроллером управляющего модуля и контроллером памяти DDR3, реализованном на ПЛИС Kintex 7.

Упрощенная диаграмма управляющего конечного автомата представлена на рис. 4.

Рис. 4. Диаграмма управляющего конечного автомата

Рассмотрим данную диаграмму более подробно.

После получения команды "сброс" УКА переходит в состояние ожидания команды. Находясь в состоянии ожидания, УКА может получить от управляющего модуля либо команду

на чтение данных из памяти, либо команду на запись данных в память.

При приеме команды на запись предается начальный адрес в памяти DDR3, длина сегмента записываемых данных и отсчеты записываемого сигнала. После окончания приема данных УКА переходит в состояние ожидания команды.

В зависимости от поставленной задачи команда на запись сигнала в память DDR3 может либо выполняться однократно (однократно при запуске формирователя могут загружаться все сигналы из ПЗУ в память DDR3, а далее оператор использует только команды на чтение) либо непосредственно перед каждой командой на чтение может быть вызвана команда на запись

При приеме команды на чтение так же передается начальный и конечный адрес в памяти DDR3. Затем УКА начинает формировать сигналы для контроллера памяти DDR3 таким образом, чтобы обеспечить циклическое чтение из памяти DDR3, прерываясь только по сигналу переполнения FIFO ЦАП. Выход из состояния чтения осуществляется с помощью сигнала сброса.

Один из возможных вариантов реализации УКА на языке Verilog HDL представлен на рис. 5 и представляет собой простой конечный автомат, меняющий свое состояние (определяется значением регистра state) по фронту тактового сигнала clk либо по фронту сигнала сброса rst.

always @ (posedge elk or posedge rst) begin : FSM if[rst) begin //Оброс регистров УКА

end else

case

IDLE : begin //состояние ожидания команды end

MEM WRITE: begin //запись в ОЗУ формирователя end

MEM READ: begin //чтение из ОЗУ формирователя end

endcase end

Рис. 5. Реализация УКА на языке Verilog HDL

В качестве корректных состояний УКА отдельно выделены состояния ожидания команды, состояние чтения и состояние записи. Рассмотрим данные состояния более подробно.

Состояние ожидание команды (также как состояние записи и чтения) разбито на 2 состояния: IDLE0 и IDLE1. В состоянии IDLE0 при условии наличия данных от управляющего контроллера (сигнал mcu_data_ready) и сигнала окончания калибровки (init_calib_complete) производится запись начального адреса (start_addr), конечного адреса (end_addr), текущего адреса обращения к

памяти (next_addr), тип принятой команды (rw_mode_reg) а так же переход в состояние IDLE1.

В состоянии IDLE1, в соответствии с кодом принятой команды, происходит переход в состоянии чтения или записи. Реализация описанных действий представлена на рис. 6.

11)1. КО : begin

if[mcu_data_ieady & initcalibcomplete) begin

mcu_data_iecieved <= 1;

start_addr <=saddr:

next_addr <= saddr;

end_addr <= eaddr,

rw_mode_reg <=rw_mode;

state <=IDLE1;

end

end

IDLE1: begin

mcu_data_recieved <= 0;

case

1Ъ0 : state <=MEM WRITEO;

1Ъ1 : state <= MEM READO;

default: state <= IDLEO,

endcase

end

Рис. 6. Реализация состояния ожидания команды на языке Verilog HDL

MEMJWRITEO: begin

app_cmd <= З'ЪООО; //команда записи

iffmcu data ready&app wdfjrdy)begin

mcu data recieved <= 1;

app_addr <=next_addr;

next_addr <= next_addr + 8;

app_en<=l;

app wdfdata <= mcudata; app_wdf_end <= 1;

app_wdf_mask -- 64Ъ0000000000000000:

appwdfwien <= 1;

state <= MEM WRITE 1;

end

end

MEM WRITEl : begin mcudatarecieved <= 0; app_wdf_end <= 0; app_wdf_wien <— 0; if(app_rdy) begin app_en<=0; if(next_addr > end_addr) state <= IDLEO: else

state <= MEM WRITEO; end end

Рис. 7. Реализация состояния записи в память на языке Verilog HDL

На рис. 7 и 8 показана реализация в УКА процессов чтения и записи. В состоянии MEM_READ0 УКА управляет контроллером памяти DDR3 таким образом, чтобы тот осуществлял циклическое чтение данных из памяти. Считанные данные затем помещаются в FIFO. При заполнении выше заданного порога, В

состоянии MEM_WRITE0 УКА ожидает приема данных от управляющего модуля (mcu_data_ready) и затем, при условии готовности приема команды контроллером памяти DDR3 (app_wdf_rdy) выставляет необходимые сигналы для осуществления записи принятых данных. Затем УКА переходит в состояние MEM_WRITE1, в котором УКА ожидает корректного завершения процедуры записи данных. Из состояния MEM_WRITE1 УКА может перейти либо в состояние IDLE0 в случае окончания записи данных, либо в состояние MEM_WRITE0 иначе.

FIFO выставляет высокий уровень сигнала dac_fifo_almostfUll (признак того, что очередь почти заполнена), и УКА переходит в состояние MEM_READ1, в котором чтение

приостанавливается, до тех пор, пока FIFO не освободится.

MEM_READ0: begin app_cmd<=3'b001; //команда чтения case( {dac_fifo_a]mostiull,app_rdy}) 2Ъ01: begin app en <=1; app addr <= next addr, iflnextaddr+8 > end_addr) next addr <= stmt addr, else

next addr <— next addr + 8; state <= MEM READO; end

2Ы1: begin app en <= 0: state <= MEM RE AD 1; end

default: begin app_en<= 1; state <= MEM READO; end

endcase end

MEM_READ1: begin case( dac fifo almostfull) Ш: begin app_en<= 1; appaddr <=next_addr, iflnext_addr + 8 > end_addr) next_addr<= start addr, else

next_addr<=next_addr+ 8; state <= MEM READO; end

default: begin

appen <= 0:

state <= MEMRE AD 1;

end

endcase end

Рис. 8. Реализация состояния чтения из памяти на языке Verilog HDL

Порог включения сигнала dac_fifo_almostfull устанавливается таким образом, чтобы не происходило переполнения очереди FIFO.

Временные диаграммы процесса записи и чтения памяти DDR3 представленны на рис. 9 и 10 соответственно.

Чарр_с™О:0]

lappjn

"bappjwij^ 4apf>jwf_datapll:C]

fe appjwttf _wer I cfpjmtjsrd

[ с mm Шишишь] шиш тллшшшш Lrmnj шиш шиш

0

.". J1. 7 0 : [ OKOMEl n

шни

^Ш ш

мнюию« :s3DMft:si»ai«-0JDM«t33Di •OCMfcMKt )DimitDimii№i»u!»ug ;(П21СКЖ тазвгши шогпюош

OOOOGOOO С 0 П

л_

Рис. 9. Временная диаграмма процесса записи в память DDR3

1*

4<»p_cmdt2:£i]

1 Wjé/

4(iWJiijbta[Sll;D] ik ippjd_<iata_vaU

0000001$ ИШ1 В Iii fLMJ шрлдш ш ЩИ

-—

л 1_1

1 г "ni. Ii-va.г-:) КВИЗММС 1 ммкямшж. ¡(Ï 1 гн

Рис. 10. Временная диаграмма процесса чтения из памяти DDR3

Программное обеспечение управляющего модуля синтезатора сигналов

В качестве основы управляющего модуля был использован микроконтроллер STM32F439 под управлением операционной системы реального времени c открытым исходным кодом FreeRTOS [8]. Данная операционная система позволяет разделить пользовательскую программу на отдельные задачи, для каждой из которых может быть задан различный приоритет, в соответствии с которым ей будет выделяться процессорное время. Во FreeRTOS так же может быть использована невытесняющая многозадачность, очереди, семафоры и мьютексы для синхронизации задач, и многое другое [10].

Программное обеспечение управляющее синтезатором цифровых сигналов реализует две основные задачи:

1) Задача, обеспечивающая работу сетевого интерфейса. Для реализации работы данной задачи был использован TCP/IP стек LwIP - набор API функций позволяющий реализовать многие сетевые протоколы: TCP, UDP, HTTP, FTP и другие [9].

2) Задача, осуществляющая обработку данных, полученных через сетевой интерфейс и взаимодействие с УКА. В соответствии с принятой командой, запускается одна из задач, которая изменяет состояние КА или работает с периферией.

Общая схема работы данной задачи представлена на рис. 11.

Заключение

В работе представлен способ построения формирователя сигналов произвольной формы, а так же один из возможных подходов к разработке программного обеспечения, управляющего его работой. Полученные результаты показывают эффективность использования предложенных методов при построении цифровых синтезаторов сигналов произвольной формы.

С

Пуск

Инициализация периферии

(Микросхемы физического

уровня Ethernet, Синтезатора Тактовой частоты, ЦАП и тд)

Ожидание команды

Передача управляющему КА Начального адреса сигнала, длительности сигнала, перевод КА в состояние READ

да

Принята команда

Принята команда ^на запись в ПЗУ?,

Ожидание данных

Запись данных в NAND FLASH память

1 нет - Приняты все _

Да Принята команда на запись в DDR3?

Перевод КА в состояние WRITE

Ожидание данных из ПЗУ

Запись данных в DDR3 SDRAM память

Приняты все

Принята команда

остановки . формирования?

Перевод КА в состояние IDDLE

Рис. 11. Схема работы программного обеспечения управляющего модуля

Литература

1. Chua M. Y. FPGA-based chirp generator for high resolution UAV SAR / M. Y. Chua, V. C. Koo // Progress In Electromagnetics Research. - 2009. - Vol. 99. - P. 71-88.

2. Sandhya Ran M. Digital Frequency Synthesis using Multi-Phase NCO for Dielectric Characterization of

Materials on Xilinx Zynq FPGA / M. Sandhya Rani, K. Soundararajan, K. Nagabushan Raju // Global Journal of Researches in Engineering: (F) Electrical and Electronics Engineering. - 2014. - Vol. 14, №7. - P. 14-19.

3. Hervas M. An FPGA Scalable Software Defined Radio Platform Design for Educational and Research Purposes / M. Hervas, R. M. Alsina-Pages, M. Salvador // Electronics. - 2016. - Vol. 5, №2 - P. 53-73.

4. Макаренко В. Компоненты для построения беспроводных устройств связи. Ч. 7: Синтезаторы частоты прямого цифрового синтеза / В. Макаренко // Электронные компоненты и системы. - 2010. - №1. - С. 34-46.

5. Simple QPSK modulator implemented in Virtex 6 FPGA board for satellite ground station / A.M. Moubark, M.A.M. Ali, H. Sanusi, S.M. Ali,N. Zainal // Proceeding of the International Conference on Computer Design. - 2011. -P. 131-135.

6. FPGA implementation of low power digital QPSK modulator using Verilog HDL / A.M. Moubark, M.A.M. Ali, H. Sanusi, S.M. Ali,N. Zainal // Journal of Applied Sciences. - 2013. - P. 38-46.

7. Implementation of DDS Chirp Signal Generator on FPGA / H. Yang, S.-B. Ryu, H.-C. Lee, S.-G. Lee, S.-S. Yong, J.-H. Kim // 2014 International Conference on

Information and Communication Technology Convergence. -2014. - P. 956 - 959.

8. FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions [Электронный ресурс]. -http://www.freertos.org/index.html (дата обращения: 16.08.2016).

9. lwIP - A Lightweight TCP/IP stack [Электронный ресурс]. - http://savannah.nongnu.org/projects/lwip/ (дата обращения: 16.08.2016).

10. AD9739 (Rev. C) [Электронный ресурс]. -http://www.analog.com/media/en/technical-documentation/data-sheets/AD9739.pdf (дата обращения: 16.08.2016).

11. High-performance advanced line, ARM Cortex-M4 core with DSP and FPU, 2 Mbytes Flash, 180 MHz CPU, ART Accelerator, Chrom-ART Accelerator, FMC with SDRAM, TFT, HW crypto [Электронный ресурс]. -http://www.st.com/content/st_com/en/products/microcontroll ers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439/stm32f439ii.html (дата обращения: 16.08.2016).

12. UG086 Xilinx Memory Interface Generator (MIG), User Guide. - http://www.xilinx.com/support/documentation/ ip_documentation/ug086. pdf.

Воронежский государственный технический университет

Центр системных исследований и разработок Научно-технического центра радиоэлектронной борьбы

DEVELOPMENT OF THE SOFTWARE FOR CONTROL SYSTEM FOR THE DIGITAL SIGNAL

SYNTHESIZERS

D.N. Donskih1, S.A. Popov2, A.V. Yurjev3, V.F. Barabanov4, S.V. Tyurin5

'Graduate student, Voronezh State Technical University, Voronezh, Russian Federation

e-mail: dndonskih@gmail.com 2Graduate student, Voronezh State Technical University, Voronezh, Russian Federation e-mail: sergey.a.popov@yandex.ru 3Head of department, CSIR NTC REB, Voronezh, Russian Federation e-mail: sergey.a.popov@yandex.ru 4Ph.D., Professor, Voronezh State Technical University, Voronezh, Russian Federation

e-mail: bvf@list.ru

5Ph.D., Associate professor, Voronezh State Technical University, Voronezh, Russian Federation

e-mail: svturin@mail.ru

The article introduces a block diagram of a signal synthesizer of arbitrary shape, consisting of a control module and a signal generation module. The main components of the control module are read-only memory, which was used as a chip NAND Flash memory, and a processor company ST Microelectronics STM32F439. The STM32F439 processor is used to control the signal conditioning module, as well as to organize the operation of the network interface. The signal conditioning module is built using Xilinx XC7K70T programmable logic integrated circuit, DDR3 memory module, Analog Devices AD9739 digital-to-analog converter and bandpass filter.

Considerable attention is paid to the description of the software of the synthesizer of signals. One of the possible variants of implementing the software for the signal conditioning module is presented. It is a finite state machine that provides interaction with a digital-to-analog converter and the possibility of using the SDRAM DDR3 memory module as a random-access memory for storing samples of the generated signal. There is also a possible approach to the development of software for the control module of the synthesizer of signals, the main task of which is the organization of storing the formed signals in memory and servicing the network interface

Key words: digital signal synthesis, signal generation, FPGA, Verilog HDL

References

1. Chua M. Y., Koo V. C., "FPGA-based chirp generator for high resolution UAV SAR", Progress In Electromagnetics Research (2009): 71-88.

2. Sandhya M. Ran, Soundararajan K., Nagabushan Raju K., "Digital Frequency Synthesis using Multi-Phase NCO for Dielectric Characterization of Materials on Xilinx Zynq FPGA, " Global Journal of Researches in Engineering 14-7 (2014): 14-19.

3. Hervas M. Alsina-Pages R. M., Salvador M., "FPGA Scalable Software Defined Radio Platform Design for Educational and Research Purposes, " Electronics, 5-2 (2016): 53-73.

4. Makarenko V., Ali M.A.M., Sanusi H., Ali S.M., Zainal N., "Wireless communication devices components, Part 7" ("Komponenty dliapostroeniia besprovodnykh ustroistv sviazi, chast 7") Elektronnye komponenty i sistemy, 1 (2010): 34-46.

5. Moubark A.M., Ali M.A.M., Sanusi H., Ali S.M., Zainal N., "Simple QPSK modulator implemented in Virtex 6 FPGA boardfor satellite ground station, " Proceeding of the International Conference on Computer Design, (2011): 131-135.

6. Moubark A.M., Ali M.A.M., Sanusi H., Ali S.M., Zainal N., "FPGA implementation of low power digital QPSK modulator using Verilog HDL, " Journal of Applied Sciences, (2013): 38-46.

7. Yang H., Ryu S.-B., Lee H.-C., Lee S.-G., Yong S.-S., Kim J.-H., "Implementation of DDS Chirp Signal Generator on FPGA, " 2014 International Conference on Information and Communication Technology Convergence, (2014): 956 - 959.

8. FreeRTOS, "Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions," http://www.freertos.org/index.html

9. lwIP, "A Lightweight TCP/IP stack", http://savannah.nongnu.org/projects/lwip/

10. AD9739 (Rev. C), http://www.analog.com/media/en/technical-documentation/data-sheets/AD9739.pdf.

11. High-performance advanced line, "ARM Cortex-M4 core with DSP and FPU, 2 Mbytes Flash, 180 MHz CPU, ART Accelerator, Chrom-ART Accelerator, FMC with SDRAM, TFT, HW crypto," http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f4-series/stm32f429-439/stm32f439ii.html.

12. UG086 Xilinx Memory Interface Generator (MIG), User Guide, http://www.xilinx.com/support/documentation/ip_documentation/ug086.pdf.