рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Лекция № 7 5-тый курс Тема: Структурная методология описания проектов цифровых систем устройств с регулярной структурой посредством оператора generate

Лекция № 7 5-тый курс Тема: Структурная методология описания проектов цифровых систем устройств с регулярной структурой посредством оператора generate - раздел Образование, Лекция № 7 (5-Тый Курс) Тема: Ст...

Лекция № 7 (5-тый курс)

Тема: Структурная методология описания проектов цифровых систем (устройств) с регулярной структурой посредством оператора generate.

О задании глобальных параметров проекта из внешней среды (оператор generic( ))

(Структурная методология описания проектов систолических цифровых систем (устройств) посредством оператора generate)

Вопросы по теме:

  1. Вводные замечания

Оператор generate порождающей схемы for

Оператор generate порождающей схемы if

4. О задании глобальных настроечных параметров для проекта из внешней среды (оператор generic( ))

Систолическими цифровыми устройствами в цифровой схемотехнике принято называть такие устройства, которые содержат в своей структуре (архитектуре) множество однотипных (абсолютно одинаковых) по своему устройству элементов (компонентов). Примерами цифровых устройств с регулярной структурой являются N-разрядный двоичный счетчик, N-разрядный сумматор. Так N-разрядный двоичный счетчик содержит в своей структуре множество однотипных триггеров (триггеров типа D или триггеров типа JK). В свою очередь, N-разрядный сумматор содержит в своей структуре множество полных однотипных одноразрядных сумматоров. Заметим, что в систолических цифровых устройствах схема соединений компонентов часто также является регулярной.

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

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

Значительно упростить процесс создания проектов цифровых устройств (имеющих большую разрядность) с систолической структурой можно за счет применения оператора generate.

Применение оператора generate (generate statement) также значительно уменьшает объем описание проектов устройств с регулярной структурой.

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

Таким образом, применение оператора generate даст возможность определить группу идентичных компонентов, использующих только одну спецификацию компонента и многократное внедрение спецификации компонента за счет генерирующего (порождающего) механизма оператора.

По своему конструктивному устройству операторgenerate относится к классу составных операторов.

Конструкция Оператора generateсостоит из трех главных частей:

· Объявления generation scheme (порождающей (генерирующей) схемы). Порождающая схема может иметь вид for или видif; Порождающая схема for определяет, каким образом (сколько раз) должны выполнятся операторы, располагаемые в подразделе выполняемых конкурентных операторов. Порождающая схема for определяет, каким образом (сколько раз) должны выполнятся операторы, располагаемые в подразделе выполняемых конкурентных операторов. Порождающая схема ifопределяет, каким образом (при каком условии) должны выполнятся операторы, располагаемые в подразделе выполняемых конкурентных операторов

 

· Подраздела Деклараций (В подразделе деклараций могут располагаться локальные объявления подпрограмм, типов, сигналов, констант, компонентов, атрибутов, конфигураций, файлов и групп);

· Подраздела выполняемых конкурентных (параллельно выполняемых) операторов.

 

 

2. Оператора generateпорождающей схемы for

Оператора generateпорождающей схемы forимеет такой синтаксис:

Label(метка) : forparameter (переменная цикла) inrange (параметры цикла) generate

[ { declarations – подраздел деклараций}

begin ]

{ concurrent_statements – подраздел конкурентных операторов}

end generate [ label ] ;

 

· Каждый оператор generateпорождающей схемыfor… generate должен иметь метку.

· Если оператор generateпорождающей схемыfor… generate не содержит никакие локальные объявления, то ключевое слово beginиспользовать не нужно.

· Оператор generateпорождающей схемыfor… generate может быть вложенным.

· Оператор обязательно должен заканчиваться ключевыми словами end generate

 

 

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

Пример 1 иллюстрирует применение концепции порождающей схема for в VHDL проекте 4-битного двоичного счетчика, где в качестве компонент использованы 4 триггера типа D.

Для наглядности иллюстрации этой концепции на Рис.1 приведена схема электрическая принципиальная двоичного счетчика реализованного (instantiates) из N D-триггеров.

 

 

Рис. 1. Двоичный N-битный накапливающий счетчик.

Пример 1.

Субпроект триггера типа D. (Этот Субпроект является определением будущей компоненты (component D_FF), которая будет многократно внедряться, в проект счетчика с систолической структурой) entity D_FF is port (D,CLK_S : in BIT; Q : out BIT := '0'; NQ : out BIT := '1' ); end entity D_FF; architecture A_RS_FF of D_FF is begin BIN_P_RS_FF: process(CLK_S) begin if CLK_S = '1' and CLK_S'Event then Q <= D; NQ <= not D; end if; end process; end architecture A_RS_FF; Субпроект верхнего уровняДвоичного 4-битного накапливающего счетчика. entity COUNTER_BIN_N is generic (N : Integer := 4); port (Q : out Bit_Vector (0 to N-1); IN_1 : in Bit ); end entity COUNTER_BIN_N; architecture BEH of COUNTER_BIN_N is component D_FF port(D, CLK_S : in BIT; Q, NQ : out BIT); end component D_FF; signal S : BIT_VECTOR(0 to N); begin S(0) <= IN_1; G_1 : for I in 0 to N-1 generate D_Flip_Flop :D_FF port map(S(I+1), S(I), Q(I), S(I+1)); end generate; end architecture BEH;

 

В примере 1 сначала дана спецификация D триггера, который затем использован в качестве компонента (в соответствии с объявлением component D_FF) в проекте верхнего уровня entity COUNTER_BIN_N. Оператор generate порождающей схемы for… generate используется в проекте верхнего уровня entity COUNTER_BIN_N, чтобы 4-ре раза внедрить компонент component D_FF посредством оператора внедрения компонента D_Flip_Flop :D_FF port map(S(I+1), S(I), Q(I), S(I+1)); Количество внедрений компонента component D_FF определено параметрами переменной цикла I. Предельное верхнее значение параметра N переменной цикла I указано в проекте посредством оператора generic (N : Integer := 4);

 

Оператор generate порождающей схемы if

Оператора generate порождающей схемы if имеет такой синтаксис:

label (метка): if condition (условие)generate

[ { declarations – подраздел деклараций}

begin ]

{ concurrent_statements – подраздел конкурентных операторов}

end generate [ label ] ;

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

· Каждый оператор generateпорождающей схемыif... generate должен иметь метку.

· Если оператор generateпорождающей схемыif... generate не содержит никакие локальные объявления, то ключевое слово beginиспользовать не нужно.

· Оператор generateпорождающей схемыif... generate может быть вложенным.

· Оператор обязательно должен заканчиваться ключевыми словами end generate

 

Примером цифрового устройства с полурегулярной структурой является синхронный двоично-десятичный счетчик. Схема электрическая принципиальная двоично-десятичного счетчика построенного на базе JK-триггеров показана на Рис.2. Схема такого счетчика помимо JK-триггеров содержит в своем составе логические элементы И-НЕ.

 

 

Рис. 2. Накапливающий счетчик ДВОИЧНО-ДЕСЯТИЧНОГО КОДА.

Как видно из рис.2, схема счетчика помимо регулярного блока (Regular block)

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

«Палочкой-выручалочкой», при создании VHDL проекта такого счетчика, может стать оператор generate порождающей схемы if ... generate.

В примере 2 показана методология применения оператора generate порождающей схемы if ... generate.

Пример 2

-- the BCD counter (Проект счетчика entity COUNTER_BCD разработан здесь, в предположении того, что определение компонент component D_FF и component NAND_GATE уже существуют) entity COUNTER_BCD is–- объявление проекта port (IN_1 : in Bit; --объявление входных портовQ:out Bit_Vector(0 to 3)); --объявление выходных портов end entity COUNTER_BCD; architecture STRUCT of COUNTER_BCD is --объявление и определение архитектурыcomponent D_FF -–объявление компоненты port (J, K, CLK_S : in BIT; Q: out BIT); end component D_FF; component NAND_GATE -–объявление компоненты port (IN1, IN2 : in Bit; OUT1 : out Bit); end component NAND_GATE; signal S: Bit_vector(0 to 2); --объявление внутреннего сигнала signal L: Bit_vector(0 to 1); begin--подраздел выполняемых конкурентных операторов тела архитектуры D_FF_0 : D_FF port map ('1','1',IN_1, S(0)); --оператор внедрения компонента (крайнего левого - - триггера на схеме рис.2) Gen_1 : for I in 1 to 3 generateGen_2 : if I = 1 or I = 2 generate- - оператор порождающий проверку компонент - - входящих в регулярный блок Рис.2 D_FF_I : D_FF port map (S(I-1),S(I-1), IN_1, L(I-1));--внедр.D_FF NAND_I : NAND_GATE port map(S(I-1),L(I-1), S(I));--внедр.NAND_GATE Q(I) <= L(I-1); -- назначение значения выходному порту Q(I) end generate Gen_2; Gen_3 : if I = 3 generate- - оператор порождающий проверку правой крайней компоненты - - Рис.2 D_FF_3 : D_FF port map (S(I-1),S(I-1), IN_1, Q(I) ); end generate Gen_3; end generate Gen_1; Q(0) <= S(0); --назначение значения выходному порту Q(0) end STRUCT;

В проекте примера 2 применение вложенных операторов Gen_2 : if I = 1 or I = 2 generateиGen_3 : if I = 3 generateпозволило сократить объем описания проекта. Ведущий оператор Gen_1 : for I in 1 to 3 generateдоопределил в проекте три старших разряда, т.е. сгенерировал инструкциями (операторами) своего тела внедрение компонент номера которых на схеме ассоциированы с со значением переменной цикла I.

 

 

Примечание:

Операторы Generate обеих модификаций могут содержать в своем подразделе конкурентных операторов любой из следующих операторов: любую разновидность параллельного назначения значения сигналу, оператор process, оператор block, оператор параллельного утверждения, параллельный оператор вызова подпрограммы-процедуры, оператор внедрения компонента, и другие операторы Generate (т.е. операторы: concurrent signal assignment statement, process statement, block statement, concurrent assertion statement, concurrent procedure call statement, component instantiation statement, and another generate statement).

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

 

Пример 3.

Этот пример иллюстрирует возможности оператора Generate при создании проекта 16-ти разрядного параллельного сумматора с последовательным переносом по структурной методологии. Сумматор этого вида представляет собой полурегулярную структуру, содержащую 1 полусумматор и 15 полных одноразрядных сумматоров. Схема электрическая принципиальная сумматора показана на Рис.3

 

 

 

Рис.3

 

Субпроект полусумматора. (Этот Субпроект является определением компоненты (Component half_adder), которая будет один раз внедрена, в проект параллельного сумматора с систолической структурой)

-----------------------------------------------------------------------------------------------------------

ENTITY Half_adder IS

PORT (a,b : IN Bit; Sum, c : OUT Bit );

END ENTITY Half_adder ;

ARCHITECTURE Half_adder OF Half_adder IS

BEGIN

Sum <= a XOR b;

c <= a AND b;

END ARCHITECTUREHalf_adder ;

------------------------------------------------------------------------------------------------------------

Субпроект полного одноразрядного сумматора. (Этот Субпроект является определением компоненты (Component full_adder), которая будет 15 раз внедрена, в проект параллельного сумматора с систолической структурой)

----------------------------------------------------------------

ENTITY Full_adder IS

PORT (a,b,c0 : IN Bit ; Sum, c : OUT Bit );

END ENTITY Full_adder ;

ARCHITECTURE Full_adder OF Full_adder IS

BEGIN

Sum <= (a XOR b) XOR c0 ;

c <= (a AND b) OR (a AND c0) OR (b AND c0);

END ARCHITECTUREFull_adder ;

Проект вехнего уровня в котором внедряются сомпонентыHalf_adder и Full_adder посредством оператора Generate

--------------------------------------------------------------------------

ENTITY parallel_adder_N IS

GENERIC (width : Integer := 16);

PORT (Sum : OUT Bit_Vector (0TO width -1);

a,b : IN Bit_Vector (0TO width -1); carry : OUT Bit );

END ENTITY parallel_adder_N;

 

ARCHITECTURE parallel_adder OF parallel_adder_N IS

SIGNALc_in : Bit_Vector (1TO width );

Componenthalf_adder is

PORT (a,b : IN Bit; Sum,c : OUT Bit );

End Component;

Componentfull_adder is

PORT (a,b,c0 : IN Bit ; Sum, c : OUT Bit );

End Component;

Begin

adder: FOR i IN 0 TO width-1 GENERATE

ml_bit: IF i=0 GENERATE

ml_cell: half_adder PORT MAP (a(0), b(0), sum(0), c_in(1));

END GENERATE ml_bit;

 

sr_bit: IF i>0 AND i<width-1 GENERATE

sr_cell: full_adder PORT MAP (a(i), b(i), c_in(i), sum(i), c_in(i+1));

END GENERATE sr_bit;

 

st_bit: IF i=width-1 GENERATE

st_cell: full_adder PORT MAP (a(i), b(i), c_in(i), sum(i), carry);

END GENERATE st_bit;

END GENERATEadder;

END ARCHITECTUREparallel_adder ;

----------------------------------------------------------------------------------------------------------

Примечание:В проекте примера 3 разрядность параллельного сумматора определена в операторе GENERIC (width : Integer := 16);

Важное замечание: Сам оператор GENERATE относится конкурентных операторов и поэтому всегда располагается в подразделе конкурентных выполняемых операторов тела архитектуры.

 

 

4. О задании глобальных настроечных параметров для проекта из внешней среды

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

Особую актуальность вопрос задания параметров проекта из внешней среды приобретает в настоящее время, так как практически каждый год обновляется технологическая база производства СБИС микросхемотехники. Если например, при производстве СБИС 3 года назад максимально допустимое время задержки на вентиль лежало в пределах 10 нс, то сегодня эта цифра составляет 2 –3 нс.

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

Это качество обеспечивает возможность многократного использования разработанных VHDL проектов, т.е. их переносимость.

В языке VHDL возможность задавать общие (глобальные) параметры для настройки конкретных характеристик разрабатываемых проектов цифровых устройств из внешней среды обеспечивается оператором Generic( )

Оператором Generic( ) имеет такой синтаксис:

 

generic(generic_interface_list);

где: generic_interface_list представляет собой список глобальных настроечных параметров проекта. При чем глобальные параметры в списке отделяются друг от друга символом точка с запятой ( ; ).

 

 

В справочном руководстве по языку VHDL об операторе Generic( ); сказано следующее:

 

1. Оператор Generic( ); предназначен для задания значений глобальных параметров программным объектам данных типа signal (port). С его помощью очень удобно задавать в проекте разрядность порта, тактовую частоту работы процессора. Очень часто этот оператор называют константой интерфейса. Оператор Generic( ) может быть объявлен также в теле оператора block, в теле объявления component ( ) или объявления проектируемого объекта (entity). Другими словами, оператор Generic( ) обеспечивают канал для статических (постоянных) данных, которые будут сообщены создаваемому проекту (блоку) снаружи (из окружающей среды). В отличие от программных данных типа constant (констант), значения общих параметров может быть инициализировано внешним образом, или в операторе реализации (внедрения) компонента или в спецификации конфигурации.

Оператор Generic(…) поддерживает также статическую (постоянную) информацию необходимую для работы других операторов проекта подобным образом, как и программные данные типа constant. В отличие от constant, значения данных содержащихся в операторе generic(...) могут быть инициализированы внешним образом. Подобно оператору port(…), оператор generic(... ) может быть объявлен в подразделе объявлений проектируемого объекта (в entity) и объявлениях component( ). Однако, оператор generic(...) всегда должен объявляться перед оператором port(…).

Значения общих параметров настройки, содержащиеся в теле оператора generic( ), который объявлен в теле оператора entity (в подразделе объявления проектируемого объекта) видимы и в entity( ) проекта и в теле архитектуры, связанной с этим entity( ). В частности, как говорилось выше, оператор generic( ), может использоваться, чтобы:

· определить разрядность (ширину) портов (пример 1),

· число подкомпонентов внутри блока,

· частотные характеристики синхронизации блока (пример 2),

· физические характеристики проекта,

· ширину (разрядногсть) векторов внутри тела архитектуры,

· число итераций цикла и т.д.

Примеры:

Пример 1

entity CPU is generic (BusWidth : Integer := 16); port(DataBus : inout Std_Logic_Vector(BusWidth-1 downto 0)); . . .

 

В объявлении проекта entity CPU оператор generic(BusWidth : Integer := 16), с параметром BusWidth : Integer := 16 используется, чтобы объявить разрядность порта DataBus. Этот параметр может быть успешно применен во всех объявлениях сигналов (шин) в теле связанной с проектом архитектуры. Этим способом конструктор может обеспечить только значение для одного общего параметра, действие которого распространяется на весь проект.

 

Пример 2

entity Gen_Gates is generic (Delay : Time := 10 ns); port (In1, In2 : in Std_Logic; Output : out Std_Logic); end Gen_Gates; architecture Gates of Gen_Gates is begin . . . Output <= In1 or In2 after Delay; . . . end Gates;

 

В объявлении проекта entity Gen_Gates оператор generic (Delay : Time := 10 ns); определяет временную задержку Delay : Time := 10 ns проектируемого устройства или задержку для назначения значений сигналу Output.

 

Пример 3

--Проект управляемого генератора вырабатывающего заданное

--количество импульсов с управляемыми из внешней среды

-- параметрами периода и скважности

 

library IEEE;

use IEEE.STD_LOGIC_1164.all;

 

entity clk_generic is

generic ( lenght0 : Time := 15 ns; lenght1 : Time := 35 ns);

port( A : in integer;

clk1 : out std_logic);

end clk_generic;

 

architecture clk_generic_ar of clk_generic is

begin

process

begin

if A = 0 then

clk1 <= '0';

else

for i in 1 to A loop

clk1 <= '1';

wait for lenght1;

clk1 <= '0';

wait for lenght0;

end loop;

end if;

wait on A;

end process;

end clk_generic_ar;

 

Временная диаграмма работы проекта

 

Важные примечания:

Большинство инструментальных средств синтеза поддерживают работу с оператором generic (…), только когда параметры, содержащиеся в его списке, имеют тип integer.

 

– Конец работы –

Используемые теги: Лекция, 5-тый, курс, Тема, Структурная, Методология, описания, проектов, цифровых, систем, устройств, регулярной, структурой, посредством, оператора, generate0.183

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Лекция № 7 5-тый курс Тема: Структурная методология описания проектов цифровых систем устройств с регулярной структурой посредством оператора generate

Что будем делать с полученным материалом:

Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Еще рефераты, курсовые, дипломные работы на эту тему:

Лекция №8 5-тый курс Тема: Структурная методология описания проектов цифровых систем устройств посредством оператора configuration
Лекция тый курс... Тема Структурная методология описания проектов цифровых систем устройств посредством оператора configuration...

Лекция 1. Тема: Операционная система. Определение. Уровни операционной системы. Функции операционных систем. 1. Понятие операционной системы
Понятие операционной системы... Причиной появления операционных систем была необходимость создания удобных в... Операционная система ОС это программное обеспечение которое реализует связь между прикладными программами и...

Курс русской истории Лекции I—XXXII КУРС РУССКОЙ ИСТОРИИ Лекции I—XXXII ЛЕКЦИЯ I Научная задача изучения местной истории
Все книги автора... Эта же книга в других форматах... Приятного чтения...

Курс русской истории Лекции I—XXXII Курс русской истории – 1 КУРС РУССКОЙ ИСТОРИИ Лекции I—XXXII Василий Осипович Ключевский
Курс русской истории Лекции I XXXII... Курс русской истории...

До виконання курсового проекту з дисципліни ТЕОРІЯ ЕЛЕКТРОПРИВОДУ на тему: Розрахунок і аналіз перехідних процесів у електроприводі системи генератор-двигун Завдання на курсовий проект
до виконання курсового проекту... з дисципліни ТЕОРІЯ ЕЛЕКТРОПРИВОДУ... на тему Розрахунок і аналіз перехідних процесів у електроприводі системи генератор двигун...

Учебная программа курса. 4. Лекция 1. История психологии как наука. 5. Лекция 2. Античная философия и психология. 6. Лекция 3. Развитие психологии в Средневековый период. 19. Лекция 16. Тревога и защита
Введение... Учебная программа курса... Рабочая программа курса Лекция История психологии как наука...

Курсовой проект Тема: «Разработка структурной схемы и расчет основных характеристик системы оперативной связи гарнизона пожарной охраны»
гражданской обороны чрезвычайным ситуациям и... ликвидации последствий стихийных бедствий... Уральский институт Государственной Противопожарной службы...

МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ВЫПОЛНЕНИЮ КУРСОВОГО ПРОЕКТА Курсовой проект выполняют в соответствии с заданием на проектирование систем водоснабжения
Курсовой проект выполняют в соответствии с заданием на проектирование систем водоснабжения водоотведения и внутренних водостоков объекта... В задании приводятся все необходимые для проектирования исходные данные... В характеристике объекта проектирования указываются следующие основные данные назначение зданий их число этажность...

Лекции 1.ОСНОВНЫЕ ПОНЯТИЯ И КАТЕГОРИЯ ИНФОРМАТИКИ. 2 ЛЕКЦИИ 2. МАТЕМАТИЧЕСКИЕ ОСНОВЫ ИНФОРМАТИКИ. СИСТЕМЫ СЧИСЛЕНИЯ. 12 ЛЕКЦИЯ 3. АППАРАТНОЕ ОБЕСПЕЧЕНИЕ ЭВМ. 20 ЛЕКЦИЯ 4. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ КОМПЬЮТЕРОВ.. 49 Широко распространён также англоязычный вар
gl ОГЛАВЛЕНИЕ... Лекции ОСНОВНЫЕ ПОНЯТИЯ И КАТЕГОРИЯ ИНФОРМАТИКИ... ЛЕКЦИИ МАТЕМАТИЧЕСКИЕ ОСНОВЫ ИНФОРМАТИКИ СИСТЕМЫ СЧИСЛЕНИЯ...

0.037
Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • По категориям
  • По работам