zomg 0 26 февраля, 2011 Опубликовано 26 февраля, 2011 · Жалоба То есть нужно 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 автоматически, за них беспокоиться не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 8 26 февраля, 2011 Опубликовано 26 февраля, 2011 · Жалоба Чтобы 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 переходах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zomg 0 26 февраля, 2011 Опубликовано 26 февраля, 2011 · Жалоба 1. При такой записи SYS_clk0 и SYS_clk1 будут для Timing Analyzer'а связаны по фазе, а в реальности этого может и не быть - не зря же они на разные входы подаются... А если в этом случае разность фаз случайная, то что же делать? Если схемы с такими клоками пересечь, то такая абра-кадабра получится... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 8 26 февраля, 2011 Опубликовано 26 февраля, 2011 · Жалоба А если в этом случае разность фаз случайная, то что же делать?Как что делать ?? - cross clock domain переход делать... для управляющих сигналов синхронизаторы делать, а для данных обычно надобно FIFO прилаживать. Если схемы с такими клоками пересечь, то такая абра-кадабра получится...Вот над этим и ломают головы люди умные... как бы оно так половчее сделать, чтобы безотказно работало, да еще и с меньшей задержкой данные передавало, и места бы чтобы поменьше занимало. Вот и приходится ставить синхронизаторы для перехода с ClkX на ClkY, а чтобы MAP/P&R голову долго не ломали по дополнительному constaint'у накладывать приходится на каждое направления перехода (как я и писал ранее)... Да и в самих синхронизаторах constaint’ов разных по пачке, чтобы подавлялась метастабильность получше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться