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

これは完全にはっきりしていません。 **変化しているか**変化していることを知りたいですか? –

+0

何かが変わったとき、私は何が変わっても気にしません。 – xx77aBs

答えて

2

あなたは

change <= or_reduce(tickL1) 

または

change <= or_reduce(rL1 xor l1); 

どのまたは一緒に結果のすべての信号ですので、これらのいずれかが1信号ある場合を使用することができますも1になります。

編集:これらのすべてが機能を削減誰もがXORと強迫観念を持っているのはなぜieee.std_logic_misc.all

+0

or_reduceを使うと "Undefined symbol 'or_reduce'"が出ます。私は何を含めるべきか教えていただけますか? – xx77aBs

+2

あなたは 'ieee.std_logic_misc.all'を使用する必要があります。 –

+0

これは完全に、ありがとう:) – xx77aBs

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

これはうまくいきません(エラー:集合体の "他の"値を特定できません(LRM 7.3.2.2))。 – xx77aBs

9

にありますか?

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

ハハthx:D私はちょうど "変更された<= rL1 = l1"しようとしましたが、これは動作しませんでした=ブール値とstd_logicを返します。また、私は "いつ"について忘れていました:) – xx77aBs

+0

このような実装では、周波数の損失とソースの使用量の増加が 'xor'の実装と比べてどうなりますか? –

+3

@AlehDouhi平等比較をどのように合成すると思いますか?おそらくXORとORが減少します。だから、おそらく同じことをするでしょうが、あなたが思っていなかったより小さく、より速い方法を得るかもしれません。読み取り可能なコードのルール1は、あなたが意味することを言い、必要なときにのみ最適化します。高速なコードのルール1は、コンパイラ/シンセサイザを1つ(そして1つだけ)の実装に限定するものではありません。 –

関連する問題