Perbedaan antara pernyataan If-else dan Case dalam VHDL

11

Saya ingin memahami bagaimana berbagai konstruksi dalam kode VHDL disintesis dalam RTL.

  • Adakah yang bisa memberi tahu saya perbedaan antara konstruksi If-Else dan konstruksi Case statement dari suatu proses dalam VHDL dalam hal bagaimana kode tersebut disimpulkan ke dalam rangkaian RTL oleh alat sintesis?
  • Pertimbangkan kasus multi-if bersarang dan campur aduk-case dengan konstruksi if-else di dalam suatu proses.
  • Juga kapan harus menggunakan konstruksi mana?

PS: Saya telah melihat pertanyaan terkait "Pernyataan berganda jika sedang diproses dalam vhdl" tetapi itu tetap saja tidak menjawab pertanyaan saya.

nurabha
sumber
Saya tidak dapat berkomentar tentang bagaimana gerbang fisik akan dikonfigurasi, tetapi dalam kebanyakan kompiler yang memancarkan perakitan x86 sebuah if-else biasanya ada sebagai pemeriksaan tunggal dengan lompatan bersyarat (mis. Jg, jl, jz, jnz, dll.), sedangkan switch mengatur kasus dalam urutan angka dan melakukan iteratif dec/ jzinstruksi, yang jauh lebih efisien. Mungkin optimasi serupa diterapkan di sini.
Polinomial
@ Polinomial Perilaku If-else dan case berbeda secara signifikan dalam bahasa perangkat keras dibandingkan dengan pemrograman linier tipikal Anda. Optimalisasi kode-op tidak terlalu relevan karena pernyataan HDL mengeksekusi "secara instan".
W5VO

Jawaban:

10

Adakah yang bisa memberi tahu saya perbedaan antara konstruksi If-Else dan konstruksi Case statement dari suatu proses dalam VHDL dalam hal bagaimana kode tersebut disimpulkan ke dalam rangkaian RTL oleh alat sintesis?

The if-elsif-elsemembangun menyimpulkan prioritas routing jaringan:

skema

mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab

Ini sesuai dengan

if bool_expr_1 then
    sig <= val_expr_1;
elsif bool_expr_2 then
    sig <= val_expr_2;
elsif bool_expr_3 then
    sig <= val_expr_3;
else
    sig <= val_expr_4;
end if;

The casemembangun, di sisi lain, menyimpulkan besar ol' mux:

masukkan deskripsi gambar di sini

Ini sesuai dengan

case case_expr is
  when c0 =>
    sig <= val_expr_0;
  when c1 =>
    sig <= val_expr_1;
  when c2 =>
    sig <= val_expr_2;
      ...
  when others =>
    sig <= val_expr_N;
end case;

Jelas ini adalah desain yang sangat sederhana dengan hanya satu ekspresi nilai, menghasilkan satu output.

Pertimbangkan kasus multi-if bersarang dan campur aduk-case dengan konstruksi if-else di dalam proses.

Per di atas, Anda dapat melihat bagaimana mereka akan bersarang / bercampur.

Juga kapan harus menggunakan konstruksi mana?

Karena if-elsediprioritaskan, itu harus digunakan ketika lebih dari satu kondisi input dapat terjadi. Menggunakan case, satu sisi lain, adalah tepat ketika input saling eksklusif.

Angelo Stavrow
sumber
Saya mengerti bahwa statment kasus hanya berfungsi untuk kondisi input tunggal dan jika-lain dapat bekerja untuk beberapa kondisi input. Tetapi kedua konstruksi pada dasarnya menghasilkan muxes (tanpa adanya CLK). Apakah tidak mungkin bahwa sintesis logika dapat mengoptimalkan input-tunggal jika-lain untuk mux besar tunggal daripada rantai muxes? Juga, apa yang dimaksud dengan jaringan perutean prioritas ... bukankah ini hanya rantai mux, bukannya 1 mux besar?
nurabha
Selain itu, ketika kita memiliki proses yang peka terhadap jam, jika-lain dapat menghasilkan elemen berurutan seperti register, kait dll. Bisakah pernyataan kasus juga menghasilkan logika berurutan?
nurabha
Ya, jaringan perutean prioritas persis seperti itu - rantai muxes. Namun, sifat dari if-elsekonstruk itu adalah di mana rantai itu muncul. Kondisi pertama harus gagal agar kondisi kedua diuji. Ini bukan kasus untuk, eh, casekonstruk, dan inilah sebabnya if-elsepernyataan tidak dapat disintesis sebagai mux besar tunggal.
Angelo Stavrow
1
Dan ya, sebuah casepernyataan dapat menghasilkan logika sekuensial juga. Saya menemukan "Dunia Nyata VHDL" , serangkaian slide ceramah dari Universitas Glasgow, yang mungkin bermanfaat bagi Anda.
Angelo Stavrow
Ini referensi yang bagus.
nurabha
4

Dalam posting blog lama ini , penulis menulis dan mensintesis dua versi kode VHDL yang secara fungsional setara. Satu menggunakan if-else, lainnya menggunakan case. Hasil:

Saya mensintesis kode ini dan mendapatkan hasil yang tepat. Bahkan skema RTL persis sama untuk kedua program.

Dan kesimpulannya:

Ini menunjukkan bahwa pernyataan 'case' dan 'if ... elsif ... else' sama-sama efisien. Namun jika Anda ingin menulis kode yang jelas, maka Anda lebih baik menggunakan 'case'. 'Case' sangat berguna ketika output tergantung pada sejumlah besar kondisi. Tetapi jika jumlah kondisinya sangat kecil (2 atau 3) maka Anda dapat menggunakan 'jika..selseif..else'.

Ada juga puluhan posting tentang subjek ini di Stack Overflow untuk setiap bahasa yang mungkin. Kesimpulannya pada umumnya sama, bahwa tidak ada perbedaan kinerja-bijaksana. Kadang-kadang, jika ada banyak kasus, kompiler mungkin cukup pintar untuk membuat tabel pencarian yang akan menghasilkan kinerja yang sedikit lebih baik.

VHDL synthesizer mungkin dapat melakukan hal serupa. Tetapi Anda masih membutuhkan sejumlah besar kasus dalam hal ini (maksud kata) Anda mungkin ingin menggunakan pernyataan kasus karena memberikan keterbacaan yang lebih baik di mana ada sejumlah besar opsi.

tertanam.kyle
sumber