Цитата(zomg @ Feb 26 2011, 10:48)

Чтобы 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 переходах.