VHDL에서 If-else와 Case 문의 차이점


11

VHDL 코드의 다른 구문이 RTL에서 어떻게 합성되는지 이해하고 싶습니다.

  • 누구든지 VHDL 프로세스의 If-Else 구문과 Case 문 구문 의 차이점을 합성 툴로 코드가 RTL 회로로 추론하는 방법에 대해 말할 수 있습니까 ?
  • 여러 중첩 된 if-elsecase- statees혼합하여 if-else 구문을 프로세스 내부에 사용하는 경우를 고려하십시오 .
  • 또한 언제 어떤 구문을 사용해야합니까?

추신 : 관련 질문 "vhdl에서 여러 개의 if 문이 처리 중입니다"라는 질문을 보았지만 어쨌든 내 질문에 대답하지 않습니다.


물리적 게이트 구성 방법에 대해서는 언급 할 수 없지만 x86 어셈블리를 생성하는 대부분의 컴파일러에서 if-else는 일반적으로 조건부 점프 (예 : jg, jl, jz, jnz 등)를 사용하여 단일 검사로 존재합니다. 반면 스위치는 숫자 순서로 사례를 구성하고 반복 dec/ jz명령어를 수행하므로 훨씬 효율적입니다. 아마도 비슷한 최적화가 여기에 적용됩니다.
다항식

@Polynomial If-else 및 case의 동작은 일반적인 선형 프로그래밍과 비교하여 하드웨어 언어에서 크게 다릅니다. HDL 문이 "즉시"실행되므로 Op 코드 최적화는 그다지 중요하지 않습니다.
W5VO

답변:


10

누구든지 VHDL 프로세스의 If-Else 구문과 Case 문 구문의 차이점을 합성 툴로 코드가 RTL 회로로 추론하는 방법에 대해 말할 수 있습니까?

if-elsif-else구조는 네트워크 라우팅 우선 순위를 추론 :

개략도

이 회로 시뮬레이션CircuitLab을 사용하여 작성된 회로도

이것은

if bool_expr_1 then
    sig <= val_expr_1;
elsif bool_expr_2 then
    sig <= val_expr_2;
elsif bool_expr_3 then
    sig <= val_expr_3;
else
    sig <= val_expr_4;
end if;

case반면에 그 구조는 큰 ol 'mux를 유추합니다.

여기에 이미지 설명을 입력하십시오

이것은

case case_expr is
  when c0 =>
    sig <= val_expr_0;
  when c1 =>
    sig <= val_expr_1;
  when c2 =>
    sig <= val_expr_2;
      ...
  when others =>
    sig <= val_expr_N;
end case;

분명히 이것들은 단 하나의 값 표현으로 매우 단순화 된 디자인이므로 결과는 하나입니다.

여러 중첩 된 if-else 및 case-statees를 혼합하여 if-else 구문을 프로세스 내부에 사용하는 경우를 고려하십시오.

위의 내용에 따라 중첩 / 혼합 방법을 확인할 수 있습니다.

또한 언제 어떤 구문을 사용해야합니까?

if-else우선 순위를 유추 하므로 둘 이상의 입력 조건이 발생할 수있을 때 사용해야합니다. 사용 case입력이 상호 배타적 인 경우 하나를, 다른 손으로, 적절하다.


case statment는 단일 입력 조건에서만 작동하고 if-else는 여러 입력 조건에서 작동 할 수 있음을 이해합니다. 그러나 두 구조는 본질적으로 muck를 생성합니다 (clk가없는 경우). 논리 합성이 일련의 먹스 대신 단일 빅 먹스에 단일 입력 if-else를 최적화 할 수 있습니까? 또한 우선 순위 라우팅 네트워크는 무엇입니까? 이것은 단순히 하나의 큰 mux 대신 단순한 mux 체인이 아닙니까?
nurabha 2016 년

또한, 클럭에 민감한 프로세스가있는 경우 if-else는 레지스터, 래치 등과 같은 순차적 요소를 생성 할 수 있습니다. case 문도 순차적 논리를 생성 할 수 있습니까?
nurabha 2016 년

예, 우선 순위 라우팅 네트워크는 바로 그 체인입니다. if-else그러나 구조 의 본질은 그 사슬이 발생하는 곳입니다. 두 번째 조건을 테스트 하려면 첫 번째 조건 실패 해야합니다 . 이것은 case구문 의 경우가 아니며, 이것이 if-else문장을 단일 대형 mux로 합성 할 수없는 이유 입니다.
Angelo Stavrow 2014 년

1
그리고 예, case문장은 순차적 논리를 생성 할 수 있습니다. 글래스고 대학교 (University of Glasgow)의 강의 슬라이드 인 "Real World VHDL"을 찾았습니다 .
Angelo Stavrow 2014 년

이것은 좋은 참조입니다.
nurabha 2016 년

4

이 된 블로그 게시물 , 저자가 쓴 VHDL 코드의 두 가지 기능이 동일한 버전을 합성. 하나는 if-else를 사용하고 다른 하나는 case를 사용합니다. 결과:

이 코드를 합성하고 정확한 결과를 얻었습니다. RTL 회로도는 두 프로그램에서 모두 동일했습니다.

그리고 그의 결론 :

이것은 'case'와 'if ... elsif ... else'문이 똑같이 효율적이라는 것을 보여줍니다. 그러나 명확한 코드를 작성하려면 'case'를 사용하는 것이 좋습니다 .'case '는 출력은 많은 조건에 따라 달라 지지만 조건 수가 매우 작은 경우 (2 또는 3) 'if..elseif..else'를 사용할 수 있습니다.

도 있습니다 게시물 수십 생각할 수있는 모든 언어에 대한 스택 오버플로이 주제에 대한이. 결론은 일반적으로 성능 측면에서 차이가 없다는 것입니다. 경우에 따라 많은 경우가있는 경우 컴파일러가 약간 더 나은 성능을 얻을 수있는 룩업 테이블을 만들 정도로 똑똑 할 수 있습니다.

VHDL 신시사이저는 비슷한 것을 할 수 있습니다. 그러나 여전히 많은 수의 케이스가 필요합니다 (이 경우 의도적 인 경우) 많은 옵션이있는 경우 더 나은 가독성을 제공하므로 어쨌든 case 문을 사용하고 싶을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.