VHDL没有Delta延迟输入到输出分配

时间:2018-02-08 21:02:43

标签: vhdl

我遇到如下情况:

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的delta延迟,从而创建时钟交叉边界。有没有办法在不引入增量延迟的情况下将实体输出分配给实体输入?感谢。

编辑:回复一些评论。首先,我想要回答这个确切的问题。为了澄清,我希望输出端口的行为与输入端口的别名完全相同。如果答案是“在VHDL中没有可能的方法使输出端口成为输入端口的精确行为匹配”,那么这就是正确的答案,我会接受它作为语言的限制。其次,如果您没有看到问题所在,请在以下测试平台中实例化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)上分配的。即使clk2只是clkin_to_clkout模块中clk1的一个直通,mr_sig_del_dly也没有延迟1 clk1循环。这是因为clk2是clk1的delta延迟版本,因为我使用了信号分配。 再次感谢您的所有回复。

2 个答案:

答案 0 :(得分:0)

您似乎不知道delta延迟是什么。 增量延迟是无限小延迟。每个任务都有(至少)模拟中的delta延迟。这就是VHDL的工作原理。

编辑:

在您发表评论后,我会看到您的来源。您遇到的问题可能只是模拟,因为综合会简化它。然而,有一个电子等效物,是多相时钟。考虑你想要一个2相时钟,即差分信号,其中第二个信号是第一个信号的倒数。如果您通过仅使用一个反相器来实现这些时钟,则第二个信号将具有相位偏移。这是由于逆变器组件的延迟。因此,在时钟生成逻辑(如PLL和DCM)中,未反转的信号也被延迟(使用可变延迟缓冲器)。即需要处理 所有时钟信号,为它们提供相同的(delta)延迟。

可以在VHDL中应用相同的解决方案。例如:

library ieee;
use ieee.std_logic_1164.all;

entity clk_buffers is
    port(
        clk : in std_logic;
        clk1 : out std_logic;
        clk2_n : out std_logic
        );
end entity;

architecture rtl of clk_buffers is begin
    clk1 <= clk;
    clk2_n <= not clk;
end architecture;

library ieee;

entity test_bench is end entity;
architecture behavioural of test_bench is
    use ieee.std_logic_1164.all;
    signal clk, clk1, clk2_n : std_logic := '1';
    signal base, child1, child2 : integer := 0;
begin
    clk <= not clk after 1 ns;

    clk_buffers_inst : entity work.clk_buffers
        port map(clk => clk, clk1 => clk1, clk2_n => clk2_n);

    base <= base+1 when rising_edge(clk1);
    child1 <= base when rising_edge(clk1);
    child2 <= base when falling_edge(clk2_n);
end architecture;

enter image description here

答案 1 :(得分:0)

在VHDL-2008中或之前没有可能的方法使输出端口成为输入端口的精确行为匹配。 参考Jim Lewis对原始问题的评论。 谢谢,吉姆和所有认为的人。