|
Работа с синхросигналами, нужна помощь. |
|
|
|
Mar 4 2009, 05:47
|
Знающий
   
Группа: Свой
Сообщений: 552
Регистрация: 29-02-08
Пользователь №: 35 481

|
Добрый день. Вопрос в следующем. Работаю с Virtex5. Есть два канала данных, и два синхросигнала SCLK и SCLKx2, где SCLKx2 - частота в два раза больше чем у SCLK. Оба синхросигнала получаются с DLL и соотвественно синхронны и, если можно так сказать "синфазны". В схеме есть места, где данные передаются с триггера тактируемого SCLK на триггер, тактируемый SCLKx2 и наоборот. Тут вроде проблем нету. Но оба канала данных обрабатываются либо параллельно, на SCLK, либо последовательно, на SLCKx2. И тут появляется огромное желание сигнал SCLK использовать еще и как логический, т.е. заводить его на Ce триггера или управлять при помощи него мультиплексором. Но чувствую, что можно нарваться. Кто-нить встречал и может дать ссылку на доку, желательно Xilinx-кую, где написано, можно так делать или нет?
|
|
|
|
|
Mar 4 2009, 07:17
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(Михаил_K @ Mar 4 2009, 08:47)  Но чувствую, что можно нарваться. Кто-нить встречал и может дать ссылку на доку, желательно Xilinx-кую, где написано, можно так делать или нет? Делал я так. Но в качестве CE использовал не сам SCLK, а стробированный SCLKx2. Код process (Reset, SCLKx2) begin if (Reset = '1') then CE <= '0'; elsif (rising_edge(SCLKx2)) then CE <= SCLK; end if; end process;
|
|
|
|
|
Mar 4 2009, 07:32
|
Знающий
   
Группа: Свой
Сообщений: 552
Регистрация: 29-02-08
Пользователь №: 35 481

|
Цитата(andrew_b @ Mar 4 2009, 10:17)  Делал я так. Но в качестве CE использовал не сам SCLK, а стробированный SCLKx2. Код process (Reset, SCLKx2) begin if (Reset = '1') then CE <= '0'; elsif (rising_edge(SCLKx2)) then CE <= SCLK; end if; end process; А вот где почитать, можно ли так делать и что будет на выходе? В зависимости от того, как DCM выравнит фазы клоков, возможно два варианта соотношения фазы CE и синхросигнала SCLK. А уж если DCM будет заниматься подстройкой в процессе работы (чем она и занимается), и фаза SCLK будет то опережать, то от SCLKx2 (ессно, на величину указанную в спецификации), то возможно, что Ce вообще будет два такта иметь одинаковое значение (будет проскок). Если только задержка при входе на триггер будет больше чем возможное опережение фазы SCLK, тогда можно применить такую схему.
|
|
|
|
|
Mar 4 2009, 07:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(Михаил_K @ Mar 4 2009, 10:32)  А уж если DCM будет заниматься подстройкой в процессе работы (чем она и занимается), и фаза SCLK будет то опережать, то от SCLKx2 (ессно, на величину указанную в спецификации) Вы же сами написали: Цитата В схеме есть места, где данные передаются с триггера тактируемого SCLK на триггер, тактируемый SCLKx2 и наоборот. Тут вроде проблем нету. Вы не находите некоторое противоречие?
|
|
|
|
|
Mar 4 2009, 07:53
|
Знающий
   
Группа: Свой
Сообщений: 845
Регистрация: 18-10-04
Из: Pereslavl-Zalessky, Russian Federation
Пользователь №: 905

|
Делать так можно, но есть способ, при котором клок не выходит за пределы специально для него сделанных сетей и все части микросхемы и среды разработки используются по назначению. Смысл заключается в том, чтобы сделать регистр, который бы инвертировался на каждом такте быстрого клока. Тогда он будет менять свой уровень как и медленный клок. Чтобы фаза этого регистра имела связь с фазой медленного клока, нужно начинать инвертировать с привязкой к медленному клоку. Для этого нужен еще один регистр сброса. Констрейны в этом случае записываются проще и соблюдать их легче. Убедитесь в надежном соблюдении setup time. Код signal reg_phase_res, reg_phase : std_logic;
...
process (Reset, SCLK) begin if (Reset='1') then reg_phase_res <= '1'; elsif (rising_edge(SCLK)) then reg_phase_res <= '0'; end if; end process;
process (SCLKx2) begin if (rising_edge(SCLKx2)) then if (reg_phase_res='1') then reg_phase <= '1'; else reg_phase <= not reg_phase; end if; end if; end process;
-- пример использования process(SCLKx2) begin if (rising_edge(SCLKx2)) then if (reg_phase == '1') then -- заменено if (SCLK=='1') then .... else .... end if; end if; end process;
|
|
|
|
|
Mar 4 2009, 08:18
|
Знающий
   
Группа: Свой
Сообщений: 552
Регистрация: 29-02-08
Пользователь №: 35 481

|
Цитата(andrew_b @ Mar 4 2009, 10:48)  Вы не находите некоторое противоречие? Нет. Потому-что данные с триггера выходят с задержкой. И задержка эта, вместе с линиями коммутаций такова, что имеющийся разброс фаз на DCM не приводит к сбою в работе схемы. Цитата(Shtirlits @ Mar 4 2009, 10:53)  Делать так можно, но есть способ, при котором клок не выходит за пределы специально для него сделанных сетей и все части микросхемы и среды разработки используются по назначению. Смысл заключается в том, чтобы сделать регистр, который бы инвертировался на каждом такте быстрого клока. Тогда он будет менять свой уровень как и медленный клок. Чтобы фаза этого регистра имела связь с фазой медленного клока, нужно начинать инвертировать с привязкой к медленному клоку. Для этого нужен еще один регистр сброса. Констрейны в этом случае записываются проще и соблюдать их легче. Спасибо, от этом я думал. Здесь один недостаток - этот сигнал придется дополнительно таскать по всему кристаллу, и у отдельных узлов делать вход для этого сигнала. Этакое неудобство, но видимо обойти его не удастся. Правда для совпадения фазы я все-таки по другому сделал. Через триггер, как было предложено выше, только на вход D подал клок с выхода DCM, сдвинутого на 270 градусов.
|
|
|
|
|
Mar 4 2009, 09:02
|
Знающий
   
Группа: Свой
Сообщений: 845
Регистрация: 18-10-04
Из: Pereslavl-Zalessky, Russian Federation
Пользователь №: 905

|
Цитата(Михаил_K @ Mar 4 2009, 11:18)  Здесь один недостаток - этот сигнал придется дополнительно таскать по всему кристаллу, и у отдельных узлов делать вход для этого сигнала. Этакое неудобство, но видимо обойти его не удастся. Во-первых, это неудобство нечто по сравнению с муками отладки схемы с нарушениями тайминогов. Во-вторых, если в каждый блок приходят оба клока и reset, то можно в кажом блоке сделать по экземпляру схемки из двух регистров. А там либо place-and-route их объединит или просто не станет дублировать. А еще скажите, какого порядка частота, 500MHz, 50MHz ? На 50MHz еще как-то можно говорить, что разные клоки на выходе чего-то у FPGA синхронных, а на 500MHz от такой фразы как-то не по себе.
|
|
|
|
|
Mar 4 2009, 09:27
|
Знающий
   
Группа: Свой
Сообщений: 552
Регистрация: 29-02-08
Пользователь №: 35 481

|
Цитата(Shtirlits @ Mar 4 2009, 12:02)  А еще скажите, какого порядка частота, 500MHz, 50MHz ? На 50MHz еще как-то можно говорить, что разные клоки на выходе чего-то у FPGA синхронных, а на 500MHz от такой фразы как-то не по себе. 100 и 200 МГц. Цитата(andrew_b @ Mar 4 2009, 12:05)  Оттуда, что путь от DCM до буферов разный. Просимулируйте дизайн с реальными задержками и посмотрите на свои клоки. На сколько разный? На 1 микрон? Да вы на кристалл-то посмотрите.
|
|
|
|
|
Mar 4 2009, 09:32
|
Знающий
   
Группа: Свой
Сообщений: 845
Регистрация: 18-10-04
Из: Pereslavl-Zalessky, Russian Federation
Пользователь №: 905

|
Цитата(DmitryR @ Mar 4 2009, 12:10)  Я при возникновении похожих задач (хлопать быстрым клоком медленный синфазный) делал так: падающим быстрого хлопал медленный. Так как, если их нарастающие синфазны, то во время падающего быстрого у медленного всегда полка. Без констрейнов так делать нельзя. Вот возьмите проект, где вы так делали и тщательно сделайте следующее: 1) в FPGA editor (если это xilinx) проследите сеть медленного клока, где и как он соединяется с входом регистра, который на быстром клоке 2) в анализаторе таймингов посмотрите, какое время распространения клока получилось после того, как вы его подключили к входу данных 3) ужаснитесь содеянному Такие номера проходят на частотах в десятки раз ниже максимальных частот устройства, когда что ни делай, все равно временем распространения сигнала можно пренебречь. Так делать можно, но очень полезно понимать что делаешь и избегать советовать другим, если не известна частота. Ведь время прохождения медленного клока от выхода DCM до входа данных регистра с быстрым клоком может быть сопоставимо с периодом быстрого клока и уж точно даже близко не похоже на время прохождения от выхода DCM до синхровхода регистра. Подключение клока к входам данных затрудяет работу.
|
|
|
|
|
Mar 4 2009, 09:32
|
Знающий
   
Группа: Свой
Сообщений: 552
Регистрация: 29-02-08
Пользователь №: 35 481

|
Цитата(DmitryR @ Mar 4 2009, 12:10)  Я при возникновении похожих задач (хлопать быстрым клоком медленный синфазный) делал так: падающим быстрого хлопал медленный. Так как, если их нарастающие синфазны, то во время падающего быстрого у медленного всегда полка. Не очень здорово. Т.к. сразу в два раза уменьшаем setup для всех потребителей этого сигнала. Т.е. в моем случае вместо 5 нс, получаем 2.5 (без учета задержек на триггере и линиях связи). Если бы у меня было 10 и 20 МГц - я бы так и сделал. А тут я влетаю в эквивалентную частоту в 400 МГц. Хотя... Если поставить два триггера последовательно, срабатывающих по разным фронтам.... Надо подумать.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|