Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: синхронизировать тактовые частоты двух ПЛИС
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
AVR
Необходимо решить задачу синхронизации двух ПЛИС Spartan 6. Мне надо чтобы были синхронными импульсы 100 Гц, а уже расхождение в течение 10 мс в рамках допустимой погрешности будет при любом раскладе. Необходимо чтобы синхронность в пределах 1-2 мкс сохранялась в течение 5 минут. Казалось бы, требования простые, придумывая и тестируя различные методы на Verilog в симуляторе (имитируя расхождение частот в плюс и минус) мне удавалось решить задачу. А вот реальные испытания с осциллографом и двумя каналами (по триггеру смотрел расхождение) показали что решение никуда не годится...

У каждой ПЛИС свой внешний генератор на 50 МГц (KXO-V97, но не суть, там 50 ppm). Между собой они соединены по диф.-паре LVDS_33, помех нет.

Важный момент: после синхронизации ПЛИС должны быть разъединены, поэтому надо чтобы 5 минут потом сохранялось равенство тактовых частот, только вот установить еще надо их равными.

Я так понимаю что встроенный DCM решает такую задачу. Им я пользовался лишь для преобразования одной частоты в другую.

Вопрос: как пользоваться DCM для синхронизации двух тактовых частот? Как называется процесс или режим работы DCM? Есть ли статьи или туториалы?

Чтобы если одна базовая ПЛИС ушла по частота от 50 МГц на 752 Гц например, то чтобы вторая тоже имела такое же смещение (50000752 Гц).
Lmx2315
QUOTE (AVR @ Mar 3 2013, 02:12) *
Важный момент: после синхронизации ПЛИС должны быть разъединены, поэтому надо чтобы 5 минут потом сохранялось равенство тактовых частот, только вот установить еще надо их равными.

..это не возможно, вы можете синхронизировать только "часы" которые за какое-то ограниченное время потом разбегутся на какую-то ограниченную величину.
Тактовые частоты после разрыва синхронизации расходяться сразу же . И это при том что я так и не понял как это вы собрались синхронизировать тактовые генераторы KXO-V97 посредством DCM .
iosifk
Цитата(AVR @ Mar 3 2013, 02:12) *
Необходимо решить задачу синхронизации двух ПЛИС Spartan 6.


"Плезиохронные потоки"...
Вооюще такая задача решена в системах цифровой телефонии и передачи данных. Потоки Е3 и выше...
AVR
Цитата(Lmx2315 @ Mar 3 2013, 10:23) *
..это не возможно, вы можете синхронизировать только "часы" которые за какое-то ограниченное время потом разбегутся на какую-то ограниченную величину.
Пусть разбегаются. Мне нужно, чтобы пока они соединены - они были синхронны. После разъединения, допустимо чтобы они разбежались на пару микросекунд в течение пяти минут.
Цитата(Lmx2315 @ Mar 3 2013, 10:23) *
Тактовые частоты после разрыва синхронизации расходяться сразу же . И это при том что я так и не понял как это вы собрались синхронизировать тактовые генераторы KXO-V97 посредством DCM .
Я так понимаю что от Вас ответа уже получить я не смогу, ведь очевидно что же что второстепенная ПЛИС будет тактироваться при помощи DCM, который в свою очередь тактируется генератором.

Перефразирую вопрос: DCM позволяет выдавать тактовую, которая подавалась ему на вход? Если нет, то как вообще решить эту простую на первый взгляд задачу?

DCM в Spartan 6 может работать в режиме NCO (Numerically Controlled Oscillator)?

Могу всё путать, вот и обращаюсь за помощью... Задача: синхронизировать.
Lmx2315
QUOTE (AVR @ Mar 3 2013, 11:57) *
Пусть разбегаются. Мне нужно, чтобы пока они соединены - они были синхронны. После разъединения, допустимо чтобы они разбежались на пару микросекунд в течение пяти минут.

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

QUOTE
Я так понимаю что от Вас ответа уже получить я не смогу, ведь очевидно что же что второстепенная ПЛИС будет тактироваться при помощи DCM, который в свою очередь тактируется генератором.


не понял.

QUOTE
Перефразирую вопрос: DCM позволяет выдавать тактовую, которая подавалась ему на вход? Если нет, то как вообще решить эту простую на первый взгляд задачу?


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

QUOTE
DCM в Spartan 6 может работать в режиме NCO (Numerically Controlled Oscillator)?


такого раньше не слышал.
des00
NCO здесь вообще не к месту, потому что это обычный генератор работающий от генератора тактовой частоты.

Даже если вы возьмете хорошие генераторы ну положим со стабильностью 1ppm и частотой 50МГц то возможна ситуация когда мастер работает на частоте 49 999 950 Гц, а слейв на частоте 50 000 050 Гц. Опорники вы не синхронизируете никак.

Максимум что можете синхронизировать часы, которые считают ваши 100Гц. Реальную частоту, фазу и их уход легко посчитать из используемых вами генераторов.

ЗЫ. Судя по описанию вы используете в качестве опорных генераторов гуны. Если работчую точку вы задавали им делителем напряжения, то весь шум питания будет моделировать ваши опоры.
AVR
Цитата
Даже если вы возьмете хорошие генераторы ну положим со стабильностью 1ppm и частотой 50МГц то возможна ситуация когда мастер работает на частоте 49 999 950 Гц, а слейв на частоте 50 000 050 Гц. Опорники вы не синхронизируете никак.
Я в курсе что опорники никак. Мне надо нивелировать эффект ухода частота хотя бы на 5 минут работы схемы с отключенной синхронизацией. Пока кабель подключен - мой алгоритм уже позволяет держать синхронность, просто уход пока что большой, слишком быстро уползает.

Цитата
Максимум что можете синхронизировать часы, которые считают ваши 100Гц. Реальную частоту, фазу и их уход легко посчитать из используемых вами генераторов.
Как посчитать это в ПЛИС? Я считаю только на сколько Гц отличается один от другого.

Цитата
ЗЫ. Судя по описанию вы используете в качестве опорных генераторов гуны. Если работчую точку вы задавали им делителем напряжения, то весь шум питания будет моделировать ваши опоры.
Нет, у меня не ГУН, у меня просто KXO-V97 - он тупо выдает 50 МГц и никак не управляется - выдает как умеет...

Просто хочу понять - Spartan 6 в принципе позволяет сделать чтобы 50 001 463 Гц на одном генераторе, чтобы заставить чтобы второй DCM выдавал те же 50 001 463 Гц? Я так уже понял по ответа что нельзя =(
Lmx2315
QUOTE (AVR @ Mar 3 2013, 12:59) *
Я в курсе что опорники никак. Мне надо нивелировать эффект ухода частота хотя бы на 5 минут работы схемы с отключенной синхронизацией. Пока кабель подключен - мой алгоритм уже позволяет держать синхронность, просто уход пока что большой, слишком быстро уползает.

Как посчитать это в ПЛИС? Я считаю только на сколько Гц отличается один от другого.

Вы не сможете нивелировать уход частоты, но вы можете синхронизировать часы на время.

..сделайте счётчик микросекунд.

по результату работы счётчика микросекунд (как досчитает до 1000) - считайте миллисекунды.

По сигналу синхронизации от мастера - сбрасывайте в ноль счётчик микросекунд слейва.
des00
Цитата(AVR @ Mar 3 2013, 02:59) *
Я в курсе что опорники никак. Мне надо нивелировать эффект ухода частота хотя бы на 5 минут работы схемы с отключенной синхронизацией. Пока кабель подключен - мой алгоритм уже позволяет держать синхронность, просто уход пока что большой, слишком быстро уползает.

Как посчитать это в ПЛИС? Я считаю только на сколько Гц отличается один от другого.

хмм, частоты вы знаете. ставите 2 частоты фронт в фронт и считаете насколько они разойдутся за время 5 минут. Можно даже не считать, а тупо промоделировать.

Цитата
Просто хочу понять - Spartan 6 в принципе позволяет сделать чтобы 50 001 463 Гц на одном генераторе, чтобы заставить чтобы второй DCM выдавал те же 50 001 463 Гц? Я так уже понял по ответа что нельзя =(

если бы к вас был доступ ко входу петлевого фильтра PLL, тогда можно было бы занулить ошибку на его входе и тогда все бы определялось стабильностью встроенного гуна в DCM. Правда ЕМНИП в 6 ом спаратне DCM идут еще без гунов. на основе DPLL.

Как вариант можно на слейве сделать так : поставить гун, собрать ФАПЧ и рулить петлевым фильтром. Но гун тогда нужен с хорошей стабильностью(высокой ценой)
AVR
Спасибо за ответы! В общем ясно, мой текущий способ - единственный...

Видимо придется потом напрягать знакомого, который в этом рубит, чтобы сделать отдельную специальную схему, которая будет подавать тактовые импульсы.
des00
Кстати, совсем забыл про то, что вам не обязательно синхронизировать тактовые частоты. Судя по первому посту, вам нужно синхронизовать генераторы частоты 100Гц. Дык тут все просто, возможны варианты :
1. Измерить расстройку тактовых генераторов в слейве и в генераторе частоты 100Гц, сделать поправку.
2. Запетлевать генератор частоты в 100Гц в слейве, от генератора частоты 100Гц в мастере и потом занулить вход петлевого фильтра.

Если будет нужна синхронизация еще и по фазе, то и тут возможны разные варианты %)
AVR
Цитата(des00 @ Mar 3 2013, 15:02) *
Кстати, совсем забыл про то, что вам не обязательно синхронизировать тактовые частоты. Судя по первому посту, вам нужно синхронизовать генераторы частоты 100Гц. Дык тут все просто, возможны варианты :
1. Измерить расстройку тактовых генераторов в слейве и в генераторе частоты 100Гц, сделать поправку.
2. Запетлевать генератор частоты в 100Гц в слейве, от генератора частоты 100Гц в мастере и потом занулить вход петлевого фильтра.

Если будет нужна синхронизация еще и по фазе, то и тут возможны разные варианты %)

Петлевой фильтр это как (я в курсе что это, но конкретно для XC6SLX9 это как)? Это внутри ПЛИС делается на своей логике? Или это делается каким-то блоком внутри Spartan 6 (у меня slx9)?
des00
Цитата(AVR @ Mar 3 2013, 05:08) *
Петлевой фильтр это как (я в курсе что это, но конкретно для XC6SLX9 это как)? Это внутри ПЛИС делается на своей логике? Или это делается каким-то блоком внутри Spartan 6 (у меня slx9)?

внутри плис, на своей логике естественно. Как раз тут и потребуется вам NCO генератор.

На этом генераторе вы собираете в слейве генератор на 100Гц это подстраиваемый генератор. Из принятой тактовой мастера генерируете 100Гц. Это будет опорный генератор. Затем все тривально, фазовый детектор, интегратор ошибки, петевой фильтр. Ну и настроить это дело %)
Timmy
Получается, что Вам требуются генераторы со стабильностью частоты в течение 5 минут не хуже 0.02ppm, это достаточно серьёзные аппараты, никак не KXO-V97. Думаю, что ваш цифровой алгоритм не работает именно из-за естественного разбегания недостаточно стабильных кварцев.
des00
правда эти 100Гц будут с небольшим джиттером. который будет определяться отношением 100Гц к тактовой частоте, на которой реализован NCO и коэффициентом пересчета.

Цитата(Timmy @ Mar 3 2013, 05:15) *
Получается, что Вам требуются генераторы со стабильностью частоты в течение 5 минут не хуже 0.02ppm, это достаточно серьёзные аппараты, никак не KXO-V97. Думаю, что ваш цифровой алгоритм не работает именно из-за естественного разбегания недостаточно стабильных кварцев.

ИМХО в порядке ошиблись. Требуемая стабильность частоты 100Гц = 2мкс/10мс = 200ppm.

Цитата(des00 @ Mar 3 2013, 05:13) *
Из принятой тактовой мастера генерируете 100Гц. Это будет опорный генератор.

а пропустив через интерфейс 100Гц с мастера и используя их как опорный генератор, еще и по фазе генераторы выровняете sm.gif
AVR
Цитата(des00 @ Mar 3 2013, 15:46) *
а пропустив через интерфейс 100Гц с мастера и используя их как опорный генератор, еще и по фазе генераторы выровняете sm.gif
вот этот момент, если честно, не понял
des00
Цитата(AVR @ Mar 3 2013, 05:51) *
вот этот момент, если честно, не понял

для работы фазового детектора нужна опорная частота 100Гц, ее можно получить двумя способами :
1. Подав с мастера 100Гц
2. Подав с мастера тактовую частоту и регенировать из нее 100Гц в слейве.

Во втором случае между частотами мастера и слейва будет ошибка по фазе, определяемая начальной фазой регенаратора частоты в сейве.
Timmy
Цитата(des00 @ Mar 3 2013, 15:46) *
ИМХО в порядке ошиблись. Требуемая стабильность частоты 100Гц = 2мкс/10мс = 200ppm.

Просто мне показалось, что ТС говорит не об отклонении периода частоты 100Гц на 1 мкс в течение 5 мин, а об интегральной разности фаз, набегающей за 5 мин. В первом случае задача вроде решается однократной подстройкой обычного цифрового делителя.
khach
Вместо KXO-V97 ставим подходящий VCXO, выделяем две ноги Спатрана под выход фазового детектора, операционник и ФНЧ на вход управления VCXO. В начале общения по протоколу договариваемся, кто будет ведущим, а кто ведомым. У ведущего отключаме ФД и устанавливаем PWM половину диапазона регулировки VCXO, ну или предустановленное при калибровках из епрома или откуда еще. А второй вводим в синхронизацию с первым. Или тупо подаем на ФД такотовые 100 Гц импульсы от внешней и от внутренней системы, или разность фаз определяем счетным методом- в последенем случае можно быстрее войти в синхронизм.
AVR
Цитата(khach @ Mar 3 2013, 17:39) *
Вместо KXO-V97 ставим подходящий VCXO, выделяем две ноги Спатрана под выход фазового детектора, операционник и ФНЧ на вход управления VCXO. В начале общения по протоколу договариваемся, кто будет ведущим, а кто ведомым. У ведущего отключаме ФД и устанавливаем PWM половину диапазона регулировки VCXO, ну или предустановленное при калибровках из епрома или откуда еще. А второй вводим в синхронизацию с первым. Или тупо подаем на ФД такотовые 100 Гц импульсы от внешней и от внутренней системы, или разность фаз определяем счетным методом- в последенем случае можно быстрее войти в синхронизм.

Это уже потом будет, обязательно будет, увы не сейчас...
Я не профи, для меня настолько безобразная разница в таких дешевеньких генераторах оказалась неожиданностью.
des00
2 AVR вы бы задачу описали, тогда можно было бы не гадать
AVR
Цитата(des00 @ Mar 3 2013, 17:57) *
2 AVR вы бы задачу описали, тогда можно было бы не гадать

Задача:
Есть две ПЛИС. У каждой свой генератор. Частоты различаются. На несколько секунд их можно соединить кабелем, затем 5 минут работы автономно.
Необходимо сделать так, чтобы импульсы (пусть будет 1 КГц, не 100 Гц) в течение 5 минут на одной плате были как можно более синхронны к 1 КГц импульсам на второй плате.

Цель: необходимо замерять время хода звука с высокой точностью (есть датчики к ПЛИС с соответствующей аналоговой схемой), поэтому хотя бы 5 минут должно быть более менее стабильно.
skv
Цитата(AVR @ Mar 3 2013, 02:12) *
Необходимо решить задачу синхронизации двух ПЛИС Spartan 6. Мне надо чтобы были синхронными импульсы 100 Гц, а уже расхождение в течение 10 мс в рамках допустимой погрешности будет при любом раскладе. Необходимо чтобы синхронность в пределах 1-2 мкс сохранялась в течение 5 минут. Казалось бы, требования простые, придумывая и тестируя различные методы на Verilog в симуляторе (имитируя расхождение частот в плюс и минус) мне удавалось решить задачу. А вот реальные испытания с осциллографом и двумя каналами (по триггеру смотрел расхождение) показали что решение никуда не годится...

У каждой ПЛИС свой внешний генератор на 50 МГц (KXO-V97, но не суть, там 50 ppm). Между собой они соединены по диф.-паре LVDS_33, помех нет.

Важный момент: после синхронизации ПЛИС должны быть разъединены, поэтому надо чтобы 5 минут потом сохранялось равенство тактовых частот, только вот установить еще надо их равными.

Я так понимаю что встроенный DCM решает такую задачу. Им я пользовался лишь для преобразования одной частоты в другую.

Вопрос: как пользоваться DCM для синхронизации двух тактовых частот? Как называется процесс или режим работы DCM? Есть ли статьи или туториалы?

Чтобы если одна базовая ПЛИС ушла по частота от 50 МГц на 752 Гц например, то чтобы вторая тоже имела такое же смещение (50000752 Гц).


Боюсь, что сделать "часы реалього времени" на дешевой комерческой базе, но с точностью атомных ччастов не получиться. Все зависит от точности опорного тактового генератора. Никакие синтезаторы не могут скомпенсировать неточность тактового генератора. Это не их задача. Они для этого не предназначены. Они лишь делят и умножают опорную частоту, чтобы получить требуемую. Сами посчитайте. При 50 ppm за 5 минут в худшем случае разбегутся на 30 мс. Чтобы обеспечить ваши требования нужно чтобы точность тактовых генераторов была 0,00х ppm. Лично я таких генераторов не встричал.

Можно попробовать подобрать. Но нужно обязательно генератор с компенсацией температурного дрейфа. Иначе все усилия пойдут "коту под хвост"

Цитата(AVR @ Mar 3 2013, 19:22) *
Задача:
Есть две ПЛИС. У каждой свой генератор. Частоты различаются. На несколько секунд их можно соединить кабелем, затем 5 минут работы автономно.
Необходимо сделать так, чтобы импульсы (пусть будет 1 КГц, не 100 Гц) в течение 5 минут на одной плате были как можно более синхронны к 1 КГц импульсам на второй плате.

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


Для этого не надо высокоточных генераторов.
Задача решается калибровкой системы по эталонному звуковому сигналу. Грубо говоря, подбираете сколько тактов 50 МГ-цовой частоты укладывается в периоде эталонного 100 Г-цового сигнала
AVR
Цитата(skv @ Mar 3 2013, 19:55) *
Для этого не надо высокоточных генераторов.
Задача решается калибровкой системы по эталонному звуковому сигналу. Грубо говоря, подбираете сколько тактов 50 МГ-цовой частоты укладывается в периоде эталонного 100 Г-цового сигнала

Именно так я сейчас и делаю и это нашел как единственное решение, которое мне видимо придется доводить до ума, потому что пока что разлетается частота быстрее расчетов.

Только сигнал у меня 20-40 КГц, а 1 КГц - это лишь частота синхроимпульсов.

Я создал тему чтобы узнать - есть ли в Spartan 6 что-нибудь для идеального решения задачи. Оказалось нет.
des00
Цитата(AVR @ Mar 3 2013, 09:22) *
Необходимо сделать так, чтобы импульсы (пусть будет 1 КГц, не 100 Гц) в течение 5 минут на одной плате были как можно более синхронны к 1 КГц импульсам на второй плате.

Что дальше происходит с этими импульсами ? они идут вне плис или используются в качестве стробов/сигналов для обработки внутри плис ?


Как бы есть простая технология цифровой привязки "виртуальных тактовых частот" (т.е. частоты, на которой идет обработка сигнала, не путать с тактовой частотой), как раз на описанной выше ФАПЧ. Использую ее в связных модемах, в задачах когда нужно передавать/принимать синхронные потоки при использовании одного эталонного генератора. Но не знаю подойдет ли она вам, там есть определенные ограничения (например требование на тактовую частоту устройства Ft > Fsymb), в особенности что касается аналого-цифровых стыков.

вот только генераторы надо будет подобрать получше, хотя бы 5ппм %)

Цитата(khach @ Mar 3 2013, 07:39) *
Вместо KXO-V97 ставим подходящий VCXO, выделяем две ноги Спатрана под выход фазового детектора, операционник и ФНЧ на вход управления VCXO. В начале общения по протоколу договариваемся, кто будет ведущим, а кто ведомым. У ведущего отключаме ФД и устанавливаем PWM половину диапазона регулировки VCXO, ну или предустановленное при калибровках из епрома или откуда еще. А второй вводим в синхронизацию с первым. Или тупо подаем на ФД такотовые 100 Гц импульсы от внешней и от внутренней системы, или разность фаз определяем счетным методом- в последенем случае можно быстрее войти в синхронизм.

угу, а когда внешний клок пропадает, как будете фиксировать уровень управления гуном? генерировать требуемую последовательность фазового детектора? Петлевой фильтр в цифре делать надо. Ну и по управлению либо шумоподобный шим либо ЦАП ставить %)
Iptash
На ведущей плате передатчик посылающие синхросигналы, на ведомой плате приемник. Или не?
des00
Цитата(Iptash @ Mar 3 2013, 10:43) *
На ведущей плате передатчик посылающие синхросигналы, на ведомой плате приемник. Или не?

не внимательно читали условие задачи sm.gif
Iptash
Ну вот же.
Цитата(AVR @ Mar 3 2013, 19:22) *
Задача:
Есть две ПЛИС. У каждой свой генератор. Частоты различаются. На несколько секунд их можно соединить кабелем, затем 5 минут работы автономно.
Необходимо сделать так, чтобы импульсы (пусть будет 1 КГц, не 100 Гц) в течение 5 минут на одной плате были как можно более синхронны к 1 КГц импульсам на второй плате.

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

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

Хм. Опять непонятно наверное выразился.
Для точного измерения некой велечины между двумя разнесенными устройствами, необходимо чтобы их генераторы точно работали синхронно, поэтому нужно раз в 5мин. синхронизировать эти устройства между собой, иначе синхронизация уплывает. Вот я и предлагаю синхронизироваться удаленно с помощью передатчика
синхроимпульсов на ведущем устройстве и приемником на ведомом.
AVR
Цитата(Iptash @ Mar 3 2013, 22:07) *
Вот я и предлагаю синхронизироваться удаленно с помощью передатчика синхроимпульсов на ведущем устройстве и приемником на ведомом.

На каком принципе? Может оптическом? Потому что расстояние в течение 5 минут будет неизвестно.

Есть светодиод, он мигает синхроимпульсами, зная инерционность этого процесса - определяем точное время, так?

Устройства будут разъединены и находиться на произвольном расстоянии и произвольной ориентацией в пространстве.
Iptash
Цитата(AVR @ Mar 3 2013, 22:13) *
На каком принципе?

Радиоволны.
Boris_TS
Цитата(skv @ Mar 3 2013, 19:55) *
Чтобы обеспечить ваши требования нужно чтобы точность тактовых генераторов была 0,00х ppm. Лично я таких генераторов не встричал.

Для расширения кругозора: ОАО «Морион» СПб - вдруг да пригодиться.
AVR
Цитата(Boris_TS @ Mar 3 2013, 23:37) *
Для расширения кругозора: ОАО «Морион» СПб - вдруг да пригодиться.

Пригодится то что я смогу приехать и достать в течение дня в Санкт-Петербурге wink.gif
AVR
Цитата(Boris_TS @ Mar 3 2013, 23:37) *
Для расширения кругозора: ОАО «Морион» СПб - вдруг да пригодиться.

Спасибо! Вот уже больше недели с ними работаю - купил две штуки 20 МГц с 0.2 ppm - обошлось в почти 4 тысячи рублей за каждый, вчера смог оценить их точность: если перезапустить их спустя сутки - разница окажется одинаковой, равно как и после нескольких часов работы.

В общем - они действительно очень стабильны. Хотя "Морион" показался жуткой совковой конторой по отношению к клиенту и по методам работы, и еле нашел как добраться до их склада...

Проблема решена - решал алгоритмически.

Если кому интересно как - пишите в личку сообщение (чтобы я не пропустил) sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.