Jenis Pengkodean Mana yang Harus Saya Gunakan? Contoh Aplikasi FPGA
Ikuti tiga eksperimen yang menunjukkan proses menentukan jenis penyandian yang sesuai dengan FPGA tertentu.
Jenis penyandian mana yang harus saya gunakan untuk FPGA saya? Seperti yang saya bahas di artikel sebelumnya, kompiler biasanya akan memutuskan ini untuk Anda—dan saya sarankan Anda mengikuti apa yang diputuskan oleh kompiler.
Namun, penting untuk memahami perbedaan antara jenis pengkodean dan mengapa kompiler mungkin sampai pada kesimpulan tertentu. Dengan mengingat hal itu, artikel ini akan memandu Anda melalui eksperimen yang menunjukkan contoh aplikasi FPGA dan membahas, langkah demi langkah, jenis penyandian mana yang terbaik.
Sejauh ini dalam seri ini, kita telah membahas cara membuat finite state machine (FSM) dengan Verilog, status awal dan bagaimana memori memengaruhi pengkodean FPGA, dan ikhtisar tingkat tinggi yang membandingkan pengkodean biner vs. one-hot vs. Gray .
Sistem Sedang Diuji
Untuk eksperimen ini, saya ingin membuat instance mesin status beberapa kali untuk memperbesar perbedaan dalam perangkat keras yang dihasilkan saat pengkodean biner, Gray, dan one-hot digunakan.
Sistem yang akhirnya saya pilih adalah Conway's Game of Life, sebuah otomat seluler yang mensimulasikan perilaku sel-sel hidup di lingkungan mereka, yang merupakan susunan sel 2D persegi panjang. Conway's Game of Life adalah simulasi dari sel-sel yang lahir, bereproduksi, dan mati, menurut seperangkat aturan sederhana yang diikuti setiap sel untuk menentukan apa yang terjadi pada siklus berikutnya. Setiap sel hidup dapat bertahan hidup atau mati, dan setiap sel mati dapat tetap mati atau menjadi hidup. Berikut adalah aturan untuk setiap siklus:
- Sel hidup dengan dua atau tiga tetangga yang masih hidup dapat bertahan hidup.
- Sel mati dengan tiga tetangga hidup menjadi hidup.
- Semua sel lain mati atau tetap mati.
Aturan ini menciptakan banyak perilaku dan pola menarik yang telah dipelajari secara luas dalam ilmu komputer.
Beginilah tampilan Game of Life Conway saat menjalankan apa yang dikenal sebagai senjata peluncur Gosper tunggal.
Variasi dari Game of Life Conway, yang dikenal sebagai Glider Gun milik Bill Gosper. Gif dibuat oleh Lucas Vieira [CC BY-SA 3.0]
Kode Verilog
Kembali ke sistem pengujian kami, setiap sel dirancang sebagai mesin keadaan dengan delapan keadaan. Memang, logika untuk sebuah sel di Conway's Game of Life dapat diselesaikan dalam satu siklus, tetapi saya memutuskan untuk membuat mesin 8-status agar memiliki perbedaan mencolok saat menggunakan pengkodean yang berbeda. Status digunakan untuk menghitung tetangga sel yang masih hidup.
Potongan kode Verilog berikut menunjukkan struktur modul sel untuk mesin ini, termasuk pengkodean biner asli dari status.
`tentukan STATE_0 3'b000
`define STATE_1 3'b001
`define STATE_2 3'b010
`define STATE_3 3'b011
`tentukan STATE_4 3'b100
`tentukan STATE_5 3'b101
`define STATE_6 3'b110
`tentukan STATE_7 3'b111
modul LifeCell(
masukan clk,
masukan pertama,
masukan benih,
masukan [7:0] tetangga,
output reg hidup);
reg [2:0] status;
selalu @ (posedge clk)
if (nrst ==0)
status <=`STATE_0;
lain
kasus(negara bagian)
`STATE_0:mulai
// ...
status <=`STATE_1;
akhir
`STATE_1:mulai
// ...
status <=`STATE_2;
akhir
// ...
`STATE_7:mulai
// ...
status <=`STATE_1;
akhir
endcase
endmodule
Jika Anda ingin melihat kode lebih dekat, silakan lihat proyeknya di GitHub.
Implementasi Pengkodean FPGA
Sistem ini disintesis dan diimplementasikan sebagai dunia sel 23x23, dengan total 27 varian:tiga FSM berbeda digunakan, semuanya dengan tiga pengkodean yang disebutkan di atas, semuanya pada tiga FPGA target yang berbeda.
FSM #1:Model Asli
Mesin ini memiliki status awal yang berjalan sekali dan kemudian berjalan dalam satu siklus melalui tujuh status yang tersisa. Ini hampir merupakan urutan yang lengkap, jadi pengkodean Gray tampak menjanjikan bagi saya pada awalnya.
FSM #2:Urutan
Mesin ini berfungsi sebagai penghitung 3 bit, jadi saya juga mengharapkan pengkodean Gray untuk menghancurkan persaingan.
FSM #3:Kekusutan Sewenang-wenang
Mesin ini memiliki jalur kritis yang sama dengan FSM #1, tetapi melewati jalur sewenang-wenang ketika jumlah tetangga yang masih hidup diketahui melebihi 3.
Untuk perilaku transisi status arbitrer ini, saya mengharapkan penyandian satu-panas menjadi pilihan terbaik.
Arsitektur Target
Sistem ini diterapkan untuk tiga FPGA target, menggunakan alat pengembangan vendor mereka:
- Xilinx Vivado Suite, untuk FPGA Artix 7
- Intel Quartus Prime, untuk FPGA Cyclone V
- Berlian Lattice, untuk FPGA LatticeXP2
Membandingkan Hasil
Membandingkan kinerja dua sistem atau lebih itu sulit, terutama karena keputusannya bergantung pada metrik yang kami gunakan dan aspek mana yang kami anggap lebih penting daripada yang lain. Untuk eksperimen ini, saya mengumpulkan data berikut untuk menghasilkan skor untuk setiap implementasi:
- Jumlah Unit Logika. Ini adalah LUT (lihat tabel) untuk Xilinx dan Lattice FPGA, atau ALM untuk Intel FPGA. Skor:1 poin.
- Jumlah Register. Skor:1 poin.
- Perkiraan Frekuensi Maksimum. Skor:2 poin.
- Perkiraan Daya On-Chip. Skor:2 poin.
Untuk setiap implementasi, keempat aspek ini dibandingkan di antara tiga pengkodean, jadi di antara pengkodean, saya mendapat hasil terbaik, terburuk, dan tengah:Yang terbaik mendapat skor positifnya, yang terburuk mendapat skor negatifnya, dan yang tengah mendapat 0.
Setelah menjumlahkan semua skor untuk setiap model, saya mendapatkan hasil sebagai berikut:
Tabel hasil untuk 27 implementasi. Di setiap baris, pengkodean terbaik ditampilkan dalam warna hijau, yang terburuk dalam warna merah, dan bagian tengah dalam warna kuning jika tidak ada ikatan.
Ini sepertinya menyarankan menjauh dari pengkodean satu-panas, dengan hanya dua kasus di mana ia menang, salah satunya adalah seri. Selain itu, meskipun saya awalnya mengharapkan one-hot untuk menjadi pengkodean terbaik untuk model FSM #3, ternyata pengkodean terburuknya, tanpa alat pengembangan yang merekomendasikannya. Meskipun demikian, ada kasus di mana one-hot mengalahkan yang lain, sebagian besar dalam metrik frekuensi dan daya.
Secara keseluruhan, pengkodean Gray tampaknya menjadi pilihan terbaik untuk sistem khusus ini.
Mengekstrak pemenang dari tabel ini, kami mendapatkan yang berikut:
Putusan
Meskipun perbandingan ini tampaknya lebih menyukai encoding Gray daripada biner dan one-hot, hasilnya sangat bergantung pada metrik yang kami gunakan, dan metrik ini mencerminkan apa yang penting bagi kami. Sebagai contoh, dalam perbandingan ini, saya menganggap frekuensi dan daya lebih penting daripada penggunaan (jumlah elemen logika dan register dalam desain.) Jika saya menilai penggunaan daripada frekuensi dan frekuensi daripada daya, pasti akan menghasilkan peringkat yang berbeda.
Perbandingan ini tidak dimaksudkan sebagai pekerjaan definitif pada kinerja yang diperoleh dengan menggunakan pengkodean ini. Sebaliknya, ini menunjukkan peringkat yang dihasilkan oleh preferensi pribadi saya dalam arsitektur yang saya gunakan.
Sekali lagi, jika Anda ingin melihat kodenya, lihat 27 implementasinya, atau lihat simulasi saya tentang Game of Life Conway beraksi, lihat proyeknya di GitHub.