Перейти к содержанию
    

То есть нужно 2 констрейна на каждый cross clock domain переход?

Чтобы ISE анализировал cross clock domain переходы, то в .ucf необходимо определить связь между клоками, например clk0 и clk1, таким образом:

NET "clk0" TNM_NET = "SYS_clk0";
TIMESPEC "TS_SYS_clk0" = PERIOD "SYS_clk0" 5 ns HIGH 50 %;
NET "clk1" TNM_NET = "SYS_clk1";
TIMESPEC "TS_SYS_clk1" = PERIOD "SYS_clk1" "TS_SYS_clk0"*2 HIGH 50 %;

Здесь clk0 и clk1 приходят с внешних ножек. Констрейнты для клоков с выхода PLL и DCM будут прописаны ISE автоматически, за них беспокоиться не надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы ISE анализировал cross clock domain переходы, то в .ucf необходимо определить связь между клоками, например clk0 и clk1, таким образом:

NET "clk0" TNM_NET = "SYS_clk0";
TIMESPEC "TS_SYS_clk0" = PERIOD "SYS_clk0" 5 ns HIGH 50 %;
NET "clk1" TNM_NET = "SYS_clk1";
TIMESPEC "TS_SYS_clk1" = PERIOD "SYS_clk1" "TS_SYS_clk0"*2 HIGH 50 %;

Здесь clk0 и clk1 приходят с внешних ножек. Констрейнты для клоков с выхода PLL и DCM будут прописаны ISE автоматически, за них беспокоиться не надо.

1. При такой записи SYS_clk0 и SYS_clk1 будут для Timing Analyzer'а связаны по фазе, а в реальности этого может и не быть - не зря же они на разные входы подаются...

2. Для особоневерующих есть более интересный случай, если взять соотношение частот не 2, а, например, 1.01 - вот потеха начнётся...

 

Для тех, кому лень код писать, а покрутить гаечки хочется:

VHDL:

library IEEE;
use IEEE.Std_Logic_1164.all;

Library UNISIM;
use UNISIM.vcomponents.all;

entity CLK is port (
    IN_D:    in    std_logic;
    IN_CLK:    in    std_logic_vector(1 downto 0);
    OUT_Q:    out    std_logic_vector(1 downto 0) );
end entity;


architecture Arc of CLK is
    signal    CLK_UB:    std_logic_vector(OUT_Q'Range);
    signal    CLK:    std_logic_vector(OUT_Q'Range);
    signal    D:        std_logic;
    signal    Q:        std_logic_vector(OUT_Q'Range) := (others => '0');
    
    attribute iob: string;
    attribute iob of Q: signal is "false";
begin
    D_IBUF: component IBUF port map ( I => IN_D, O => D );
    
    IO: for i in CLK'Reverse_Range generate
        CLK_IBUF: component IBUFG port map ( I => IN_CLK(I), O => CLK_UB(i) );
        CLK_BUFG: component BUFG  port map ( I => CLK_UB(I), O => CLK   (i) );
        Q_OBUF:   component OBUF  port map ( I => Q(I),      O => OUT_Q (i) );
    end generate;
    
    Q(0) <= D    when rising_edge(CLK(0));
    Q(1) <= Q(0) when rising_edge(CLK(1));
end architecture;

UCF:

NET "IN_CLK<0>" TNM_NET = CLK0;
NET "IN_CLK<1>" TNM_NET = CLK1;
TIMESPEC TS_CLK_0 = PERIOD "CLK0" 5 ns          HIGH 50%;
TIMESPEC TS_CLK_1 = PERIOD "CLK1" TS_CLK_0*1.01 HIGH 50%;

Для ленивых результат от P&R:

------------------------------------------------------------------------------------------------------
  Constraint                                |  Check  | Worst Case |  Best Case | Timing |   Timing   
                                            |         |    Slack   | Achievable | Errors |    Score   
------------------------------------------------------------------------------------------------------
* TS_CLK_1 = PERIOD TIMEGRP "CLK1" TS_CLK_0 | SETUP   |    -1.706ns|   177.356ns|       1|        1706
   * 1.01 HIGH 50%                          | HOLD    |     0.678ns|            |       0|           0
------------------------------------------------------------------------------------------------------
  TS_CLK_0 = PERIOD TIMEGRP "CLK0" 5 ns HIG | N/A     |         N/A|         N/A|     N/A|         N/A
  H 50%                                     |         |            |            |        |            
------------------------------------------------------------------------------------------------------

P.S. Вот с этим (метастабильностью) и развлекаются при cross clock domain переходах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. При такой записи SYS_clk0 и SYS_clk1 будут для Timing Analyzer'а связаны по фазе, а в реальности этого может и не быть - не зря же они на разные входы подаются...

А если в этом случае разность фаз случайная, то что же делать?

 

Если схемы с такими клоками пересечь, то такая абра-кадабра получится...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если в этом случае разность фаз случайная, то что же делать?
Как что делать ?? - cross clock domain переход делать... для управляющих сигналов синхронизаторы делать, а для данных обычно надобно FIFO прилаживать.

 

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

 

Вот и приходится ставить синхронизаторы для перехода с ClkX на ClkY, а чтобы MAP/P&R голову долго не ломали по дополнительному constaint'у накладывать приходится на каждое направления перехода (как я и писал ранее)... Да и в самих синхронизаторах constaint’ов разных по пачке, чтобы подавлялась метастабильность получше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

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

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...