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):
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?
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.
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!
Jawaban:
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.
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.
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 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.
sumber
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:
(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).
sumber
sumber
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:
(di luar a
process
ataufunction
, yang secara eksplisit menandainya sebagai berurutan), maka Anda telah menyandikan fakta bahwa:x
,y
,z
,a
Danb
adalah kabela
danb
merupakan sinyal inputx
terhubung ke output dari suatuor
rangkaian, yang mengambila
danb
sebagai inputSangat mudah untuk melihat bagaimana yang akan disintesis menjadi perangkat keras yang sebenarnya, dan itu
x
dany
dievaluasi pada saat yang sama.Kemudian, ketika saatnya mensimulasikan rangkaian, simulator (yang biasanya merupakan program berurutan) telah mensimulasikan fisika rangkaian seperti ini:
a
ataub
berubah? Iya? Hei,x
tergantunga
. Mari kita perbaruix
.y
juga tergantung padaa
. Perbarui itu juga.z
tergantung padax
. Perbarui karenax
telah diperbarui.x
bergantung pada (a
ataub
) telah diperbarui? Tidak? Sama untuky
danz
. 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 x
akan menyebabkan rekursi simulasi yang tak terbatas. Simulator hanya bisa terputus setelah kedalaman tertentu.x <= 0; x <= 1
mengarah ke kesalahan (korsleting). Ini adalah salah satu alasan mengapastd_logic
ada.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.
sumber
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.
sumber
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:
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.
sumber