Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт мар 19, 2024 13:41

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: VHDL: основы
СообщениеДобавлено: Сб фев 07, 2009 02:06 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Итак, начинаем краткий "почти онлайновый" цикл семинаров по VHDL. Почти онлайновый - потому что материалы будут выкладываться на ходу, и на ходу же правиться, в соответствии с уточнениями и вопросами. Это не цикл статей и не учебный курс. Цикл статей или учебник - дело примерно годовой работы. За лекциями - в учебный центр... желательно Xilinx ;)

Итак, VHDL. HDL = Hardware Description Language, то есть язык описания аппаратуры. V само по себе аббревиатура от аббревиатуры - VHSIC (Very High-Speed Integrated Circuits). HDL возникли довольно давно, когда стало понятно, что просто так интегральную микросхему спроектировать не получится - возможны не только технологические ошибки, но и принципиальные просчеты. Микросхема работает, но ее работа не соответствует "высокоуровневым", прагматическим критериям. Поэтому появились языки, которые позволяли без изготовления чипа моделировать (!) его работу. Очень важно, что HDL - это в первую очередь языки моделирования. Производители ПЛИС в определенный момент включились в этот поток, обеспечив создание конфигураций ПЛИС по HDL-описаниям. Для этого в VHDL существует синтезируемое подмножество - набор конструкций языка, который действительно приводит к появлению на кристалле схемы. Кроме этого, существуют также vendor-specific подмножества - то, что добавляет конкретный производитель. Все это обуславливает необходимость достаточно аккуратно относиться к процессу описания схем на VHDL. Во-первых, не все написанное и показанное на модели окажется в кристалле. Во-вторых, кое-что может оказаться актуальным только для ПЛИС одного производителя (а то и одного семейства).

Пример:

Код:
a <= '1' after 3 ns;
b <= '1';


Эти строки делают одно и то же - подают на соответствующие линии логическую единицу. В первом случае добавлено ключевое слово after 3 ns. Может показаться (и даже существуют ошибочные утверждения), что после просмотра такого текста инструментальные средства создадут соединение с задержкой в 3 нс. Однако ключевое слово after не относится к синтезируемому подмножеству! Программа моделирования покажет эту задержку, полагая, что разработчик каким-то образом знает, какая именно задержка будет в этой схеме. Однако программа синтеза проигнорирует данное ключевое слово, и сделает так, как это возможно в данном устройстве. Надо отметить, что в процессе получения кристалла все задержки будут определены достаточно точно.
Вообще процесс создания конфигурации ПЛИС состоит из следующих этапов.

Synthesize - получение списка связей проекта по HDL-описаниям и другим источникам (схемам, state diagrams). Этот этап может быть проделан и САПР сторонних фирм, не производящих ПЛИС. Однако сами производители включают в состав своих САПР достаточно неплохие синтезаторы, менять которые на начальных этапах не имеет какого-либо смысла.
Implementation - этот этап может быть выполнен только с помощью САПР производителя. Это принципиальнейший момент. Формат файла конфигурации является строго охраняемым коммерческим секретом, и это в том числе и в интересах пользователей - иначе узнать схему проекта можно будет просто по файлу конфигурации. Implementation в САПР Xilinx состоит из следующих фаз
Translate - объединение отдельных синтезированных компонентов
Map - "отображение" компонентов на физические ресурсы конкретного типа (например, триггер может находиться в логической ячейке или в блоке ввода-вывода, надо определить, в какой тип ресурсов его поместить)
Place & Route - размещение и трассировка. Компоненты помещаются в конкретные физические локации кристалла, между ними программируются связи.

Данное перечисление сделано не случайно. Дело в том, что моделирование проектов выполняется также на разных стадиях. Существует достаточно много программ, которые могут выполнять функциональное моделирование. В этом случае преобразования сигналов производятся мгновенно - точнее, программа моделирования не показывает задержки между изменениями источника и приемника (просто потому, что не располагает информацией о таких задержках). Именно в этом случае интерес представляет несинтезируемое подмножество VHDL, поскольку даже не имея САПР ПЛИС, можно получать достаточно адекватные модели микросхем. Однако это дело довольно нетривиальное, и, имея более эффективный для обучения путь, не стоит замыкаться в программах, которые могут только моделировать, да и то с активным участием разработчика.
Что же дают САПР ПЛИС? У них есть еще два этапа, на которых можно получить модель. Первый, несколько промежуточный - post-map моделирование. САПР уже имеет информацию, через компоненты какого типа будет проходить сигнал. Это уже достаточно адекватное представление о структуре временных задержек. Минус в том, что информация все же не совсем точная, плюс в том, что для совсем уж больших проектов post-map получается существенно раньше, чем...
post-route модель. Вот это уже весьма и весьма адекватная, в пределах известного производителю, модель физических компонентов кристалла. Эту модель называют также gate-level (модель вентильного уровня). Про VHDL можно забыть, моделирование проводится с учетом поведения конкретных компонентов ПЛИС, с моделями компонентов, тщательно проверенными производителями. Иными словами, даже без кропотливой работы по описанию задержек в VHDL можно получать адекватные модели, показывающие поведение разработанной микросхемы очень и очень близко к реальности.

Вывод: для освоения VHDL и ПЛИС крайне рекомендуется взять САПР ПЛИС какого-либо производителя. Прежде всего, это полный маршрут проектирования. Это достаточно хорошие синтезатор и программа моделирования, которые, будучи интегрированы в единую систему, могут показать разработчику, даже не имеющему на столе микросхемы, достаточно адекватную картину разработанного им проекта. САПР забирается в бесплатном варианте с сайта производителя.
www.altera.com
www.xilinx.com
(Лично мне существенно проще демонстрировать все с помощью САПР/устройств Xilinx)

Итак, предположим, что САПР ISE Webpack установлен и запущен. Модули, в том числе VHDL, создаются с помощью достаточно удобного мастера, который сам включает в шаблон все необходимое. Благодаря этому среди всего многообразия необходимых в VHDL конструкций можно записывать только наиболее сущностные. Итак, что же создаст этот мастер:

Код:
entity <entity_name> is
generic (
   <generic_name> : <type> := <value>;
   <other generics>...   
);
port (
   <port_name> : <mode> <type>;
   <other ports>...
);
end <entity_name>;
         

architecture <arch_name> of <entity_name> is
   -- declarative_items (signal declarations, component declarations, etc.)
begin
   -- architecture body
end <arch_name>;
      


Entity - это "сущность". Можно рассматривать ее как коробочку с модулем. На коробочке есть разъемы - ports. Для каждого из них указаны имя, режим (вход, выход, двунаправленный) и тип (один из преопределенных типов VHDL). Раздел generics необязателен, он содержит "конструкторские" параметры - например, константы.

В разделе architecture собственно и описано, что же делает модуль. Внутри можно описать вспомогательные сигналы, компоненты, типы и прочее, которые будут видны только внутри данного модуля. После ключевого слова begin надо и описать, как будет себя вести новая коробочка.

Типов в VHDL достаточно много. Вообще, VHDL строго типизированный язык. Несколько сбивает с толку, что среди типов, предусмотренных в языке, имеются и несинтезируемые. Например, тип time, который предназначен только для описания временных задержек, или real, string и character, предназначенные для управления синтезом "изнутри" (например, можно задать температуру в градусах Цельсия в разделе generic, и потом принимать решение о синтезе того или иного фрагмента схемы; можно также в том же generic задать строковые константы, которые будут использоваться при выводе сообщений, ни то, ни другое не попадет в кристалл).

Итак, если очень грубо, то в VHDL следует начать с использования таких сигналов.

std_logic - это просто провод. Есть еще bit, который тоже "просто провод", но он принимает значения строго '0' и '1' (кстати, именно так, в одинарных кавычках aka апостроф). std_logic может принимать целых 9 значений, среди которых, кроме bit, еще 'z' (третье состояние, оно же высокий импеданс, оно синтезируется), а также 'x' (unknown), 'u' (undefined), 'l', 'h', и так далее. Еще раз обращаем внимание, что эти состояния несинтезируемы, но для модели довольно полезны. В частности, если мы что-то забыли, то увидим 'x' на модели, и придется разобраться, что сделано не так.

Группа проводов называется std_logic_vector. Он указывается с индексами. a : std_logic_vector(7 downto 0). Или a : std_logic_vector(0 to 7); Первое используется чаще, потому что значения присваются так же, как объявлены индексы. То есть значение "10000000" (теперь в двойных кавычках, потому что тип другой) в первом случае присвоит единичку 7-му разряду, а во втором - нулевому. Первое несколько привычнее. К отдельным разрядам можно обращаться по индексам, например, a(3). Еще можно "склеивать" числа меньшей разрядности в одно большое.
Код:
a(7 downto 0) <= "111" & '0' & "1100";


Наконец, можно захотеть писать числа и без кавычек. Это можно сделать для типа integer. x : integer range 0 to 100. Ключевое слово range необязательно, но без него для сигнала будут отведены стандартные 32 разряда. Расточительно. Поэтому следует указать диапазон чисел, которые будут присваиваться такому сигналу. В принципе, это тоже группа проводов, как и std_logic_vector, только вместо их количества указывается желаемый диапазон чисел, а синтезатор сам подбирает разрядность. Кстати, это не означает, что в микросхеме будут предусмотрены какие-то средства, чтобы другие числа там никак не могли оказаться. САПР просто будет контролировать наши попытки загрузить числа вне диапазона (хотя, возможно, и подходящие по разрядности).

Как строго типизированный, VHDL не позволяет просто так присваивать std_logic_vector и integer друг другу. Для этого требуется использовать функции преобразования типа. Например, если определены

Код:
a : std_logic_vector(7 downto 0);
x : integer range 0 to 255;

(что, в принципе, одно и то же), то возможны следующие преобразования.

Код:
x <= conv_integer(a);
a <= conv_std_logic_vector(x, 8 );


В последнем случае разрядность необходимо указать явно. Дело в том, что в случае, когда в std_logic_vector кладется константа, она не обязана занимать всю ширину. Например, 1 может быть представлен единственным разрядом, младшим. Поэтому разработчик должен явно указать число разрядов, которыми требуется представить целочисленную константу или сигнал.

Как было нетрудно понять, можно назначать сигналам уровни с помощью оператора присваивания. Это <=. Такой оператор означает, по сути, "прокладку провода" из правой части-источника к левой части-приемнику. Сигналы, описывая "провода", очень похожи на переменные языков программирования. Однако не стоит путать их с переменными-variable, которые тоже существуют в VHDL, но они опять-таки, как правило, несинтезируемы, а представляют собой в основном вспомогательные программные объекты, необходимые САПР для работы. Теперь, имея такую информацию о языке, можно попробовать выполнить упражнение.

1) Создаем в проекте VHDL module, выбирая для него входы a, b и выход c.
2) Убеждаемся, что в разделе ports эти сигналы объявлены мастером как std_logic и в разделе architecture пишем выражение c <= a and b;
3) Пробуем другие варианты.
4) Все это синтезируется, пропускается через Implement и тщательно исследуется.

to be continued...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб фев 07, 2009 02:42 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
В случае Quartus II одно уточнение - std_logic и std_logic_vector можно использовать только после явного указания

Код:
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_unsigned.all;


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

eще одна квартусовая кака - конструкция conv_std_logic_vector(x, 8 ); вызывает ошибку.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб фев 07, 2009 02:54 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
WingLion писал(а):
В случае Quartus II одно уточнение - std_logic и std_logic_vector можно использовать только после явного указания

Код:
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_unsigned.all;


При чем, как показала моя короткая практика,
эти строчки надо пихать перед каждым entity,

Да, все так. Это стандартные библиотеки, и ISE их ставит автоматически. Именно из тех соображений, что все равно понадобятся.

WingLion писал(а):
eще одна квартусовая кака - конструкция conv_std_logic_vector(x, 8 ); вызывает ошибку.

Она тоже определена именно в ISE, и используется в каждом модуле "из коробки". Удобно. Впрочем, это функция, и значит, может быть определена самостоятельно.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Вс сен 04, 2011 10:46 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Подымая тему замечу, что с AHDL я таки соскочил и последние месяцы почти все делаю только на VHDL. Плюс схематик на верхнем уровне.

Верхний уровень с VHDL применяю только для моделирования небольших кусочков схем и для выдачи результатов работы (по ТЗ все должно быть в HDL).

Чтобы повысить удобство почти делаю с помощью VHDL-пакетов.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Вс сен 18, 2011 12:04 
Не в сети
Аватара пользователя

Зарегистрирован: Чт апр 26, 2007 21:09
Сообщения: 303
Благодарил (а): 12 раз.
Поблагодарили: 10 раз.
WingLion писал(а):
Подымая тему замечу, что с AHDL я таки соскочил и последние месяцы почти все делаю только на VHDL.

Нельзя ли в одной-двух фразах рассказать о причинах "перескока"?
Субъективность или - что-то особенное?
Я просто беспокоюсь. У нас тут ряд проектов начинается и есть среди "железячников" "активное ядро", которое чуть ли не до драки требует всё разрабатывать именно на AHDL-е...
Я-то - лицо, скажем непричастное, но - охота знать, чем и их и ваш выбор обусловлен.
Что бы представлять себе, вокруг чего так страсти кипят и копья ломаются...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Вс сен 18, 2011 19:07 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Wlad писал(а):
Нельзя ли в одной-двух фразах рассказать о причинах "перескока"?


Первая и последняя причина в том, что VHDL - более универсальный язык с точки зрения применимости к ПЛИС разных фирм.
AHDL - это Altera и только Altera.
VHDL - это и Altera, и Xilinx, и Actel... (а с другими я и не сталкивался)

Плюс - мне надо теперь не только с ПЛИС фирмы ALTERA работать, но и с Xilinx.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Пн сен 19, 2011 01:07 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Wlad писал(а):
Я просто беспокоюсь. У нас тут ряд проектов начинается и есть среди "железячников" "активное ядро", которое чуть ли не до драки требует всё разрабатывать именно на AHDL-е...
Я-то - лицо, скажем непричастное, но - охота знать, чем и их и ваш выбор обусловлен.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Пн сен 19, 2011 05:02 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
В последнее время делаю проекты на VHDL примерно по такой схеме:

Код:
-- всяческие объявления входов/выходов/entity/architecture здесь пропускаю

    signal object1 : type_for_object1;
    signal object2 : type_for_object2;
--  .... и так далее, сколько надо отдельных объектов в проекте
    signal object3 : type_for_object3;

begin

-- главные функции объектов
   process(clk) begin if (clk'event and clk=vcc) then
    object1 <= Main_Object1(object1, inputs1);
    object2 <= Main_Object1(object2, inputs2);
    object3 <= Main_Object1(object3, inputs3);
    end if; end process;
-- соединения входов и выходов (очень примерный пример)
    inputs1.c <= inputs_from_input;
    inputs1.a <= input_a;
    inputs1.b <= object2.ouputs;
    inputs3 <= object1.outputs_for_3;
    inpusts2.x <= object1.outputs_for2;
    inputs2.y <= object3.outputs_for_2;




условные "объекты" - это составляющие части схемы (отдельные конечные автоматы)
Main_objects* - главные функции объектов, описанные в отдельных пакетных файлах

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

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

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Чт июн 14, 2012 12:11 
Понадобилась мне вот такая конструкция в VHDL

Код:
         if ct = 2 then
            case (count) is
               when (begin1 to (begin1 + zazor1)) => bla-bla-bla;
               when (begin2 to (begin2 + zazor2)) => blo-blo-blo;
               when others => blu-blu-blu;
            end case;
         end if;


В Квартусе проходит на ура и работает как надо, а ISE 10.1xxx ругается по чем зря...

Диапазоны в case у Xilinx-а принципиально не подерживаются или надо как-то иначе делать?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Чт июн 14, 2012 14:59 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Первый вариант - да, видимо не любит он выражений после when. Второй вариант - begin1 (ну вдруг?) не integer, тогда к нему нельзя применить to.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Вс июн 24, 2012 06:14 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
WingLion from work писал(а):
В Квартусе проходит на ура и работает как надо, а ISE 10.1xxx ругается по чем зря...

Диапазоны в case у Xilinx-а принципиально не подерживаются или надо как-то иначе делать?



Сделал нужную функциональность с помощью if-ов.

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Сб янв 05, 2013 21:44 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 660
Благодарил (а): 7 раз.
Поблагодарили: 25 раз.
может и не актуально уже, но все же: пара документов - "Spartan-6 Libraries Guide for HDL Designs" и Spartan-6 FPGA Block RAM Resources"
http://www.programmableplanet.com/author.asp?section_id=2011&doc_id=256760&
ссылки см. по тексту


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Сб мар 30, 2013 15:14 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
сМЕШНОЙ ВОПРОС ВОЗНИК
Как на VHDL ОПИСАТЬ T-ТРИГГЕР? тот, что по обоим фронтам перекидывается

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Сб мар 30, 2013 15:32 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7958
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
WingLion писал(а):
Как на VHDL ОПИСАТЬ T-ТРИГГЕР? тот, что по обоим фронтам перекидывается

Никак, такого в ячейках нет. То есть описать-то можно, но синтезатор будет сильно ругаться. Триггеры DDR находятся в блоках ввода-вывода, их можно вставить через instantiation (т.е. сослаться на аппаратный примитив и описать назначение выводов через port map).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: VHDL: основы
СообщениеДобавлено: Сб мар 30, 2013 20:46 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
похоже, меня бес попутал... То, что мне было нужно - совсем не то, что написал выше..

Код:
process (tc) begin
if tc'event and tc = vcc then
tff <= tff xor t_ena;
end process;

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB