VHDL : 벡터의 OR-ing 비트


11

벡터의 비트를 함께 OR하고 싶습니다. 그래서 벡터라는 벡터가 example(23 downto 0)있고 모든 비트를 다른 벡터로 OR하고 싶습니다.가는 것을 포함하지 않는 방법이 example(0) or example(1) or ...example(23)있습니까?


대신 단순히 0과 비교할 수 있습니까? 같은 효과가 있습니다.
David

David의 주석을 확장하려면 (32 비트 벡터 사용) : or_result <= '0' when input=X"00000000" else '1';해당 벡터의 길이와 일치하도록 0의 수를 변경하십시오.

논리 감소는 vhdl 2008에서 사용할 수 있습니다. stackoverflow.com/questions/20296276/…
Moberg

1
또한 더 일반적인 방법을 사용할 수 있습니다.result <= '0' when (example=(example'range=>'0')) else '1';
Miguel Risco

답변:



5

Verilog에는 편리한 "감소 연산자"가있어 원하는 것을 정확하게 수행 할 수 있습니다 . 벡터 |example[23:0]의 모든 비트를 OR하는 결과를 제공합니다 example.

불행히도 VHDL에는이 연산자가 없습니다. 에 따르면 comp.lang.vhdl 자주 묻는 질문 ,하지만

벡터의 모든 비트에 대해 감소 연산을 수행하기 위해 (예를 들어, 벡터의 모든 비트를 "또는") 미리 정의 된 VHDL 연산자가 없다. 그러나 축소 연산자는 쉽게 구현할 수 있습니다.

[ 'X'및 'Z'값을 처리하지 않는 예 건너 뛰기]

    function or_reduce( V: std_logic_vector )
                return std_ulogic is
      variable result: std_ulogic;
    begin
      for i in V'range loop
        if i = V'left then
          result := V(i);
        else
          result := result OR V(i);
        end if;
        exit when result = '1';
      end loop;
      return result;
    end or_reduce;
    ...
    b <= or_reduce( b_vec ); 

누가 다운 보트를했는지, 왜 그런지 설명 할까?
광자

이 합성 할 수 있습니까?
Johannes Schaub-litb

@ JohannesSchaub-litb는 물론 실제로 큰 OR 게이트 (또는 더 작은 것의 트리)로 합성 될 수 있습니다. 아마도 표준 라이브러리 (Aron D. Marasco의 답변)의 버전이 즉시 생성 된 것보다 더 잘 최적화 될 것입니다.
광자

VHDL-2008에는 단항 감소 연산자가 있습니다. FAQ가 오래되었습니다. 더욱이, 제시된 기능은 일부 툴이 질식 할 수 있고 시뮬레이션을위한 미세 최적화 외에 필요하지 않은 초기 출구로 인해 의심스러운 합성 가능성을 가지고 있습니다.
KevinThibedeau
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.