Какова мотивация в использовании Verilog или VHDL над C?


12

Я пришел из опыта программирования и не слишком много путался с аппаратными средствами или прошивками (самое большее, электроника и Arduino).

Какова мотивация в использовании языков описания аппаратных средств (HDL), таких как Verilog и VHDL, по сравнению с языками программирования, такими как C или некоторая сборка?

Является ли этот вопрос вопросом выбора?

Я читал, что аппаратное обеспечение, прошивка которого написана на HDL, имеет явное преимущество при параллельном выполнении инструкций. Тем не менее, я был удивлен, увидев дискуссии, выражающие сомнения , писать ли прошивку на C или Assembly (как подходит Assembly, если у вас не обязательно есть CPU?), Но я пришел к выводу, что это тоже вариант.

Поэтому у меня есть несколько вопросов (не стесняйтесь ничего объяснять):

  1. Прошивка действительно может быть написана либо на HDL, либо на языке программирования, или это просто еще один способ выполнить ту же задачу? Я хотел бы привести примеры из реальной жизни. Какие ограничения вытекают из каждого варианта?

  2. Я знаю, что обычное использование встроенного программного обеспечения вместо программного обеспечения используется в аппаратных ускорителях (таких как графические процессоры, сетевые адаптеры, SSL-ускорители и т. Д.). Насколько я понимаю, это ускорение не всегда необходимо, а только рекомендуется (например, в случае SSL и ускорения сложных алгоритмов). Можно ли выбирать между прошивкой и программным обеспечением во всех случаях? Если нет, я был бы рад случаям, когда прошивка явно и однозначно уместна.

  3. Я читал, что прошивка в основном сгорела на ROM или flash. Как это там представлено? В битах, как программное обеспечение? Если так, то в чем глубокая разница? Это наличие адаптированных схем в случае прошивки?

Думаю, я допустил ошибку здесь и там в некоторых предположениях, пожалуйста, прости меня. Спасибо!


14
Языки программирования предназначены для описания программного обеспечения, языки описания оборудования - для описания оборудования.
Игнасио Васкес-Абрамс

1
Вы не пишете прошивку с Verilog или VHDL - вы используете Verilog или VHDL для разработки чипов, программирования FPGA и разработки материнских плат. Вы используете C или сборку для написания прошивки. Вы также можете использовать C / C ++ для разработки материнских плат - есть библиотека SystemC, которая может быть скомпилирована компилятором C для создания программы, которая имитирует ваш дизайн, но также может быть скомпилирована компилятором SystemC в схемы.
Slebetman

FWIW, поскольку у вас есть опыт работы с Arduino, написание программного обеспечения для Arduino называется написанием прошивки. Прошивка может быть полной операционной системой - например, linux используется в прошивке большинства маршрутизаторов, а Windows используется в прошивке большинства банкоматов
slebetman

Ответы:


28

Какова мотивация в использовании языков описания аппаратных средств (HDL), таких как Verilog и VHDL, по сравнению с языками программирования, такими как C или некоторая сборка?

C и ассемблер - хорошие языки для того, чтобы указывать процессору, что делать. Они описывают действия, которые должны выполняться последовательно одним конечным автоматом.

HDL являются хорошими языками для описания или определения произвольного набора цифровых схем. Они могут выражать операции, выполняемые параллельно, таким образом, что языки программирования не могут. Они также могут описывать временные ограничения для интерфейсов между блоками способами, недоступными языкам программирования.

Я был удивлен, увидев дискуссии, выражающие сомнения, писать ли прошивку на C или Assembly (как подходит Assembly, если у вас не обязательно есть процессор?)

В этом вопросе задается вопрос: «Если вы пишете код для микроконтроллера, есть ли реальная разница, если вы пишете на ассемблере или на языке C или другом языке высокого уровня?».

Поскольку он специально спрашивает о системах с микроконтроллером (ЦП с периферийными устройствами), C или сборка являются разумным выбором для разработки, а HDL - нет.

Прошивка действительно может быть написана либо на HDL, либо на языке программирования, или это просто еще один способ выполнить ту же задачу?

Это зависит от того, какое у вас оборудование. Если у вас есть процессор, используйте язык программирования. Если у вас есть FPGA или вы разрабатываете ASIC, используйте HDL. Если вы разрабатываете очень большое количество цифровой логики, вы можете обратиться к одному из промежуточных языков, например SystemVerilog.

Я читал, что прошивка в основном сгорела на ROM или flash. Как это там представлено? В битах, как программное обеспечение? Если так, то в чем глубокая разница? Это наличие адаптированных схем в случае прошивки?

Я думаю, что вы зациклились на термине "прошивка". Изначально это слово означало код для запуска во встроенной системе, который не был доступен для изменения конечному пользователю. Если вы продадите кому-нибудь компьютер, существует очень высокая вероятность того, что пользователь изменит то, какое программное обеспечение на нем запущено. Если вы продали им осциллограф, вы бы не хотели, чтобы они меняли код, который работает на внутреннем микропроцессоре, поэтому вы назвали его прошивкой.

Пользователи ПЛИС присвоили слово «прошивка» для вывода своих проектов, потому что оно более изменчиво, чем аппаратное обеспечение (вещи, которые спаяны вместе). Но на самом деле «прошивка», которая конфигурирует FPGA, отличается от «прошивки», которая работает на uC. Прошивка uC направляет uC через ряд состояний для выполнения своих функций. Микропрограмма ПЛИС определяет набор взаимосвязей между логическими элементами и значениями, которые должны храниться в справочных таблицах.

В любом случае микропрограмма обычно хранится в виде битов в eeprom (или на диске на хост-компьютере, который будет выгружать ее при каждом перезапуске встроенной системы). Но это не делает их похожими друг на друга.


Когда вы пишете в VHDL / Verilog, гораздо проще визуализировать логику, которая будет реализована, и, следовательно, оптимизировать. То же самое нельзя сказать о C. Даже SystemC все еще достаточно
отделен

@JonRB, если вы кодируете для UC или UP, я на самом деле не знаю, как сделать это с HDL. Я согласен, что при кодировании логики SystemVerilog или SystemC предназначены для систем, которые настолько велики, что просто не практично пытаться спроектировать все на уровне отдельных шлюзов.
Фотон

2
Обратите внимание, что VHDL и Verilog также используются, когда у вас нет аппаратного обеспечения вообще. Они могут быть скомпилированы непосредственно в схемы вместо потока битов ПЛИС. Например, Apple раньше проектировала свои материнские платы, используя Verilog вместо схематического захвата графического интерфейса, поскольку улучшена поддержка контроля версий, анализа и простого анализа с использованием сценариев, когда ваш дизайн представляет собой простой текст вместо проприетарных двоичных чертежей.
Slebetman

10

Для первой части вашего вопроса, о мотивах использования одного или другого: есть фундаментальная разница между C и HDL (VHDL / Verilog) . C представляет собой программное обеспечение , язык программирования (как сборка), VHDL / Verilog являются аппаратное обеспечение Языки описания. Они не предназначены для той же цели.

C переводится в ассемблерный код (в его двоичной форме, то есть на машинном языке) при компиляции . Этот код представляет собой серию инструкций, которые указывают ЦПУ на выполнение ряда основных операций (изменение значения регистра, выполнение сложения и т. Д.).

С другой стороны, HDL синтезируется в аппаратное обеспечение. В VHDL вы можете, например, написать что-то вроде:

output <= input1 + input2;

(см. также более полный пример здесь ). Это будет синтезировано в (аппаратный) сумматор. Если код синтезируется для ПЛИС , это будет означать поток битов, который может настроить конкретную ПЛИС для реализации сумматора (как комбинационная логика ).

На самом деле, вы могли бы спроектировать процессор на VHDL (см. Процессоры с мягким ядром и Процессоры с жестким ядром ) и написать программное обеспечение для него на C ...

По поводу прошивки: на самом деле все зависит от того, как вы определяете слово. Прошивка может быть программа (программное обеспечение) , которая работает в микроконтроллер (написано так, например , в С или ассемблере), или это может быть битовый поток конфигурирования программируемой (аппаратное обеспечение) логическое устройство (CPLD или FPGA). Иногда это может быть пакет, содержащий и то, и другое: если вы берете прошивку для некоторых моделей FritzBox (модем ADSL), они фактически содержат целую систему Linux (написанную на ассемблере, C и многих других языках программирования) и битовый поток для настроить FPGA (вероятно, синтезированный из VHDL или Verilog).


3
  1. Это зависит от вашей архитектуры. Если у вас есть процессор (или, как правило, микроконтроллер), вам нужно написать прошивку на обычном языке программирования (включая сборку). Если у вас есть что-то вроде FPGA, ваша прошивка должна быть записана на HDL. HDL не могут (насколько мне известно) генерировать программы, которые могут эффективно выполняться обычным процессором, а FPGA не выполняет обычные программы из коробки. Вы можете, однако, сконфигурировать свою FPGA как ЦП и затем выполнить обычную программу с этим. Для этого потребуется два уровня прошивки: нижний уровень, записанный на HDL для сборки ЦП, и верхний уровень, написанный на обычном языке программирования, для выполнения на этом ЦП.
  2. Не существует жесткого различия между прошивкой и программным обеспечением. На многих устройствах прошивка будет храниться, например, во флэш-памяти, но на современном телефоне почти все хранится во флэш-памяти, и различие между прошивкой и программным обеспечением неясно (большинство людей, вероятно, рассмотрят код для программирования прошивки процессора основной полосы частот). , и большинство людей будет рассматривать прикладные программы, но где точная граница?).
  3. Как я сказал в 2, нет четкого различия, кроме идеи, что прошивка немного более постоянна.

3

Аппаратный параллелизм является основной мотивацией.

Электроны могут течь одновременно в параллельных проводах, поэтому мы хотим принять это во внимание при проектировании оборудования.

В VHDL, если вы напишите что-то вроде:

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

(за пределами processили function, которые явно помечают его как последовательный), тогда вы закодировали тот факт, что:

  • x, y, z, aИ bявляются провода
  • aи bявляются входными сигналами
  • xподключен к выходу orцепи, которая принимает aи в bкачестве входа
  • и так далее для других линий

Легко видеть, как это будет синтезировано в реальное аппаратное обеспечение, и это xи yбудет оцениваться одновременно.

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

Затем, когда пришло время симулировать схему, симулятор (который обычно представляет собой последовательную программу) так симулирует физику схемы примерно так:

  • имеет aили bизменить? Да? Эй, xзависит a. Давай обновим x.
  • yтакже зависит от a. Обновите это также.
  • zзависит x. Обновите его, потому что xбыл обновлен.
  • есть что-нибудь, что xзависит ( aили b) было обновлено? Нет? То же самое для yи z. ОК, мы закончили с этим шагом.

Это приводит к «интересным» возможным результатам, которые не имеют последовательного аналога, но которые представляют возможные физические ситуации:

  • x <= not xприведет к бесконечной рекурсии симуляции. Симуляторы могут просто отрезать после определенной глубины.
  • x <= 0; x <= 1приводит к ошибке (короткому замыканию). Это одна из причин, почему std_logicсуществует.

Тем не менее, даже несмотря на то, что VHDL моделирует аппаратное обеспечение более тесно, чем C, само по себе оно не является достаточно подробным описанием:

В конце концов, VHDL обеспечивает хороший баланс между функциональностью схемы, понятной человеку более высокого уровня, и синтезируемостью более низкого уровня.

С другой стороны, C больше внимания уделяет последовательному общению с процессором.

Конечно, вы можете кодировать схему с помощью структур C, перечислений и массивов, а затем моделировать ее так же, как это делает VHDL (это более или менее похоже на то, что делает System C , но я никогда не пробовал).

Но вы бы по существу заново внедрили симулятор VHDL и с более подробным языком. Правильный инструмент для правильной работы, я думаю.

Есть также инструменты, которые конвертируют C в VHDL /programming/8988629/can-you-program-fpgas-in-c-like-languages, но ожидают более низкую производительность, поскольку это жесткие преобразования более высокого уровня.


0

HDL используются для описания (синтеза) аппаратных средств, где в качестве языка программирования используется для программирования уже синтезированного аппаратного обеспечения, например, процессора.

Вы можете получить версии cpus с мягким ядром как VHDL или битовый поток, чтобы синтезировать этот процессор на FPGA.


-1

Процессор использует небольшое количество схем для последовательного выполнения большого количества операций, позволяя большинству компонентов использоваться для выполнения различных операций в разное время.

FPGA содержит несколько схем, которые не могут - по крайней мере, индивидуально - выполнять особенно сложные операции, но все они способны действовать одновременно и независимо.

Предположим, что кто-то хочет иметь чип, который выполняет ряд задач, среди которых мониторинг 15 входов и:

  • Установка высокого уровня выхода в любое время, когда все входы стабильны в течение как минимум 21 мс, а количество входов, которые являются высокими, кратно трем
  • Установка низкого уровня выходного сигнала в любое время, когда все входы стабильны в течение как минимум 21 мс, а количество входов, которые являются высокими, не кратно трем
  • Изменение выхода произвольным образом между временем изменения любого входа и временем, когда все входы были стабильны в течение по крайней мере 20 мс.

Если у кого-то есть микроконтроллер, который выполняет другие задачи, но может сэкономить несколько микросекунд каждые 20 мс для проверки этих входов и настройки выхода, то большая часть схем, которые микроконтроллер использует для выполнения других задач, также будет пригодна для выполнения указанной задачи. выше, поэтому очень небольшая схема (кроме некоторого ПЗУ и, возможно, ОЗУ) должна быть посвящена этой задаче. С другой стороны, может пройти некоторое время между временем изменения входа и временем, когда результат должным образом отражает его.

Используя Verilog или VHDL, можно построить аппаратную схему, которая может непрерывно контролировать 15 входов и выполнять указанные вычисления. Такое устройство, вероятно, могло бы обеспечить вывод на выходе правильной индикации в пределах 100 нс - на порядки быстрее, чем микроконтроллер, - но количество схем, предназначенных для этой задачи и непригодных для каких-либо других целей, было бы намного больше.


Это не похоже на особенно четкий пример, чтобы проиллюстрировать различие - в его деталях достаточно спорных моментов, которые могут не помочь в ознакомлении тем, кто еще не знаком. Кто-то, кто реально сталкивается с этой проблемой, вероятно, выберет современный MCU с широким словом данных и хорошими прерываниями смены контактов. Решение о том, какое решение потребляет больше логики, потребовало бы принятия решения о том, считаете ли вы многочисленные неиспользуемые периферийные устройства на MCU или нетронутые фрагменты на FPGA. Первый будет немного дешевле.
Крис Страттон

@ChrisStratton: Возможно, я должен был предположить, что вещи могут измениться, если требования к времени ужесточаются? Требование, чтобы у ЦП было несколько микросекунд, доступных каждые 20 мс, может не потребовать каких-либо изменений в базовой системе, но если время отклика должно составлять 200 мкс, такое требование может потребовать более быстрого ЦП, чем в противном случае, если бы это требовалось. до 20us может потребоваться добавить дополнительный процессор только для его обработки, а если меньше 200 нс, это вообще невозможно сделать с процессором.
суперкат

Это потому, что вы не используете возможности MCU. При прерывании смены контакта запустите блок аппаратного таймера, который установит выход через 20 мс. Затем на досуге решите, действительно ли это оправдано, а если нет, отмените это. Это не очень хороший пример для того, чтобы выразить свою точку зрения на ПЛИС, потому что существует такая большая взаимозависимость - единственная часть, которая действительно работает параллельно, это обнаружение событий, и современный MCU уже дает вам это в основном в параллельном оборудовании. Между тем, все остальное эффективно последовательное, поэтому вы создаете сверхбыстрый конечный автомат, который следит за очень медленными часами?
Крис Страттон

@ChrisStratton: Если подходящая функция прерывания смены штифта существует и еще не используется для чего-то другого, это может избежать необходимости постоянного опроса, но если много вещей происходит одновременно, их нужно будет обрабатывать последовательно с любой скоростью процессор может справиться с ними.
суперкат

Последовательная обработка не является проблемой, учитывая огромную задержку, которую ваша проблема ставит между вводом и ответом. И даже если текущий MCU был слишком занят, добавление одного для этой цели было бы частью стоимости добавления FPGA. Реально, единственный способ решить эту проблему в FPGA - это либо потому, что уже есть один с запасными срезами и направленными на него сигналами, либо как искусственный проект в образовательном или хобби-контексте.
Крис Страттон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.