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

당신은 시도 할 수 있습니다 :이 경우 changed에서

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'; 

는 하나의 비트입니다.

조건 내에서 others 연산자를 사용할 수 있는지 기억하지 못합니다 ... 그 이유는 "시도 할 수 있습니다"입니다 ... 그래서 당신에게 효과가 있는지 알려주세요 ....

+0

불행히도 이것은 작동하지 않습니다 (오류 : "기타"값을 집계 할 수 없음 (LRM 7.3.2.2)). – xx77aBs

9

에 감소?

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

Hahah thx : D 그냥 "changed <= rL1 = l1"시도했지만 작동하지 않습니다 = 부울 및 std_logic 반환합니다. 또한 "언제"에 대해 잊어 버렸습니다 :) – xx77aBs

+0

그런 구현은 주파수를 잃고 소스 사용을'xor' 구현과 비교하여 증가시키지 않을까요? –

+3

@AlehDouhi 평등 비교가 합성 될 것이라고 생각합니까? 아마도 XOR과 OR이 줄어들 것입니다. 그래서 당신은 아마 똑같은 것을 얻을 것입니다, 그러나 당신은 당신이 생각하지 못했던 더 작고 빠른 방법을 얻을 것입니다. 읽을 수있는 코드의 규칙 1, 의미를 말하고 필요한 경우에만 최적화하십시오. 규칙 1의 빠른 코드, 말은 무슨 뜻이며 컴파일러/신시사이저를 하나의 구현으로 제한하지 마십시오. –

관련 문제