【问题标题】:VHDL - How to detect change on std_logic_vector?VHDL - 如何检测 std_logic_vector 的变化?
【发布时间】:2012-04-29 02:00:07
【问题描述】:

我有一个 std_logic_vector,我需要知道它什么时候会发生一些变化。 到目前为止,我写了这个:

process (cp, l1)
begin
    if rising_edge(cp) then
        rL1 <= l1;
    end if;
end process;
tickL1 <= rL1 xor l1;

rL1 是 l1 的延迟版本,l1 是我正在检查更改的 std_logic_vector。问题是 xor 返回 std_logic_vector,但我只需要 0 或 1。我怎样才能得到它?

【问题讨论】:

  • 这还不完全清楚。您想知道什么时候发生变化或什么发生变化吗?
  • 只要有变化,我才不管变化。

标签: vhdl


【解决方案1】:

为什么每个人都对 XOR 很着迷?

changed <= '0' when rL1 = l1 else '1';

【讨论】:

  • 哈哈 thx :D 我只是尝试了“更改
  • xor实现相比,这样的实现不会导致频率损失和源使用量增加吗?
  • @AlehDouhi 你认为相等比较会合成什么?可能是 XOR 和 OR 减少。所以你可能会得到同样的东西,但你可能会得到一些你没有想到的更小、更快的方法。可读代码的规则 1,说出你的意思,只在必要时进行优化。快速代码规则 1,说出你的意思,不要将编译器/合成器限制为一个(并且只有一个)实现。
  • 不知道,可能是 AND,NOT,比较器和 MUX :) 抱歉,开个玩笑 :) 谢谢您的解释!
【解决方案2】:

你可以使用

change <= or_reduce(tickL1)

change <= or_reduce(rL1 xor l1);

结果的所有信号都为 OR,所以如果其中任何一个是 1,则信号 change 也将是 1

编辑:所有这些reduce函数都在ieee.std_logic_misc.all

【讨论】:

  • 当我使用 or_reduce 时,我得到“未定义的符号 'or_reduce'”。你能告诉我应该包括什么吗?
  • 你必须use ieee.std_logic_misc.all
【解决方案3】:

您可以尝试:

process (cp, l1)
begin
    if rising_edge(cp) then
        rL1 <= l1;
    end if;
end process;
changed <= '0' when (rL1 xor l1) = (others => '0') else '1';

在这种情况下,changed 是一个位。

我真的不记得您是否可以在条件中使用 others 运算符...这就是我说“您可以尝试”的原因...所以,让我知道它是否适合您... .

【讨论】:

  • 不幸的是,这不起作用(错误:无法确定“其他”值的总和。(LRM 7.3.2.2))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多