检测std_logic vhdl中的更改

时间:2016-01-27 19:28:44

标签: vhdl

我正在尝试检测选择器输入信号的变化。当我找到第一个改变的输入(上升或下降沿)时,我给出一个索引作为输出。当我尝试合成我的源代码时,我收到错误“不支持的Clock语句”。 A也尝试使用“rising_edge”和“falling_edge”,但我得到了同样的错误。 这是我的代码

library ieee;
use ieee.std_logic_1164.all;

entity Selector is
port (
X1:  in std_logic;
X2:  in std_logic;
X3:  in std_logic;
X4:  in std_logic;
X5:  in std_logic;
X6:  in std_logic;
O:       out std_logic_vector(2 downto 0)
);
end Selector;


architecture behave of Selector is
begin
process(X1,X2,X3,X4,X5,X6)
begin
    if (X1'event) then
            O <= "000";
    elsif (X2'event) then
            O <= "001";
    elsif (X3'event) then
            O <= "010";
    elsif (X4'event) then
            O <= "011";
    elsif (X5'event) then
            O <= "100";
    elsif (X6'event) then
            O <= "101";
    else
            O <= "000";
    end if;
end process;
end behave;

是否有替代解决方案?

1 个答案:

答案 0 :(得分:1)

您需要一个额外的时钟输入来比较当前时钟周期中"X1,...的值与上一个时钟周期中的值。如果X2 es与时钟异步,则必须先同步它们。

输入同步

要使输入与时钟同步,您必须使用两个串行的D触发器对每个输入进行采样。第一个触发器的输出可能会受到亚稳态问题的影响,这些问题在这些论文中有更详细的描述:

必须约束两个触发器之间的连接(对于每个输入),以便它们之间的连接路径尽可能短。下面的实现将只显示两个触发器。我可以在sync_BitsPoC Library组件中找到更高级的实现。我是其中一位作者。

比较

一旦输入与时钟同步,只需将其延迟另一个时钟周期。这将构成最后一个值,因此,您可以将当前值与最后一个值进行比较,以检测信号变化。输入时钟的频率必须比其中一个X输入的变化频率快得多:

  • 快速回复边缘检测,
  • 捕捉所有信号变化。

这是一个可能的实现:

X