Я пришел из опыта программирования и не слишком много путался с аппаратными средствами или прошивками (самое большее, электроника и Arduino).
Какова мотивация в использовании языков описания аппаратных средств (HDL), таких как Verilog и VHDL, по сравнению с языками программирования, такими как C или некоторая сборка?
Является ли этот вопрос вопросом выбора?
Я читал, что аппаратное обеспечение, прошивка которого написана на HDL, имеет явное преимущество при параллельном выполнении инструкций. Тем не менее, я был удивлен, увидев дискуссии, выражающие сомнения , писать ли прошивку на C или Assembly (как подходит Assembly, если у вас не обязательно есть CPU?), Но я пришел к выводу, что это тоже вариант.
Поэтому у меня есть несколько вопросов (не стесняйтесь ничего объяснять):
Прошивка действительно может быть написана либо на HDL, либо на языке программирования, или это просто еще один способ выполнить ту же задачу? Я хотел бы привести примеры из реальной жизни. Какие ограничения вытекают из каждого варианта?
Я знаю, что обычное использование встроенного программного обеспечения вместо программного обеспечения используется в аппаратных ускорителях (таких как графические процессоры, сетевые адаптеры, SSL-ускорители и т. Д.). Насколько я понимаю, это ускорение не всегда необходимо, а только рекомендуется (например, в случае SSL и ускорения сложных алгоритмов). Можно ли выбирать между прошивкой и программным обеспечением во всех случаях? Если нет, я был бы рад случаям, когда прошивка явно и однозначно уместна.
Я читал, что прошивка в основном сгорела на ROM или flash. Как это там представлено? В битах, как программное обеспечение? Если так, то в чем глубокая разница? Это наличие адаптированных схем в случае прошивки?
Думаю, я допустил ошибку здесь и там в некоторых предположениях, пожалуйста, прости меня. Спасибо!
Ответы:
C и ассемблер - хорошие языки для того, чтобы указывать процессору, что делать. Они описывают действия, которые должны выполняться последовательно одним конечным автоматом.
HDL являются хорошими языками для описания или определения произвольного набора цифровых схем. Они могут выражать операции, выполняемые параллельно, таким образом, что языки программирования не могут. Они также могут описывать временные ограничения для интерфейсов между блоками способами, недоступными языкам программирования.
В этом вопросе задается вопрос: «Если вы пишете код для микроконтроллера, есть ли реальная разница, если вы пишете на ассемблере или на языке C или другом языке высокого уровня?».
Поскольку он специально спрашивает о системах с микроконтроллером (ЦП с периферийными устройствами), C или сборка являются разумным выбором для разработки, а HDL - нет.
Это зависит от того, какое у вас оборудование. Если у вас есть процессор, используйте язык программирования. Если у вас есть FPGA или вы разрабатываете ASIC, используйте HDL. Если вы разрабатываете очень большое количество цифровой логики, вы можете обратиться к одному из промежуточных языков, например SystemVerilog.
Я думаю, что вы зациклились на термине "прошивка". Изначально это слово означало код для запуска во встроенной системе, который не был доступен для изменения конечному пользователю. Если вы продадите кому-нибудь компьютер, существует очень высокая вероятность того, что пользователь изменит то, какое программное обеспечение на нем запущено. Если вы продали им осциллограф, вы бы не хотели, чтобы они меняли код, который работает на внутреннем микропроцессоре, поэтому вы назвали его прошивкой.
Пользователи ПЛИС присвоили слово «прошивка» для вывода своих проектов, потому что оно более изменчиво, чем аппаратное обеспечение (вещи, которые спаяны вместе). Но на самом деле «прошивка», которая конфигурирует FPGA, отличается от «прошивки», которая работает на uC. Прошивка uC направляет uC через ряд состояний для выполнения своих функций. Микропрограмма ПЛИС определяет набор взаимосвязей между логическими элементами и значениями, которые должны храниться в справочных таблицах.
В любом случае микропрограмма обычно хранится в виде битов в eeprom (или на диске на хост-компьютере, который будет выгружать ее при каждом перезапуске встроенной системы). Но это не делает их похожими друг на друга.
источник
Для первой части вашего вопроса, о мотивах использования одного или другого: есть фундаментальная разница между C и HDL (VHDL / Verilog) . C представляет собой программное обеспечение , язык программирования (как сборка), VHDL / Verilog являются аппаратное обеспечение Языки описания. Они не предназначены для той же цели.
C переводится в ассемблерный код (в его двоичной форме, то есть на машинном языке) при компиляции . Этот код представляет собой серию инструкций, которые указывают ЦПУ на выполнение ряда основных операций (изменение значения регистра, выполнение сложения и т. Д.).
С другой стороны, HDL синтезируется в аппаратное обеспечение. В VHDL вы можете, например, написать что-то вроде:
(см. также более полный пример здесь ). Это будет синтезировано в (аппаратный) сумматор. Если код синтезируется для ПЛИС , это будет означать поток битов, который может настроить конкретную ПЛИС для реализации сумматора (как комбинационная логика ).
На самом деле, вы могли бы спроектировать процессор на VHDL (см. Процессоры с мягким ядром и Процессоры с жестким ядром ) и написать программное обеспечение для него на C ...
По поводу прошивки: на самом деле все зависит от того, как вы определяете слово. Прошивка может быть программа (программное обеспечение) , которая работает в микроконтроллер (написано так, например , в С или ассемблере), или это может быть битовый поток конфигурирования программируемой (аппаратное обеспечение) логическое устройство (CPLD или FPGA). Иногда это может быть пакет, содержащий и то, и другое: если вы берете прошивку для некоторых моделей FritzBox (модем ADSL), они фактически содержат целую систему Linux (написанную на ассемблере, C и многих других языках программирования) и битовый поток для настроить FPGA (вероятно, синтезированный из VHDL или Verilog).
источник
источник
Аппаратный параллелизм является основной мотивацией.
Электроны могут течь одновременно в параллельных проводах, поэтому мы хотим принять это во внимание при проектировании оборудования.
В VHDL, если вы напишите что-то вроде:
(за пределами
process
илиfunction
, которые явно помечают его как последовательный), тогда вы закодировали тот факт, что:x
,y
,z
,a
Иb
являются проводаa
иb
являются входными сигналамиx
подключен к выходуor
цепи, которая принимаетa
и вb
качестве входаЛегко видеть, как это будет синтезировано в реальное аппаратное обеспечение, и это
x
иy
будет оцениваться одновременно.Затем, когда пришло время симулировать схему, симулятор (который обычно представляет собой последовательную программу) так симулирует физику схемы примерно так:
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, но ожидают более низкую производительность, поскольку это жесткие преобразования более высокого уровня.
источник
HDL используются для описания (синтеза) аппаратных средств, где в качестве языка программирования используется для программирования уже синтезированного аппаратного обеспечения, например, процессора.
Вы можете получить версии cpus с мягким ядром как VHDL или битовый поток, чтобы синтезировать этот процессор на FPGA.
источник
Процессор использует небольшое количество схем для последовательного выполнения большого количества операций, позволяя большинству компонентов использоваться для выполнения различных операций в разное время.
FPGA содержит несколько схем, которые не могут - по крайней мере, индивидуально - выполнять особенно сложные операции, но все они способны действовать одновременно и независимо.
Предположим, что кто-то хочет иметь чип, который выполняет ряд задач, среди которых мониторинг 15 входов и:
Если у кого-то есть микроконтроллер, который выполняет другие задачи, но может сэкономить несколько микросекунд каждые 20 мс для проверки этих входов и настройки выхода, то большая часть схем, которые микроконтроллер использует для выполнения других задач, также будет пригодна для выполнения указанной задачи. выше, поэтому очень небольшая схема (кроме некоторого ПЗУ и, возможно, ОЗУ) должна быть посвящена этой задаче. С другой стороны, может пройти некоторое время между временем изменения входа и временем, когда результат должным образом отражает его.
Используя Verilog или VHDL, можно построить аппаратную схему, которая может непрерывно контролировать 15 входов и выполнять указанные вычисления. Такое устройство, вероятно, могло бы обеспечить вывод на выходе правильной индикации в пределах 100 нс - на порядки быстрее, чем микроконтроллер, - но количество схем, предназначенных для этой задачи и непригодных для каких-либо других целей, было бы намного больше.
источник