C를 통해 Verilog 또는 VHDL을 사용하는 동기는 무엇입니까?


12

나는 프로그래밍 배경에서 왔으며 하드웨어 나 펌웨어 (최대 전자 및 Arduino)로 너무 엉망이되지 않았습니다.

C 또는 일부 어셈블리와 같은 프로그래밍 언어보다 Verilog 및 VHDL과 같은 하드웨어 설명 언어 (HDL)를 사용하는 동기는 무엇입니까?

이 문제는 선택의 문제입니까?

펌웨어가 HDL로 작성된 하드웨어는 명령을 병렬로 실행하는 데 분명한 이점이 있음을 읽었습니다. 그러나 C 또는 어셈블리로 펌웨어를 작성할지 의문을 나타내는 토론에 놀랐습니다 (CPU가없는 경우 어셈블리가 어떻게 적절합니까?). 또한 옵션이라고 결론지었습니다.

따라서 몇 가지 질문이 있습니다 (주저하지 말고 설명하십시오).

  1. 펌웨어는 실제로 HDL 또는 소프트웨어 프로그래밍 언어로 작성 될 수 있습니까, 아니면 동일한 미션을 수행하는 또 다른 방법일까요? 나는 실제 사례를 좋아합니다. 각 옵션으로 인해 어떤 제약이 발생합니까?

  2. 소프트웨어를 통한 펌웨어의 일반적인 사용은 하드웨어 가속기 (GPU, 네트워크 어댑터, SSL 가속기 등)에서 사용됩니다. 내가 이해하는 것처럼이 가속은 항상 필요한 것은 아니지만 권장 사항 만 (예 : SSL 및 복잡한 알고리즘의 가속의 경우) 권장됩니다. 모든 경우에 펌웨어와 소프트웨어 중에서 선택할 수 있습니까? 그렇지 않다면 펌웨어가 명확하고 명백하게 적합한 경우에 기뻐할 것입니다.

  3. 펌웨어가 대부분 ROM이나 플래시에서 타 버린 것을 읽었습니다. 거기에 어떻게 표현되어 있습니까? 소프트웨어처럼 비트로? 그렇다면 심오한 차이점은 무엇입니까? 펌웨어의 경우에 적합한 회로를 사용할 수 있습니까?

나는 여기저기서 실수를 한 것 같아요, 몇 가지 가정에서 용서해주세요. 감사합니다!


14
프로그래밍 언어는 소프트웨어를 설명하기위한 것이고 하드웨어 설명 언어는 하드웨어를 설명하기위한 것입니다.
Ignacio Vazquez-Abrams

1
Verilog 또는 VHDL로 펌웨어를 작성하지 마십시오. Verilog 또는 VHDL을 사용하여 칩을 설계하고 FPGA를 프로그래밍하며 마더 보드를 설계하십시오. C 또는 어셈블리를 사용하여 펌웨어를 작성합니다. C / C ++를 사용하여 마더 보드를 디자인 할 수도 있습니다. C 컴파일러가 디자인을 시뮬레이션하는 프로그램을 만들기 위해 컴파일 할 수 있지만 SystemC 컴파일러가 회로로 컴파일 할 수있는 SystemC라는 라이브러리가 있습니다.
slebetman

FWIW, Arduino 경험이 있기 때문에 Arduino 용 소프트웨어 작성을 펌웨어 작성이라고합니다. 펌웨어는 완전한 운영 체제 일 수 있습니다. 예를 들어 리눅스는 대부분의 라우터 펌웨어에 사용되고 Windows는 대부분 ATM의 펌웨어에 사용됩니다
slebetman

답변:


28

C 또는 일부 어셈블리와 같은 프로그래밍 언어보다 Verilog 및 VHDL과 같은 하드웨어 설명 언어 (HDL)를 사용하는 동기는 무엇입니까?

C와 어셈블리는 CPU에게 무엇을해야 하는지를 알려주는 좋은 언어입니다. 단일 상태 머신이 순차적으로 수행하는 조치를 설명합니다.

HDL은 임의의 디지털 회로 컬렉션을 설명하거나 정의하기에 적합한 언어입니다. 프로그래밍 언어로는 할 수없는 방식으로 병렬로 수행 된 작업을 표현할 수 있습니다. 또한 프로그래밍 언어로는 할 수없는 방식으로 블록 간의 인터페이스에 대한 타이밍 제한을 설명 할 수 있습니다.

C 또는 어셈블리로 펌웨어를 작성할지 의문을 나타내는 토론을보고 놀랐습니다 (CPU가없는 경우 어셈블리가 어떻게 적절합니까?)

이 질문에서 "마이크로 컨트롤러 용 코드를 작성하는 경우 어셈블리 나 C 또는 다른 고급 언어로 작성하면 큰 차이가 있습니까?"입니다.

그는 마이크로 컨트롤러 (주변 장치가있는 CPU)가있는 시스템에 대해 구체적으로 요구하고 있기 때문에 C 또는 어셈블리는 모두 전나무 개발에 적합한 선택이며 HDL은 그렇지 않습니다.

펌웨어는 실제로 HDL 또는 소프트웨어 프로그래밍 언어로 작성 될 수 있습니까, 아니면 동일한 미션을 수행하는 또 다른 방법일까요?

사용하는 하드웨어 종류에 따라 다릅니다. CPU가 있으면 프로그래밍 언어를 사용하십시오. FPGA가 있거나 ASIC을 설계하는 경우 HDL을 사용하십시오. 대량의 디지털 로직을 설계하는 경우 SystemVerilog와 같은 중간 언어 중 하나를 살펴볼 수 있습니다.

펌웨어가 대부분 ROM이나 플래시에서 타 버린 것을 읽었습니다. 거기에 어떻게 표현되어 있습니까? 소프트웨어처럼 비트로? 그렇다면 심오한 차이점은 무엇입니까? 펌웨어의 경우에 적합한 회로를 사용할 수 있습니까?

"펌웨어"라는 용어에 매달리고 있다고 생각합니다. 이 단어는 원래 임베디드 시스템에서 실행되는 코드로 최종 사용자가 액세스 할 수 없었습니다. 누군가 PC를 판매 한 경우 사용자가 실행중인 소프트웨어를 사용자가 변경할 가능성이 매우 높습니다. 오실로스코프를 판매 한 경우 내부 마이크로 프로세서에서 실행되는 코드를 변경하지 않기를 원하므로 펌웨어라고합니다.

FPGA 사용자는 하드웨어 (함께 납땜되는 것)보다 변경이 가능하기 때문에 디자인의 출력에 "펌웨어"라는 단어를 사용했습니다. 그러나 실제로 FPGA를 구성하는 "펌웨어"는 uC에서 실행되는 "펌웨어"와 다릅니다. uC 펌웨어는 uC가 일련의 상태를 통해 기능을 수행하도록 지시합니다. FPGA 펌웨어는 로직 요소 간의 상호 연결 세트와 룩업 테이블에 저장 될 값을 정의합니다.

두 경우 모두 펌웨어는 일반적으로 eeprom (또는 임베디드 시스템을 다시 시작할 때마다 펌웨어를로드하지 않는 호스트 시스템의 디스크)에 비트로 저장됩니다. 그러나 이것이 서로 유사하지는 않습니다.


VHDL / Verilog로 작성할 때 구현 될 논리를 시각화하여 최적화하는 것이 훨씬 쉽습니다. C도 마찬가지입니다. SystemC조차도 실제 물리적 구현과는 충분히 이혼하여 예기치 않은 합성 결과가 발생할 수 있습니다.
JonRB

@JonRB, uC 또는 uP를 코딩하는 경우 실제로 HDL을 사용하여 그렇게 할 수있는 방법을 모릅니다. 논리를 코딩 할 때 SystemVerilog 또는 SystemC는 개별 게이트 레벨에서 모든 것을 설계하려고 시도하는 것이 실용적이지 않은 시스템에 적합하다는 데 동의합니다.
Photon

2
VHDL과 Verilog는 하드웨어가 전혀 없을 때에도 사용됩니다. FPGA 비트 스트림 대신 회로에 직접 컴파일 할 수 있습니다. 예를 들어 Apple은 GUI 바이너리 캡처 대신 Verilog를 사용하여 마더 보드를 디자인하는 데 사용되었습니다. 디자인이 독점 바이너리 드로잉 대신 일반 텍스트 인 경우 스크립트를 사용하여 버전 제어, grepping 및 단순히 구문 분석에 대한 지원이 향상 되었기 때문입니다.
slebetman

10

질문의 첫 부분에서 하나 또는 다른 것을 사용하는 동기에 대해 C와 HDL (VHDL / Verilog) 사이에는 근본적인 차이가 있습니다. C는 소프트웨어 프로그래밍 언어 (조립 그대로)이고 VHDL / Verilog는 하드웨어 설명 언어입니다. 그것들은 같은 목적을위한 것이 아닙니다.

C는 컴파일 될 때 어셈블리 코드 (이진 형식, 즉 기계 언어)로 변환됩니다 . 이 코드는 CPU에 일련의 기본 작업 (레지스터 값 변경, 추가 수행 등)을 수행하도록 지시하는 일련의 명령어입니다.

한편, HDL은 하드웨어 로 합성 됩니다. VHDL에서는 다음과 같은 것을 작성할 수 있습니다.

output <= input1 + input2;

( 여기 에서 더 완전한 예를 참조하십시오 ). 이것은 (하드웨어) 가산기로 합성됩니다. 코드가 FPGA를 위해 합성된다면 , 이는 특정 FPGA를 구성하여 가산기 ( 조합 논리로 ) 를 구현할 수있는 비트 스트림을 의미합니다 .

실제로 VHDL에서 CPU를 설계하고 ( 소프트 코어 프로세서 VS 하드 코어 프로세서 참조 ) C에서 CPU를 작성할 수 있습니다.

펌웨어 정보 : 실제로는 모두 단어를 정의하는 방법에 따라 다릅니다. 펌웨어는 마이크로 컨트롤러에서 실행이 (따라서 C 또는 어셈블러로 예를 들어 작성)하는 프로그램 (소프트웨어) 일 수있다, 또는 구성 프로그램 (하드웨어) 논리 장치 (CPLD 나 FPGA)에 대한 비트 스트림이 될 수 있습니다. FritzBox (ADSL 모뎀)의 일부 모델에 대한 펌웨어를 사용하는 경우 실제로는 전체 Linux 시스템 (어셈블러, C 및 기타 많은 프로그래밍 언어로 작성 됨) 및 비트 스트림을 포함합니다. VHDL 또는 Verilog에서 합성 된 FPGA 구성


3
  1. 아키텍처에 따라 다릅니다. CPU (또는 일반적으로 마이크로 컨트롤러)가있는 경우 일반 프로그래밍 언어 (조립 포함)로 펌웨어를 작성해야합니다. FPGA와 같은 것이 있으면 펌웨어를 HDL로 작성해야합니다. HDL은 (내 지식으로는) 기존 CPU에서 효율적으로 실행할 수있는 프로그램을 생성 할 수 없으며 FPGA는 기존 프로그램을 즉시 실행하지 않습니다. 그러나 FPGA를 CPU로 구성한 다음 기존 프로그램을 실행할 수 있습니다. 이를 위해서는 CPU를 구축하기 위해 HDL로 작성된 하위 계층과 해당 CPU에서 실행하기 위해 기존 프로그래밍 언어로 작성된 상위 계층의 두 가지 펌웨어 계층이 필요합니다.
  2. 펌웨어와 소프트웨어는 크게 구별되지 않습니다. 많은 장치에서 펌웨어는 플래시 메모리에 저장되지만 현대 전화에서는 거의 모든 것이 플래시 메모리에 저장되며 펌웨어와 소프트웨어의 구별이 불분명합니다 (대부분의 사람들은베이스 밴드 프로세서 펌웨어를 프로그래밍하는 코드를 고려할 것임) 대부분의 사람들은 응용 프로그램 소프트웨어를 고려하지만 정확한 경계는 어디에 있습니까?).
  3. 2에서 말했듯이 펌웨어가 조금 더 영구적이라는 아이디어 외에 명확한 구분이 없습니다.

3

하드웨어 동시성 은 주요 동기입니다.

전자는 병렬 와이어로 동시에 흐를 수 있으므로 하드웨어를 설계 할 때이를 고려해야합니다.

VHDL에서 다음과 같이 쓰는 경우 :

x <= a or b;
y <= a and b;
z <= x xor y;

( 명시 적으로 순차적으로 표시 하는 process또는 외부 function) 다음과 같은 사실을 인코딩했습니다.

  • x, y, z, ab전선은
  • ab입력 신호들이다
  • x(A)의 출력에 접속되고 or얻어 회로, ab입력으로서
  • 다른 라인에 대해서도

그는 실제 하드웨어로 합성하고, 그되는 방법 쉽게 볼 xy동시에 평가된다.

        +-----+
A--+----+     |  X
   |    | OR  +-----+
B----+--+     |     |  +-----+
   | |  +-----+     +--+     |
   | |                 | XOR +-- Z
   | |  +-----+     +--+     |
   | +--+     |  Y  |  +-----+
   |    | AND +-----+
   +----+     |
        +-----+

그런 다음 시간이되면 회로를 시뮬레이트하면 시뮬레이터 (보통 순차적 프로그램)는 회로의 물리를 다음과 같이 시뮬레이트합니다.

  • a또는 b변경? 예? 에 x따라 다릅니다 a. 업데이트합시다 x.
  • y또한에 따라 다릅니다 a. 그것도 업데이트하십시오.
  • z에 따라 다릅니다 x. 업데이트되었으므로 업데이트하십시오 x.
  • 아무것도있다 x(에 따라 a또는 b) 업데이트를? 아니? 동일에 yz. 이제이 단계를 완료했습니다.

이것은 순차적 아날로그는 없지만 가능한 물리적 상황을 나타내는 "흥미로운"가능한 결과로 이어집니다.

  • x <= not x시뮬레이션의 무한 재귀로 이어질 것입니다. 시뮬레이터는 특정 깊이 후에 차단할 수 있습니다.
  • x <= 0; x <= 1오류가 발생합니다 (단락). 이는 이유 중 하나std_logic존재한다.

여전히 VHDL이 C보다 하드웨어를 더 가깝게 모델링하더라도, 그 자체에 대한 자세한 설명은 아닙니다.

결국 VHDL은 인간이 이해할 수있는 높은 수준의 회로 기능과 낮은 수준의 합성 가능성 사이에 균형이 잘 맞습니다.

반면에 C는 CPU와 순차적으로 대화하는 데 더 중점을 둡니다.

물론 C 구조체, 열거 형 및 배열을 사용하여 회로를 인코딩 한 다음 VHDL과 같은 방식으로 시뮬레이션 할 수 있습니다 ( 시스템 C 와 거의 비슷 하지만 시도하지는 않았습니다).

그러나 본질적으로 VHDL 시뮬레이터를 다시 구현하고 더 자세한 언어를 사용합니다. 올바른 작업을위한 올바른 도구입니다.

C를 VHDL로 변환하는 도구도 있습니다. https : //.com/questions/8988629/can-you-program-fpgas-in-c-like-languages 그러나 더 높은 수준의 변환이 아니기 때문에 성능이 떨어질 것입니다.


0

HDL은 프로그래밍 언어가 이미 합성 된 하드웨어, 즉 CPU를 프로그래밍하는 데 사용되는 하드웨어를 설명 (합성)하는 데 사용됩니다.

FPGA에서 해당 CPU를 합성하기 위해 소프트 코어 버전의 CPU를 VHDL 또는 비트 스트림으로 얻을 수 있습니다.


-1

프로세서는 적당한 양의 회로를 사용하여 대부분의 구성 요소가 다른 시간에 다른 작업을 수행하는 데 사용될 수 있도록하여 많은 수의 작업을 순차적으로 수행합니다.

FPGA에는 특히 개별적으로 복잡한 작업을 수행 할 수 없지만 동시에 독립적으로 작동 할 수있는 여러 회로가 포함되어 있습니다.

많은 작업을 수행하는 칩을 원한다고 가정하고 그 중 15 개의 입력을 모니터링하고 다음을 수행합니다.

  • 모든 입력이 최소 21ms 동안 안정적이고 높은 입력 수는 3의 배수 일 때마다 출력을 높게 설정
  • 모든 입력이 최소 21ms 동안 안정되고 높은 입력 수가 3의 배수가 아닐 때마다 출력을 낮게 설정
  • 입력 변경 시간과 모든 입력이 최소 20ms 동안 안정된 시간 사이에서 임의의 방식으로 출력 변경

하나가 다른 일을하는 마이크로 컨트롤러를 가지고 있지만 입력을 검사하고 출력을 설정하기 위해 20ms마다 몇 마이크로 초를 절약 할 수 있다면, 마이크로 컨트롤러가 다른 작업을 수행하는 데 사용하는 대부분의 회로도 표시된 작업을 수행하는 데 사용할 수 있습니다 위의 작업을 수행하기 위해서는 약간의 회로 (일부 ROM 및 RAM 제외)가 필요합니다. 반면에 입력이 변경되는 시간과 출력이 올바르게 반영하는 시간 사이에는 시간이 걸릴 수 있습니다.

Verilog 또는 VHDL을 사용하여 15 개의 입력을 지속적으로 모니터링하고 표시된 계산을 수행 할 수있는 하드웨어 회로를 구성 할 수 있습니다. 이러한 장치는 아마도 출력이 마이크로 컨트롤러보다 100ns 내에서 정확한 표시를 생성 할 수있을 것입니다. 그러나 해당 작업 전용이며 다른 목적으로는 사용할 수없는 회로의 양은 훨씬 더 많습니다.


이것은 특별히 구별되는 예를 보여주지 않는 것 같습니다. 세부 사항에 이미 논쟁의 여지가있는 점이있어서 아직 익숙하지 않은 사람에게는 익숙하지 않을 것입니다. 현실적으로이 문제에 직면 한 사람은 넓은 데이터 워드와 우수한 핀 변환 인터럽트를 갖춘 최신 MCU를 선택했을 것입니다. 더 많은 로직을 소비하는 솔루션을 결정하려면 MCU에서 사용되지 않은 수많은 주변 장치 또는 FPGA에서 수정되지 않은 슬라이스를 계산할 것인지 결정해야합니다. 전자는 상당히 저렴합니다.
Chris Stratton 2016 년

@ChrisStratton : 타이밍 요구 사항이 더 엄격 해지면 상황이 바뀔 수 있다고 제안했을 것입니다. CPU가 20ms마다 몇 마이크로 초를 사용할 수 있도록 요구하면 기본 시스템을 변경할 필요가 없지만 응답 시간이 200us가되어야하는 경우, 그러한 요구 사항은 필요한 경우보다 더 빠른 CPU가 필요할 수 있습니다. 20us 미만에서는 처리하기 위해 추가 CPU를 추가해야 할 수도 있으며 200ns 미만인 경우 CPU로 전혀 달성하지 못할 수도 있습니다.
supercat

MCU의 기능을 활용하지 않기 때문입니다. 핀 변경 인터럽트에서 출력을 20ms 후에 설정하는 하드웨어 타이머 블록을 시작하십시오. 그런 다음 여가 시간 에 실제로 보증되는지 여부를 결정하고, 그렇지 않은 경우 취소하십시오. 상호 의존성이 너무 높기 때문에 FPGA 포인트를 만드는 좋은 예는 아닙니다. 실제로 병렬로 실행되는 유일한 부분은 이벤트 감지이며 최신 MCU는 이미 병렬 하드웨어에서 제공합니다. 한편 나머지는 효과적으로 순차적이므로 매우 느린 시계를 보는 초고속 상태 머신을 구축하십니까?
Chris Stratton

@ChrisStratton : 적절한 핀 변환 인터럽트 기능이 존재하고 다른 용도로 사용되지 않는 경우 지속적인 폴링이 필요하지 않지만 한 번에 많은 일이 발생하면 어떤 속도로든 순차적으로 처리해야합니다. CPU가 처리 할 수 ​​있습니다.
supercat

순차적 처리는 문제 설명이 입력과 응답 사이에 부과하는 큰 지연을 고려할 때 문제가되지 않습니다. 그리고 현재 MCU가 너무 바쁘더라도이 목적을 위해 하나를 추가하는 것은 FPGA 추가 비용의 일부에 불과합니다. 현실적으로이 문제가 FPGA에서 해결되는 유일한 방법은 이미 예비 슬라이스와 신호가 라우팅되어 있거나 교육 또는 취미 환경에서 인공 프로젝트이기 때문입니다.
Chris Stratton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.