【发布时间】:2018-02-08 21:02:43
【问题描述】:
我遇到了如下情况:
library ieee;
use ieee.std_logic_1164;
entity clkin_to_clkout is
port (
clk_in : in std_logic;
clk_out : out std_logic);
end entity clkin_to_clkout;
architecture arch of clkin_to_clkout is
begin
clk_out <= clk_in;
end architecture arch;
clk_in 到 clk_out 的分配对综合来说不是问题,但在模拟器中,它会导致从 clk_in 到 clk_out 的增量延迟,从而创建时钟跨越边界。有没有办法在不引入增量延迟的情况下将实体输出分配给实体输入?谢谢。
编辑:对一些 cmets 的回应。首先,我想回答这个确切的问题。为了澄清起见,我希望输出端口的行为与输入端口的别名完全相同。如果答案是“在 VHDL 中,不可能使输出端口与输入端口的行为完全匹配”,那么这是正确的答案,我会接受它作为语言的限制。其次,如果看不出问题出在哪里,请在下面的testbench中实例化clkin_to_clkout实体,模拟几个clk1周期后观察mr_sig_del_dly和mr_sig_clk_dly的区别:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity delta_delay is
end entity delta_delay;
architecture arch of delta_delay is
signal clk1: std_logic := '0';
signal clk2 : std_logic;
signal mr_sig : unsigned(7 downto 0) := (others => '0');
signal mr_sig_del_dly : unsigned(7 downto 0);
signal mr_sig_clk_dly : unsigned(7 downto 0);
component clkin_to_clkout is
port (
clk_in : in std_logic;
clk_out : out std_logic);
end component clkin_to_clkout;
begin
clk1 <= not clk1 after 10 ns;
clk_inst : clkin_to_clkout
port map (
clk_in => clk1,
clk_out => clk2);
mr_sig <= mr_sig + 1 when rising_edge(clk1);
mr_sig_del_dly <= mr_sig when rising_edge(clk2);
mr_sig_clk_dly <= mr_sig when rising_edge(clk1);
end architecture arch;
当您进行仿真时,您会观察到 mr_sig_clk_dly 按预期延迟了 1 个时钟周期,因为它被分配在与 mr_sig 相同的时钟 (clk1) 上。 mr_sig_del_dly 不会延迟 1 个 clk1 周期,即使 clk2 只是 clkin_to_clkout 模块中的 clk1 的直通。这是因为 clk2 是 clk1 的增量延迟版本,因为我使用了信号分配。 再次感谢您的所有回复。
【问题讨论】:
-
为什么增量延迟是个问题?时钟跨越边界与增量延迟无关。
-
请看我对你的回答的评论。
-
我做到了。无论如何,这个组件有什么用?您似乎要求我们解决您认为可以解决您最初问题的问题。又名XY-problem。请告诉我们您最初遇到的问题。
-
这与我在这里问的问题几乎相同stackoverflow.com/questions/36153003/…
-
Delta 延迟不会引入时钟边界跨越问题。但是他们很可能暴露这样的问题。
标签: vhdl