我正在尝试检测选择器输入信号的变化。当我找到第一个改变的输入(上升或下降沿)时,我给出一个索引作为输出。当我尝试合成我的源代码时,我收到错误“不支持的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;
是否有替代解决方案?
答案 0 :(得分:1)
您需要一个额外的时钟输入来比较当前时钟周期中"
,X1
,...的值与上一个时钟周期中的值。如果X2
es与时钟异步,则必须先同步它们。
要使输入与时钟同步,您必须使用两个串行的D触发器对每个输入进行采样。第一个触发器的输出可能会受到亚稳态问题的影响,这些问题在这些论文中有更详细的描述:
必须约束两个触发器之间的连接(对于每个输入),以便它们之间的连接路径尽可能短。下面的实现将只显示两个触发器。我可以在sync_Bits的PoC Library组件中找到更高级的实现。我是其中一位作者。
一旦输入与时钟同步,只需将其延迟另一个时钟周期。这将构成最后一个值,因此,您可以将当前值与最后一个值进行比较,以检测信号变化。输入时钟的频率必须比其中一个X输入的变化频率快得多:
这是一个可能的实现:
X