stringtranslate.com

VHDL

Исходный код VHDL для подписанного сумматора

Язык описания оборудования VHSIC ( VHDL ) — это язык описания аппаратного обеспечения (HDL), который может моделировать поведение и структуру цифровых систем на нескольких уровнях абстракции , начиная от уровня системы и заканчивая уровнем логических элементов , для ввода проекта, документации, и целей проверки. С 1987 года VHDL стандартизирован Институтом инженеров по электротехнике и электронике (IEEE) как IEEE Std 1076 ; последней версией которого является IEEE Std 1076-2019 . Для моделирования аналоговых систем и систем смешанных сигналов был разработан стандартизированный IEEE HDL на основе VHDL под названием VHDL-AMS (официально IEEE 1076.1).

VHDL назван в честь программы Министерства обороны США , которая его создала, — Программы сверхвысокоскоростных интегральных схем (VHSIC). В начале 1980-х годов программа VHSIC искала новый HDL для использования при проектировании интегральных схем, которые она намеревалась разработать. Результатом этих усилий стала версия VHDL 7.2, выпущенная в 1985 году. Попытки стандартизировать ее как стандарт IEEE начались в следующем году.

История

В 1983 году VHDL был первоначально разработан по указанию Министерства обороны США для документирования поведения ASIC , которые компании-поставщики включали в оборудование. Стандарт MIL-STD-454N [2] в Требовании 64 раздела 4.5.1 «Документация ASIC в VHDL» явно требует документации «Микроэлектронных устройств» в VHDL.

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

Поскольку Министерство обороны требует, чтобы как можно большая часть синтаксиса была основана на Ada, чтобы избежать повторного изобретения концепций, которые уже были тщательно проверены при разработке Ada, VHDL в значительной степени заимствован из Ada . язык программирования как в концепции, так и в синтаксисе .

Первоначальная версия VHDL, разработанная в соответствии со стандартом IEEE IEEE 1076-1987, [3] включала широкий диапазон типов данных, включая числовые ( целочисленные и вещественные ) , логические ( битовые и логические ), символьные и временные , а также массивы вызываемых bitи bit_vectorвызываемой строки . character_

Однако проблема, не решенная в этом издании, заключалась в «многозначной логике», где также учитываются сила сигнала (нет, слабый или сильный) и неизвестные значения. Для этого потребовался стандарт IEEE 1164 , который определял 9-значные типы логики: скалярную std_logicи ее векторную версию std_logic_vector. Будучи разрешенным подтипом своего std_Ulogicродительского типа, std_logic-типизированные сигналы допускают многократное управление для моделирования структур шины, в результате чего функция связанного разрешения адекватно обрабатывает конфликтующие назначения.

Обновленный стандарт IEEE 1076 в 1993 году сделал синтаксис более согласованным, обеспечил большую гибкость в именовании, расширил тип, characterчтобы разрешить печатные символы ISO-8859-1xnor , добавил оператор и т. д. [ укажите ]

Незначительные изменения в стандарте (2000 и 2002 гг.) добавили идею защищенных типов (аналогично концепции класса в C++ ) и удалили некоторые ограничения из правил сопоставления портов.

Помимо стандарта IEEE 1164, было введено несколько дочерних стандартов для расширения функциональности языка. В стандарте IEEE 1076.2 улучшена обработка реальных и сложных типов данных. Стандарт IEEE 1076.3 ввел знаковые и беззнаковые типы для облегчения арифметических операций с векторами. Стандарт IEEE 1076.1 (известный как VHDL-AMS ) предоставил расширения для проектирования аналоговых схем и схем смешанных сигналов.

Некоторые другие стандарты поддерживают более широкое использование VHDL, в частности VITAL (VHDL Initiative Towards ASIC Libraries) и расширения проектирования микроволновых схем.

В июне 2006 года Технический комитет VHDL компании Accellera (командированный IEEE для работы над следующим обновлением стандарта) утвердил так называемый проект 3.0 VHDL-2006. При сохранении полной совместимости со старыми версиями предлагаемый стандарт предоставляет многочисленные расширения, которые упрощают написание кода VHDL и управление им. Ключевые изменения включают включение дочерних стандартов (1164, 1076.2, 1076.3) в основной стандарт 1076, расширенный набор операторов, более гибкий синтаксис операторов регистра и генерации , включение VHPI (процедурный интерфейс VHDL) (интерфейс к языкам C/C++). ) и подмножество PSL ( язык спецификации свойств ). Эти изменения должны улучшить качество синтезируемого кода VHDL, сделать тестовые стенды более гибкими и позволить более широко использовать VHDL для описаний на уровне системы.

В феврале 2008 года Accellera утвердила VHDL 4.0, также неофициально известный как VHDL 2008, который устраняет более 90 проблем, обнаруженных во время пробного периода версии 3.0, и включает расширенные универсальные типы. В 2008 году Accellera представила IEEE VHDL 4.0 для голосования за включение в IEEE 1076-2008. Стандарт VHDL IEEE 1076-2008 [4] был опубликован в январе 2009 года.

Стандартизация

Стандарт IEEE 1076 определяет язык описания оборудования VHSIC или VHDL. Первоначально он был разработан в рамках контракта F33615-83-C-1003 с ВВС США , заключенного в 1983 году с командой Intermetrics, Inc. в качестве языковых экспертов и генерального подрядчика, Texas Instruments в качестве экспертов по проектированию микросхем и IBM в качестве разработчиков компьютерных систем. эксперты. Язык претерпел многочисленные изменения и имеет множество связанных с ним подстандартов, которые существенно дополняют или расширяют его.

1076 был и остается важной вехой в разработке электронных систем. [5]

Редакции

Сопутствующие стандарты

Дизайн

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

Симулятор VHDL обычно представляет собой симулятор, управляемый событиями. [13] Это означает, что каждая транзакция добавляется в очередь событий на определенное запланированное время. Например, если назначение сигнала должно произойти через 1 наносекунду, событие добавляется в очередь на время +1 нс. Нулевая задержка также допускается, но ее все равно необходимо запланировать: для этих случаев используется дельта-задержка , которая представляет собой бесконечно малый шаг по времени. Моделирование переключается между двумя режимами: выполнение операторов, при котором оцениваются запущенные операторы, и обработка событий, при которых обрабатываются события в очереди.

В VHDL есть конструкции для управления параллелизмом, свойственным аппаратным проектам, но эти конструкции ( процессы ) отличаются по синтаксису от параллельных конструкций в Ada ( задач ). Как и Ada, VHDL строго типизирован и не чувствителен к регистру . Для непосредственного представления операций, распространенных в аппаратном обеспечении, существует множество функций VHDL, которых нет в Ada, например расширенный набор логических операторов, включая nand и nor .

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

Неопытному разработчику относительно легко создать код, который успешно моделируется, но не может быть синтезирован в реальном устройстве или слишком велик, чтобы его можно было использовать на практике. Особой ловушкой является случайное использование в качестве элементов хранения прозрачных защелок , а не триггеров D-типа . [14]

Можно спроектировать аппаратное обеспечение в VHDL IDE (для реализации FPGA, такой как Xilinx ISE, Altera Quartus, Synopsys Synplify или Mentor Graphics HDL Designer) для создания схемы RTL нужной схемы. После этого созданную схему можно проверить с помощью программного обеспечения для моделирования, которое показывает формы входных и выходных сигналов схемы после создания соответствующего испытательного стенда. Чтобы создать подходящий испытательный стенд для конкретной схемы или кода VHDL, необходимо правильно определить входные данные. Например, для ввода тактового сигнала требуется циклический процесс или итеративный оператор. [15]

И последний момент: когда модель VHDL преобразуется в «вентили и провода», которые отображаются на программируемом логическом устройстве, таком как CPLD или FPGA , тогда настраивается фактическое оборудование, а не «исполняется» код VHDL. «как будто на каком-то процессорном чипе.

Преимущества

Ключевое преимущество VHDL при использовании для проектирования систем заключается в том, что он позволяет описывать (моделировать) и проверять (моделировать) поведение требуемой системы до того, как инструменты синтеза преобразуют проект в реальное оборудование (вентили и провода).

Еще одним преимуществом является то, что VHDL позволяет описывать параллельную систему . VHDL — это язык потоков данных , в котором каждый оператор рассматривается для одновременного выполнения, в отличие от процедурных языков вычислений, таких как BASIC, C и ассемблерный код, где последовательность операторов выполняется последовательно, по одной инструкции за раз.

Проект VHDL является многоцелевым. Будучи созданным один раз, расчетный блок может использоваться во многих других проектах. Однако многие формационные и функциональные параметры блока могут быть настроены (параметры емкости, объем памяти, элементная база, состав блоков и структура взаимосвязей).

Проект VHDL является переносимым. Будучи созданным для одной элементной базы, проект вычислительного устройства может быть портирован на другую элементную базу, например СБИС с различными технологиями.

Большим преимуществом VHDL по сравнению с оригинальным Verilog является то, что VHDL имеет систему полного типа . Дизайнеры могут использовать систему типов для написания гораздо более структурированного кода (особенно путем объявления типов записей ). [16]

Примеры дизайна

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

Простой логический элемент И в VHDL будет выглядеть примерно так:

-- (это комментарий VHDL) / * это комментарий блока ( VHDL - 2008 ) */ -- импортируем std_logic из библиотеки IEEE Library IEEE ; используйте IEEE.std_logic_1164. все ;        -- это сущность сущности ANDGATE - это порт ( I1 : в std_logic ; I2 : в std_logic ; O : вне std_logic ); конечный объект ANDGATE ;                   -- это архитектура RTL ANDGATE : начало O < = I1 и I2 ; конечная архитектура RTL ;           

(Обратите внимание, что это RTLозначает проектирование уровня передачи регистров .) Хотя приведенный выше пример может показаться многословным новичкам в HDL, многие его части либо необязательны, либо их нужно написать только один раз. Обычно такие простые функции являются частью более крупного поведенческого модуля, а не имеют отдельный модуль для чего-то столь простого. Кроме того, использование таких элементов, как std_logicтип, на первый взгляд может показаться излишним. Можно легко использовать встроенный bitтип и избежать импорта библиотеки вначале. Однако использование формы многозначной логики , в частности 9-значной логики ( U, X, 0, 1, Z, W, H, L, -), вместо простых битов (0,1), предлагает разработчику очень мощный инструмент моделирования и отладки, который в настоящее время позволяет не существует ни в одном другом ЛПВП.

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

Синтезируемые конструкции и шаблоны VHDL

VHDL часто используется для двух разных целей: моделирования электронных конструкций и синтеза таких конструкций. Синтез — это процесс, в котором VHDL компилируется и отображается в технологию реализации, такую ​​как FPGA или ASIC.

Не все конструкции VHDL подходят для синтеза. Например, большинство конструкций, которые явно связаны со временем, например, wait for 10 ns;не поддаются синтезу, несмотря на то, что они действительны для моделирования. Хотя разные инструменты синтеза имеют разные возможности, существует общее синтезируемое подмножество VHDL, которое определяет, какие языковые конструкции и идиомы отображаются в общее оборудование для многих инструментов синтеза. IEEE 1076.6 определяет подмножество языка, которое считается официальным подмножеством синтеза. Обычно считается «лучшей практикой» писать очень идиоматический код для синтеза, поскольку результаты могут быть неправильными или неоптимальными для нестандартных конструкций.

Шаблон MUX

Мультиплексор , или «MUX», как его обычно называют, представляет собой простую конструкцию, очень распространенную при проектировании аппаратного обеспечения. В приведенном ниже примере показан простой мультиплексор «два к одному» со входами Aи B, селектором Sи выходом X. Обратите внимание, что существует множество других способов выразить тот же MUX на VHDL. [17]

X <= A , когда S = '1' else B ;        

Более сложный пример мультиплексора с входами 4x2 и 2-битным селектором:

библиотека IEEE ; используйте IEEE.std_logic_1164. все ; объектный мультиплексор4 — это порт ( a1 : в std_logic_vector ( от 2 до 0 ); a2 : в std_logic_vector ( от 2 до 0 ); a3 : в std_logic_vector ( от 2 до 0 ); a4 : в std_logic_vector ( от 2 до 0 ); sel : в std_logic_vector ( 1 до 0 ); b : out std_logic_vector ( 2 до 0 ) ); конец мультиплексора4 ; архитектура rtl mux4 - декларативная часть: пусто начало p_mux : процесс ( a1 , a2 , a3 , a4 , sel ) начало случая sel - это When "00" => b <= a1 ; когда «01» => b <= a2 ; когда «10» => b <= a3 ; когда другие => b <= a4 ; конец дела ; завершить процесс p_mux ; конец ртл ;                                                                                         

Шаблон защелки

Прозрачная защелка — это, по сути, один бит памяти, который обновляется при подаче сигнала разрешения. Опять же, есть много других способов выразить это на VHDL.

-- шаблон фиксации 1: Q <= D if Enable = '1' else Q ;        -- шаблон блокировки 2: процесс ( все ) начинается Q <= D , когда ( Включить ); завершить процесс ;     

шлепанцы типа D

Триггер D-типа производит выборку входящего сигнала по нарастающему (или падающему) фронту тактового сигнала. В этом примере имеется асинхронный сброс с активным высоким уровнем и выборка по нарастающему фронту тактовой частоты.

DFF : процесс ( все ) начинается , если RST , то Q <= '0' ; elsif Rising_edge ( CLK ), затем Q <= D ; конец, если ; завершить процесс DFF ;                   

Другой распространенный способ записи поведения, запускаемого по фронту, в VHDL — использование атрибута сигнала «событие». Между именем сигнала и именем атрибута должен быть написан один апостроф.

DFF : процесс ( RST , CLK ) начинается , если RST , то Q <= '0' ; elsif CLK 'event и CLK = '1' then Q <= D ; конец , если ; завершить процесс DFF ;                        

VHDL также подходит для «острых строк», таких как

DFF : Q <= '0' , когда RST = '1' , иначе D , когда нарастающий_фронт ( clk );            

или

DFF : процесс ( все ) начинается , если нарастающий_фронт ( CLK ), затем Q <= D ; конец, если ; если RST , то Q <= '0' ; конец, если ; завершить процесс DFF ;                      

или:

библиотека IEEE ; ИСПОЛЬЗУЙТЕ IEEE.Std_logic_1164. все ;  сущность RisingEdge_DFlipFlop_SyncReset — это порт ( Q : out std_logic ; Clk : in std_logic ; sync_reset : in std_logic ; D : in std_logic ); конец RisingEdge_DFlipFlop_SyncReset ;                         Архитектура Поведение RisingEdge_DFlipFlop_SyncReset начало процесса ( Clk ) Begin if ( rising_edge ( Clk )) then if ( sync_reset = ' 1' ) then Q <= '0' ; иначе Q <= D ; конец , если ; конец , если ; завершить процесс ; конец Поведенческий ;                                

Это может быть полезно, если не все сигналы (регистры), управляемые этим процессом, должны быть сброшены.

Пример: счетчик

Следующий пример представляет собой повышающий счетчик с асинхронным сбросом, параллельной загрузкой и настраиваемой шириной. Он демонстрирует использование типа unsigned, преобразования типов между unsigned и std_logic_vector, а также дженерики VHDL . Обобщенные шаблоны очень близки к аргументам или шаблонам в других традиционных языках программирования, таких как C++. Пример приведен на языке VHDL 2008.

библиотека IEEE ; используйте IEEE.std_logic_1164. все ; используйте IEEE.numeric_std. все ; -- для беззнакового типа    объект COUNTER является универсальным ( WIDTH : в натуральном виде := 32 ); порт ( RST : в std_logic ; CLK : в std_logic ; LOAD : в std_logic ; DATA : в std_logic_vector ( WIDTH - 1 до 0 ); Q : out std_logic_vector ( WIDTH - 1 до 0 )); конечный объект COUNTER ;                                      архитектура RTL COUNTER - это    начинать процесс ( все ) начинается , если RST , то Q <= ( others => '0' ) ; elsifising_edge ( CLK ) , то если LOAD = '1' , то Q <= DATA ; иначе Q <= std_logic_vector ( беззнаковый ( Q ) + 1 ); конец , если ; конец, если ; завершить процесс ;                               конечная архитектура RTL ;  

В более сложные счетчики могут добавляться операторы if/then/else для rising_edge(CLK) elsifдобавления других функций, таких как разрешение счетчика, остановка или пролонгация при определенном значении счетчика, генерация выходных сигналов, таких как сигналы счетчика терминалов, и т. д. Необходимо соблюдать осторожность при упорядочивании и вложение таких элементов управления, если они используются вместе, для создания желаемых приоритетов и минимизации количества необходимых логических уровней.

Конструкции только для моделирования

Большую часть VHDL невозможно преобразовать в аппаратное обеспечение. Это подмножество известно как несинтезируемое или предназначенное только для моделирования подмножество VHDL и может использоваться только для прототипирования, моделирования и отладки. Например, следующий код сгенерирует тактовый сигнал с частотой 50 МГц. Его можно, например, использовать для управления тактовым входом в проекте во время моделирования. Однако это конструкция, предназначенная только для моделирования, и ее нельзя реализовать аппаратно. В реальном оборудовании часы генерируются извне; его можно уменьшить внутренне с помощью пользовательской логики или специального оборудования.

начало процесса CLK <= '1' ; подождите 10 нс ; _ CLK <= '0' ; подождите 10 нс ; _ завершить процесс ;               

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

начало процесса , ожидание START = '1' ; -- дождитесь, пока START не станет высоким для i в цикле от 1 до 10 -- затем подождите несколько периодов такта... подождите, пока Rising_edge ( CLK ); конец цикла ;                     for i в цикле от 1 до 10 — записываем числа от 1 до 10 в DATA, 1 в каждом цикле DATA <= to_unsigned ( i , 8 ); дождаться повышения_границы ( CLK ) ; конец цикла ;                 -- дождаться изменения вывода wait on RESULT ; -- теперь повышаем ACK для тактового периода ACK <= '1' ; дождаться повышения_границы ( CLK ) ; ПОДТВЕРЖДЕНИЕ <= '0' ;               -- и так далее... завершить процесс ; 

Особенности VHDL-2008

Иерархические псевдонимы

библиотека ieee ; используйте ieee.std_logic_1164. все ;  сущность bfm конечная сущность ; архитектура bfm это сигнал en : std_logic ; _ начало - вставьте сюда реализацию конец архитектуры ;             // ------------------------------------------ библиотека ieee ; используйте ieee.std_logic_1164. все ;  объект test1 конечный объект ; Архитектура теста test1 начинается _ _         ibfm : сущность работает . бфм ; -- Псевдоним процесса testbench Probe_en равен << signal . тест1 . ИБФМ . ru : std_logic >> ; начать зонд_ен <= '1' ; подождите 100 нс ; _ зонд_ен <= '0' ; подождите 100 нс ; _ зонд_en <= '1' ; подождите 100 нс ; _ std.env . стоп ( 0 ); завершить процесс ; конечная архитектура ;                                     

Стандартные библиотеки

Также называются стандартными пакетами.

Стандартный пакет IEEE

Стандартный пакет IEEE включает следующее: [18]

Симуляторы VHDL

Коммерческий:

Другой:

Смотрите также

Рекомендации

  1. Дэвид Р. Коэльо (30 июня 1989 г.). Справочник VHDL. Springer Science & Business Media. ISBN 978-0-7923-9031-2.
  2. ^ Министерство обороны (1992). Военный стандарт, Стандартные общие требования к электронному оборудованию . Проверено 15 ноября 2017 г.
  3. ^ ab 1076-1987 - Справочное руководство по стандартному языку VHDL IEEE . 1988. doi :10.1109/IEESTD.1988.122645. ISBN 0-7381-4324-3.
  4. ^ 1076-2008 – Справочное руководство по стандартному языку VHDL IEEE . 2009. doi :10.1109/IEESTD.2009.4772740. ISBN 978-0-7381-6854-8.
  5. ^ Рабочая группа IEEE P1076 Группа анализа и стандартизации VHDL (VASG)
  6. ^ 1076-1993 – Справочное руководство по стандартному языку VHDL IEEE . 1994. doi :10.1109/IEESTD.1994.121433. ISBN 0-7381-0986-Х.
  7. ^ 1076-2000 - Справочное руководство по стандартному языку VHDL IEEE . 2000. doi :10.1109/IEESTD.2000.92297. ISBN 0-7381-1948-2.
  8. ^ 1076-2002 – Справочное руководство по стандартному языку VHDL IEEE . 2002. doi :10.1109/IEESTD.2002.93614. ISBN 0-7381-3247-0.
  9. ^ IEC 61691-1-1 Первое издание 2004-10; IEEE 1076 — Поведенческие языки IEC/IEEE. Часть 1-1: Справочное руководство по языку VHDL (принятие стандарта IEEE 1076-2002) . 2004. doi :10.1109/IEESTD.2004.95752. ISBN 2-8318-7691-5.
  10. ^ 1076c-2007 – Справочное руководство по стандартному языку VHDL IEEE, поправка 1: Интерфейс приложения процедурного языка . 2007. doi :10.1109/IEESTD.2007.4299594. ISBN 978-0-7381-5523-4.
  11. ^ 61691-1-1-2011 — Поведенческие языки — Часть 1-1: Справочное руководство по языку VHDL . 2011. doi :10.1109/IEESTD.2011.5967868. ISBN 978-0-7381-6605-6.
  12. ^ «IEEE 1076.6-2004 - Стандарт IEEE для синтеза уровня передачи регистров (RTL) VHDL» .
  13. ^ «ELEC3017 — Моделирование» (PDF) . Университет Саутгемптона. Архивировано (PDF) из оригинала 23 февраля 2017 г. Проверено 23 февраля 2017 г.
  14. ^ «Почему меня должны волновать прозрачные защелки?». Дулос . Проверено 22 декабря 2012 г.
  15. ^ «Генерация часов». Дулос . Проверено 22 декабря 2012 г.
  16. ^ Иржи Гайслер. «Метод структурированного проектирования VHDL» (PDF) . Архивировано (PDF) из оригинала 10 октября 2022 г. Проверено 15 ноября 2017 г.
  17. ^ «Логические операторы VHDL и присвоение сигналов для комбинаторной логики». Учебное пособие по ПЛИС . 16 мая 2020 г. Проверено 23 августа 2020 г.
  18. Кьюзано, Сильвия (5 апреля 2011 г.). «Типы данных и операторы VHDL, доступные в стандартных пакетах IEEE» (PDF) . Политехнический университет Турина . Архивировано (PDF) из оригинала 10 октября 2022 г.
  19. ^ «VCS: самое высокопроизводительное в отрасли решение для моделирования» . сайт Synopsis.com .
  20. ^ «Авторские права | Лицензии» . Документация GHDL — документация GHDL 0.36-dev . readthedocs.io.
  21. Гассон, Ник (5 ноября 2011 г.). «Написание компилятора VHDL».
  22. Гассон, Ник (22 июля 2023 г.). «NVC — компилятор и симулятор VHDL» . Проверено 23 июля 2023 г.
  23. ^ "freehdl: По теме" . Архивировано из оригинала 10 февраля 2002 года.
Примечания

дальнейшее чтение

Внешние ссылки