VHDL : 합성 정수?


17

합성 신호 및 포트 등을 위해 VHDL에서 정수를 사용해야하는 경우 약간 혼란 스럽습니다.

최상위 포트에서 std_logic을 사용하지만 내부적으로 모든 곳에서 범위 정수를 사용하고있었습니다. 그러나 합성 대상 코드에만 부호있는 / 부호없는 부호를 사용해야한다고 말하는 사람들에 대한 몇 가지 언급을 우연히 발견했습니다.

서명하지 않은 상태로 사용하기 위해 현재 프로젝트를 진행하고 재 작업했습니다.

정수를 사용하는 것은 나쁜 습관입니까? 뭐가 문제 야? 도구가 정수를 매핑 할 너비에 대한 불확실성이 있습니까?


좋은 질문. 나는 그것을 스스로 궁금해했다. 나는 정수, 양수 및 기타 유형을 사용하여 시작했지만 제대로 합성하기에는 매우 털이 많은 것으로 밝혀졌습니다. 모든 사람들이 왜 std_logic을 높은 유형의 언어로 사용하는지 설명 할 수 있기를 바랍니다.
Trygve Laugstøl

1
네. 미쳤어? 현재 실습에서 많이 입력 하면 많은 DATA_I <= TO_UNSIGNED (32010, DATA_I'LENGTH); 유형 물건 ... 그 누구도 귀찮게하지 않습니다? :) 그것은 많은 불필요한 수하물처럼 보입니다. (특히 STD_LOGIC_VECTOR () 를 추가 할 때 ) 내 유형과 크기를 선언했습니다 . DATA_I <= 32010 이어야합니다 . 암시 적이어야합니다. 부호있는 / 서명되지 않은 것 사이를 이동하는 것은 명시 적이어야하며 ... 정확한 모호하지 않은 정수 할당 또는 연산은 암시 적이어야합니다.
darron

답변:


15

정수는 합성이 좋고 항상 사용합니다.

최상위 포트에서 std_logic을 사용하지만 내부적으로 모든 곳에서 범위 정수를 사용하고있었습니다.

괜찮아!

알아 두십시오 :

  • 당신은 먼저 당신이 아닌 것을 시뮬레이션하고 있습니다. 롤오버 동작을 원한다면 명시 적으로 코딩해야합니다.
  • (2311)+2311231unsignedsigned
  • 당신이 그들을 제한하지 않는 경우, 당신은 할 수 때로는 (신디와 이후의 도구들이 멀리 비트를 최적화 할 수 있음 "을 참조하십시오"할 수없는 경우) 할 것이 적은 32 비트 카운터와 끝까지.

거꾸로 :

  • 부호없는 / 서명 된 벡터보다 시뮬레이션 속도가 훨씬 빠릅니다.
  • 시뮬레이션에서 자동으로 롤오버되지 않습니다 (예, 두 목록 모두에 있음). 예를 들어 카운터가 너무 작다는 조기 경고가 나타납니다.

당신이 사용하는 벡터 유형을 수행 할 때 사용하는 ieee.numeric_std, 아니ieee.std_logic_arith 당신은하지 않습니다?

나는 가능한 integer곳에서 s를 사용 하지만, "롤오버 n 비트 카운터"를 명시 적으로 원한다면을 사용하는 경향이 있습니다 unsigned.


예, numeric_std를 사용합니다. 나는 자일링스 툴에 대해 대부분 걱정하고있다. 그들은 여전히 ​​모든 것에 대해 std_logic_vector를 생성하고 "UNSIGNED"는 구문 강조 표시조차되지 않는다.
darron

1
@darron 구문 강조에 대해 걱정하지 마십시오. 에디터와 구문 하이 라이터는 합성 툴과 완전히 다른 소프트웨어입니다. 또한 unsigned는 "그냥"데이터 유형입니다. 언어 자체가 아닌 표준 라이브러리의 일부입니다.
Philippe

하한 -2 ^ 32 + 1 아닌가? 만약 그것이 -2 ^ 31-1이라면, 하나의 숫자만을 나타 내기 위해 단지 하나 이상의 비트가 필요할 것입니다-매우 이상합니다.
Bregalad

@ Bregalad-좋은 캐치-그것은 꽤 오랫동안 잘못되었습니다!
Martin Thompson

@MartinThompson 또는 빼기 기호를 유지하려면-(2 ^ 32-1)로 쓸 수 있습니다.
Bregalad


6

RTL 자체에 정수를 사용하는 데 아무런 문제가 없습니다. 없지만 일부는 그것을 피할 이유가 있습니다. 이것은 실제로 주관적인 "모범 사례"에 대한 질문이며 결국 자신이 원하는 것을 스스로 찾아야합니다. 그것에 대한 도움으로, 나는 이것에 대한 나의 경험과 생각을 나눌 것입니다.

원칙적으로 , 나는 또한 합성을 위해 쓸 때 (제한된) 정수를 사용하는 것을 선호합니다. 나는 때때로 그것을한다. 그러나 실제로 , 나는 보통 signedand에 고착한다 unsigned. 왜 그런지 자세히 설명하겠습니다.

어쨌든 디자인의 일부로 벡터화 된 데이터 유형을 사용해야합니다.

  • 벤더 IP 또는 타사 IP는 거의 integer포트 유형을 사용하지 않습니다.

  • 예를 들어 BlockRam을 통해 데이터를 전송할 때 유추하여 IP / 매크로 / 프리미티브에 연결할 필요가 없더라도 어쨌든 벡터화 된 유형으로 변환해야 할 가능성이 높습니다

  • 위의 어느 것도 적용되지 않더라도 어느 시점 에서 다른 인터페이스 (대부분의 경우 최상위 포트)와 인터페이스해야합니다.

integer전체 디자인에 사용할 수 없으므로 다음과 같은 이유로 모두 함께 건너 뛸 수 있습니다.

  • 어떤 시점에서, 당신은 어쨌든 변환을 수행해야하며, 이것은 integer처음 에 사용 지점의 일부를 제거합니다

  • 또한 시뮬레이션의 경우 이러한 변환은 일반적으로 재설정 전에 또는 다른 시간 에 'U'또는의 벡터로 'X'호출되며 이러한 모든 함수 호출은 패키지 함수에서 경고 메시지를 생성하여 시뮬레이션 경고 / 프롬 트를 어지럽게합니다.

사용의 단점integer :

  • 벡터화 된 유형과 달리 정수에는 'U''X'; 나는 그것들이 시뮬레이션에 매우 도움이된다는 것을 알았습니다. 초기화되지 않은 신호가 설계를 통해 어떻게 전파되는지 알 수 있으며, 재설정 후 초기화되지 않은 신호가 많으면 반응 할 것입니다. 정수를 사용하는 경우에는 그렇지 않습니다.

  • 정수를 사용하면 덧셈 / 뺄셈을 수행 할 때 언더 플로 / 오버플로가 발생할 때 시뮬레이션 / 합성 불일치가 발생할 위험이 더 큽니다. (다른 사람이 이미 지적했듯이)

내가 integer정말로 좋은 옵션이라고 생각 되는 전형적인 경우 :

  • chipScope / signalTap 등을 통해 모니터링하는 디버그 신호 / 카운터

  • 자신의 코드로 들어가거나 나가지 않는 카운터의 내부 표현. 네, 당신은 FIFO를 작성하는 경우 예를 들어, 이러한 경우이고, 당신은 추측 항법 (dead-reckoning) 쓰기입니다 / 신호를 형성하기 위해 읽고 full, empty, almostFull등 (포인터에 그러나를 arithmetics이 경우의 추측 항법 (dead-reckoning)보다 더 좋은 방법입니다. ..)

내 자신의 결론 : 나는 때때로 정수를 사용하지만, 드물게, 그리고 대부분 위에서 설명한 경우에 사용합니다. 내가 사용에 많은 오버 헤드 표시되지 않습니다 unsignedsigned정수 대신, 따라서, 일반적으로 그들에 충실.

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