【问题标题】:Detect changes in std_logic vhdl检测 std_logic vhdl 中的变化
【发布时间】:2016-01-27 19:28:43
【问题描述】:

我正在尝试检测我的选择器输入信号的变化。当我发现第一个改变的输入(上升沿或下降沿)时,我给出一个索引作为输出。当我尝试合成我的源代码时,我收到一个错误“不支持的时钟语句”。 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;

是否有替代解决方案?

【问题讨论】:

  • 不完整的 Xilinx XST 错误消息告诉您具有六个时钟的双倍数据速率寄存器不是受支持的综合构造(请参阅 XST HDL 支持的构造)。也许您可以多了解一下您在这里要做什么。除了对时间顺序敏感之外,它看起来有点像优先级编码器。如果您需要依赖于时间顺序的模拟结果,则需要强制使用与所有事件兼容的时钟以确保顺序。
  • 我想监控这六个信号。我希望能够找到第一个改变的人(从 H 到 L 或从 L 到 H),尊重他们的优先级。当我找到那个信号时,我会输出一个特定的向量。

标签: vhdl


【解决方案1】:

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

输入同步

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

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

比较

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

  • 快速响应边缘检测,并且
  • 捕捉所有信号变化。

这是一个可能的实现:

library ieee;
use ieee.std_logic_1164.all;

entity Selector is
    port (
        clk : in std_logic;
        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
    signal X : std_logic_vector(6 downto 1); -- all inputs in one vector
    signal X_meta : std_logic_vector(6 downto 1); -- first  sampling stage
    signal X_curr : std_logic_vector(6 downto 1); -- second sampling stage =
                                                  -- current value
    signal X_last : std_logic_vector(6 downto 1); -- last value of X_curr
begin
    -- Concatenate all inputs to one vector for shorter code below.
    X <= X6 & X5 & X4 & X3 & X2 & X1;

    -- Synchronize external inputs to clock. If the X* inputs are already
    -- synchronous to 'clk' then replace this process with:
    -- X_curr <= X;
    sync: process(clk)
    begin
        if rising_edge(clk) then
            -- The path betweeen these two flip-flops must be constrained for a
            -- short delay, so that, the wire in between is as ahort as
            -- possible. 
            X_meta <= X;
            X_curr <= X_meta;
        end if;
    end process;

    -- This statement delays the current value X_curr by one clock cycle.
    X_last <= X_curr when rising_edge(clk);

    -- Comparison and selector output.
    process(X_curr, X_last)
    begin
        if    (X_curr(1) xor X_last(1)) = '1' then
            O <= "000";
        elsif (X_curr(2) xor X_last(2)) = '1' then
            O <= "001";
        elsif (X_curr(3) xor X_last(3)) = '1' then
            O <= "010";
        elsif (X_curr(4) xor X_last(4)) = '1' then
            O <= "011";
        elsif (X_curr(5) xor X_last(5)) = '1' then
            O <= "100";
        elsif (X_curr(6) xor X_last(6)) = '1' then
            O <= "101";
        else
            O <= "000";
        end if;
    end process;
end behave;

【讨论】:

  • 与异步顺序相比,存在一个时钟不确定性。见Metastability and Clock Uncertainty in FPGA Designs。 “如果输入违反了最小建立时间或保持时间“......””,触发器可能会保持在前一个状态,可能会进入预期的下一个状态,或者可能会处于不稳定的中间状态持续在它解决到两个稳定状态之一之前的不确定时间量“......。亚稳态恢复的解决状态也可以是任何一种状态。
  • (我没有建议您的答案是有原因的,仍然需要有关该应用程序的更多信息)。
  • @user1155120 是的,我知道亚稳态问题。我认为在这里解决这个问题太复杂了。我希望,我现在找到了好方法。
  • 你没有抓住重点。无论面对建立时间或保持时间违规时是否发生亚稳态,都会有一个时钟不确定性进入时钟域。您可以保证信号的单个事件持续时间超过 2 个时钟,同时亚稳态恢复加上建立和保持少于一个时钟。你不能保证时钟的一致性。确定顺序需要多精确的精度?那还没有呈现出来。
  • @user1155120 我现在看到,在两个信号同时发生变化的情况下,cmets 中提到的 OP 具​​有一定的优先级。我的回答中没有讨论这种情况,我不知道如何解决。如果信号只是在附近发生变化,那么时钟周期必须是两次信号变化之间时间的一半。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多