我遇到如下情况:
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延迟版本,因为我使用了信号分配。 再次感谢您的所有回复。
答案 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;
答案 1 :(得分:0)
在VHDL-2008中或之前没有可能的方法使输出端口成为输入端口的精确行为匹配。 参考Jim Lewis对原始问题的评论。 谢谢,吉姆和所有认为的人。