Яка мотивація у використанні Verilog або VHDL над C?


12

Я надходжу з програми програмування і не заплутався занадто багато з обладнанням або мікропрограмним забезпеченням (принаймні, трохи електроніки та Arduino).

Яка мотивація у використанні апаратних мов опису (HDL), таких як Verilog та VHDL над мовами програмування, такими як C або деякі збори?

Це питання взагалі є питанням вибору?

Я читав, що апаратне забезпечення, яке прошивка записане на HDL, має явну перевагу в паралельному виконанні інструкцій. Однак я був здивований, побачивши дискусії, в яких висловлювались сумніви щодо того, чи писати прошивку на С або Асамблеї (як Асамблея підходить, якщо у вас не обов'язково є процесор?), Але я прийшов до висновку, що це також варіант.

Тому у мене є кілька запитань (не соромтесь нічого пояснювати):

  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 чи іншій мові високого рівня?".

Оскільки він спеціально запитує про системи з мікроконтролером (процесор з периферійними пристроями), C або збірка - це розумні можливості для розробки файлових марок, а HDL - ні.

Прошивку справді можна записати або в HDL, або на мові програмування, або це просто інший спосіб виконати ту саму місію?

Це залежить від того, яке обладнання ви маєте. Якщо у вас є процесор, використовуйте мову програмування. Якщо у вас FPGA або ви проектуєте ASIC, використовуйте HDL. Якщо ви розробляєте дуже велику кількість цифрової логіки, ви можете звернутися до однієї з мов між ними, як SystemVerilog.

Я читав, що вбудована програма в основному горіла на ROM або flash. Як це представлено там? Бітами, як програмне забезпечення? Якщо так, то яка різниця? Це наявність адаптованих схем у разі прошивки?

Думаю, ви зависаєте від терміна "прошивка". Спочатку це слово означало код, який запускається у вбудованій системі, яка не була доступною для кінцевого користувача. Якщо ви кому-небудь продали ПК, є велика ймовірність, що користувач змінить програмне забезпечення, яке працює на ньому. Якщо ви продали їм осцилоскоп, ви б не хотіли, щоб вони міняли код, який працює на внутрішньому мікропроцесорі, тому ви назвали його прошивкою.

Користувачі FPGA призначили слово "прошивка" для виведення своїх конструкцій, оскільки воно є більш змінним, ніж апаратне (речі, які спаяні разом). Але насправді "прошивка", яка налаштовує FPGA, відрізняється від "прошивки", яка працює на комп'ютері. Прошивка uC спрямовує UC через ряд станів для виконання його функції. Прошивка FPGA визначає набір взаємозв'язків між логічними елементами та значеннями, які слід зберігати в оглядових таблицях.

В будь-якому випадку прошивка, як правило, зберігається у вигляді бітів на eeprom (або на диску на хост-машині, яка буде завантажувати її щоразу, коли вбудована система буде перезапущена). Але це не робить їх схожими один на одного.


Коли ви пишете у VHDL / Verilog, набагато простіше уявити логіку, яка буде реалізована та таким чином оптимізувати. Те ж саме не можна сказати і для C. Навіть SystemC все ще достатньо відокремлений від фактичної фізичної реалізації, що можуть відбутися несподівані результати синтезу
JonRB

@JonRB, Якщо ви кодуєте UC або UP, я насправді не знаю жодного способу зробити це з HDL. Я погоджуюся, що при кодуванні логіки SystemVerilog або SystemC призначені для настільки великих систем, що просто не практично намагатися спроектувати все на рівні індивідуальних воріт.
The Photon

2
Зауважте, що VHDL та Verilog також використовуються, коли у вас зовсім немає апаратури. Вони можуть бути складені безпосередньо до схем замість бітового потоку FPGA. Наприклад, Apple використовувала для проектування своїх материнських плат за допомогою Verilog замість схематичного захоплення графічного інтерфейсу, оскільки є краща підтримка контролю версій, стискання та просто розбір за допомогою скриптів, коли ваш дизайн є звичайним текстом замість власних бінарних малюнків.
slebetman

10

У першій частині вашого питання про мотивацію використання того чи іншого: існує принципова різниця між С та ЛПВЩ (VHDL / Verilog) . C - це мова програмування програмного забезпечення (у разі складання), VHDL / Verilog - це мови опису апаратних засобів . Вони не призначені для однієї і тієї ж мети.

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

З іншого боку, HDL синтезується до обладнання. Наприклад, у VHDL можна написати щось на зразок:

output <= input1 + input2;

(див. також більш повний приклад тут ). Це буде синтезовано до (апаратного) додатку. Якщо код синтезований для FPGA , це означатиме бітовий потік, який може налаштувати конкретну FPGA для реалізації додавача (як комбінаційної логіки ).

Насправді ви можете розробити процесор у VHDL (див. Процесори з м'яким ядром процесори VS Hard Core Processors ) і написати програмне забезпечення для нього на C ...

Про прошивку: насправді все залежить від того, як ви визначаєте слово. Прошивка може бути програма (програмне забезпечення) , яка працює в мікроконтролер (написано так, наприклад , в С або асемблері), або це може бути потік бітів конфігурації програмованої (апаратне забезпечення) логічний пристрій (CPLD або FPGA). Іноді це може бути пакет, що містить обидва: якщо ви берете прошивку для деяких моделей FritzBox (ADSL-модем), вони насправді містять цілу систему Linux (написану в ассемблері, С та багатьох інших мовах програмування), а також біт-потік до налаштувати 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 використовуються для опису (синтезу) апаратного забезпечення, де мова програмування використовується для програмування вже синтезованого обладнання, тобто процесора.

Ви можете отримати м'які основні версії процесора як VHDL або бітовий потік для синтезу цього процесора на FPGA.


-1

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

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

Припустимо, хочеться мати чіп, який виконує ряд завдань, серед яких моніторинг 15 входів та:

  • Встановлення високого виходу будь-коли, коли всі входи були стабільними принаймні 21 мс, а кількість входів, що є високим, кратне три
  • Встановлення низького виходу в будь-який час, коли всі входи були стабільними принаймні 21 мс, а кількість входів, які є високими, не кратні три
  • Змінюючи вихід у довільному порядку між часом, коли змінюється будь-який вхід, і часом, коли всі входи стали стабільними принаймні 20 мс.

Якщо у вас є мікроконтролер, який займається іншими справами, але може витратити кілька мікросекунд кожні 20 мс, щоб вивчити ці входи та встановити вихід, то більша частина схеми, яку мікроконтролер використовує для виконання інших завдань, також буде корисною для виконання зазначеного завдання вище, тому дуже мало схеми (крім деяких ПЗУ та, можливо, оперативної пам'яті) потрібно буде присвятити цьому завданню. З іншого боку, може пройти деякий час між тим, як змінюється вхідний сигнал, і тим часом, коли висновок належним чином відображає його.

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


Це не здається особливо чітким прикладом, щоб проілюструвати відмінність - у його деталях є достатньо дискусійних моментів, які можуть насправді не допомогти ознайомити всіх, хто вже не знайомий. Хтось реально зіткнувся з цією проблемою, ймовірно, вибрав би сучасний MCU з широким словом даних та хорошими перервами для зміни штифтів. Вирішення того, яке рішення потребує більшої логіки, тоді вимагатиме прийняття рішення, якщо порахувати численні невикористані периферійні пристрої на MCU або недоторкані фрагменти на FPGA. Колишній буде зовсім трохи дешевше.
Кріс Страттон

@ChrisStratton: Можливо, я мав би припустити, що все може змінитися, якщо вимоги до термінів посиляться? Вимагаючи, щоб у центрального процесора були доступні кілька мікросекунд кожні 20 мс, можливо, не знадобиться жодна зміна базової системи, але якщо час відповіді повинен бути 200ус, така вимога може зажадати більш швидкого ЦП, ніж інакше знадобиться, якщо це потрібно до 20us, можливо, буде потрібно додати додатковий процесор просто для того, щоб обробити його, і якщо під 200ns це взагалі неможливо виконати з процесором.
supercat

Це тому, що ви не використовуєте можливості MCU. Після переривання зміни штифта запустіть блок апаратного таймера, який встановить вихід 20 мс пізніше. Тоді вирішіть на дозвіллі, якщо це насправді виправдано, а якщо ні, скасуйте це. Насправді не чудовий приклад зробити свою точку FPGA, оскільки існує стільки взаємозалежності - єдина частина, яка дійсно працює паралельно, - це виявлення подій, а сучасний MCU вже дає вам це в основному паралельному апаратному забезпеченні. Тим часом решта ефективно послідовна, тож ви будуєте надшвидку державну машину, яка дивиться на дуже повільний годинник?
Кріс Страттон

@ChrisStratton: Якщо існує відповідна функція переривання змін, яка вже не використовується для чогось іншого, це може уникнути необхідності постійного опитування, але якщо багато речей станеться одразу, їх потрібно буде обробляти послідовно з будь-якою швидкістю ЦП може впоратися з ними.
supercat

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