|
Правильное использование locked у PLL |
|
|
|
Jan 22 2015, 18:27
|
Местный
  
Группа: Участник
Сообщений: 294
Регистрация: 25-09-13
Из: Н.Новгород
Пользователь №: 78 485

|
Приветствую! Имеется Cyclone4, а в нём имеется PLL. Как известно PLL на рабочий режим выходит не сразу, сразу после запуска она выдаёт нестабильную частоту. Тактировать схемы такой нестабильной частотой, понятное дело, нельзя - могут сбойнуть. Для этого в PLL предусмотрен специальный выход "locked". Доподлинно неизвестно синхронизирован ли этот выход с тактовой частотой выдаваемой PLL, или нет. Потому встаёт вопрос: как правильно использовать этот выход. Я предлагаю такую схему:
На Verilog-е выглядит так: Код module M1( .................................... (*chip_pin = "Y2"*) input inMHz50);
wire Locked33_6, MHz33_6_; PLL1 PLL1(.c0(MHz33_6_), .locked(Locked33_6), .inclk0(inMHz50)); wire Enable33_6Q; DFF Enable33_6(.q(Enable33_6Q), .d(Locked33_6), .clk(MHz33_6_), .clrn(1'd1), .prn(1'd1)); wire MHz33_6; LCELL Cell(.out(MHz33_6), .in(Enable33_6Q & MHz33_6_));
.......ля-ля-ля тополя....... endmodule LCELL нужен только для того чтобы на него сослаться в констрейнах, по другому я не сумел. Сами констрейны выглядят так: Код derive_clock_uncertainty
#тактовая частота с генератора 50МГц create_clock -period 50MHz -name {inMHz50} [get_ports {inMHz50}]
#тактовая частота с PLL create_generated_clock -name MHz33_6_ -source [get_ports {inMHz50}] [get_pins {PLL1|altpll_component|auto_generated|pll1|clk[0]}] -divide_by 5 -multiply_by 7 -duty_cycle 70.00 create_generated_clock -name MHz33_6 -source [get_pins {PLL1|altpll_component|auto_generated|pll1|clk[0]}] [get_nets {Cell}] -invert То что в названии частоты присутствует 33,6 МГц - это пережиток прошлого, сейчас там 70. В последней строчке я и ссылаюсь на LCELL, "-invert" присутствует из-за того что компилятор по каким-то своим причинам инвертирует сигнал после LCELL. Вопроса, собственно, два: Правильно ли использовать выход "locked" подобным образом? И если правильно, правильно ли заданы констрейны?
Сообщение отредактировал Jackov - Jan 22 2015, 18:28
|
|
|
|
|
 |
Ответов
|
Feb 5 2015, 16:50
|
Местный
  
Группа: Участник
Сообщений: 294
Регистрация: 25-09-13
Из: Н.Новгород
Пользователь №: 78 485

|
Цитата(Jackov @ Feb 3 2015, 20:41)  Не совсем, у меня в always-е два сигнала фигурируют, там один. Попробую завтра так сделать, отпишусь что получилось. Цитата(Krys @ Feb 4 2015, 06:09)  Ну да, у Вас асинхронный сброс, не вчитался. Просто сотрите его из олвейза ))) Будет сброс синхронный, а засинтезируется он как клок енэйбл. И наверняка (потом покажете кусок схемы) он ляжет как дополнительный вход LUTа, стоящего перед входом данных триггера. По опыту, не хочет синтезатор подключать сигналы типа CE к соответствующим входам триггера, лучше ему через LUT. Ну на то есть причины конечно (хотя это касается Xilinx, в Альтере может и захочет). В общем вот. Имеем такой код: Код module test(output reg Q, input D, En, input Clk); always @(posedge Clk) begin if(En) begin Q = D; end end endmodule Синтезатор, вроде, ссинтезировал правильно  А вот как развелось
Такое ощущение, что надо чего-то в настройках повращать. Запускал в Квартуе 9.1 для Циклона 4. Цитата(SM @ Feb 4 2015, 20:55)  1) CLB CE. 2) BUFGCE. 3) Gated clock.
Но, в данном, конкретном случае, явно BUFGCE просится, ввиду особенности задачи. Поясните ньюфагу по хардкору. Если всё правильно понял, то Gated clock - это разрешение клока на триггере, BUFGCE - переключатель клоков с входом разрешения. CLB CE - это что за зверь? Цитата(ViKo @ Feb 4 2015, 21:23)  Топикстартеру надо пересмотреть свою позицию: Разверните мысль, пожалуйста.
Сообщение отредактировал Jackov - Feb 5 2015, 16:51
|
|
|
|
|
Feb 6 2015, 05:20
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(Jackov @ Feb 5 2015, 23:50)  Синтезатор, вроде, ссинтезировал правильно  А вот как развелось
Такое ощущение, что надо чего-то в настройках повращать. Запускал в Квартуе 9.1 для Циклона 4. Ничего удивительного. Именно для вашего примера, использование сигнала En, как сигнала разрешения ENA триггера в LE не эффективно. Причины объясняются тут Cyclone IV Device Handbook -> Logic Elements and Logic Array Blocks in Cyclone IV Devices -> Logic Array Blocks. Цитата ..... Each LAB consists of the following features: ■ 16 LEs ■ LAB control signals ■ LE carry chains ■ Register chains ■ Local interconnect ...... LAB Control Signals Each LAB contains dedicated logic for driving control signals to its LEs. The control signals include: ■ Two clocks ■ Two clock enables ■ Two asynchronous clears ■ One synchronous clear ■ One synchronous load ....... Логический вывод из этого думаю сможете сделать самостоятельно. Это кстати касается всех современных ПЛИС.
--------------------
|
|
|
|
|
Feb 6 2015, 05:44
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(des00 @ Feb 6 2015, 08:20)  Логический вывод из этого думаю сможете сделать самостоятельно. Это кстати касается всех современных ПЛИС. Вот, кстати, именно в данном случае, в проекте из одного триггера, это логике и не поддается. По разводке оба варианта одинаковы (какая разница, завести enable на LAB CE, или на LUT, все равно куда-то заводить, конкуренции между этими сигналами в данной схеме нет), а вот лишний LUT занят (кол-во LUT - вроде как один из критериев оптимизации). И, кстати, это далеко не всех ПЛИС и сред касается:
Эскизы прикрепленных изображений
|
|
|
|
|
Feb 6 2015, 05:55
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(SM @ Feb 6 2015, 13:44)  Вот, кстати, именно в данном случае, в проекте из одного триггера, это логике и не поддается. По разводке оба варианта одинаковы (какая разница, завести enable на LAB CE, или на LUT, все равно куда-то заводить, конкуренции между этими сигналами в данной схеме нет), а вот лишний LUT занят (кол-во LUT - вроде как один из критериев оптимизации). Немного не корректно. В случае использования clkena для одного LE из LAB, у вас "убивается" весь LAB. Т.е. вы уже не можете использовать триггеры других 15 ти LE. А LUT можете использовать либо для многолютовой комбинаторики либо для нагрузки триггеров из другого LAB. И в общем случае это приведет к перерасходу ресурсов разводки и не возможности register packing. Тоже самое касается сигналов sclr и sload. А то что ква делает так, ну вот такой у него оптимизатор. Даже в проекте из одного триггера на миллионный чип. Кстати LAB в первых сыклонах был 10LE и там чудно делались сложные (с использованием сигналов clear/load/enable) 40 бит аккумуляторы. В старших, пришлось кое где уйти на 32 бита. Цитата И, кстати, это далеко не всех ПЛИС и сред касается: Как я понимаю это ячейка латекса, подскажите что за чип, посмотрю даташит, вполне возможно что у них в аналоге LAB есть дополнительные ключи на отключение clkena части триггеров от общего управления UPD. В стратиксе 5 ом, в LAB 10ALM, в каждом 4 ре триггера. И там, цена желания что бы на счетчике был именно clkena (ручная вставка dffeas примитивов) еще выше. UPD2. Посмотрел на вашу картинку внимательнее. Судя по всему верхняя половина LE не задействована. Вам повезло, "убийство" верхнего триггера вы не заметили. Вот будет у вас более плотный дизайн, тогда думаю обратите на это внимание
--------------------
|
|
|
|
|
Feb 6 2015, 06:09
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(des00 @ Feb 6 2015, 08:55)  И в общем случае это приведет к перерасходу ресурсов разводки А причем тут "общий случай" и какие-то гипотетические триггеры и сигналы, которые могут быть нужны и которых нет? У нас случай вполне себе частный, и конкретный, от автора: Код module test(output reg Q, input D, En, input Clk); always @(posedge Clk) begin if(En) begin Q = D; end end endmodule 1) В части разводки конкуренции нет, больше цепей нет в принципе, следовательно, критерий отпадает (умножается на коэфф. конкуренции = 0). 2) В части нужности других CE - тоже нет, тоже критерий отпадает (умножается на коэфф. конкуренции = 0). 3) В части нужности других триггеров в LAB - опять, конкуренции нет, опять, критерий отпадает (умножается на коэфф. конкуренции = 0). 4) А вот LUT - он и ток кушает, и место (area) занимает, так что критерий имеет вес. Вот его и следует соптимизировать, заведя сигнал на CE. Цитата(des00 @ Feb 6 2015, 08:55)  Как я понимаю это ячейка латекса, подскажите что за чип, посмотрю даташит, вполне возможно что у них в аналоге LAB есть дополнительные ключи на отключение clkena части триггеров от общего управления Нет там таких ключей, CE тоже общий. Любой смотрите на выбор, разводится одинаково (я проверил на XO2, XO3, XP, XP2, ECP2, ECP3). Просто, там, оптимизатор делает свою работу более логично, нежели квартус. PS А когда количество enable-ов от одного сигнала возрастает, так, тем более, есть прямой смысл их объединять в кучу и заводить на CE, и не только на LAB/SLICE CE, но и в более глобальные ресурсы разводки.
|
|
|
|
|
Feb 6 2015, 06:16
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(SM @ Feb 6 2015, 14:09)  А причем тут "общий случай"? У нас случай вполне себе частный, и конкретный, от автора: Код module test(output reg Q, input D, En, input Clk); always @(posedge Clk) begin if(En) begin Q = D; end end endmodule 1) В части разводки конкуренции нет, больше цепей нет в принципе, следовательно, критерий отпадает (умножается на коэфф. конкуренции = 0). 2) В части нужности других CE - тоже нет, тоже критерий отпадает (умножается на коэфф. конкуренции = 0). 3) В части нужности других триггеров в LAB - опять, конкуренции нет, опять, критерий отпадает (умножается на коэфф. конкуренции = 0). 4) А вот LUT - он и ток кушает, и место (area) занимает, так что критерий имеет вес. Вот его и следует соптимизировать, заведя сигнал на CE. Нет там таких ключей, CE тоже общий. Любой смотрите на выбор, разводится одинаково (я проверил на XO2, XO3, XP, XP2, ECP2, ECP3). Просто, там, оптимизатор делает свою работу более логично, нежели квартус. Это все софистика при решении задачи о сферическом коне в вакууме. Вы гуру вам виднее и опыта у вас больше. Мои результаты по утаптыванию проектов в чипы от альтер приводил на форуме кучу раз. 99.5-99.8 % занятого дспешным кодом третьего сыклона, хлопающего на частоте 192МГц (у него триггерная 250). Всё после изучения даташитов и логических выводов о работе квартуса.
--------------------
|
|
|
|
|
Feb 6 2015, 06:18
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(des00 @ Feb 6 2015, 09:16)  Это все софистика при решении задачи о сферическом коне в вакууме. А Вы вернитесь в мир реальный, к реальному элементарному исходнику из одного триггера, о котором речь в теме идет, и который неоптимально укладывается квартусом. А не о забитии 99% кристалла. PS Может, если ему дать больше приоритета на Area, и заведет? Я сейчас посмотрел, в моей среде по умолчанию стоит и Area, и Timing driven. UPD: Убрал "Area", ничего не поменялось...
|
|
|
|
|
Feb 6 2015, 06:49
|

Гуру
     
Группа: Свой
Сообщений: 2 002
Регистрация: 17-01-06
Из: Томск, Россия
Пользователь №: 13 271

|
Цитата(SM @ Feb 6 2015, 12:18)  А Вы вернитесь в мир реальный, к реальному элементарному исходнику из одного триггера, о котором речь в теме идет, и который неоптимально укладывается квартусом. А не о забитии 99% кристалла Про сферического коня - это правильно. Пример тривиальный. Зачем ругать синтезатор из-за ошибки на тривиальных примерах? Да, формально это ошибка, но ругать надо, когда будет неоптимально синтезить нормальные проекты. Предлагаю засинтезить проект по защёлкиванию шины данных (размером с количество "теряемых" триггеров) по клоку, стробируемому по CE. В этом случае хотя бы синтезатору будет видно, что совершенно все триггеры имеют CE, и ничего не потеряется, если подать CE прямо на соответствующий выделенный аппаратный вход триггера. Можно ещё дополнительно усложнить задачу, подобрав на входе триггера такую комбинационную функцию, которая бы занимала все входы LUT'а. В этом случае добавление к этой функции ещё одного сигнала приводит к необходимости ещё одного лута, а это уж точно неоптимально (просто в тривиальном примере от добавления сигнала CE к LUT'у ничего страшного не происходит, т.к. ещё есть свободные входы). Цитата(SM @ Feb 6 2015, 12:41)  Не грешит, а показывает взвешенный подход, где один триггер, там одно, где кристалл под завязку - там другое. Да я пробовал и на неплотных проектах. Да вообще где ни пробовал - там это везде наблюдалось. Из чего я сделал для себя эмпирический вывод, что с этим надо смириться, CE он добавляет не на аппаратный выделенный вход триггера, а замешивает в LUT. Цитата(SM @ Feb 6 2015, 12:41)  Простоту алгоритма коррекции таймингов между разными клок-доменами А если домен один - то нет преимуществ?
--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
|
|
|
|
|
Feb 6 2015, 06:57
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Krys @ Feb 6 2015, 09:49)  А если домен один - то нет преимуществ? Ну это, смотря как этот enable делать. Я имел в виду нечто вроде DCS/BUFGCE/Gated_clock - таким образом, каждый enable создает свой домен, экономя потребление (отключается целый сегмент дерева тактовых сигналов). Но затраты на разводку увеличиваются - так как начинаются проблемы с коррекцией HOLD-ов на междоменных переходах. А подача на CE с точки зрения затратности ресурсов на разводку идентична мультиплексору данных. Цитата(Krys @ Feb 6 2015, 09:49)  Зачем ругать синтезатор из-за ошибки на тривиальных примерах? Из соображений логики. Раз на тривиальном сделал неоптимально, значит и на нетривиальном где-то лажанется по этой же причине....
|
|
|
|
Сообщений в этой теме
Jackov Правильное использование locked у PLL Jan 22 2015, 18:27 Opex У xilinx есть клоковые буферы со входом enable, у ... Jan 23 2015, 08:46 bogaev_roman to Jackov Что мешает использовать этот сигнал в ка... Jan 23 2015, 09:07 ViKo Цитата(bogaev_roman @ Jan 23 2015, 12:07)... Jan 23 2015, 09:13 Jackov Цитата(Opex @ Jan 23 2015, 11:46) У xilin... Jan 23 2015, 16:22 Opex Цитата(Jackov @ Jan 23 2015, 21:22) Ммм..... Jan 23 2015, 17:18 SM Цитата(Jackov @ Jan 23 2015, 19:22) Не хо... Jan 23 2015, 17:51  DuHast Только меня смущает, что на MHz33_6 не будет ни ка... Jan 23 2015, 18:36 Hose Яков, начните с изучения плл. Он красиво нарисован... Jan 23 2015, 17:10 Jackov Цитата(Hose @ Jan 23 2015, 20:10) Яков, н... Jan 23 2015, 18:40 DuHast Цитата(Jackov @ Jan 23 2015, 21:40) Она т... Jan 23 2015, 18:43  Jackov Цитата(DuHast @ Jan 23 2015, 21:43) У Вас... Jan 23 2015, 19:08 SM Цитата(Jackov @ Jan 23 2015, 21:40) Хотя ... Jan 23 2015, 18:52 ViKo Вижу в Мегавизарде Альтеры Enable self-reset on lo... Jan 23 2015, 19:00 Jackov Цитата(ViKo @ Jan 23 2015, 22:00) Вижу в ... Jan 26 2015, 14:58 Opex Xilinx, кстати, не рекомендует использовать такое ... Jan 26 2015, 15:18 Jackov Цитата(Opex @ Jan 26 2015, 18:18) а вмест... Jan 29 2015, 14:49 Krys Цитата(Opex @ Jan 26 2015, 21:18) Xilinx,... Feb 2 2015, 08:04 Opex В триггерах всяких, и т.д.
Просто рекомендуется пи... Jan 29 2015, 15:24 Jackov Цитата(Opex @ Jan 29 2015, 18:24) if (ena... Jan 29 2015, 19:06  SM Цитата(Jackov @ Jan 29 2015, 22:06) DV-тр... Jan 29 2015, 19:27   Jackov Цитата(SM @ Jan 29 2015, 22:27) Что такое... Jan 29 2015, 20:36    doom13 Цитата(Jackov @ Jan 29 2015, 23:36) Кстат... Jan 29 2015, 20:50    SM Цитата(Jackov @ Jan 29 2015, 23:36) Кстат... Feb 2 2015, 08:34 ViKo Точно так же, как и подавать данные на D вход.
Мог... Feb 2 2015, 08:36 SM Цитата(ViKo @ Feb 2 2015, 11:36) Можно вл... Feb 2 2015, 08:46 ViKo Книжка есть - Пухальский, Новосельцева. Цифровые у... Feb 2 2015, 09:01 SM Цитата(ViKo @ Feb 2 2015, 12:01) Там можн... Feb 2 2015, 09:03 Opex Цитата(Krys @ Feb 2 2015, 13:04) Судя из ... Feb 2 2015, 12:28 Krys Цитата(Opex @ Feb 2 2015, 18:28) Вы прочи... Feb 3 2015, 03:36  Jackov Цитата(Krys @ Feb 3 2015, 06:36) там один... Feb 3 2015, 17:41 Jackov Цитата(SM @ Feb 2 2015, 11:34) Как достуч... Feb 2 2015, 16:27 SM Цитата(Jackov @ Feb 2 2015, 19:27) Пробле... Feb 2 2015, 16:45  Jackov Цитата(SM @ Feb 2 2015, 19:45) А Вам заче... Feb 2 2015, 18:21 SM Извращение какое. Зачем его разводить по всей схем... Feb 2 2015, 18:35 Opex Цитата(Krys @ Feb 3 2015, 08:36) очень вн... Feb 3 2015, 08:57 Krys Это всё понятно. Однако просто гейтед клок в их по... Feb 3 2015, 09:41 Opex Советуем использовать одно, но лучше используйте д... Feb 3 2015, 15:02 Krys Цитата(Opex @ Feb 3 2015, 21:02) Советуем... Feb 4 2015, 03:09 Opex Цитата(Krys @ Feb 4 2015, 08:09) Вам что,... Feb 4 2015, 16:02 SM Цитата(Opex @ Feb 4 2015, 19:02) 1) BUFGC... Feb 4 2015, 17:55 ViKo Топикстартеру надо пересмотреть свою позицию:
Цита... Feb 4 2015, 18:23 Krys Цитата(ViKo @ Feb 5 2015, 00:23) Топикста... Feb 5 2015, 02:27  SM Цитата(Krys @ Feb 5 2015, 05:27) 100) Gat... Feb 5 2015, 08:34   Krys Цитата(SM @ Feb 5 2015, 14:34) Да не 100)... Feb 5 2015, 09:01 ViKo Krys, перечитайте тему с начала, что не задавать н... Feb 5 2015, 06:08 Krys Цитата(ViKo @ Feb 5 2015, 12:08) Krys, пе... Feb 5 2015, 07:07  ViKo Цитата(Krys @ Feb 5 2015, 10:07) Почему ж... Feb 5 2015, 08:44 Krys Цитата(Jackov @ Feb 5 2015, 22:50) А вот ... Feb 6 2015, 04:15   ViKo Цитата(SM @ Feb 6 2015, 08:44) Вот, кстат... Feb 6 2015, 05:52       des00 Цитата(SM @ Feb 6 2015, 13:18) А Вы верни... Feb 6 2015, 07:01        SM Цитата(des00 @ Feb 6 2015, 10:01) а фоне ... Feb 6 2015, 07:06         des00 Цитата(SM @ Feb 6 2015, 14:06) Вот это, к... Feb 6 2015, 07:12          Krys Цитата(des00 @ Feb 6 2015, 13:12) задали ... Feb 6 2015, 07:47          SM Цитата(des00 @ Feb 6 2015, 10:12) для вас... Feb 6 2015, 09:04    Krys Цитата(des00 @ Feb 6 2015, 11:55) В случ... Feb 6 2015, 06:39     SM Цитата(Krys @ Feb 6 2015, 09:37) А какие ... Feb 6 2015, 06:41 ViKo Развернул уже, и не раз. Feb 5 2015, 16:56 Jackov Цитата(ViKo @ Feb 5 2015, 19:56) Разверну... Feb 5 2015, 17:10 ViKo Цитата(Jackov @ Feb 5 2015, 20:10) Это не... Feb 5 2015, 17:17 SM Цитата(Jackov @ Feb 5 2015, 20:10) И в св... Feb 5 2015, 17:23  ViKo Цитата(SM @ Feb 5 2015, 20:23) а вот на р... Feb 5 2015, 17:27 Jackov Цитата(ViKo @ Feb 5 2015, 20:17) Да ну...... Feb 5 2015, 19:13 SM Цитата(Jackov @ Feb 5 2015, 22:13) Не про... Feb 5 2015, 19:27  Jackov Цитата(SM @ Feb 5 2015, 22:27) Ну если эт... Feb 5 2015, 19:34 ViKo Для проверки забейте 4 входных сигнала вместо 1. Н... Feb 6 2015, 09:10 SM Цитата(ViKo @ Feb 6 2015, 12:10) и Quartu... Feb 6 2015, 09:25  ViKo Цитата(SM @ Feb 6 2015, 12:25) Ничего он ... Feb 6 2015, 09:31   SM Цитата(ViKo @ Feb 6 2015, 12:31) Но макси... Feb 6 2015, 09:43    ViKo Цитата(SM @ Feb 6 2015, 12:43) Но для опт... Feb 6 2015, 09:56     SM Цитата(ViKo @ Feb 6 2015, 12:56) Задать о... Feb 6 2015, 09:59 Krys Цитата(ViKo @ Feb 6 2015, 15:10) Для пров... Feb 6 2015, 11:04  Jackov Цитата(Krys @ Feb 6 2015, 14:04) Тогда уж... Feb 11 2015, 16:41   Krys Цитата(Jackov @ Feb 11 2015, 22:41) Компи... Feb 13 2015, 03:14    ViKo Цитата(Krys @ Feb 13 2015, 06:14) Вы мне ... Feb 13 2015, 09:34     Krys Цитата(ViKo @ Feb 13 2015, 15:34) Сначала... Feb 16 2015, 03:27 ViKo Не уверен, но помню, что галки SPEED, AREA еще со ... Feb 6 2015, 10:04 SM Цитата(ViKo @ Feb 6 2015, 13:04) Не увере... Feb 6 2015, 10:20 Opex ЦитатаПользуясь случаем, хочу спросить. Почему син... Feb 11 2015, 18:13 Jackov Цитата(Opex @ Feb 11 2015, 21:13) generat... Feb 11 2015, 18:25  SM Цитата(Jackov @ Feb 11 2015, 21:25) Почем... Feb 11 2015, 19:19
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|