Menguasai Desain FPGA Tertanam: Panduan Implementasi Praktis
Ketersediaan FPGA yang lebih kuat dan lingkungan pemrograman yang lebih efektif telah membuat implementasi FPGA dapat diakses secara luas, namun penggunaan FPGA bisa terasa menakutkan.
Catatan Editor: Seiring munculnya algoritma canggih untuk desain produk pintar, pengembang seringkali kesulitan mengimplementasikan sistem embedded yang mampu memenuhi kebutuhan pemrosesan algoritma tersebut. FPGA dapat menyediakan performa yang diperlukan, tetapi desain dengan FPGA lama dianggap terbatas pada ahli pemrograman FPGA. Namun hari ini, ketersediaan FPGA yang lebih kuat dan lingkungan pengembangan yang lebih efektif telah membuat pengembangan FPGA dapat diakses secara luas. Dalam cuplikan ini, Bab 4 dari buku Architecting High-Performance Embedded Systems, penulis meninjau secara komprehensif perangkat FPGA, bahasa implementasi, dan proses pengembangan FPGA serta walkthrough rinci tentang cara memulai implementasi FPGA dalam desain Anda. Cuplikan lengkap disajikan dalam rangkaian installment berikut: 1: Sumber daya hardware 2: Bahasa implementasi 3: Proses pengembangan 4: Membangun proyek 5: Implementasi (artikel ini)
Diadaptasi dari Architecting High-Performance Embedded Systems, oleh Jim Ledin.
Menguji Perilaku Logika
Penting untuk menguji perilaku logika menggunakan simulasi sebelum mencoba menjalankannya di FPGA. Hal ini karena jauh lebih mudah untuk mendeteksi dan memperbaiki masalah dalam lingkungan simulasi daripada dengan logika yang berjalan di dalam FPGA. Alat simulasi Vivado melakukan pekerjaan yang sangat baik dalam merepresentasikan perilaku rangkaian:
Di sub-jendela Sources , klik kanan pada Simulation Sources dan pilih Add Sources…:
Gambar 4.18 – Pemilihan menu Add Sources… untuk Simulation Sources
Di dialog Add Sources , pastikan Add or create simulation sources terpilih, lalu klik Next.
Di dialog Add or Create Simulation Sources , klik Create File.
Masukkan nama file vhdl dan klik OK.
Klik Finish untuk menutup dialog Add or Create Simulation Sources , lalu klik OK di dialog Define Module dan klik Yes ketika ditanya apakah Anda yakin ingin menggunakan ini
Double-klik Adder4 TestBench (Behavioral) (Adder4TestBench.vhdl) di bawah Simulation Sources. Hapus konten yang diisi otomatis dari jendela editor vhdl dan masukkan kode berikut ke dalam editor Adder4TestBench.vhdl :
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity ADDER4_TESTBENCH is end entity ADDER4_TESTBENCH; architecture BEHAVIORAL of ADDER4_TESTBENCH is component ADDER4 is port ( A4 : in std_logic_vector(3 downto 0); B4 : in std_logic_vector(3 downto 0); SUM4 : out std_logic_vector(3 downto 0); C_OUT4 : out std_logic ); end component; signal a : std_logic_vector(3 downto 0); signal b : std_logic_vector(3 downto 0); signal s : std_logic_vector(3 downto 0); signal c_out &; &;: std_logic; signal expected_sum5: unsigned(4 downto 0); signal expected_sum4: unsigned(3 downto 0); signal expected_c : std_logic; signal error : std_logic; begin TESTED_DEVICE: ADDER4 port map ( A4 => a, B4 => b, SUM4 => s, C_OUT4 => c_out ); TEST: process begin -- Uji semua kombinasi dari dua penambahan 4-bit (256 total tes) for a_val in 0 to 15 loop for b_val in 0 to 15 loop -- Set input ke komponen ADDER4 a <= std_logic_vector(to_unsigned(a_val, a'length)); b <= std_logic_vector(to_unsigned(b_val, b'length)); wait for 1 ns; -- Hitung jumlah 5-bit dari dua nilai 4-bit expected_sum5 <= unsigned('0' & a) + unsigned('0' & b); wait for 1 ns; -- Pecah jumlah menjadi output 4-bit dan bit carry expected_sum4 <= expected_sum5(3 downto 0); expected_c <= expected_sum5(4); wait for 1 ns; -- Sinyal 'error' hanya akan menjadi 1 jika terjadi kesalahan if ((unsigned(s) = unsigned(expected_sum4)) and (c_out = expected_c)) then error <= '0'; else error <= '1'; end if; -- Setiap perjalanan melalui loop dalam memakan waktu 10 ns wait for 7 ns; end loop; end loop; wait; end process TEST; end architecture BEHAVIORAL;
Kode ini menguji fungsionality penambahan 4-bit dengan menyajikan semua kombinasi angka 4-bit ke masing-masing input A4 dan B4 dari komponen Adder4. Ini membandingkan output SUM4 dan C_OUT4 dari komponen Adder4 dengan nilai yang dihitung secara independen untuk input yang sama. Setelah setiap operasi penambahan, sinyal error diatur ke 0 jika output Adder4 cocok dengan nilai yang diharapkan, atau diatur ke 1 jika ada ketidakcocokan.
Kode di Adder4TestBench.vhdl mirip dengan kode software tradisional dalam cara menggunakan nested for loops untuk menerapkan semua kombinasi input uji ke komponen Adder4 yang sedang diuji. Kode yang menjalankan tes dalam mode simulasi non-synthesizable, yang berarti tidak secara murni merepresentasikan rangkaian logika hardware dan mampu melakukan operasi mirip software tradisional, seperti eksekusi iteratif for loops.
Namun, seperti dalam rangkaian fisik, sinyal yang diberi nilai dalam kode test bench menggunakan operator <= tidak dapat digunakan pada waktu yang sama dalam ekspresi berikutnya. Hal ini karena lingkungan simulasi merepresentasikan efek dunia nyata dari propagasi delay, yang signifikan bahkan dalam perangkat FPGA kecil. Tiga pernyataan wait for 1 ns; dalam kode test bench menghentikan operasi rangkaian untuk memberikan waktu propagasi delay. Delays 1 ns ini memberikan waktu untuk nilai sinyal yang dihitung tepat sebelum pernyataan wait untuk menyebar sehingga dapat digunakan dalam pernyataan berikutnya. Pernyataan akhir wait for 7 ns; dalam loop dalam adalah jeda yang memungkinkan kita untuk melihat hasil dari setiap iterasi loop simulasi dengan jelas di tampilan trace sinyal.
Klik kanan Adder4 TestBench (Behavioral) (Adder4TestBench.vhdl) di bawah Simulation Sources dan pilih Automatic Update and Compile Order. Ini menetapkan ADDER4_TESTBENCH sebagai objek level atas untuk run simulasi:
Gambar 4.19 – Pemilihan menu untuk menetapkan Automatic Update and Compile Order
Klik Run Simulation, lalu Run Behavioral Simulation di jendela Flow Navigator untuk memasuki mode simulasi. Jika Anda belum menyimpan file editor, Anda akan diminta untuk melakukannya. Klik Save. Simulasi kemudian akan berjalan:
Gambar 4.20 – Pemilihan menu Run Behavioral Simulation
Ketika jendela SIMULATION dibuka, klik tombol maximize di jendela output simulasi dengan judul Untitled 1:
Gambar 4.21 – Jendela hasil simulasi
Waktu simulasi total setiap perjalanan melalui loop dalam adalah 10 ns. Karena ada 256 perjalanan melalui loop di Adder4TestBench.vhdl, waktu untuk menjalankan simulasi adalah 2560 ns.
Setel waktu run simulasi ke 2560 ns di toolbar atas (langkah 1 dalam gambar berikutnya), tekan tombol restart yang mengarah ke kiri (langkah 2), lalu tekan tombol yang menghadap kanan untuk menjalankan simulasi selama 2560 ns (langkah 3), dan akhirnya tekan tombol Zoom Fit (langkah 4) untuk menskalakan rentang data output simulasi agar pas dengan jendela:
Gambar 4.22 – Hasil simulasi dari awal hingga akhir run
Anda dapat menggunakan ikon kaca pembesar untuk memperbesar setiap titik trace dan mengamati hasil setiap operasi penambahan yang dilakukan selama pengujian. Misalnya, gambar berikut menunjukkan nilai desimal 6 dan 2 ditambahkan untuk menghasilkan hasil 8 dengan carry 0. Nilai ini cocok dengan nilai yang diharapkan, yang menyebabkan error diatur ke 0. Sinyal error adalah 0 untuk semua 256 kasus uji, menunjukkan rangkaian logika kami lulus semua tes:
Gambar 4.23 – Tampilan diperbesar dari hasil simulasi
Tutup mode simulasi dengan mengklik X di bar biru SIMULATION di atas data trace. Klik OK ketika ditanya apakah Anda ingin menutup simulasi.
Setelah lulus pengujian behavior, kita akan menentukan sinyal I/O yang digunakan dalam desain.
Menentukan Sinyal I/O
Langkah berikutnya adalah menghubungkan input dan output rangkaian kami ke perangkat hardware pada papan Arty. Input akan menjadi switch dan pushbutton papan, sedangkan output akan menjadi LED.
Langkah-langkah berikut akan membuat file constraints yang menggambarkan pin I/O yang akan kita gunakan pada perangkat FPGA dan fungsi yang terhubung ke pin-pin tersebut pada papan Arty. File constraints memiliki ekstensi xdc:
Di sub-jendela Sources , klik kanan Constraints dan pilih Add Sources….
Di dialog Add Sources , pastikan Add or create constraints terpilih, lalu klik Next.
Di dialog Add or Create Constraints , klik Create File.
Masukkan nama file Arty-A7-100.xdc (atau Arty-A7-35.xdc jika sesuai untuk perangkat Anda) dan klik OK.
Klik Finish untuk menutup dialog Add or Create Constraints
Perluas pohon sumber Constraints dan double-klik Arty-A7-35.xdc.
Digilent menyediakan file constraints yang diisi sebelumnya untuk papan Arty A7 Kunjungi https://raw.githubusercontent.com/Digilent/digilent-xdc/master/Arty-A7-35-Master.xdc dan salin seluruh konten jendela browser ke jendela editor Arty-A7-35.xdc di Vivado. Jika sesuai untuk perangkat Anda, gunakan file di https://raw.githubusercontent.com/Digilent/digilent-xdc/master/Arty-A7-100-Master.xdc sebagai gantinya.
Semua pin I/O di-comment out dalam file constraints oleh Uncomment baris yang sesuai dalam file dengan menghapus karakter # dari awal setiap baris. Kami akan menggunakan pin yang tercantum dalam bagian-bagian berikut di file Arty-A7-100.xdc: Switches, RGB LEDs (hanya led0_g, LED hijau pertama), LEDs, dan Buttons. Gambar berikut menunjukkan baris-baris ini setelah di-uncomment:
Gambar 4.24 – Jendela editor constraints
Di bagian berikutnya, kami akan membuat file VHDL level atas yang menghubungkan kode penambahan dengan perangkat I/O papan.
Membuat File VHDL Level Atas
Kami selanjutnya akan membuat file VHDL level atas yang menghubungkan komponen penambahan 4-bit kami dengan sinyal I/O papan yang sesuai:
Di sub-jendela Sources, klik kanan pada Design Sources dan pilih Add Sources….
Di dialog Add Sources , pastikan Add or create design sources terpilih, lalu klik Next.
Di dialog Add or Create Design Sources , klik Create File.
Masukkan nama file vhdl dan klik OK.
Klik Finish untuk menutup dialog Add or Create Design Sources , lalu klik OK di dialog Define Module dan klik Yes ketika ditanya apakah Anda yakin ingin menggunakan ini
Double-klik vhdl di bawah Design Sources. Hapus konten yang diisi otomatis dari jendela editor ArtyAdder.vhdl dan masukkan kode berikut ke dalam editor ArtyAdder.vhdl :
-- Load the standard libraries library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity ARTY_ADDER is port ( sw : in STD_LOGIC_VECTOR (3 downto 0); btn : in STD_LOGIC_VECTOR (3 downto 0); led : out STD_LOGIC_VECTOR (3 downto 0); led0_g : out STD_LOGIC ); end entity ARTY_ADDER; architecture BEHAVIORAL of ARTY_ADDER is -- Reference the previous definition of the 4-bit adder component ADDER4 is port ( A4 : in std_logic_vector(3 downto 0); B4 : in std_logic_vector(3 downto 0); SUM4 : out std_logic_vector(3 downto 0); C_OUT4 : out std_logic ); end component; begin ADDER : ADDER4 port map ( A4 => sw, B4 => btn, SUM4 => led, C_OUT4 => led0_g ); end architecture BEHAVIORAL;
Kode ini memetakan nama sinyal untuk perangkat I/O yang disebut dalam Arty-A7-100.xdc sebagai sw (4 switch), btn (4 pushbutton), led (4 LED single-color), dan led0_g (saluran hijau dari LED multi-color pertama) ke input dan output ADDER4.
Sementara VHDL tidak case-sensitive, pemrosesan file constraint xdc di Vivado case-sensitive. Case yang digunakan dalam nama perangkat I/O yang didefinisikan dalam file xdc harus identik saat direferensikan dalam file VHDL. Secara khusus, nama sinyal I/O dalam VHDL harus lowercase dalam file ini karena mereka lowercase dalam file constraints.
Kami sekarang siap untuk mensintesis, mengimplementasikan, dan memprogram desain kami untuk papan Arty.
Mensintesis dan Mengimplementasikan Bitstream FPGA
Alternatifnya, Anda dapat memilih Generate Bitstream dan Vivado akan melakukan semua langkah yang diperlukan, termasuk sintesis, implementasi, dan pembuatan bitstream tanpa intervensi pengguna lebih lanjut. Jika terjadi fatal error, proses akan berhenti dan pesan error akan ditampilkan. Lakukan langkah-langkah berikut untuk menghasilkan bitstream:
Klik Generate Bitstream untuk memulai build Anda mungkin ditanya apakah Anda ingin menyimpan editor teks. Klik Save. Anda mungkin diberitahu bahwa tidak ada hasil implementasi yang tersedia dan ditanya apakah OK untuk meluncurkan sintesis dan implementasi. Klik Yes:
Gambar 4.25 – Pemilihan menu Generate Bitstream
Dialog Launch Runs kemudian Anda dapat memilih nilai untuk Number of jobs hingga jumlah core processor di komputer Anda. Menggunakan lebih banyak core membuat proses lebih cepat, tetapi dapat membebani mesin Anda jika Anda ingin terus menggunakannya selama proses build yang panjang. Klik OK untuk memulai build:
Gambar 4.26 – Dialog Launch Runs
Selama proses build, Vivado akan menampilkan status di sudut kanan atas jendela utama. Jika perlu, Anda dapat membatalkan proses build dengan mengklik Cancel di sebelah tampilan status:
Gambar 4.27 – Tampilan status kompilasi
Ketika proses build selesai, asumsikan tidak ada fatal error, dialog Bitstream Generation Completed akan meskipun opsi lain ditawarkan, kami akan langsung melanjutkan untuk mendownload bitstream ke papan Arty. Pilih Open Hardware Manager dan klik OK:
Gambar 4.28 – Dialog Bitstream Generation Completed
Selanjutnya, kami akan mendownload bitstream ke FPGA.
Mendownload Bitstream ke Papan
Lakukan langkah-langkah berikut untuk mendownload bitstream ke papan Arty A7:
Dialog HARDWARE MANAGER akan muncul dan menunjukkan No hardware target is open.
Hubungkan papan Arty A7-35 atau A7-100 Anda ke komputer dengan kabel USB Tunggu beberapa detik hingga papan dikenali, lalu klik Open target, lalu Auto Connect:
Gambar 4.29 – Pemilihan Open target dan Auto Connect
Setelah beberapa detik, Vivado seharusnya menunjukkan bahwa papan terhubung. Klik Program device untuk mendownload bitstream FPGA ke Arty Anda akan diminta untuk memilih file bitstream. Jika Anda telah menggunakan struktur direktori yang sama dengan contoh ini, file akan terletak di C:/Projects/ArtyAdder/ArtyAdder.runs/impl_1/ARTY_ADDER.bit:
Gambar 4.30 – Dialog Program Device
Klik Program untuk mendownload program ke perangkat FPGA dan memulainya
Anda sekarang dapat menguji operasi program dengan I/O Arty Letakkan semua empat switch dalam posisi off (gerakkan switch menuju tepi papan yang berseberangan) dan jangan menekan salah satu dari empat pushbutton. Semua empat LED hijau harus mati.
Jika Anda menyalakan switch individu atau menekan salah satu pushbutton, LED hijau yang sesuai harus menyala. Menyalakan kombinasi sembarang switch sambil menekan sejumlah pushbutton akan menjumlahkan angka 4-bit yang sesuai dan menyala LED dengan Jika ada carry (misalnya, nyalakan SW3 dan tekan BTN3 secara bersamaan), LED carry hijau akan menyala.
Proses pemrograman yang dilakukan di sini menyimpan program dalam RAM FPGA. Jika Anda menyetel ulang daya papan FPGA, Anda perlu mengulangi proses pemrograman untuk memuat ulang program. Alternatifnya, Anda dapat menyimpan file konfigurasi FPGA di memori flash papan seperti yang dijelaskan dalam bagian berikutnya.
Memprogram Bitstream ke Memori Flash Papan
Untuk mengonfigurasi FPGA setiap kali daya diberikan ke papan Arty, file konfigurasi FPGA harus disimpan ke memori flash di papan. Jika jumper MODE terpasang, FPGA akan mencoba mendownload file konfigurasi dari memori flash papan saat menyala. Memori ini terletak di chip terpisah berseberangan dengan FPGA Artix-7. Ikuti langkah-langkah berikut untuk memprogram file konfigurasi ke memori flash:
Pasang jumper MODE di papan Arty jika belum terpasang
Klik kanan Generate Bitstream dan pilih Bitstream Settings….
Di dialog Settings , centang kotak di samping -bin_file dan klik OK:
Gambar 4.31 – Dialog Bitstream settings
Di dialog utama Vivado, klik Generate Bitstream dan ulangi proses pembuatan bitstream. Klik Cancel ketika dialog Bitstream Generation Completed
Di dialog Hardware, klik kanan nomor bagian FPGA (xc7a100t_0) dan pilih Add Configuration Memory Device…:
Gambar 4.32 – Pemilihan menu Add Configuration Memory Device…
Ketik s25fl127 ke dalam Search Ini akan menampilkan satu nomor bagian yang cocok. Pilih bagian dan klik OK:
Gambar 4.33 – Dialog Add Configuration Memory Device
Anda akan disajikan dengan dialog yang bertanya Apakah Anda ingin memprogram perangkat memori konfigurasi sekarang? Klik OK.
Ini akan membuka dialog Program Configuration Memory Device yang meminta nama file konfigurasi. Klik tombol … di kanan Configuration file dan pilih C:/Projects/ArtyAdder/ArtyAdder.runs/impl_1/ARTY_ADDER.bin. Klik OK:
Gambar 4.34 – Dialog Program Configuration Memory Device
Proses pemrograman akan memakan waktu beberapa detik Anda seharusnya menerima pesan yang menunjukkan sukses setelah file telah diprogram ke memori flash papan:
Gambar 4.35 – Dialog Program Flash complete
Setelah ini, setiap kali Anda menyetel ulang daya papan, program penambahan 4-bit akan dimuat dan berjalan. Akan memakan waktu lama untuk program dimuat dengan pengaturan yang kami gunakan untuk pemuatan file konfigurasi. Untuk menghindari menunggu FPGA memuat program, Anda dapat meningkatkan kecepatan pemuatan file konfigurasi dengan melakukan langkah-langkah berikut:
Pilih Open Synthesized Design di Flow Navigator.
Di menu utama Vivado, pilih Tools/Edit Device Properties….
Di tab General , setel Enable Bitstream Compression ke TRUE.
Di tab Configuration , setel Configuration Rate (MHz) ke 33, lalu klik OK.
Hasilkan bitstream lagi, dan program memori flash seperti yang dijelaskan Anda perlu menghapus perangkat memori konfigurasi dan menambahkannya lagi untuk menampilkan opsi untuk memprogram ulang.
Tutup HardwareManager.
Cabut kabel USB papan Arty dan colokkan lagi Program seharusnya berjalan hampir seketika saat menyala.
Bagian ini menyajikan contoh logika kombinatorial sederhana yang berinteraksi dengan sinyal pada pin I/O FPGA. Tujuan di sini adalah untuk mempersiapkan Anda dengan suite alat Vivado
tool dan untuk menunjukkan bagaimana alat digunakan untuk melakukan siklus pengembangan FPGA lengkap.
Ringkasan
Bab ini dimulai dengan diskusi tentang penggunaan efektif FPGA dalam arsitektur sistem embedded waktu nyata dan dilanjutkan dengan deskripsi perangkat FPGA standar dan komponen low-level yang terkandung di dalamnya. Rentang bahasa desain FPGA, termasuk HDL, metode diagram blok, dan bahasa pemrograman populer seperti C/C++, diperkenalkan. Garis besar proses pengembangan FPGA disajikan. Bab ini diakhiri dengan contoh lengkap siklus pengembangan FPGA, dimulai dari pernyataan kebutuhan dan berakhir dengan sistem fungsional yang diimplementasikan pada papan pengembangan FPGA berbiaya rendah.
Setelah menyelesaikan bab ini, Anda seharusnya tahu bagaimana FPGA dapat diterapkan secara efektif dalam arsitektur sistem embedded waktu nyata dan memahami komponen di dalam rangkaian terpadu FPGA. Anda telah mempelajari bahasa pemrograman yang digunakan dalam desain algoritma FPGA, langkah-langkah dalam siklus pengembangan FPGA, dan memahami urutan langkah dalam proses pengembangan FPGA.
Bab berikutnya akan memperluas proses pengembangan FPGA untuk menyediakan pendekatan lengkap untuk merancang sistem embedded waktu nyata yang mengandung FPGA. Ini juga akan memulai pengembangan prototipe sistem embedded high-performance, sebuah osiloskop digital, yang akan menjadi contoh untuk bab-bab berikutnya.
Jim Ledin adalah CEO Ledin Engineering, Inc. Jim adalah ahli dalam desain dan pengembangan perangkat lunak dan hardware embedded, serta pengujian. Ia juga terampil dalam penilaian keamanan siber sistem embedded dan pengujian penetrasi. Ia memiliki gelar S.T. di teknik aerospace dari Iowa State University dan M.S. di teknik elektro dan komputer dari Georgia Institute of Technology. Jim adalah insinyur listrik profesional terdaftar di California, Certified Information System Security Professional (CISSP), Certified Ethical Hacker (CEH), dan Certified Penetration Tester (CPT).
Konten Terkait:
Embedded design with FPGAs: Hardware resources
Embedded design with FPGAs: Implementation languages
Embedded design with FPGAs: Development process
Open-source tools help simplify FPGA programming
Implementing floating-point algorithms in FPGAs or ASICs
Leveraging FPGAs for deep learning
Software tools migrate GPU code to FPGAs for AI applications
Untuk lebih banyak Embedded, berlangganan newsletter email mingguan Embedded.