【发布时间】:2018-05-03 23:35:23
【问题描述】:
如何对同一时钟域中的信号设置不同的时钟约束?
在我的设计中,我有一个可通过 APB 寄存器配置的 PLL。 我也在使用 2 种模式(模式 1 和模式 2)。 根据模式(用户可选择),时钟输出为 100 MHz 或 70 MHz。
因为时钟来自相同的 PLL 输出,所以相同的时钟用于在模式 1 下工作 @100 MHz 和在模式 2 下工作 @70 MHz 的设计。
下面是顶层实体的结构:
entity myTopLevel is
port(
I_clk : in std_logic; -- the PLL output; @100MHz or 70 MHz
I_rst : in std_logic; -- input rst
I_mode1 : in std_logic; -- when '1' : I_clk is running @ 100 MHz, when '0' : 70 MHz
I_data : in std_logic_vector(15 downto 0);
O_data : out std_logic_vector(15 downto 0));
在顶级实体内部,有 2 个模块。 1 在 100 MHz 下运行,并且在 I_mode1 = '0' 时处于复位状态。另一个以 70 MHz 运行,并且在 I_mode1 = '1' 时处于复位状态:
INST1 : myProcessModuleMode1
port (
I_clk1 => I_clk,
I_rst1 => S_rst1, -- asserted when I_mode1 = '0'
I_data1=> I_data,
O_data1=> S_data1)
INST2 : myProcessModuleMode2
port (
I_clk2 => I_clk,
I_rst2 => S_rst2, -- asserted when I_mode2 = '0'
I_data2=> I_data,
O_data2=> S_data2)
O_data <= S_data1 when I_mode1='1' else S_data2;
但是,myProcessModuleMode2 比 myProcessModuleMode1 慢。所以我想在module2上添加一个约束@ 70 MHz,在module1上添加一个100 MHz。可能吗 ? 使用当前版本,我将时钟限制在 100 MHz 并且我得到(在综合/放置&布线之后)90 MHz,在模块 2 中具有负松弛(没关系,我想要 70 MHz)和模块 1 中的一些负松弛...... 我想释放模块 2 中的约束,以便在模块 1 中获得更好的结果。
在模块 2 上使用多周期路径可能是时钟 @100 MHz 和 50 MHz 而不是时钟 @ 100 MHz 和 70 MHz 的解决方案。
注意:I_mode1(配置模式)被认为是静态的。 注2:I_*代表输入,O_*输出,S_*信号。
问候,
【问题讨论】:
-
约束不固定时钟频率。它告诉工具您的逻辑需要最大 路径延迟才能工作。由于这个最大值随着三个时钟速度的上升而减小,因此您只需使用最快时钟的约束。
-
@JHBonarius:问题在于,如果顶层时钟被限制在要求更高的 100 MHz 时序,那么模块 2 就会受到过度限制。您是否尝试将 70 MHz 约束应用于模块 2 内的 I_clk 信号?计时工具应警告重叠约束并告诉您有效应用了哪个约束。也许您的工具还允许具有非整数多重性的多循环路径约束,例如 1.4 ...
-
然后只需将每个模块连接到自己的时钟即可。使用时钟域交叉技术将它们连接到数据总线。无论如何,您为什么要将它们与一个时钟组合在一个块中?你让你的生活变得复杂
-
@damage :该工具不允许非整数多周期约束和 70MHz 约束在 100MHz 时钟域中给我带来更差的结果。@JHBonarius :我别无选择:两个时钟是完全相同的网络(来自 APB 可配置的 PLL 的相同输出)。在一种模式下,此时钟输出为 70MHz,在另一种模式下,此相同输出为 100MHz。如果我制作 2 个不同的块,它们都将具有相同的时钟输入,所以它是相同的。
-
@damage :我会尝试把时钟约束放到block模块里面,让你知道结果。
标签: constraints vhdl clock synthesis