Структурный синтез сложных цифровых автоматов...................................




Концепция операционного и управляющего автомата......................

Принцип микропрограммного управления........................................

Содержательные и закодированные ГСА...........................................

Канонический метод структурного синтеза сложного цифрового автомата

Канонический метод синтеза микропрограммных автоматов Мили.

Кодирование состояний автомата.......................................................

Кодирование состояний автоматов с целью минимизации комбинационных схем...................................................................................................................

Противогоночное кодирование состояний автоматов................

Кодирование состояний автоматов, реализуемых на ПЛИС.....

Канонический метод синтеза микропрограммных автоматов Мура.

VHDL-модели управляющих автоматов.............................................

Операционные автоматы................................................................................

VHDL-модель операционного автомата.............................................

Синтез канонической структуры операционного автомата...............

6.2.1 Характеристики операционного автомата

6.2.2 Эквивалентные операции и обобщенный оператор

6.2.3 Явление гонок в операционных автоматах

6.3 Операционный автомат типа I

6.4 Операционный автомат типа М

6.5 Операционный автомат типа IM

6.5.1 ОА типа IM с параллельной комбинационной частью

6.5.2 ОА типа IM с последовательной комбинационной частью

6.6 Операционный автомат типа S

Перечень ссылок................................................................................................


5 СТРУКТУРНЫЙ СИНТЕЗ СЛОЖНЫХ ЦИФРОВЫХ АВТОМАТОВ

 

5.1 Концепция операционного и управляющего автомата

 

Для построения любого устройства управления необходимо, прежде всего, определить его функции и связи с объектом управления. В вычислительной технике под объектом управления подразумевается любой цифровой прибор, предназначенный для выполнения любых операций над информацией. К таким приборам, которые называются операционными, относятся контролер внешних устройств, разнообразные процессоры, каналы ввода-вывода, арифметико-логические устройства (АЛУ), память и др. Для упрощения процесса проектирования и понимания принципов действия операционных устройств, их принято разделять по структурному и функциональному отношению на два тесно взаимодействующих между собой блока: первый, выполняющий функции операционного автомата (ОА), второй – управляющего автомата (УА).

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

Иногда целесообразно рассматривать многоуровневое представление цифровой системы. Например, если рассматривать взаимодействие АЛУ и процессора, то процессор в этой связи представляет управляющий автомат, а АЛУ - операционный. Но при проектировании самого АЛУ в нем выделяется свой автомат управления, а к операционной части относятся его регистры, сумматор, счетчик сдвигов и т.п..

Итак, концепция состоит в том, что любое цифровое устройство можно представить в виде композиции 2-х автоматов: операционного и управляющего (рис.5.1).

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

Структура и функция операционного автомата определяется составом микроопераций, которые он должен реализовать. На операционный автомат поступают входные данные (Dh, h=1,H), выдаются результаты операции (Rq, q=1,Q). Внутри операционного автомата могут храниться промежуточные результаты (Sl, l=1,L). DÍS; RÍS.

Кроме того, операционный автомат подает признаки выполнения операции X (осведомительные сигналы).

Управляющий автомат определяет последовательность, алгоритм выполнения микрооперации в устройстве. Он вырабатывает распределенную во времени и пространстве последовательность управляющих сигналов.

X={x1, x2,..., xp}, p=1,P

Y={y1, y2,..., ym}, m=1,M

Если порядок действий над словами задается в виде схемы соединений, то такой автомат называется управляющим автоматом с жесткой логикой.

Второй тип управляющего автомата – управляющий автомат с гибкой логикой. В нем алгоритм обработки информации хранится в запоминающем устройстве (ЗУ).

Рисунок 5.1 – Структура операционного устройства

 

5.2 Принцип микропрограммного управления

Принцип микропрограммного управления состоит в следующем

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

2. Для управления порядком исполнения микроопераций из множества Y используют логическое условие из множества X.

3. Для управления порядком выполнения микроопераций используется алгоритм (микро алгоритм) выполнения сложного действия, задаваемый в виде совокупности микроопераций и логических условий и представляемый в виде граф-схемы алгоритма (ГСА) или микропрограммы.

4. Микропрограмма или ГСА используется как форма представления функций устройства, на основе которого определяется структура устройства и порядок выполнения действий во времени.

 

Функция операционного автомата определяется следующими множествами (рис. 5.2):

1. Множество входных слов D={d1, …, dH}, вводимых в автомат в качестве операндов.

2. Множеством выходных слов R={r1, …, rQ}, используемых для представления информации в процессе выполнения операции.

3. Множество внутренних слов S={s1, …, sN}, используемых для представления информации в процессе выполнения операции. В дальнейшем будем предполагать, что входные и выходные слова совпадают с определенными внутренними словами, то есть DÍS и RÍS.

4. Множествам микроопераций Y={ym} (m=1,M), реализующих преобразование S=jm(s) над словами информации, где jm – вычислительная функция.

5. Множество логических условий X={xl} (l=1,L), где xl=yl(s) и yl – булева функция.

Рисунок 5.2 – Структурная реализация операционного автомата

 

Таким образом, функция операционного автомата задана, если определены множества D, R, S, Y, X. Заметим, что время не является аргументом функции операционного автомата.

Функция устанавливает список действий – микрооперации логических условий – которые может выполнять автомат, но не определяет порядок следования во времени.

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

Функция управляющего автомата состоит в реализации граф схемы (микропрограммы) алгоритма управления, функциональные алгоритмы которой являются сигналы y1, …, yL.

Алгоритм управления наиболее часто представляется в виде граф схемы (микропрограммы) или в виде логической схемы алгоритма. Каждая из этих форм определяет временную последовательность реализации алгоритма – устанавливает порядок проверки логических условий x1, …, xL и порядок следования микроопераций y1, …, yM.

Операционный автомат разделяется на три части: память S; комбинационную схему j, реализующую микрооперации; комбинационную схему y, вычисляющую значения логических условий. Память S обеспечивает хранение слов S1, …, SN, которые представляют значения операндов D, промежуточные значения и конечные результаты R. Для выполнения микроопераций Y={ym} служит комбинационная схема j. Управляющие сигналы Y, формируемые управляющим автоматом, инициируют выполнение необходимых микроопераций.

Для вычисления значений логических условий служит комбинационная схема y, реализующая систему булевых функций X l:=jl(Sg 1, …, SgK), значения которых представляются осведомительными сигналами X ={ xl }.

Управляющий автомат в соответствии с кодом операции генерирует набор управляющих сигналов, который инициирует соответствующий набор микроопераций. Выполнение микроопераций приводит к изменению сотояния памяти операционного автомата – значений слов S1, …, SN. Состояние памяти S отображается множеством осведомительных сигналов X, которые анализируются управляющим автоматом для определения следующего набора микроопераций.

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

Количество тактов зависят от операции, которую реализует устройство, и состава системы образующих алгоритм Z=(j,y). Чем элементарнее (проще) функции j и y, тем больше число тактов требуется для выполнения операций.

Структура управляющего автомата и его связь с операционным автоматом показаны на рис. 5.3

Рисунок 5.3 – Структурная реализация управляющего автомата

 

Управляющий автомат состоит из запоминающей части и комбинационной части. Комбинационная часть это комбинационные схемы КС1 и КС2. Комбинационная схема 1 (КС1) служит для реализации внешних сигналов управления, с помощью которых управляют объектом управления. Комбинационная схема 2 (КС2) служит для получения сигналов возбуждения входов триггеров.

ОА – операционный автомат;

ОУ – объект управления;

D1, D2 – сигналы возбуждения триггеров.

Переключение автомата из состояния в состояние выполняется сигналом синхронизации C.

 

5.3 Содержательные и закодированные ГСА

 

Граф-схемой алгоритма (ГСА) называют ориентированный связанный граф, содержащий одну начальную вершину (А0), одну конечнуюk) и произвольное конечное множество операторных (A = {a1,..., ak-1}) и условных (P = {p1,..., pf}) вершин. Данные вершины изображены на рисунке 5.4 под буквами а, б, в и гсоответственно.

Рисунок 5.4 – Типы вершин ГСА

 

 

Конечная, операторная и условная вершины имеют по одному входу, начальная вершина входов не имеет, как и показано на рисунке. Начальная и операторная вершины имеют только по одному выходу, а условная - два выхода, помеченных символами 1 и 0. Конечная вершина выходов не имеет.

При построении ГСА должна удовлетворять следующим условиям:

1. Входы и выходы вершин соединяются друг с другом с помощью дуг, направленных всегда от выхода к входу;

2. Каждый выход соединен точно с одним входом;

3. Любой вход соединяется, по крайней мере, с одним выходом;

4. Любая вершина графа лежит, по крайней мере, на одном пути из начальной вершины к конечной вершине;

5. Один из выходов условной вершины может соединяться с ее входом, что недопустимо для операторной вершины. Такие условные вершины будем иногда называть возвратными вершинами;

6. В каждой условной вершине записывается один из элементов множества X = {x1,..., xL}, называемого множеством логических условий. Запись одинаковых элементов множества X в различных условных вершин разрешается;

7. В каждой операторной вершине записывается оператор (микрокоманда) Yt - подмножество множества Y = {y1,..., xN}, называемого множеством микроопераций. Y = {yt1,..., ytu,..., ytU}; ytU Î Y, u = 1,..., Ut. При Ut = 0 Yt = Æ, Разрешается также запись в различных операторных вершинах одинаковых подмножеств множества операций.

Оператор или микрокоманда – совокупность микроопераций, выполняемых одновременно за один такт. Микрооперации, выполняемые совместно (одновременно) в течении одного такта называются совместимыми микрооперациями.

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

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

Для записи функциональных микропрограмм используется язык функционального микропрограммирования (Ф - язык).

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

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

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

1. Описание слов и массивов, устанавливающее типы и форматы слов, с которыми оперирует микропрограмма.

2. Содержательный граф микропрограммы, который определяет алгоритм выполнения операций в содержательной форме – в виде описания микроопераций и логических условий.

Основным элементом информации, с которым оперирует Ф – микропрограмма, является слово. Наименование и формат слова задаются в следующем виде C(П12), где С – идентификатор; П1 и П2 – номера старшего и младшего двоичных разрядов слова. Разряды слова номеруются направо неотрицательными целыми числами n1>0, n2>0, n1<n2. Одноразрядное слово состоит только из идентификатора С.

Совокупность слов, имеющих одинаковую длину, может объединятся в массив. Массив описывается в следующем виде: M[m1:m2](n1:n2), где M – идентификатор массива; m1,m2 – границы номеров слов, составляющих массивов, причем m1<m2; n1,n2 – номера старшего и младшего разрядов слова.

В зависимости от способа использования значений выделяют следующие типы слов:

1. Входные слова – значения присваиваются вне микропрограммы и используются внутри микропрограммы.

2. Внутренние – значения присваиваются и используются только внутри микропрограммы.

3. Вспомогательные – значения присваиваются и используются только внутри микропрограммы, но существуют не постоянно, а только в течении такта автоматного времени (типа А).

4. Выходные – значения присваиваются в микропрограмме и используются вне ее (типа О).

Двоичное выражение определяет правило вычисления двоичного значения путем выполнения операций над первичными двоичными значениями. Константы записываются в следующем виде 11002, 148, 1210, С16.

Первичные двоичные значения, слова и поля – объединяются в двоичное выражение с помощью двоичных операций, к которым относятся обычно следующие операции: ù - инверсия, × конкатенация, Ù - конъюнкция, Ú-дизъюнкция, + - сложение, - - вычитание, Å - сложение по модулю 2.

Примерами двоичных выражений являются следующие конструкции:

А; В(0); ù А; С+1; С+А(1:15); С+112ù А(1:15)+1.

Последнее выражение вычисляется в следующем порядке – вначале инвертируются разряды 1-15 слова А ù А(1:15); затем формируется составляющее значение 110ù А(1:15); выполняется сложение с С составным значением С+112ù А(1:15); и последняя сумма складывается с 1.

В синтаксическом смысле микрооперация – это оператор присваивания, посредством которого слову присваивается значение двоичного выражения. Микрооперация состоит из левой части, знака присваивания (:=) и двоичного выражения в правой части.

Все микрооперации подразделяются на семь классов:

1. установки;

2. инвертирования;

3. предачи;

4. сдвига;

5. счета;

6. сложения;

7. бинарные логические;

8. комбинированные.

Микрооперация передачи – обеспечивает присваивание слову значение другого слова (А:=В). Микрооперация сдвига служит для изменения положения разрядов слова по отношению к начальному пути перемещения каждого разряда на k позиций влево или вправо. Операции сдвига обозначаются следующим образом:

Rh(A) – удаление из двоичного выражения А k младших правых разрядов, то есть сдвиг на k разрядов вправо.

Lk(A) – удаление из двоичного выражения A k старших левых разрядов, то есть сдвиг на k разрядов влево.

Бинарные логические микрооперации присваивают слову значение, получаемое поразрядным применением микроопераций Ù, Ú, Å к парам соответствующих разрядов слагаемых. Например, С:=АÚВ.

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

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

- шины, обеспечивающие передачу слов информации;

- регистры, обеспечивающие хранение слов;

- комбинационные схемы, посредством которых вычисляются значения функций.

Рассмотрим в качестве примера содержательную ГСА, описывающую устройство сложения двоичных чисел с использованием обратного кода. Sm=A+B (рис. 2.5).

После построения содержательной ГСА логические условия и микрооперации кодируются символами x1,..., xL и y1,..., yN соответственно.

Условия переходов (из условных вершин).

x1: signSm;

x2: signRg;

x3:переполнение?.

Микрооперации (из операторных вершин):

y1: Sm:=A;

y2: Rg:=B;

y3: Sm:=[Sm]обр;

y4: Sm:=Sm+[Rg]обр;

y5: Sm:=Sm+Rg;

y6: PP:=1.

Микрокоманды и соответствующие им микрооперации:

Y1={ y1, y2};

Y2={ y3};

Y3={ y4};

Y4={ y5};

Y5={ y6}.

Затем строится закодированная ГСА, в которой микрооперации и условия заменены идентификаторами (рис.5.6).

 

 

 

Рисунок 5.5 – Содержательная ГСА

 

 

Рисунок 5.6 – Закодированная ГСА

 

5.4 Канонический метод структурного синтеза сложного цифрового автомата

 

Автомат с числом внутренних состояний ≥3 является сложным автоматом. Реализуется на основе композиций некоторого числа более простых автоматов.

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

Суть канонического синтеза цифрового автомата состоит в сведении задачи синтеза сложного цифрового автомата к задаче синтеза комбинационных схем КС1 и КС2 (рис. 5.3). Канонический метод синтеза автомата состоит из 6 этапов:

1. Кодирование входных сигналов цифрового автомата (букв входного алфавита) двоичными кодами на входных структурных шинах X={x1, x2, …, xL}.

2. Кодирование букв выходного алфавита двоичными кодами на выходных структурных шинах автоматов Y={y1, y2, …, yM}.

3. Кодирование внутренних состояний автомата двоичными кодами состояний триггеров A={a1, a2, …, aK}.

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

5. Минимизация систем функций выхода и функций возбуждения и перевод их к заданному базису.

6. Построение схемы автомата.

Для формирования последовательности управляющих сигналов Y, соответствующей последовательности осведомительных сигналов X, можно использовать микропрограммный автомат (последовательную схему). При этом множество входных сигналов автомата определяется множеством логических условий (осведомительных сигналов), множество выходных сигналов определяется множеством управляющих сигналов, используемых для возбуждения микроопераций и законов функционирования автомата, задающем порядок преобразования входной последовательности X(0), X(1),…, X(t) в выходную последовательность Y(0), Y(1), …,Y(t), определяемую микропрограммой.

При синтезе микропрограммных автоматов вначале путём анализа содержательного смысла условных и операторных вершин Ф-микропрограммы определяют список (множество) Х и множество Y. Затем переходят от Ф-микропрограммы к закодированной ГСА, на которой вместо содержательного смысла проставлены имена и . Затем производят определение закона функционирования микропрограммного автомата (Мили или Мура) путём выполнения отметки внутренних состояний автомата на ГСА и построения структурных таблиц автоматов (прямых или обратных). На последнем этапе кодируют внутренние состояния автомата, записывают систему функций выхода и возбуждения входов триггеров, упрощают эти системы, переводят их в заданный схемотехнический базис и строят схему автомата.

 

5.5 Канонический метод синтеза микропрограммных автоматов Мили

 

Отметки внутренних состояний автомата Мили по закодированной ГСА выполняются по следующим правилам:

1. символом отмечается вход первой вершины, следующей за начальной, а также вход конечной вершины;

2. входы вершин, следующих за операторными вершинами, отмечаются символами ;

3. входы двух различных вершин, за исключением конечной, не могут быть отмечены одинаковыми символами;

4. вход вершины может отмечаться только одним символом.

Внутренние состояния автомата Мили отмечены на дугах ГСА (рис. 5.7).

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

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

Прямой структурной таблицей автомата Мили для ГСА на рис. 5.7 является таблица 5.1

 

Таблица 5.1 – Прямая структурная таблица для автомата Мили

h
        ,  
         
         
       
       

 

В таблице 5.1 h -указывает номер строки; – исходное состояние автомата для такта t; – двоичный код состояния ; – состояние перехода для момента времени t+1; – двоичный код состояния перехода; – условие перехода для строки h; – выходной сигнал на переходе из в для строки h; – сигналы возбуждения входов триггеров.

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

Рисунок 5.7 – Разметка ГСА по Типу автомата Мили

 

Структурная таблица автомата по существу является списочной формой (списком) представления графа переходов автомата, но более компактна по сравнению с ним.

В ряде случаев, оказывается более удобным пользоваться обратной структурной таблицей автомата (таблица 5.2), в которой столбцы обозначены точно также, но сначала записываются все переходы в , затем в и так далее. Таким образом, в прямой структурной таблице автомата Мили ведущим является столбец , в обратной таблице ведущим является столбец .

 

Таблица 5.2– Обратная структурная таблица для автомата Мили

h
         
        ,  
         
         
         

 

Теперь построим граф переходов для автомата Мили по табл. 5.2 или 5.1. Каждая строка таблицы соответствует дуге графа (рис.5.8).

Рисунок 5.8 – Граф переходов автомата Мили

 

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

Минимальное число триггеров для хранения состояний, определяется выражением

 

,

где n – число триггеров для хранения состояний;

k – количество состояний.

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

Для уменьшения сложности системы, реализующей функции возбуждения D-триггеров лучше использовать частотный алгоритм кодирования состояний автомата. Этот алгоритм состоит из 5-ти этапов.

1. Каждому внутреннему состоянию автомата аi ставится в соответствие целое число Ni, равное числу переходов в это состояние (Ni равно числу появлений состояния аi в таблице переходов или числу стрелок, входящих в аi в графе переходов).

2. Все числа N1, N2,… Ni,… NМ сортируются по убыванию.

3. Состояние at с максимальным значением Nt кодируется нулевой комбинацией, т.е. кодом kt=00…00;

4. Следующие n внутренних состояний кодируются кодовой комбинацией с одной единицей: 00…01, 00…10,…

5. Оставшиеся незакодированные внутренние состояния кодируют вначале комбинациями с двумя единицами, затем с тремя и т. д., пока все состояния не будут закодированы.

В результате получаем такое кодирование, при котором чем больше имеется переходов в некоторое состояние, тем меньше единиц содержится в его коде.

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

Кодирование состояний по выше рассмотренному алгоритму сведено в табл. 5.3

 

Таблица 5.3– Кодирование состояний автомата Мили на D -триггерах

    D 3 D 2 D 1
a1 – 2 a2 – 1 a3 – 2 a4 – 2 a5 – 2 a1 – 2 a3 – 2 a4 – 2 a5 – 2 a2 – 1  

 

Граф переходов с закодированными состояниями приведен на рис. 5.9. На дугах графа указаны разряды, на которые имеются единицы кодов состояний, куда входят дуги.

Рисунок 5.9 – Кодирование состояний автомата Мили

 

Коэффициент качества кодирования определяется как отношение числа букв D на графе к общему числу дуг.

Заполненная прямая структурная таблица для автомата Мили представлена в табл. 5.4.

 

Таблица 5.4 – Прямая структурная таблица для автомата Мили

h D 3 D 2 D 1
        ,  
         
     


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: