2012-04-28 168 views
1

我有一个std_logic_vector,我需要知道什么时候发生了一些变化。 到目前为止,我写了这个:VHDL - 如何检测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.我怎么能得到它?

+1

这是不完全清楚。当**正在改变或** **改变时,你想知道**吗? – 2012-04-28 15:01:05

+0

只要有什么改变,我不在乎什么改变。 – xx77aBs 2012-04-28 15:09:04

回答

2

您可以使用

change <= or_reduce(tickL1) 

change <= or_reduce(rL1 xor l1); 

其中OR的结果的所有信号加在一起,因此,如果任何这些是1信号change也将是1

编辑:所有这些减少功能在ieee.std_logic_misc.all

+0

当我使用or_reduce时,我得到“未定义符号or_reduce'”。你能告诉我我应该包括什么? – xx77aBs 2012-04-28 15:11:36

+2

你必须'使用ieee.std_logic_misc.all'。 – 2012-04-28 15:13:40

+0

这很好,谢谢:) – xx77aBs 2012-04-28 16:03:36

0

你可以试试:

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运算符......这就是我说“你可以尝试”的原因......所以,让我知道它是否适用于你......

+0

Unfortunatel这不起作用(错误:无法确定聚合中的“其他”值(LRM 7.3.2.2))。 – xx77aBs 2012-04-28 15:09:30

9

为什么每个人都得到了与XOR的痴迷?

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

哈哈thx:D我试着只是“改变<= rL1 = l1”,但没有奏效,因为=返回布尔值而不是std_logic。另外我忘了“什么时候”:) – xx77aBs 2012-04-28 18:53:01

+0

这样的实现会不会导致频率丢失和“xor”实现相比增加的源使用率? – 2012-04-28 23:18:55

+3

@AlehDouhi你认为平等比较会综合到什么程度?可能是XOR和OR降低。所以你可能会得到同样的结果,但是你可能会得到一些你没有想到的更小,更快的方法。规则1的可读代码,说你的意思,只在必要时优化。快速代码的规则1,说出你的意思,不要将编译器/合成器限制为一个(也只能是一个)实现。 – 2012-04-29 00:08:56