Apa motivasi dalam menggunakan Verilog atau VHDL di atas C?


12

Saya berasal dari latar belakang pemrograman dan tidak terlalu banyak bermain-main dengan perangkat keras atau firmware (paling sedikit elektronik dan Arduino).

Apa motivasi dalam menggunakan bahasa deskripsi perangkat keras (HDL) seperti Verilog dan VHDL di atas bahasa pemrograman seperti C atau Majelis?

Apakah masalah ini memang masalah pilihan?

Saya membaca bahwa perangkat keras, yang firmware-nya ditulis dalam HDL, memiliki keuntungan yang jelas dalam menjalankan instruksi secara paralel. Namun, saya terkejut melihat diskusi mengungkapkan keraguan apakah akan menulis firmware di C atau Majelis (bagaimana Majelis cocok jika Anda tidak perlu memiliki CPU?) Tapi saya menyimpulkan itu juga merupakan pilihan.

Karena itu, saya punya beberapa pertanyaan (jangan ragu untuk menjelaskan apa pun):

  1. Firmware benar-benar dapat ditulis dalam HDL atau dalam bahasa pemrograman perangkat lunak, atau itu hanya cara lain untuk melakukan misi yang sama? Saya suka contoh dunia nyata. Kendala apa yang dihasilkan dari setiap opsi?

  2. Saya tahu bahwa penggunaan umum dari firmware melalui perangkat lunak adalah akselerator perangkat keras (seperti GPU, adapter jaringan, akselerator SSL, dll.). Seperti yang saya pahami, akselerasi ini tidak selalu diperlukan, tetapi hanya disarankan (misalnya, dalam kasus SSL dan akselerasi algoritma yang kompleks). Bisakah seseorang memilih antara firmware dan perangkat lunak dalam semua kasus? Jika tidak, saya akan senang dengan kasus-kasus di mana firmware secara jelas dan tepat sesuai.

  3. Saya telah membaca bahwa sebagian besar firmware dibakar pada ROM atau flash. Bagaimana itu diwakili di sana? Dalam bit, seperti perangkat lunak? Jika demikian, apa perbedaannya? Apakah ketersediaan sirkuit yang disesuaikan dalam hal firmware?

Saya kira saya membuat kesalahan di sana-sini dalam beberapa asumsi, tolong maafkan saya. Terima kasih!


14
Bahasa pemrograman untuk menggambarkan perangkat lunak, bahasa deskripsi perangkat keras untuk menjelaskan perangkat keras.
Ignacio Vazquez-Abrams

1
Anda tidak menulis firmware dengan Verilog atau VHDL - Anda menggunakan Verilog atau VHDL untuk merancang chip, program FPGA, dan merancang motherboard. Anda menggunakan C atau rakitan untuk menulis firmware. Anda juga dapat menggunakan C / C ++ untuk mendesain motherboard - ada pustaka yang disebut SystemC yang dapat dikompilasi oleh kompiler C untuk membuat program yang mensimulasikan desain Anda tetapi juga dapat dikompilasi oleh kompiler SystemC ke dalam sirkuit.
slebetman

FWIW, karena Anda memiliki pengalaman Arduino, menulis perangkat lunak untuk Arduino disebut menulis firmware. Firmware dapat berupa sistem operasi yang lengkap - linux misalnya digunakan di firmware sebagian besar router dan Windows digunakan di firmware sebagian besar ATM
slebetman

Jawaban:


28

Apa motivasi dalam menggunakan bahasa deskripsi perangkat keras (HDL) seperti Verilog dan VHDL di atas bahasa pemrograman seperti C atau Majelis?

C dan assembly adalah bahasa yang baik untuk memberi tahu CPU apa yang harus dilakukan. Mereka menggambarkan tindakan yang harus dilakukan secara berurutan oleh satu mesin negara.

HDL adalah bahasa yang baik untuk menggambarkan atau mendefinisikan koleksi sirkuit digital yang sewenang-wenang. Mereka dapat mengekspresikan operasi yang dilakukan secara paralel dengan cara yang tidak bisa dilakukan oleh bahasa pemrograman. Mereka juga dapat menjelaskan batasan waktu untuk antarmuka antar blok dengan cara yang tidak bisa dilakukan oleh bahasa pemrograman.

Saya terkejut melihat diskusi yang mengungkapkan keraguan apakah akan menulis firmware di C atau Assembly (bagaimana Assembly cocok jika Anda tidak harus memiliki CPU?)

Dalam pertanyaan itu, apa yang ditanyakan adalah, "Jika Anda menulis kode untuk mikrokontroler apakah ada perbedaan nyata jika Anda menulis dalam perakitan atau C atau bahasa tingkat tinggi lainnya?".

Karena dia secara khusus bertanya tentang sistem dengan mikrokontroler (CPU dengan periferal), C atau rakitan adalah pilihan yang masuk akal untuk pengembangan firwmare, dan HDL tidak.

Firmware benar-benar dapat ditulis dalam HDL atau dalam bahasa pemrograman perangkat lunak, atau itu hanya cara lain untuk melakukan misi yang sama?

Tergantung jenis perangkat keras yang Anda miliki. Jika Anda memiliki CPU, gunakan bahasa pemrograman. Jika Anda memiliki FPGA atau Anda merancang ASIC, gunakan HDL. Jika Anda mendesain logika digital dalam jumlah yang sangat besar, Anda dapat melihat salah satu bahasa di antaranya seperti SystemVerilog.

Saya telah membaca bahwa sebagian besar firmware dibakar pada ROM atau flash. Bagaimana itu diwakili di sana? Dalam bit, seperti perangkat lunak? Jika demikian, apa perbedaannya? Apakah ketersediaan sirkuit yang disesuaikan dalam hal firmware?

Saya pikir Anda terpaku pada istilah "firmware". Kata ini awalnya berarti kode untuk dijalankan pada sistem tertanam, yang tidak dapat diakses oleh pengguna akhir untuk diubah. Jika Anda menjual PC kepada seseorang, ada kemungkinan sangat besar bahwa pengguna akan mengubah perangkat lunak apa yang dijalankan di atasnya. Jika Anda menjual osiloskop, Anda tidak ingin mereka mengubah kode yang dijalankan pada mikroprosesor internal, jadi Anda menyebutnya firmware.

Pengguna FPGA menggunakan kata "firmware" untuk output desain mereka, karena lebih dapat diubah daripada perangkat keras (barang yang disolder bersama). Tapi sebenarnya "firmware" yang mengkonfigurasi FPGA berbeda dari "firmware" yang berjalan pada UC. Firmware UC mengarahkan UC melalui serangkaian negara untuk melakukan fungsinya. Firmware FPGA mendefinisikan satu set interkoneksi antara elemen-elemen logika, dan nilai-nilai yang akan disimpan dalam tabel pencarian.

Dalam kedua kasus, firmware biasanya disimpan sebagai bit pada eeprom (atau pada disk pada mesin host yang akan memuatnya kapan pun sistem tertanam dimulai kembali). Tapi itu tidak membuat mereka mirip satu sama lain.


Ketika Anda menulis dalam VHDL / Verilog jauh lebih mudah untuk memvisualisasikan logika yang akan diimplementasikan dan dengan demikian mengoptimalkan. Hal yang sama tidak dapat dikatakan untuk C. Bahkan SystemC masih cukup bercerai dari implementasi fisik aktual sehingga hasil sintesis yang tidak terduga dapat terjadi
JonRB

@ JonRB, Jika Anda mengkode untuk UC atau UP, saya sebenarnya tidak mengetahui cara untuk melakukan itu dengan HDL. Saya setuju bahwa ketika coding logika, SystemVerilog atau SystemC adalah untuk sistem yang begitu besar sehingga tidak praktis untuk mencoba merancang segala sesuatu di tingkat gerbang individu.
The Photon

2
Perhatikan bahwa VHDL dan Verilog juga digunakan ketika Anda tidak memiliki perangkat keras sama sekali. Mereka dapat dikompilasi secara langsung ke sirkuit, bukan bitstream FPGA. Apple misalnya digunakan untuk mendesain motherboard mereka menggunakan Verilog alih-alih tangkapan skematis GUI karena ada dukungan yang lebih baik untuk kontrol versi, grepping dan hanya parsing menggunakan skrip ketika desain Anda adalah teks biasa bukan gambar biner berpemilik.
Slebetman

10

Untuk bagian pertama dari pertanyaan Anda, tentang motivasi untuk menggunakan satu atau yang lain: ada perbedaan mendasar antara C dan HDL (VHDL / Verilog) . C adalah bahasa pemrograman perangkat lunak (seperti halnya perakitan), VHDL / Verilog adalah bahasa deskripsi perangkat keras . Mereka tidak dimaksudkan untuk tujuan yang sama.

C diterjemahkan ke dalam kode assembly (dalam bentuk biner, yaitu bahasa mesin) saat dikompilasi . Kode ini adalah serangkaian instruksi yang memberi tahu CPU untuk melakukan serangkaian operasi dasar (mengubah nilai register, melakukan penambahan, dll.).

Di sisi lain, HDL disintesis ke perangkat keras. Dalam VHDL Anda bisa misalnya menulis sesuatu seperti:

output <= input1 + input2;

(lihat juga contoh yang lebih lengkap di sini ). Ini akan disintesiskan ke adder (perangkat keras). Jika kode disintesis untuk FPGA , ini berarti bitstream yang dapat mengkonfigurasi FPGA tertentu untuk mengimplementasikan adder (sebagai logika kombinasional ).

Sebenarnya, Anda dapat mendesain CPU dalam VHDL (lihat Prosesor Soft Core VS Prosesor Hard Core ), dan tulis peranti lunaknya di CHD ...

Tentang firmware: sebenarnya semua tergantung pada bagaimana Anda mendefinisikan kata. Sebuah firmware dapat menjadi program (software) yang berjalan di mikrokontroler (dengan demikian ditulis misalnya di C atau assembler), atau dapat menjadi bitstream untuk mengkonfigurasi sebuah programmable perangkat (hardware) logika (CPLD atau FPGA). Kadang-kadang itu bisa berupa paket yang mengandung keduanya: jika Anda mengambil firmware untuk beberapa model FritzBox (modem ADSL), mereka sebenarnya berisi keseluruhan sistem Linux (ditulis dalam assembler, C, dan banyak bahasa pemrograman lainnya), dan bitstream untuk mengkonfigurasi FPGA (kemungkinan disintesis dari VHDL atau Verilog).


3
  1. Tergantung pada arsitektur Anda. Jika Anda memiliki CPU (atau, biasanya, Mikrokontroler), Anda perlu menulis firmware dalam bahasa pemrograman biasa (termasuk perakitan). Jika Anda memiliki sesuatu seperti FPGA, firmware Anda harus ditulis dalam HDL. HDL tidak dapat (setahu saya) menghasilkan program yang dapat dieksekusi secara efisien oleh CPU konvensional, dan FPGA tidak menjalankan program konvensional di luar kotak. Anda bisa, bagaimanapun, mengkonfigurasi FPGA Anda sebagai CPU dan kemudian menjalankan program konvensional dengan itu. Ini akan membutuhkan dua lapisan firmware, lapisan bawah ditulis dalam HDL untuk membangun CPU, dan lapisan yang lebih tinggi ditulis dalam bahasa pemrograman konvensional untuk mengeksekusi pada CPU itu.
  2. Tidak ada perbedaan yang sulit antara firmware dan perangkat lunak. Pada banyak perangkat, firmware akan disimpan dalam memori flash misalnya, tetapi pada ponsel modern, hampir semuanya disimpan dalam memori flash, dan perbedaan antara firmware dan perangkat lunak tidak jelas (kebanyakan orang mungkin akan mempertimbangkan kode untuk memprogram firmware prosesor baseband). , dan kebanyakan orang akan mempertimbangkan program aplikasi perangkat lunak, tetapi di mana batas pastinya?).
  3. Seperti yang saya katakan di 2, tidak ada perbedaan yang jelas, selain gagasan bahwa firmware sedikit lebih permanen.

3

Konkurensi perangkat keras adalah motivasi utama.

Elektron dapat mengalir secara bersamaan dalam kabel paralel, jadi kami ingin memperhitungkannya saat mendesain perangkat keras.

Dalam VHDL, jika Anda menulis sesuatu seperti:

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

(di luar a processatau function, yang secara eksplisit menandainya sebagai berurutan), maka Anda telah menyandikan fakta bahwa:

  • x, y, z, aDan badalah kabel
  • adan bmerupakan sinyal input
  • xterhubung ke output dari suatu orrangkaian, yang mengambil adan bsebagai input
  • dan seterusnya untuk jalur lainnya

Sangat mudah untuk melihat bagaimana yang akan disintesis menjadi perangkat keras yang sebenarnya, dan itu xdan ydievaluasi pada saat yang sama.

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

Kemudian, ketika saatnya mensimulasikan rangkaian, simulator (yang biasanya merupakan program berurutan) telah mensimulasikan fisika rangkaian seperti ini:

  • telah aatau bberubah? Iya? Hei, xtergantung a. Mari kita perbarui x.
  • yjuga tergantung pada a. Perbarui itu juga.
  • ztergantung pada x. Perbarui karena xtelah diperbarui.
  • Adakah sesuatu yang xbergantung pada ( aatau b) telah diperbarui? Tidak? Sama untuk ydan z. OK, kita selesai dengan langkah ini.

Ini mengarah pada "kemungkinan" hasil yang mungkin yang tidak memiliki analog berurutan, tetapi yang mewakili situasi fisik yang mungkin:

  • x <= not xakan menyebabkan rekursi simulasi yang tak terbatas. Simulator hanya bisa terputus setelah kedalaman tertentu.
  • x <= 0; x <= 1mengarah ke kesalahan (korsleting). Ini adalah salah satu alasan mengapa std_logicada.

Namun, meskipun VHDL memodelkan perangkat keras lebih dekat daripada C, itu sendiri bukanlah deskripsi yang sangat terperinci tentangnya:

Pada akhirnya VHDL memberikan keseimbangan yang bagus antara fungsionalitas sirkuit manusia yang lebih tinggi dan tingkat sintesis yang lebih rendah.

C di sisi lain, lebih fokus berbicara ke CPU secara berurutan.

Anda tentu saja dapat menyandikan sirkuit dengan C struct, enum dan array, dan kemudian mensimulasikannya seperti yang dilakukan VHDL (ini terlihat kurang lebih seperti apa yang Sistem C , tapi saya belum pernah mencobanya).

Tetapi pada dasarnya Anda akan mengimplementasikan kembali simulator VHDL, dan dengan bahasa yang lebih verbose. Alat yang tepat untuk pekerjaan yang tepat kurasa.

Ada juga alat yang mengubah C ke VHDL /programming/8988629/can-you-program-fpgas-in-c-like-language tetapi mengharapkan kinerja yang lebih rendah karena itu adalah konversi tingkat tinggi yang sulit.


0

HDL digunakan untuk mendeskripsikan (mensintesis) perangkat keras sedangkan bahasa pemrograman digunakan untuk memprogram perangkat keras yang sudah disintesis yaitu cpu.

Anda bisa mendapatkan versi soft core cpus sebagai VHDL atau bitstream untuk mensintesis cpu itu pada FPGA.


-1

Sebuah prosesor menggunakan sejumlah kecil sirkuit untuk melakukan sejumlah besar operasi, secara berurutan, dengan memungkinkan sebagian besar komponen yang akan digunakan untuk melakukan operasi yang berbeda pada waktu yang berbeda.

FPGA berisi sejumlah sirkuit yang tidak dapat - setidaknya secara individual - melakukan operasi yang sangat canggih, tetapi semuanya mampu bertindak secara simultan dan independen.

Misalkan seseorang ingin memiliki chip yang melakukan sejumlah tugas, di antaranya adalah memantau 15 input dan:

  • Menyetel output tinggi setiap saat semua input stabil selama setidaknya 21 ms dan jumlah input yang tinggi adalah kelipatan dari tiga
  • Menyetel output rendah setiap saat semua input telah stabil untuk setidaknya 21ms dan jumlah input yang tinggi bukan kelipatan dari tiga
  • Mengubah output secara sewenang-wenang antara waktu input apa pun berubah dan waktu semua input stabil selama setidaknya 20 ms.

Jika seseorang memiliki mikrokontroler yang melakukan hal-hal lain, tetapi dapat meluangkan beberapa mikrodetik setiap 20 ms untuk memeriksa input tersebut dan mengatur output, maka sebagian besar sirkuit yang digunakan mikrokontroler untuk melakukan tugas lain juga akan dapat digunakan untuk melakukan tugas yang ditunjukkan di atas, sirkuit yang sangat sedikit (selain beberapa ROM dan mungkin RAM) perlu dikhususkan untuk tugas itu. Di sisi lain, mungkin diperlukan beberapa saat antara waktu input berubah dan waktu output mencerminkannya dengan benar.

Dengan menggunakan Verilog atau VHDL, seseorang dapat membangun rangkaian perangkat keras yang dapat secara terus-menerus memantau 15 input dan melakukan perhitungan yang ditunjukkan. Perangkat seperti itu mungkin akan dapat memiliki output menghasilkan indikasi yang benar dalam 100ns - urutan besarnya lebih cepat dari mikrokontroler - tetapi jumlah sirkuit yang didedikasikan untuk tugas itu dan tidak dapat digunakan untuk tujuan lain akan jauh lebih besar.


Ini tidak tampak seperti contoh potongan yang sangat jelas untuk menggambarkan perbedaan - ada cukup poin yang dapat diperdebatkan dalam rinciannya yang mungkin tidak benar-benar membantu membiasakan siapa pun yang belum terbiasa. Seseorang yang secara realistis menghadapi masalah ini mungkin akan memilih MCU modern dengan kata data yang luas dan interupsi pin-perubahan yang baik. Memutuskan solusi mana yang menggunakan lebih banyak logika akan memerlukan memutuskan apakah Anda menghitung banyak periferal yang tidak digunakan pada MCU atau irisan tak tersentuh pada FPGA. Yang pertama akan sedikit lebih murah.
Chris Stratton

@ ChrisStratton: Mungkin saya seharusnya menyarankan bahwa hal-hal dapat berubah jika persyaratan waktu semakin ketat? Mengharuskan CPU memiliki beberapa mikrodetik tersedia setiap 20 ms mungkin tidak memerlukan perubahan apa pun pada sistem yang mendasarinya, tetapi jika waktu respons yang diperlukan adalah 200 us, persyaratan seperti itu mungkin memerlukan CPU yang lebih cepat dari yang seharusnya diperlukan, jika perlu di bawah 20 us, mungkin perlu menambahkan CPU tambahan hanya untuk menanganinya, dan jika di bawah 200 ns tidak mungkin dilakukan sama sekali dengan CPU.
supercat

Itu karena Anda tidak memanfaatkan kemampuan MCU. Pada interupsi penggantian pin, mulai blok pengatur waktu perangkat keras yang akan mengatur output 20 ms nanti. Kemudian putuskan, santai apakah itu benar-benar dijamin, dan jika tidak, batalkan. Ini bukan contoh yang bagus untuk membuat titik FPGA Anda karena ada begitu banyak saling ketergantungan - satu-satunya bagian yang benar-benar berjalan secara paralel adalah deteksi acara, dan MCU modern sudah memberi Anda itu di sebagian besar perangkat keras paralel. Sementara sisanya secara efektif berurutan, jadi Anda membangun mesin ultra cepat yang menonton jam yang sangat lambat?
Chris Stratton

@ChrisStratton: Jika ada fitur interupsi pin-change yang sesuai dan belum digunakan untuk hal lain, itu mungkin menghindari perlunya polling konstan, tetapi jika banyak hal terjadi sekaligus mereka harus diproses secara berurutan pada tingkat berapa pun CPU dapat mengatasinya.
supercat

Pemrosesan berurutan adalah non-masalah mengingat keterlambatan besar pernyataan masalah Anda antara input dan respons. Dan bahkan jika MCU saat ini terlalu sibuk, menambahkan satu untuk tujuan ini akan menjadi sebagian kecil dari biaya menambahkan FPGA. Secara realistis satu-satunya cara masalah ini diselesaikan dalam FPGA adalah karena sudah ada irisan cadangan dan sinyal yang dialihkan ke sana, atau sebagai proyek buatan dalam konteks pendidikan atau hobi.
Chris Stratton
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.