2012-04-28 175 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