реклама на сайте
подробности

 
 
> Магический пин P143 на spartan 6, Крайне странное поведение схемы, или я сделал что-то очень глупое...
Golikov A.
сообщение Oct 16 2013, 17:54
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Всем привет!

Имеется платка со Spartan 6 (XC6SLX9), в 144 ногом корпусе.
В ней есть прошивка полностью рабочая. На ПЛИС идет клок 50 МГц, внутри он поднимается до 100 МГц.

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

если пишем на эту ногу 1, 0, инверсию внутренего сигнала, ПЛИС перестает работать. Не загорается диодик подтверждения LOCKED PLL. Более того появляется сообщение о какой-то комбинаторной логике на сигнале получаемом делением основного клока.

в куске кода
Код
output port143;

assign port143 = ~reset;

if (reset)
  CLK<=1'b0;
else
  begin
    if(clk_dev < DEVIDER)
      clk_dev <= clk_dev + 1;
   else
      begin
        clk_dev <=0;
        CLK<=~CLK;
      end
  end

вот на этот CLK жалуется синтезатор.

При этом в пустом проекте на эту ногу можно вывести частоту и она будет шевелится

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

Если выводит на 143 ногу уровни, они задаются, но плис все равно мертвая....

Пробовали не включать ПЛЛ, подали внешний клок, и результат тот же

143 нога по совместительству еще и VREF 0 банка, но в нем используется уровни по умолчанию, другие сигналы на других ногах VREFE этого банка есть и работают.


Вообщем либо я сделал что-то очень глупое, либо это какая - то магия. И главное что я не представляю что можно еще проверить, что покрутить, как диагностировать в чем косяк... Не резать же из-за такой глупости дорожку, и не паяться же на другие ноги соплей...
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 28)
count_enable
сообщение Oct 16 2013, 18:39
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 310
Регистрация: 28-01-13
Из: Лондон
Пользователь №: 75 384



Можете проверить код на любой другой плате, где эта нога ни к чему не подключена, или на секунду отключить ее, чтобы висела в воздухе? Как сконфигурирована она в ucf ?
Синтезатор скорее всего жалуется что быстрый клок идет не по клоковому дереву, а по обычной cell fabric. Плюс ручной делитель это gated clock. В промежутке между reset и clk_dev==DEVIDER сигнал CLK не определён никак.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 16 2013, 18:50
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



не жаловался до появления в проекте 143 ноги, убираешь ее из ucf все ок, добавляешь пишет

PhysDesignRules:372 - Gated clock. Clock net Unit_inst/CLK
is sourced by a combinatorial pin. This is not good design practice. Use the
CE pin to control the loading of data into the flip-flop.

в ucf файле все обычно
NET "port143" LOC = P143;

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

Перенос на другую ногу работает, синтезится, не жалуется, и запускается.

CLK - регистр, так что он определен, начальное состояние и состояние при ресете, все есть...
Go to the top of the page
 
+Quote Post
count_enable
сообщение Oct 16 2013, 21:41
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 310
Регистрация: 28-01-13
Из: Лондон
Пользователь №: 75 384



Добавьте буфер на вход, а еще лучше синхронизатор с клоком на триггере. Кстати, есть защита от дребезга?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 17 2013, 04:56
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



на вход чего!? не можете понять проблему, лучше пропустите....
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Oct 17 2013, 05:00
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(Golikov A. @ Oct 17 2013, 00:54) *
Всем привет!

Имеется платка со Spartan 6 (XC6SLX9), в 144 ногом корпусе.
В ней есть прошивка полностью рабочая. На ПЛИС идет клок 50 МГц, внутри он поднимается до 100 МГц.

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

если пишем на эту ногу 1, 0, инверсию внутренего сигнала, ПЛИС перестает работать. Не загорается диодик подтверждения LOCKED PLL. Более того появляется сообщение о какой-то комбинаторной логике на сигнале получаемом делением основного клока.

в куске кода
Код
output port143;

assign port143 = ~reset;

if (reset)
  CLK<=1'b0;
else
  begin
    if(clk_dev < DEVIDER)
      clk_dev <= clk_dev + 1;
   else
      begin
        clk_dev <=0;
        CLK<=~CLK;
      end
  end

вот на этот CLK жалуется синтезатор.

При этом в пустом проекте на эту ногу можно вывести частоту и она будет шевелится

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

Если выводит на 143 ногу уровни, они задаются, но плис все равно мертвая....

Пробовали не включать ПЛЛ, подали внешний клок, и результат тот же

143 нога по совместительству еще и VREF 0 банка, но в нем используется уровни по умолчанию, другие сигналы на других ногах VREFE этого банка есть и работают.


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

Просто адское количество детских ошибок. Чтобы не быть голословным приведу примеры:
1. Ваш "как бы счётчик" clk_dev - чисто комбинаторная схема, он не будет работать так как не сможет запомнить своё предыдущее состояние. Посмотрите шаблоны счётчиков и сравните этот с тем, что вы нагородили.
Поглядите RTL schematic - вы увидите какой там АДЪ...
2. Наблюдается gated clock - нельзя ни под каким соусом генерить клок на логике, это чревато тучей различных проблем, вопрос неоднократно обсуждался, поищите на форуме.
3. Слово "dIvider" - по-русски "делитель" пишется именно через "I", от английского глагола "to divide" - делить, язык неплохо бы знать.
Go to the top of the page
 
+Quote Post
ASN
сообщение Oct 17 2013, 05:19
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



Golikov A
Правильно ругается - gated clock это not good design practice, поскольку синтезатору сложно оценить выполнение ограничений, накладываемых на проект.
Сделайте на первом этапе весть проект синхронным и на одной тактовой глобальной частоте.
Потом уже можно оптимизировать.
Кстати, для Spartan 6 есть полезный документ SelectIO Resources (ug381.pdf‎).
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 17 2013, 05:54
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Еще раз!

Вы не на том зациклились.

я не могу понять почему добавление выхода сигнала на P143 вызывает зависание плис, отказ работы PLL и данный варнинг.
Повторяю еще раз, до вывода сигнала наружу варнинга НЕ БЫЛО
при выводе ЭТОГО ЖЕ сигнала наружу но не на 143 пин ВСЕ РАБОТАЕТ




Цитата(Bad0512 @ Oct 17 2013, 09:00) *
Просто адское количество детских ошибок. Чтобы не быть голословным приведу примеры:
1. Ваш "как бы счётчик" clk_dev - чисто комбинаторная схема, он не будет работать так как не сможет запомнить своё предыдущее состояние. Посмотрите шаблоны счётчиков и сравните этот с тем, что вы нагородили.
Поглядите RTL schematic - вы увидите какой там АДЪ...
2. Наблюдается gated clock - нельзя ни под каким соусом генерить клок на логике, это чревато тучей различных проблем, вопрос неоднократно обсуждался, поищите на форуме.
3. Слово "dIvider" - по-русски "делитель" пишется именно через "I", от английского глагола "to divide" - делить, язык неплохо бы знать.


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

Цитата(ASN @ Oct 17 2013, 09:19) *
Golikov A
Правильно ругается - gated clock это not good design practice, поскольку синтезатору сложно оценить выполнение ограничений, накладываемых на проект.
Сделайте на первом этапе весть проект синхронным и на одной тактовой глобальной частоте.
Потом уже можно оптимизировать.
Кстати, для Spartan 6 есть полезный документ SelectIO Resources (ug381.pdf‎).


Почему до вывода reset на 143 пин не ругается, и также не ругается если reset вывести на 17 пин?

я так понимаю что увидев выдранный кусок кода все потеряли покой и не могут дальше смотреть.
естественное приведенный кусок текста находится под always @(posedge main_clk)
Go to the top of the page
 
+Quote Post
alexadmin
сообщение Oct 17 2013, 06:13
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 572
Регистрация: 17-11-05
Из: СПб, Россия
Пользователь №: 10 965



Цитата(Golikov A. @ Oct 17 2013, 09:54) *
я не могу понять почему добавление выхода сигнала на P143 вызывает зависание плис, отказ работы PLL и данный варнинг.
Повторяю еще раз, до вывода сигнала наружу варнинга НЕ БЫЛО
при выводе ЭТОГО ЖЕ сигнала наружу но не на 143 пин ВСЕ РАБОТАЕТ


1. Надо смотреть схемотехнику - куда подключен этот пин и какие он вызывавет процессы в вашем устройстве. Может он сбрасывает процессор, который сбрасываетFPGA?
2. Какие функции у пина кроме user i/o. Может с этим что-то завязано.
Go to the top of the page
 
+Quote Post
vladec
сообщение Oct 17 2013, 06:13
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 167
Регистрация: 3-10-05
Из: Москва
Пользователь №: 9 158



Может у Вас какая нибудь "сопля" на плате - прозвоните цепь на GND и на питания
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 17 2013, 07:06
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(alexadmin @ Oct 17 2013, 10:13) *
1. Надо смотреть схемотехнику - куда подключен этот пин и какие он вызывавет процессы в вашем устройстве. Может он сбрасывает процессор, который сбрасываетFPGA?
2. Какие функции у пина кроме user i/o. Может с этим что-то завязано.


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

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

Цитата(vladec @ Oct 17 2013, 10:13) *
Может у Вас какая нибудь "сопля" на плате - прозвоните цепь на GND и на питания


проверяли, 3 платы, на всех одинаковая ситуация.
в пустом проекте работает нормально...


Хотя сейчас у меня появилась одна мысль, у меня общий ресет всей схемы просто подтянут к земле

NET "glb_reset" PULLDOWN;

не нашлось ему как то сначала ноги, а потом про него забыли... Может так нельзя?
Go to the top of the page
 
+Quote Post
Raven
сообщение Oct 17 2013, 07:13
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 491
Регистрация: 16-01-05
Из: Санкт-Петербург
Пользователь №: 1 987



На всякий случай добавлю - проверьте по документации, не влияет ли на функционирование совмещение функций IO и VREF на ноге 143 (то, что вы имеете при активации этой ноги).
Go to the top of the page
 
+Quote Post
ASN
сообщение Oct 17 2013, 09:22
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



Golikov A
Ещё раз - gated clock это not good design practice.
Этим всё сказано. Я не знаю Ваш проект. Но точно знаю, что в хорошем работоспособном проекте это встречается редко и, как правило, только в случае крайней необходимости.
Сначала разберитесь, почему появляется это сообщение. А затем можно двигаться дальше. Такое бывает если где-то (не факт что в этом месте) выведена тактовая частота на pin напрямую.
Во-вторых, для начала ВСЕ сигналы просечь глобальной тактовой и поместить триггеры в IOB.
После того, как проект заработает, можно будет заняться оптимизацией.
Go to the top of the page
 
+Quote Post
ZASADA
сообщение Oct 17 2013, 09:40
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 738
Регистрация: 13-01-11
Из: Минск
Пользователь №: 62 210



еще раз все перечитал, VREF тут не причем.
синтезатору не нравится именно ваш вывод сигнала reset наружу. Пока вы reset используете внутри, он возможно оптимизируется и в явном виде отсутствует.
ведь если какой-нибудь разряд clk_dev вывести на 143 ножку все работает правильно?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 17 2013, 13:02
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(ZASADA @ Oct 17 2013, 13:40) *
еще раз все перечитал, VREF тут не причем.
синтезатору не нравится именно ваш вывод сигнала reset наружу. Пока вы reset используете внутри, он возможно оптимизируется и в явном виде отсутствует.
ведь если какой-нибудь разряд clk_dev вывести на 143 ножку все работает правильно?

Нет не правильно! Читаете плохо видать.
Вывод сигнала ресет через другой пин не вызывает варнинга и все работает. Вывод константы 1 0 любого сигнала через 143 пин вызывает варнинг и все падает.

Цитата(ASN @ Oct 17 2013, 13:22) *
Golikov A
Ещё раз - gated clock это not good design practice.
Этим всё сказано. Я не знаю Ваш проект. Но точно знаю, что в хорошем работоспособном проекте это встречается редко и, как правило, только в случае крайней необходимости.
Сначала разберитесь, почему появляется это сообщение. А затем можно двигаться дальше. Такое бывает если где-то (не факт что в этом месте) выведена тактовая частота на pin напрямую.
Во-вторых, для начала ВСЕ сигналы просечь глобальной тактовой и поместить триггеры в IOB.
После того, как проект заработает, можно будет заняться оптимизацией.
ничего этим не сказано... Это варнинг появляется от 143 пина... Внимание не на варнинг а на то что он появляется


Цитата(Raven @ Oct 17 2013, 11:13) *
На всякий случай добавлю - проверьте по документации, не влияет ли на функционирование совмещение функций IO и VREF на ноге 143 (то, что вы имеете при активации этой ноги).

Да вот уже все даташиты проглядел. Реально магия какая то. Ща до проекта добирусь проверю не подбрасывается ли глобальный ресет. Это последние что хоть как то рационально объясняет происходящее
Go to the top of the page
 
+Quote Post
Sergey_Bekrenyov
сообщение Oct 17 2013, 14:41
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 323
Регистрация: 14-12-10
Из: Королёв
Пользователь №: 61 599



Цитата(Golikov A. @ Oct 17 2013, 17:02) *
Нет не правильно! Читаете плохо видать.
Вывод сигнала ресет через другой пин не вызывает варнинга и все работает. Вывод константы 1 0 любого сигнала через 143 пин вызывает варнинг и все падает.

ничего этим не сказано... Это варнинг появляется от 143 пина... Внимание не на варнинг а на то что он появляется



Да вот уже все даташиты проглядел. Реально магия какая то. Ща до проекта добирусь проверю не подбрасывается ли глобальный ресет. Это последние что хоть как то рационально объясняет происходящее



1. Попробуйте вместо always @(posedge CLK) использовать CLK как разрешение счета

always @(posedge main_clk)
if(reset)
..
else if(CLK)
..

2. Попробуйте Ваш выход на ножку подтактировать main_clk
Go to the top of the page
 
+Quote Post
Flood
сообщение Oct 17 2013, 15:08
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 702
Регистрация: 8-06-06
Пользователь №: 17 871



Цитата(Golikov A. @ Oct 17 2013, 11:06) *
всей схемы просто подтянут к земле

NET "glb_reset" PULLDOWN;

не нашлось ему как то сначала ноги, а потом про него забыли... Может так нельзя?


Так нельзя! Это лишь означает, что ограничений на этот порт нет и его можно развести на любую ножку.
Посмотрите pad report, там будет видно, куда плейсер пихнул этот пин. Возможно, как раз на ваш магический P143. А может, ваши проблемы с этим и не связаны. НО в любом случае, оставлять порт без LOC нельзя.

Цитата(Golikov A. @ Oct 16 2013, 21:54) *
в куске кода
Код
output port143;

assign port143 = ~reset;

if (reset)
  CLK<=1'b0;
else
  begin
    if(clk_dev < DEVIDER)
      clk_dev <= clk_dev + 1;
   else
      begin
        clk_dev <=0;
        CLK<=~CLK;
      end
  end


Интересно, и какая же частота ожидается на CLK?
Пока этот абсолютно не корректный асинхронный код не исправлен, двигаться дальше нельзя.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 17 2013, 15:53
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(Sergey_Bekrenyov @ Oct 17 2013, 18:41) *
1. Попробуйте вместо always @(posedge CLK) использовать CLK как разрешение счета

always @(posedge main_clk)
if(reset)
..
else if(CLK)
..

2. Попробуйте Ваш выход на ножку подтактировать main_clk


выход на ножку тактировать пробовал, теже... только в профиль

CLK я не использую в конструкциях типа always внутри проекта, он используется в клок форвардинге через выходной DDR.

Цитата(Flood @ Oct 17 2013, 19:08) *
Так нельзя! Это лишь означает, что ограничений на этот порт нет и его можно развести на любую ножку.
Посмотрите pad report, там будет видно, куда плейсер пихнул этот пин. Возможно, как раз на ваш магический P143. А может, ваши проблемы с этим и не связаны. НО в любом случае, оставлять порт без LOC нельзя.



Интересно, и какая же частота ожидается на CLK?
Пока этот абсолютно не корректный асинхронный код не исправлен, двигаться дальше нельзя.



Забыл я про эту ножку, какой - то из ответов навел меня на мысль о ней. Есть вариант что 143 пин это последний оставшийся не занятый пин, и когда я его подключаю ресету не находится места. А можно как то LOC на землю сделать? понятно что можно внутри проекта ее занулить, но вот в констраине нет такого инструмента? (это я для общего развития)



Насчет куска кода - он выдран из контекста, но не приведя полного кода я так понял меня будут клеватьsm.gif

Код
reg CLK = 1;
reg INV_CLK = 0;
reg [3:0] Devider = 0;
localparam DIV_CONST = 2;

always @(posedge main_clk)
begin
   if(reset == 1'b1)
     begin
       CLK <= 1'b1;
       INV_CLK <= 1'b0;
       Divider <= 0;
     end
   else
     begin
        if(Divider < DIV_CONST)
          Divider <= Divider + 1;
        else
           begin
              CLK <= ~CLK;
              INV_CLK <= ~INV_CLK;
              Divider <= 0;
           end
     end
end


я еще и ошибку в написании делителя исправилwink.gif круто да? теперь то точно заработает как надо...

ну я надеюсь понятно что ресет это сигнал,

Далее CLK и INV_CLK идут как клок и инверсный клок на выходной DDR, в качестве данных на который поданы 1 и 0, и в результате на ножке получается клоковый сигнал. Эта схема клок форвардинга предложенная xilinx, позволяет не задействовав глобальных клоковых буферов выводить наружу клок. Причем прелесть схемы такова что может работать не только posedge main_clk
а по обоим фронтам
always @(posedge main_clk or negedge main_clk) и получать делитель клока не только на четные значения, но и на нечетные.

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

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

Go to the top of the page
 
+Quote Post
Flood
сообщение Oct 17 2013, 16:53
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 702
Регистрация: 8-06-06
Пользователь №: 17 871



Цитата(Golikov A. @ Oct 17 2013, 19:53) *
Забыл я про эту ножку, какой - то из ответов навел меня на мысль о ней. Есть вариант что 143 пин это последний оставшийся не занятый пин, и когда я его подключаю ресету не находится места.

Смысл гадать? Посмотрите pad report (файл .pad). Там будет видно, куда оказался посажен ресет.
Если такой внешний пин не нужен, правильнее всего убрать его из портов топ-левела.
Go to the top of the page
 
+Quote Post
ASN
сообщение Oct 17 2013, 16:59
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



Golikov A
Дайте, пожалуйста, ссылочку на где есть схема клок форвардинга предложенная xilinx.
IMHO, У Spartan 6 достаточно выходов PLL, чтобы не задействовать для формирования частот ещё и логику.
Как тогда контролировать сдвиг частот при трассировке ?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 17 2013, 18:17
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Ура! ну вообщем победа.
Как собственно и думал, любая магия - это следствие какой - то большой глупости.

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

с выводом другого сигнала на 143 пин, глобальный ресет перевесился на ножку входную от внешнего устройства, которая на данный момент никуда не назначена. Внешнее устройство решили не использовать в этом проекте. Там какая - то оптическая развязка, наверняка в свободном положении она дает 1 и держит схему в ресете (Я не очень хочу сейчас лазить с тестером по плате, это немного не удобно). Ну и со всеми вытекающими схема в вечном ресете.


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

На сладкое осталось понять почему после вывода ресета наружу пин стал комбинаторной логикой, и как это победить.





Цитата(ASN @ Oct 17 2013, 20:59) *
Golikov A
Дайте, пожалуйста, ссылочку на где есть схема клок форвардинга предложенная xilinx.
IMHO, У Spartan 6 достаточно выходов PLL, чтобы не задействовать для формирования частот ещё и логику.
Как тогда контролировать сдвиг частот при трассировке ?


дело было так:

написал я делитель клока по обоим фронтам входного клока работающий и вывел его на ножку. После чего получил то ли варнинг, то ли еррор что так нельзя и не есть правильно, и предложение прям в этом же сообщении использовать DDR для клок форвардинга. После чего было написано в яндексе и гугле clock forward DDR, и получены ссылки типа
http://forums.xilinx.com/t5/Spartan-Family...-IO/td-p/212825
я не помню точно какую их них тыкал, но сути не меняет.
там я нашел рецеп
Verilog > Synthesis Constructs > Coding Examples > Misc > Output Clock Forwarding Using DDR

вот...
Как я понимаю проблему: даже сделав клок на ПЛЛ чтобы выдать его на ружу будет задействован глобальный клоковый буфер, которых не так много. А вот ДДР на выходе стоит на каждой ножке, так чего не использовать его?....

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







Ну вот и с последним разобрался. Это мне синтезатор помог

он увидел что INV_MCLK инверсия MCLK, (как догадался...) и устранил его при оптимизации, а когда дошло до размещения INV_MCLK стал комбинаторным ну и так далее, варнинг выпрыгнул...

оставил MCLK регистром
INV_MCLK сделал
Код
wire INV_MCLK
assign INV_MCLK = ~ MCLK.


теперь все счастливы....
Go to the top of the page
 
+Quote Post
Shivers
сообщение Oct 18 2013, 06:54
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



Код не слишком корректный, может поэтому синтезатор/мэппер и корежит.
Я бы разделил конструкции для облегчения работы синтезатора как то так:
Код
always @(posedge main_clk)
begin
   if(reset == 1'b1)
     begin
       CLK <= 1'b1;
       INV_CLK <= 1'b0;
     end
   else
     begin
        if(Divider[3:0] != DIV_CONST)
           begin
              CLK <= ~CLK;
              INV_CLK <= ~INV_CLK;
           end
     end

always @(posedge main_clk)
   if( reset | Divider[3:0] == DIV_CONST)
       Divider[3:0] <= 4'h0;
   else
          Divider[3:0] <= Divider[3:0] + 4'h1;

По хорошему сброс желательно еще и асинхронным сделать, но это уже надо смотреть мануал на ПЛИС, как LUT устроен.
С асинхронным сбросом будет так:
Код
assign resetn = ~reset;

always @(posedge main_clk or negedge resetn)
begin
   if(~resetn)
     begin
       CLK <= 1'b1;
       INV_CLK <= 1'b0;
     end
   else
        if(Divider[3:0] != DIV_CONST)
           begin
              CLK <= ~CLK;
              INV_CLK <= ~INV_CLK;
           end

always @(posedge main_clk or negedge resetn)
   if( ~resetn)
       Divider[3:0] <= 4'h0;
  else
   if(Divider[3:0] != DIV_CONST)
         Divider[3:0] <= Divider[3:0] + 4'h1;
   else
         Divider[3:0] <= 4'h0;

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

Еще, непонятно назначение CLK и CLK_INV - это просто деление входной частоты пополам, сигнал разрешения можно убрать, т.к. он все равно у вас не работает.
Код
always @(posedge main_clk or negedge resetn)
begin
   if(~resetn)
     begin
       CLK <= 1'b1;
       INV_CLK <= 1'b0;
     end
   else
           begin
              CLK <= ~CLK;
              INV_CLK <= ~INV_CLK;
           end

Последнее замечание. Если CLK и CLK_INV будут где то использоваться в качестве клоков, то надо их объявить как то так:
create_generated_clock CLK CLK -source main_clk -divide_by 2
create_generated_clock CLK_INV -source main_clk -divide_by 2 -invert
синтаксис может отличаться, но суть, я надеюсь, понятна.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 18 2013, 07:41
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



CLK и INV_CLK это борьба за 50% дути цикл. Она весьма наивная конечно, но мне казалось что если иметь 2 регистра которые делают абсолютно одинаковые вещи из разных состояний это сделает их более синхронными что ли.

Естественно если бы я их запускал дальше как клоки, я бы их запихал бы в буфер клоковый. Но поскольку это сигналы изолированные для клок форвардинга на ножке, то сделал так.

И они не делители входной частоты пополам они делители на 2 * (DIV_CONST+1) = 6 в моем случае, (тут надо было долго глумиться про детскую ошибку). Естественно константа сменная, и в общем случае даже вынесена за пределы данного модуля.

Сигналы ресета что идут на этот модуль, они генерятся другим и синхронно, потому делать их тут асинхронными не стал. Вообщем мне кажется все асинхронное немного усложняет и замедляет схему, хотя я могу быть не прав.
Go to the top of the page
 
+Quote Post
Shivers
сообщение Oct 18 2013, 14:39
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950



Напишу по поводу асинхронного сброса.
Если сброс синхронный, это по сути еще один аргумент функции входа. А значит, более сложная комбинаторика и как следствие - медленная схема.
Недостатки асинхронного сброса (хреновая помехоустойчивость) - понятны.

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

И еще, синхронизацию лучше делать не одним триггером, а двумя, а в некоторой литературе пишут даже про три триггера.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 18 2013, 17:51
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(Shivers @ Oct 18 2013, 18:39) *
Напишу по поводу асинхронного сброса.
Если сброс синхронный, это по сути еще один аргумент функции входа. А значит, более сложная комбинаторика и как следствие - медленная схема.
Недостатки асинхронного сброса (хреновая помехоустойчивость) - понятны.

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

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


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


2 триггера - это известная штука, для выравнивания фронта внешнего сигнала для всех модулей, но если сигнал идет только на один модуль, то вроде как и без триггера обойтись можно... зачем 3 нужно не знаю...
Go to the top of the page
 
+Quote Post
Victor®
сообщение Oct 18 2013, 19:34
Сообщение #26


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(Golikov A. @ Oct 18 2013, 20:51) *
ну синхронный сброс всяко будет меньше асинхронного или нет? Я как то не страдаю от синхронности сброса. Иногда да бывает надо, но тут как то все синхронное легко легло на проект и все...


2 триггера - это известная штука, для выравнивания фронта внешнего сигнала для всех модулей, но если сигнал идет только на один модуль, то вроде как и без триггера обойтись можно... зачем 3 нужно не знаю...


Гуглите.
Обсуждалось миллион раз.
В общем случае защита от метастабильности + синхронная установка сброса и асинхронное снятие.

P.S. причем для каждого клокового домена это надо делать отдельно.


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 18 2013, 21:02
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(Victor® @ Oct 18 2013, 23:34) *
Гуглите.
Обсуждалось миллион раз.
В общем случае защита от метастабильности + синхронная установка сброса и асинхронное снятие.

P.S. причем для каждого клокового домена это надо делать отдельно.


так после миллионов обсуждений не сошлись на том что 2 хватит?



Цитата(Victor® @ Oct 18 2013, 23:34) *
синхронная установка сброса и асинхронное снятие.


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

Правильно я понимаю?
Go to the top of the page
 
+Quote Post
Victor®
сообщение Oct 19 2013, 07:04
Сообщение #28


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(Golikov A. @ Oct 19 2013, 00:02) *
так после миллионов обсуждений не сошлись на том что 2 хватит?





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

Правильно я понимаю?


Классика жанра - почитайте

http://www.sunburst-design.com/papers/Cumm...ston_Resets.pdf


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 19 2013, 12:59
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(Victor® @ Oct 19 2013, 11:04) *
Классика жанра - почитайте

http://www.sunburst-design.com/papers/Cumm...ston_Resets.pdf


спасибо, правда вопросов только больше становится...

что хотят понятно, но как за всем уследить в большом проекте, не понятно. Особенно если начинать отделять сигналы на которые ресет не влияет на прямую, код растет, читабельность падает...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 04:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01744 секунд с 7
ELECTRONIX ©2004-2016