chip FPGA. Sirkuit terpadu logika yang dapat diprogram (PLI)

Saya akan memulai artikel pertama saya dengan mengatakan: Saya baru mengenal subjek artikel ini, tetapi saya memilih topik seperti itu saja. Saya akan menjelaskan alasannya. Saya sudah membaca Habr cukup lama dan saya selalu tertarik dengan topik-topik yang ada di dalamnya saat ini mempelajari apa yang dia bicarakan. Artikel-artikel seperti itu selalu dapat dimengerti, selalu menemukan pembacanya dan selalu menyampaikan kepada pembaca minat dan antusiasme penulisnya, yang biasanya tidak masuk akal bagi pemula di bidang apa pun!

FPGA (Programmable Logic Integrated Circuit) adalah salah satu jenisnya perangkat elektronik, digunakan untuk mengimplementasikan berbagai perangkat logis dengan kompleksitas yang berbeda-beda, mulai dari penghitung biner, sederhana rangkaian logika(mengganti standar sirkuit terpadu- longgar) ke prosesor dan neurochip khusus.

Kami menemukan tujuannya, pertanyaannya adalah bagaimana caranya? Di dalam FPGA terdapat elemen dasar tertentu yang dihubungkan berdasarkan catatan konfigurasi. Kemungkinan elemen dasar, jenis dan lokasi penyimpanan catatan konfigurasi bergantung pada jenis FPGA dan seterusnya model tertentu. Dalam FPGA modern ada dua jenis: CPLD dan FPGA, kami akan memberikannya masing-masing satu paragraf.

CPLD (perangkat logika kompleks yang dapat diprogram - perangkat logika kompleks yang dapat diprogram) - FPGA, elemen dasarnya adalah sel makro dan gerbang logika sederhana (AND(-NOT)/OR(-NOT)). Biasanya mengandung lebih sedikit elemen dasar dibandingkan FPGA, namun lebih cepat. Biasanya juga berisi memori konfigurasi non-volatile langsung pada chip, tetapi memiliki jumlah terbatas siklus konfigurasi.

FPGA (array gerbang yang dapat diprogram di lapangan - Array gerbang yang dapat diprogram pengguna) - FPGA, yang biasanya memiliki sejumlah jenis blok dasar, ini juga dapat disesuaikan gerbang logika(tabel kebenaran) dan blok penjumlahan-perkalian (Pemrosesan sinyal digital - DSP) dan PLL (Phase-Locked Loop) untuk membagi dan mengalikan frekuensi dan beberapa lainnya tergantung pada modelnya. Biasanya mudah berubah memori internal dan fungsionalitas untuk memuat konfigurasi dari eksternal memori non-volatil.

Anda dapat menemukan definisi yang sangat berbeda dari jenis FPGA ini dan perbedaan di antara keduanya, baik di buku maupun di Internet. Oleh karena itu, Anda tidak boleh terpaku pada perbedaan ini; produsen sendiri yang mengklasifikasikan FPGA yang mereka produksi. Jika Anda tidak ingat singkatannya atau tidak mengerti arti beberapa kata, tidak apa-apa, yang penting muncul konsep umum oh FPGA, saya harap saya mencapai ini. Sekarang untuk berlatih!

Mari kita mulai dengan membahas alat. saya akan menggunakan perlengkapan pemula pengembang Altera Cyclone II FPGA Starter Board, ini adalah papan siap pakai di mana FPGA seri Cyclone II – EP2C20F484C7N, serta berbagai periferal dan antarmuka dipasang. Pada artikel ini, kami menggunakan LED dan indikator tujuh segmen. Kami tidak akan menggunakan blok khusus apa pun dari seri FPGA ini, sehingga Anda dapat menggunakan hampir semua FPGA lainnya (FPGA dan CPLD) jika Anda mau.

Mereka yang sangat tertarik dapat membeli salah satu kit pengembangan atau merakit sendiri perangkatnya, yang cukup sulit bagi pemula, tetapi merupakan tugas yang sepenuhnya bisa dilakukan. Diagram pemrogram dan diagram koneksi untuk FPGA itu sendiri mudah ditemukan di Google, dan siapa pun yang sebelumnya pernah mengerjakan firmware AVR amatir dapat menemukan pemrogram Altera Byte Blaster yang cocok. Secara umum, saya memberi Anda implementasi rangkaian (di akhir artikel ada diagram rangkaian Papan Pemula saya). Siapa pun yang ingin mencobanya tanpa mengeluarkan uang dan melihat hasil kerjanya dapat menggunakan simulator yang ada di dalam Quartus II (pengerjaannya tidak dijelaskan dalam artikel ini).

Untuk softwarenya kita akan menggunakan Quartus II, versi gratis yang dapat Anda temukan di situs web produsen (Altera), baik dalam versi Windows maupun Linux.

Dan sekarang kita hampir berlatih! Kami meluncurkan sistem CAD Quartus II dan membuat proyek. Langkah pertama wizard adalah menunjukkan nama proyek dan lokasinya, lalu lewati langkah menambahkan file (kita punya waktu nanti). Kami akan menyelesaikan pembuatan proyek pada tahap pemilihan perangkat; jika kami melakukannya pada perangkat keras, kami tahu persis nama FPGA, dan kami memilihnya. Jika kami hanya membuat proyek untuk FPGA, kami akan memilih sesuatu yang lebih kuat, misalnya siklon ketiga. Saya memilih FPGA yang terpasang di starter kit saya.

Klik Selesai - proyek telah dibuat. Struktur proyek di Quartus bersifat hierarkis, kita perlu memilih hierarki teratas (Entitas Tingkat Atas). Untuk desainnya, kita dapat menggunakan file rangkaian dan file dengan deskripsi logika dalam salah satu HDL (Hardware Description Language). Pendapat saya adalah cara yang paling jelas adalah dengan menggunakan file sirkuit dengan blok logika utama sebagai puncak hierarki, dan mengimplementasikan blok itu sendiri dalam HDL. Pendapatnya mungkin berbeda, ketika saya memilih, saya membaca banyak topik holivar, tetapi untuk saat ini saya memilih model ini, Anda dapat menentukan pilihan. Saya memilih VHDL ((Sirkuit terpadu berkecepatan sangat tinggi) Bahasa Deskripsi Perangkat Keras) sebagai bahasa HDL untuk proyek tersebut; Anda dapat menggunakan bahasa lain, misalnya Verilog atau AHDL, semuanya tergantung pada preferensi Anda.

Buat file proyek pertama kita (File – New..) dan pilih Block Diagram/Schematic File. Sekarang mari kita menggambar skema paling sederhana, tambahkan satu Input, satu Output dan sambungkan keduanya (dalam FPGA nyata, rangkaian ini akan mengirimkan sinyal dari satu kaki ke kaki lainnya). Untuk melakukan ini, Klik Dua Kali ruang kosong diagram dan dalam dialog Simbol yang terbuka, pilih elemen yang diperlukan.

Kami terhubung begitu saja, dengan sebuah garis. Mari beri nama pin (Klik Dua Kali pada elemen), inputnya akan disebut CLOCK_27, dan outputnya akan disebut LEDR. Nama-nama tersebut tidak dipilih secara kebetulan - saya kemudian mengaitkan CLOCK_27 dengan input osilator 27Mhz, dan LEDR dengan LED merah nol. Simpan file, biarkan kotak centang tambahkan ke proyek. Sekarang mari kita atur file yang dihasilkan sebagai bagian atas hierarki proyek. Untuk melakukan ini, jendela Project Navigator, di tab File, di menu konteks dari file kita, pilih Set as Top-Level Entity. Halo, dunia sudah siap. Kita kompilasi proyeknya (Processing – Start Compilation), jika kita melihat Info: Quartus II Full Compilation berhasil. – kami bersukacita dan menganggap bahwa tahap pertama telah selesai.

Sekarang mari kita lihat tujuan kita. Perangkat kami akan mulai menghitung menit dan jam saat daya dihidupkan. Artinya kita memerlukan empat indikator tujuh segmen “HH:MM”. Untuk menghitung waktu kita memerlukan sinyal 1Hz yang kurang lebih akurat. Kita mendapatkannya dengan membagi frekuensi 27Mhz, lalu kita hitung dengan 60 (detik), lalu 60 (menit), lalu 24 (jam). Dari dua blok terakhir bilangan biner menit dan jam akan dikirim ke decoder Bin -> BCD (desimal berkode biner) -> 7seg. Secara umum, itulah keseluruhan perangkat. Saya akan segera membuat reservasi bahwa rangkaian akan asynchronous (Menit dimulai dari detik, dan jam dari menit), untuk kesederhanaan dan kejelasan.

Jadi, mari kita buat blok pertama kita - blok pembagian frekuensi. Ayo berkreasi berkas baru, seperti yang sudah kita ketahui, hanya jenis filenya saja yang berupa File VHDL. Mari tempelkan kode ke dalamnya:

Perpustakaan yaitu;
gunakan ieee.std_logic_1164.all;

Entitas Div_27Mhz_to_1Hz adalah
port(clk:dalam std_logic; clk_out:keluar std_logic);
akhir Div_27Mhz_to_1Hz;

Arsitektur div_behavior dari Div_27Mhz_to_1Hz adalah
mulai
proses (clk)
variabel cnt: rentang bilangan bulat 0 hingga 27000000;
mulai
Kemudian

Jika(cnt >= 13500000)
Kemudian
clk_out<= "1";
kalau tidak
clk_out<= "0";
berakhir jika;

Jika(cnt = 27000000)
Kemudian
tidak:= 0;
kalau tidak
tidak:= tidak + 1;
berakhir jika;

Berakhir jika;
proses akhir;
akhir div_behavior;

Saya akan melewatkan arahan layanan (Anda dapat mencarinya di buku referensi, tautan di akhir), saya hanya akan memperhatikan logika pekerjaan. Pertama kita mendeklarasikan entitas, mis. blok itu sendiri. Kami menunjukkan masukan dan keluarannya, jenis dan namanya. Tipe std_logic dalam bahasa umum berarti bit. Selanjutnya, kami menjelaskan arsitektur internal blok ini. Arsitekturnya terdiri dari proses paralel. Setiap proses memiliki daftar sensitivitasnya masing-masing, misalnya satu-satunya proses pada contoh di atas yang sensitif terhadap perubahan input clk. Anda dapat mendeklarasikan variabel untuk suatu proses, dalam contoh kita ini adalah variabel bertipe bilangan bulat dengan rentang 0 hingga 27.000.000. Selanjutnya, logika dasar diatur dalam badan proses: hingga setengah periode berlalu, kita memasukkan logika nol ke dalam outputnya, ketika setengahnya sudah lewat, kita pencet satu, dan jangan lupa menghitung dan mereset penghitung ke nol ketika sudah mencapai 27.000.000 Saya tidak berpura-pura memiliki kode yang sempurna - saya masih belajar, saya akan senang atas koreksinya :)

Kami menyimpan file dengan kode dan membuat simbol (File – Buat/Perbarui – Buat File Simbol Untuk File Saat Ini), ini diperlukan untuk memasukkan blok ini ke diagram utama kami. Anda dapat menemukan simbol Anda di folder Proyek dalam dialog sisipkan simbol. Sekarang mari kita membahas blok yang tersisa dengan lebih sedikit detail.

Perpustakaan yaitu;
gunakan ieee.std_logic_1164.all;
gunakan ieee.std_logic_unsigned.all;

Entitas cnt_0_to_59 adalah
port(clk:dalam std_logic; c59:keluar std_logic; vektor:keluar std_logic_vector(5 turun ke 0));
akhir cnt_0_to_59;

Arsitektur cnt_behavior dari cnt_0_to_59 adalah
mulai
proses (clk)
variabel cnt: rentang bilangan bulat 0 hingga 59;
mulai
if(clk"acara dan clk = "1")
Kemudian
jika(cnt = 59)
Kemudian
tidak:= 0;
c59<= "1";
vektor<= CONV_STD_LOGIC_VECTOR(cnt, 6);
kalau tidak
tidak:= tidak + 1;
c59<= "0";
vektor<= CONV_STD_LOGIC_VECTOR(cnt, 6);
berakhir jika;
berakhir jika;
proses akhir;
akhir cnt_behavior;

Ini adalah blok penghitungan dari nol hingga 59 yang kita gunakan untuk menghitung menit dan detik. Di antara fitur-fitur baru di sini adalah tipe keluaran std_logic_vector(5 hingga 0), yang mendefinisikan sekelompok bit (bit vektor), serta fungsi CONV_STD_LOGIC_VECTOR(cnt, 6), yang mengubah variabel menjadi vektor bit dari nilai yang ditentukan panjang.

Perpustakaan yaitu;
gunakan ieee.std_logic_1164.all;
gunakan ieee.std_logic_unsigned.all;

Untuk CONV_STD_LOGIC_VECTOR:
gunakan ieee.std_logic_arith.all;

Entitas cnt_0_to_23 adalah
port(clk:dalam std_logic; vektor:keluar std_logic_vector(4 hingga 0));
akhir cnt_0_to_23;

Arsitektur cnt_behavior dari cnt_0_to_23 adalah
mulai
proses (clk)
variabel cnt: rentang bilangan bulat 0 hingga 23;
mulai
if(clk"acara dan clk = "1")
Kemudian
jika(cnt = 23)
Kemudian
tidak:= 0;
vektor<= CONV_STD_LOGIC_VECTOR(cnt, 5);
kalau tidak
tidak:= tidak + 1;
vektor<= CONV_STD_LOGIC_VECTOR(cnt, 5);
berakhir jika;
berakhir jika;
proses akhir;
akhir cnt_behavior;

Di atas adalah penghitung jam. Tidak ada yang baru.

Perpustakaan yaitu;
gunakan ieee.std_logic_1164.all;
gunakan ieee.std_logic_unsigned.all;

Untuk CONV_STD_LOGIC_VECTOR:
gunakan ieee.std_logic_arith.all;

Entitas bin2bcd_5bit adalah
port(bin:di std_logic_vector(4 turun ke 0);
bcd1:keluar std_logic_vector(3 turun menjadi 0);
bcd10:keluar std_logic_vector(3 turun ke 0)
);

Akhiri bin2bcd_5bit;

Arsitektur converter_behavior dari bin2bcd_5bit adalah
mulai
proses(tempat sampah)
variabel i: rentang bilangan bulat 0 hingga 23;
variabel i1: rentang bilangan bulat 0 hingga 9;
mulai
saya:= konv_integer(bin);
i1:= saya / 10;
bcd10<= CONV_STD_LOGIC_VECTOR(i1, 4);
i1:= saya ingat 10;
bcd1<= CONV_STD_LOGIC_VECTOR(i1, 4);
proses akhir;
akhir converter_behavior;

Konverter Biner ke BCD pada dasarnya hanya membagi satu bilangan biner menjadi dua, masing-masing mewakili tempat desimal. Di antara fitur-fitur baru adalah operator rem, sisa pembagian. Konverter enam bit ditulis dengan cara yang sama, saya tidak akan memberikannya di sini.

Perpustakaan yaitu;
gunakan ieee.std_logic_1164.all;
gunakan ieee.std_logic_unsigned.all;

Entitas BCD_to_7seg adalah
pelabuhan(
BCD:di std_logic_vector(3 turun ke 0);
seg:keluar std_logic_vector(6 turun ke 0)
);

Akhiri BCD_to_7seg;

Konv_perilaku arsitektur BCD_to_7seg adalah
mulai
proses (BCD)
mulai
jika BCD = "0000" maka segmen<= "0000001";--0
elsif BCD = "0001" lalu seg<= "1001111";--1
elsif BCD = "0010" lalu seg<= "0010010";--2
elsif BCD = "0011" lalu seg<= "0000110";--3
elsif BCD = "0100" lalu seg<= "1001100";--4
elsif BCD = "0101" lalu seg<= "0100100";--5
elsif BCD = "0110" lalu seg<= "0100000";--6
elsif BCD = "0111" lalu seg<= "0001111";--7
elsif BCD = "1000" lalu seg<= "0000000";--8
elsif BCD = "1001" lalu seg<= "0000100";--9
segmen lainnya<= "1001001";--err
berakhir jika;
proses akhir;
akhir konv_perilaku;

Konverter kode satu bit ke tujuh segmen diimplementasikan dengan tabel kebenaran sederhana. Kode tujuh segmen itu sendiri merupakan representasi bit dari segmen yang terbakar pada indikator dengan urutan abcdefg, dalam kasus saya juga kebalikannya.

Altera-Cyclone dan Arduino

Inti dari pertanyaan itu. Perbedaan antara FPGA dan mikrokontroler

Setiap mikroproger pemula pada tahap tertentu perkembangannya bertanya-tanya apa perbedaan antara FPGA(dari Altera atau Xilinx) dan mikrokontroler(mikroprosesor)?

Anda membaca forum - para ahli di bidangnya menulis bahwa ini adalah hal-hal yang sangat berbeda yang tidak dapat dibandingkan, dengan alasan bahwa keduanya berbeda arsitektur. Anda membaca manual tentang Verilog atau C++ - keduanya menggunakan operator serupa dengan fungsi serupa, bahkan sintaksisnya serupa, tetapi mengapa keduanya berbeda? Anda pergi ke penjelajah Mars - ada LED (atau bahkan hanya bola lampu) yang digunakan FPGA Mereka berkedip, Anda melihat proyek di Arduino - mereka mengendalikan robot. Berhenti!

Namun sekarang mari kita berhenti dan bertanya pada diri kita sendiri: mengapa demikian FPGA- bola lampu bodoh, dan Arduino - robot pintar? Lagi pula, perangkat pertama dan kedua tampaknya merupakan perangkat yang dapat diprogram, bukan? FPGA Kemampuan robot tidak cukup?

Sampai batas tertentu, inti dari pertanyaan “Apa itu perbedaan antara FPGA dan mikrokontroler? diungkapkan secara tepat melalui contoh seperti itu.

Mari kita segera mencatatnya. Fungsional FPGA awalnya tidak kalah mikrokontroler(dan mikroprosesor juga), lebih tepatnya - fungsi utama keduanya pada dasarnya identik - untuk menghasilkan logika 0 atau 1 dalam kondisi tertentu, dan jika kita berbicara tentang kecepatan, jumlah pin (kaki ) dan kemampuan pemrosesan saluran, lalu mikrokontroler ke FPGA tetapi umumnya jauh. Tapi ada satu "tetapi". Saatnya mengembangkan algoritma perangkat lunak yang sama pada dua perangkat berbeda (FPGA dan mikrokontroler) berbeda beberapa kali, atau bahkan puluhan kali lipat. Tepat FPGA di sini dalam 99% kasus jauh lebih rendah daripada MK. Dan ini sama sekali bukan masalah kebingungan bahasa Verilog,VHDL atau AAHDL, dan di perangkat itu sendiri FPGA.

Tentang interaksi bahasa program dengan arsitektur FPGA dan mikrokontroler

FPGA: V FPGA dan tidak ada rantai otomatis yang rumit (yang melakukan sebagian pekerjaan untuk Anda). Yang ada hanya jalur kawat besi dan jalan raya, input, output, blok logis dan blok memori. Di antara jejak ada kelas khusus - jejak pencatatan jam kerja (diikat ke kaki tertentu yang melaluinya direkomendasikan untuk melakukan frekuensi jam).

Komposisi utama:

Rutenya adalah logam yang disolder ke lapisan sirkuit mikro yang menghantarkan listrik antar blok.

Blok adalah tempat tersendiri di papan, terdiri dari sel. Blok digunakan untuk menyimpan informasi, perkalian, penjumlahan dan operasi logika pada sinyal secara umum.

Sel adalah kelompok yang terdiri dari beberapa unit hingga beberapa lusin transistor.

Transistor adalah elemen utama logika TTL.

Kesimpulan (kaki sirkuit mikro) - pertukaran terjadi melaluinya FPGA dengan dunia luar. Ada kaki tujuan khusus yang dirancang untuk firmware, menerima frekuensi clock, catu daya, serta kaki, yang tujuannya ditentukan oleh pengguna dalam program. Dan, biasanya, jumlahnya lebih banyak daripada mikrokontroler.

Generator jam - chip eksternal yang menghasilkan pulsa jam yang menjadi dasar sebagian besar pekerjaan FPGA.

Arsitektur FPGA. Keterkaitan unsur-unsur penyusunnya

Jejak tersebut dihubungkan ke blok menggunakan transistor CMOS khusus. Transistor ini mampu mempertahankan keadaannya (terbuka atau tertutup) untuk jangka waktu yang lama. Keadaan transistor berubah ketika sinyal diterapkan sepanjang jalur tertentu, yang hanya digunakan ketika Pemrograman FPGA. Artinya, pada saat firmware, tegangan disuplai ke sekumpulan transistor CMOS tertentu. Set ini ditentukan oleh program firmware. Dengan demikian, pembangunan kompleks dari jaringan rute dan jalan raya yang besar terjadi di dalamnya FPGA, menghubungkan sejumlah besar blok logis satu sama lain dengan cara yang rumit. Dalam program ini, Anda menjelaskan dengan tepat algoritma apa yang perlu dijalankan, dan firmware menghubungkan elemen-elemen yang menjalankan fungsi yang Anda jelaskan dalam program. Sinyal berjalan di sepanjang jalur dari blok ke blok. Rute yang rumit ditentukan oleh program.

Arsitektur FPGA(FPGA)

Arsitektur Mikrokontroler

Dalam elemen logika TTL ini, semua operasi untuk memproses sinyal individual dilakukan secara independen dari Anda. Anda hanya menunjukkan apa yang harus dilakukan dengan kumpulan sinyal yang diterima ini atau itu dan di mana mengeluarkan sinyal yang perlu dikirim. Arsitektur mikrokontroler terdiri dari blok yang sama sekali berbeda dari FPGA. Dan hubungan antar blok dilakukan melalui jalan raya permanen (dan tidak direflash). Di antara blok MK, yang utama dapat dibedakan:

Memori hanya-baca (ROM) adalah memori tempat program Anda disimpan. Ini mencakup algoritma tindakan dan konstanta. Serta perpustakaan (kumpulan) perintah dan algoritma.

Memori akses acak (RAM) - memori yang digunakan mikrokontroler untuk penyimpanan data sementara (seperti pemicu di FPGA). Misalnya saat menghitung dalam beberapa langkah. Katakanlah Anda perlu mengalikan angka pertama yang masuk dengan angka kedua (tindakan pertama), lalu angka ketiga dengan angka keempat (tindakan ke-2) dan menjumlahkan hasilnya (tindakan ke-3). Dalam hal ini, hasil tindakan 1 akan dimasukkan ke dalam RAM selama durasi tindakan kedua, kemudian hasil tindakan 2 akan dimasukkan. Dan kedua hasil ini akan dipindahkan dari RAM untuk menghitung tindakan 3.

Prosesor adalah kalkulator mikrokontroler. Ia berkomunikasi dengan RAM, serta dengan memori permanen. Perhitungan ditukar dengan perhitungan operasional. Dari konstanta, prosesor menerima perintah yang memaksa prosesor untuk melakukan algoritma dan tindakan tertentu dengan sinyal input.

Fasilitas I/O (Port) dan Port I/O Serial - Pin mikrokontroler, dirancang untuk berinteraksi dengan dunia luar.

Timer adalah blok yang dirancang untuk menghitung jumlah siklus saat menjalankan algoritma.

Pengontrol bus adalah blok yang mengontrol pertukaran antar semua blok di dalamnya mikrokontroler. Ia memproses permintaan, mengirimkan perintah kontrol, mengatur dan menyederhanakan komunikasi di dalam kristal.

Pengontrol interupsi adalah blok yang menerima permintaan interupsi dari perangkat eksternal. Permintaan interupsi adalah sinyal dari perangkat eksternal yang menginformasikan bahwa perangkat tersebut perlu bertukar informasi mikrokontroler.

Jalan raya internal - rute yang diletakkan di dalam mikrokontroler untuk pertukaran informasi antar blok.

Generator jam - sirkuit mikro eksternal yang menghasilkan pulsa jam yang semuanya pengoperasian mikrokontroler.

Keterkaitan blok-blok komponen mikrokontroler

DI DALAM mikrokontroler, V perbedaan dari FPGA, pekerjaan berlangsung antara blok-blok di atas, yang mempunyai kompleks arsitektur, memfasilitasi proses pengembangan program. Saat mem-flash firmware, Anda hanya mengubah memori permanen, yang menjadi sandaran seluruh pekerjaan MK.

Perbedaan utama antara FPGA dan mikrokontroler

FPGA dijahit pada tingkat perangkat keras, hampir di seluruh area chip. Sinyal melewati rantai transistor yang kompleks. Mikroprosesor di-flash pada tingkat program perangkat keras, sinyal diteruskan secara berkelompok, dari blok ke blok - dari memori ke prosesor, ke RAM, dari RAM ke prosesor, dari prosesor ke port I/O, dari port I/O ke RAM, dari RAM... dan seterusnya. Kesimpulan: karena Arsitektur FPGA menang dalam kecepatan dan kemungkinan pemrosesan pipa yang lebih luas, MK menang dalam kemudahan penulisan algoritma. Karena cara yang lebih sederhana untuk mendeskripsikan program, imajinasi pengembang Mikrokontroler kurang dibatasi oleh waktu untuk debugging dan pengembangan, dan, dengan demikian, waktu untuk memprogram robot yang sama pada MK dan FPGA akan berbeda berkali-kali. Namun, robot berjalan terus FPGA akan jauh lebih cepat, lebih akurat dan tangkas.

Perangkat keras dan perangkat lunak.

DI DALAM FPGA Anda perlu melakukan semua pekerjaan sendiri, secara manual: untuk mengimplementasikan program apa pun FPGA, Anda perlu melacak setiap sinyal untuk setiap kabel yang masuk FPGA, letakkan beberapa sinyal di sel memori, pastikan bahwa pada saat yang tepat sel memori ini diakses oleh sinyal lain, yang juga Anda pantau atau bahkan hasilkan, dan sebagai hasilnya, kumpulan sinyal yang tertunda di memori mengaktifkan sinyal yang Anda perlukan, yang misalnya akan menuju ke pin output tertentu dan menyalakan LED yang terhubung dengannya. Beberapa sinyal tidak masuk ke memori, tetapi, misalnya, meluncurkan bagian tertentu dari algoritma (program). Artinya, dalam bahasa mikroproger, kaki-kaki ini dapat dialamatkan. Misalnya, di papan kami dalam program kami, kami memiliki tiga pin alamat untuk mengaktifkan algoritma tertentu yang tidak terkait (atau terkait), yang kami terapkan dalam bahasa Verilog di FPGA. Juga dalam program ini, selain tiga kaki alamat, kami juga memiliki, misalnya, 20 kaki informasi, yang melaluinya sekumpulan sinyal input (misalnya, dari sensor yang berbeda) datang dengan beberapa informasi (misalnya, suhu dari air di akuarium dari sensor suhu air di akuarium). 20 kaki = 20 bit. 3 kaki -3 bit. Ketika sinyal alamat 001 tiba (dari tiga kaki alamat), kami meluncurkan algoritma pertama, yang menulis 20 sinyal informasi ke dalam 20 sel memori (20 pemicu), kemudian kami mengalikan 20 sinyal berikutnya dengan 20 sinyal yang diterima sebelumnya, dan menulis hasilnya dari perkaliannya ke memori, lalu mengirimkannya ke kaki lainnya, misalnya, ke termostat air di akuarium. Namun kami akan mengirimkan hasil ini hanya ketika sebuah kode, misalnya 011, tiba di kaki alamat kami dan memulai algoritma pembacaan dan transmisi. Ya, tentu saja kita “mengirim”, “membaca” dan menulis sesuatu yang lain secara manual. Kami mengontrol setiap sinyal di setiap langkah pekerjaan FPGA sepanjang jalur tertentu, kita tidak akan kalah. Memproses atau merekam. Menambah atau mengalikan. Jangan lupa untuk menuliskannya. Jangan lupa untuk menerima sinyal berikutnya dan menuliskannya ke pemicu lainnya. Tambahkan juga di sini pekerjaan yang terkait dengan frekuensi jam, sinkronisasi (yang juga diterapkan secara manual), kesalahan yang tak terhindarkan pada tahap pengembangan dan debugging, dan banyak masalah lain yang tidak ada gunanya untuk dipertimbangkan dalam artikel ini. Itu sulit. Untuk waktu yang lama. Namun hasilnya bekerja super cepat, tanpa gangguan atau perlambatan. Besi!

Sekarang mikrokontroler. 20 kaki untuk menerima informasi - untuk sebagian besar mikrokontroler tugas yang mustahil secara fisik. Tapi 8 atau 16 - ya tolong! 3 yang informatif - mudah! Program? Di alamat 001, kalikan angka pertama yang diterima dengan angka kedua, di alamat 011 kirimkan hasilnya ke termostat. Semua! Cepat. Dengan mudah. Tidak bagus, tapi efisien. Jika Anda menulis program dengan sangat kompeten, tanpa gangguan atau rem. Secara terprogram!

Perangkat Keras dan Program! Itu hal yang utama perbedaan antara FPGA dan Mikrokontroler.

DI DALAM mikrokontroler Sebagian besar algoritma yang membingungkan namun sering digunakan sudah tertanam dalam chip. Anda hanya perlu memanggil perpustakaan yang diperlukan di mana algoritma ini disimpan secara terprogram, memanggilnya dengan nama dan itu akan melakukan semua pekerjaan kotor untuk Anda. Di satu sisi, ini nyaman dan membutuhkan lebih sedikit pengetahuan tentang struktur internal sirkuit mikro. Mikrik menangani pelacakan sinyal yang diterima, dihasilkan dan dihasilkan, penyimpanan, pemrosesan, dan penundaannya. Dia melakukan semuanya sendiri. Dalam sebagian besar tugas pemrograman mikro, inilah yang dibutuhkan. Namun jika Anda salah memanfaatkan semua kemudahan tersebut, maka ada kemungkinan pengoperasian yang salah. Perangkat Keras dan Program!

Kesimpulan

Pengembang prosesor dan mikroprosesor modern pada awalnya mengembangkan perangkat mereka FPGA. Ya, ya, tebakan Anda benar: pertama mereka meniru apa yang diciptakan arsitektur mikrokontroler melalui pengembangan dan firmware program FPGA, dan kemudian mengukur kecepatan eksekusi algoritma untuk susunan tertentu dari blok MC yang disimulasikan dan serangkaian fungsi tertentu untuk setiap blok secara terpisah.

Menurut karakteristik sinyal keluaran, FPGA paling sering dirancang untuk 3.3V, 20mA, Mikrokontroler pada 5V, 20mA.

Di bawah mikrokontroler AVR berhasil diimplementasikan ke dalam platform Arduino, banyak program open source telah ditulis, berbagai macam gadget telah dikembangkan dalam bentuk sensor, motor, monitor, dan segala keinginan hati Anda! Arduino sekarang lebih seperti perangkat konstruksi permainan untuk anak-anak dan orang dewasa. Namun, jangan lupa bahwa inti dari perancang ini mengendalikan “rumah pintar”, elektronik konsumen modern, peralatan, mobil, pesawat terbang, senjata, dan bahkan pesawat ruang angkasa. Tidak diragukan lagi, perangkat konstruksi seperti itu akan menjadi salah satu hadiah terbaik untuk setiap perwakilan dari separuh umat manusia yang lebih kuat.

Pada prinsipnya, semuanya sederhana!

Masih ada pertanyaan? Tulis komentar. Kami akan menjawab dan membantu Anda mengetahuinya =)


Bidang yang diunggulkan dengan Array of Programmable Gates

Kami memulai kuliah tentang apa itu logika yang dapat diprogram dan bagaimana mulai menggunakannya untuk kepentingan diri sendiri dan tetangga Anda...

FPGA- itulah sebutan INI dalam bahasa Rusia. P dapat diprogram L logis DAN integral DENGAN hemat.
Dalam bahasa borjuis kedengarannya sedikit berbeda - FPGA - F bidang P dapat diprogram G makan A sinar. Secara harfiah, ini diterjemahkan sebagai “Lapangan yang diunggulkan dengan rangkaian gerbang yang dapat diprogram.”
Untuk lebih seriusnya, kita dapat menyebutnya "Matriks Gerbang yang Dapat Diprogram"

Apa itu katup?
Benar sekali, ada kerusakan pada pipa air di ruang bawah tanah sehingga jika Anda memasangnya, seluruh rumah akan dibiarkan tanpa air. Singkatnya, itu adalah sesuatu yang bisa menutup dan membuka.

Jadi, biarlah ini menjadi wahyu bagi Anda, tetapi setiap sirkuit mikro terdiri dari gerbang. Benar, mereka tidak terlalu mirip dengan apa yang Anda dan saya miliki di ruang bawah tanah. Tapi mereka melakukan hal yang sama - mereka membuka dan menutup.

Katup Merupakan komponen dasar dari setiap sirkuit mikro digital.

Bahkan super-megaprosesor tercanggih pun terdiri dari gerbang. Ada banyak sekali, banyak sekali, hanya seluruh lautan. Secara alami, di setiap sirkuit mikro, gerbang dihubungkan dengan cara tertentu. Sebenarnya, fungsi sirkuit mikro bergantung pada cara mereka terhubung.

Dalam sirkuit mikro konvensional, diagram koneksi gerbang ditentukan selama pembuatan, dan selanjutnya tidak dapat diubah.
FPGA memungkinkan kita untuk mendefinisikan sendiri sirkuit ini dan mengubahnya sesuka kita selama “masa pakai” sirkuit mikro. Anda hanya perlu menggambar sirkuit di komputer dan menggunakan programmer untuk mem-flash-nya ke dalam chip FPGA.

Ini secara umum.

Faktanya, semuanya jauh lebih rumit :) Mari kita lihat gambarnya


Ini adalah salah satu sel makro - Macrocell dalam namanya.
Setiap chip FPGA terdiri dari sel makro berikut... sel makro. Seperti dapat dilihat dari diagram sel makro, terdiri dari blok Tabel Pencarian ( LUT) - "Tabel pencarian" dan juga, pemicu dengan input sinkron dan asinkron dan beberapa logika pada input pemicu. Sebenarnya hanya LUT yang diprogram. Seperti yang Anda lihat, ia memiliki 4 masukan dan satu keluaran. Output ini dapat diumpankan secara langsung ke output sel makro (Q0) atau ke input data sinkron dari flip-flop (D).

LUT tidak lebih dari ROM dengan 16 sel 1-bit. Ketika kombinasi sinyal digital tertentu diterapkan pada masukan LUT (D0...D3), ia menganggapnya sebagai alamat dan mengeluarkan isi sel pada alamat ini.

Secara umum, rangkaian gerbang logika apa pun yang memiliki 4 masukan (atau kurang) dan satu keluaran dapat dijelaskan dengan tabel kebenaran sebanyak 16 baris. Sebagai contoh, mari kita ambil rangkaian sederhana ini dan tuliskan tabel kebenarannya:

Tabel kebenaran menggambarkan tingkat logika keluaran rangkaian (Q) untuk semua kemungkinan kombinasi sinyal masukan (D0...D3). Dengan cara yang sama, dalam LUT, setiap kombinasi sinyal masukan (baca - setiap alamat ROM) dikaitkan dengan sinyal keluarannya sendiri. Artinya, tabel kebenaran rangkaian yang ingin kita lihat pada tempatnya digabungkan ke dalam LUT. Sesederhana itu!

Jika rangkaian berisi lebih dari 4 input atau lebih dari 1 output, LUT dari beberapa sel makro digunakan.

hapus="semua">

Namun yang terpenting adalah pemicunya. Lagi pula, seperti yang Anda ketahui (atau mungkin belum Anda ketahui), semua register, counter, dan banyak elemen teknologi digital lainnya terdiri dari trigger. Jadi, jumlah sel makro pada chip FPGA menentukan jumlah flip-flop. Dan sebaliknya :) Jadi, ketika memilih sirkuit mikro untuk proyek apa pun, Anda harus terlebih dahulu memperkirakan berapa banyak pemicu yang ada di sirkuit, dan mengambilnya dengan cadangan...

Gambar di bawah ini menunjukkan diagram blok rangkaian mikro seri EPM7000 dari Altera. Gambar ini diambil dari lembar data https://www.altera.com/literature/ds/m7000.pdf Mengacu pada rangkaian mikro EPM7032, EPM7064, EPM7096. Jadi, dua digit terakhir pada namanya menunjukkan dengan tepat jumlah sel makro di sirkuit mikro.


Seperti dapat dilihat dari diagram, sel makro digabungkan menjadi “blok array logis” (LAB - Logic Array Block).
Blok-blok ini terhubung satu sama lain melalui array interkoneksi yang dapat diprogram (PIA).
Selain itu, LAB dihubungkan ke pin sirkuit mikro melalui Blok Kontrol I/O.

Saat mem-flash, setiap blok memiliki informasinya sendiri yang dijahit ke dalamnya:
- LUT diprogram dalam Macrocells,
- PIA berisi informasi tentang interkoneksi internal,
- informasi tentang koneksi ke kaki-kaki sirkuit mikro dijahit ke dalam Blok Kontrol I/O.

Serius, "firmware" dari FPGA disebut "pemuatan konfigurasi".

Menurut Anda apa yang akan kami gunakan untuk memuat konfigurasi???
Tentu saja, dengan Byte Blaster lama yang bagus! :) Byte blaster adalah hal yang universal :) Saya berbicara secara detail tentang cara membuatnya di sini

Baru-baru ini, saya akhirnya mengambil langkah pertama saya menuju FPGA dan menelepon Anda bersama saya. Semangat fanatik saya terhadap FPGA dan gagasan bahwa FPGA adalah platform terbaik untuk membuat perangkat apa pun telah memperoleh karakter religius. Sekte FPGA saya mengkhotbahkan penolakan total terhadap mikrokontroler, dan cabang ekstremis mengkhotbahkan penolakan tidak hanya terhadap prosesor lunak, tetapi juga komputasi sekuensial secara umum!

Seperti biasa, pemahaman akan kebenaran terbantu dengan pemecahan masalah nyata. Dalam khotbah hari ini saya ingin berbicara tentang cobaan yang menimpa FPGA muda. Dengan mengatasi pencobaan, kita memahami kebenaran. Namun masih ada pertanyaan yang belum saya temukan jawabannya. Oleh karena itu, saya sangat ingin saudara-saudara dari Khabrovsk - pengemudi FPGA yang berpengalaman - mengambil bagian dalam diskusi dan memberikan bantuan kepada adik-adik mereka.

Artikel ini untuk pemula. Di dalamnya saya akan menjelaskan masalah umum, pertanyaan, kesalahpahaman, kesalahan yang mungkin muncul di awal pelatihan (karena muncul di hadapan saya). Namun, konteks artikel dibatasi oleh fakta bahwa pengembangan dilakukan pada FPGA dari Altera di lingkungan Quartus dalam bahasa Verilog.

Sulit untuk hidup tanpa melakukan apa pun, tetapi kami tidak takut akan kesulitan!

Salah satu alasan mengapa banyak orang tidak mulai mempelajari Verilog sekarang adalah kurangnya FPGA yang sebenarnya. Ada yang tidak bisa pesan karena mahal, ada pula yang karena tidak tahu mau ambil apa (soal pilihan sudah dibahas di artikel sebelumnya). Bagi sebagian orang, FPGA masih dikirimkan melalui pos.

Namun dalam perkembangan saya, saya sampai pada kesimpulan bahwa saya memerlukan FPGA nyata pada tahap akhir pengembangan, ketika saya perlu menguji proyek “dalam perangkat keras.” Intinya adalah saya menghabiskan sebagian besar waktu saya untuk men-debug kode saya menggunakan simulator.

Oleh karena itu saran saya: Ketiadaan FPGA bukan alasan untuk tidak aktif. Tulis dan debug modul FPGA di simulator!

Simulator untuk Verilog

Jadi, bagaimana cara menghibur diri sendiri selama hari kerja panjang yang membosankan (kalau memang begitu)? Tentu saja kita akan menguasai FPGA! Namun bagaimana Anda dapat menjadikan seluruh lingkungan pengembangan dari Altera berfungsi jika memerlukan batas Internet kerja 3 bulanan? Anda dapat membawanya ke dalam flash drive! Tetapi jika subjek studinya adalah Verilog, maka Anda dapat membatasi diri pada notepad, compiler IcarusVerilog, dan melihat hasilnya di GTK Wave.

Cobalah sekarang

Untuk memulai di lingkungan Windows, cukup unduh file instalasi iverilog-20130827_setup.exe (snapshot pengembangan) dari tautan http://bleyer.org/icarus/

Instalasi tidak menimbulkan kesulitan. Sekarang mari kita lompat sedikit ke depan: mari buat folder untuk proyek dan di dalamnya ada beberapa file dengan konten yang belum jelas:

File modul dengan kode untuk menguji modul - bench.v

`modul testbench skala waktu 1ns / 100 ps(); registrasi clk; awal mulai $display("mulai");<= 0; repeat (100) begin #10; clk <= 1; #10; clk <= 0; end $display("finish"); end


$dumpfile("test.vcd");

$dumpvars(0,bangku tes);

Clk


File bench.v menjelaskan modul pengujian testbench; sumber sinyal clk (gelombang persegi) dibuat di dalamnya. Modul lain akan dibuat dalam file terpisah, atau logikanya dapat diuji terlebih dahulu di modul ini dan kemudian dipindahkan ke modul terpisah. Kemudian contoh modul ini akan ditambahkan ke modul testbench, di mana kita akan menerapkan sinyal pengujian ke inputnya dan menerima hasilnya. Kita dapat membangun hierarki dari modul, saya rasa ini jelas bagi semua orang.



File BAT yang akan mengkompilasi dan mensimulasikan modul utama, menambahkan modul lain dari folder saat ini - makev.bat

iverilog -o test -I./ -y./ bench.v vvp jeda tes

Setelah menjalankan file ini, kita akan melihat di layar teks yang ditentukan dalam $display (ini adalah keluaran debugging), nilai sinyal dan register rangkaian akan ada di file test.vcd. Klik pada file tersebut dan pilih program yang akan dilihat - GTKWave (dalam kasus saya D:\iverilog\gtkwave\bin\gtkwave.exe). Beberapa klik lagi dan kita akan melihat clk kita.

Praktisnya, saya membuat setiap modul baru di notepad dan men-debug IcarusVerilog. Langkah selanjutnya setelah debugging tersebut adalah memeriksa modul di Quartus. Meskipun Quartus juga memiliki simulator sendiri, saya lebih jarang menggunakannya. Alasannya adalah kemudahan memperbarui kode dan melihat hasilnya di IcarusVerilog: simpan perubahan ke file, jalankan BAT, klik tombol "perbarui" di GTKWave - selesai! Di ModelSim, hal ini memerlukan lebih banyak gerakan, tetapi tidak buruk juga, terutama untuk struktur yang rumit ini.

Setelah simulasi, saatnya meluncurkan Quartus. Namun masih terlalu dini untuk mengunggah firmware ke FPGA. Kita perlu memastikan bahwa mesin komputasi ilahi memahami dengan benar jenis sirkuit apa yang ingin kita dapatkan dengan mengekspresikan pemikiran kita dalam bentuk Verilog.

Perbedaan antara simulasi dan bekerja pada perangkat keras nyata
Awalnya, seperti anak kucing buta, aku membenturkan kepalaku ke kusen pintu. Tampaknya kode yang benar tidak berfungsi sama sekali, atau tidak berfungsi seperti yang diharapkan. Atau tadinya hanya berfungsi, dan sekarang tiba-tiba berhenti! tidak semua desain Verilog dapat disintesis dalam perangkat keras. Hal ini disebabkan oleh fakta bahwa Verilog tidak hanya menjelaskan logika perangkat keras, yang digabungkan menjadi modul dan dijalankan di perangkat keras. Verilog yang sama menjelaskan modul pengujian yang menggabungkan modul yang diuji, memberikan sinyal pengujian ke inputnya, dan umumnya hanya ada untuk pengujian pada komputer. Perubahan nilai sinyal dari waktu ke waktu ditentukan oleh konstruksi yang mengandung tanda “#” dalam teks Verilog. Tanda ini berarti penundaan waktu. Pada contoh di atas, sinyal CLK dihasilkan dengan cara berikut. Dan saya dengan penuh dosa berpikir bahwa dengan cara yang sama, di dalam FPGA nyata, Anda dapat menghasilkan, misalnya, urutan bit untuk mengirim pesan melalui RS232. Bagaimanapun, sinyal dari generator 50 MHz disuplai ke input FPGA! Mungkin dia entah bagaimana fokus padanya. Ternyata, bukan hanya saya saja yang mengharapkan keajaiban: , , , , . Kenyataannya, seperti biasa, ternyata lebih parah: FPGA adalah sekumpulan logika dan penundaan waktu di dalamnya dapat muncul saat menggunakan penghitung, yang nilainya meningkat seiring dengan siklus clock dari generator ke nilai tertentu, atau dengan cara lain (tetapi selalu dalam perangkat keras).
Daftar keanehan yang ditemukan
Namun hal yang menakjubkan, membaca buku menyoroti kejahatan ini. Selain itu, rahmat diperoleh.
Jika Anda menetapkannya sebagai reg, maka itu bukanlah fakta bahwa itu akan dibuat
Bagaimana saya sampai pada masalahnya? Katakanlah ada satu modul, yang inputnya saya harus memberikan nilai (berdasarkan tipe parameter). Di masa depan, parameter ini harus berubah seiring waktu tergantung pada beberapa peristiwa eksternal. Oleh karena itu, nilainya harus disimpan dalam register (reg). Namun implementasi penerimaan event eksternal belum dilaksanakan, jadi saya tidak mengubah registernya, melainkan hanya mengaturnya ke nilai awalnya, yang tidak akan berubah di kemudian hari.

//atur register reg val 8-bit; //mulai dengan nilai val awal<= 8"d0240; //wire к которому подключим выход из модуля wire out_data; //неведомый модуль, называется bbox //экземпляр этого модуля называется bb_01 //будем считать, что в модуле есть входной порт in_data и выходной out_data //во входной порт подаем значение с регистра val, а выход подключаем к wire - out_data bbox bb_01(.in_data(val), .out_data(out_data));
Tampaknya ada tangkapan? Dalam bahasa imperatif, kita sering menetapkan variabel sebagai konstanta dan kemudian tidak pernah mengubahnya dan semuanya berfungsi. Apa yang kita lihat pada besi?


Pertama, kami tidak melihat registernya. Kedua, 8"hFF disuplai ke input modul, bukan 8"d0240 kami! Dan ini sudah cukup untuk membuat skema tidak berjalan sesuai rencana. Fakta bahwa tidak ada register adalah normal. Di Verilog, Anda dapat mendeskripsikan logika dengan berbagai cara, sekaligus synthesizer selalu mengoptimalkan implementasi perangkat keras. Sekalipun Anda menulis blok selalu dan bekerja dengan register di dalamnya, tetapi nilai keluaran akan selalu ditentukan oleh nilai masukan, maka penggunaan register di sini tidak diperlukan dan synthesizer tidak akan menyediakannya. Dan sebaliknya, jika untuk beberapa nilai data masukan nilai keluaran tidak berubah, maka tidak ada cara untuk melakukannya tanpa register kait dan synthesizer akan membuatnya. (Buku 1 hal. 88-89). Apa yang berikut ini? Jika kita mulai mengubah nilai register, misalnya tergantung pada penekanan tombol, maka register sudah dibuat dan semuanya akan berfungsi sebagaimana mestinya. Jika ternyata tombol-tombolnya tidak mengubah apa pun, maka synthesizer akan membuangnya lagi dan semuanya akan rusak lagi. Apa yang harus dilakukan dengan konstanta? Anda perlu menerapkannya langsung ke input modul:

Bbox bb_01(.in_data(8"d0240), .out_data(out_data));
Sekarang kita memiliki nilai yang benar pada input modul:

Masih menjadi misteri mengapa, ketika mereduksi sebuah register, nilainya di awal tidak disubstitusikan ke dalam input modul.

Lebih baik mengatur sendiri ukuran kawatnya.
Saat mengembangkan di lingkungan Quartus, dimungkinkan untuk tidak menentukan jalur kabel terlebih dahulu. Dalam hal ini, mereka akan dibuat secara otomatis, tetapi peringatan akan dikeluarkan tentang hal ini. Masalahnya adalah lebar kabel akan 1-bit, dan jika port lebih besar dari 1-bit, nilainya tidak akan dikirimkan.

Bbox bb_01(.in_data(8"d0240), .out_data(int_data)); other_bbox bb_02(.in_data(int_data), .out_data(out_data));
Peringatan
Peringatan (10236): Peringatan Net Implisit Verilog HDL di test.v(15): membuat net implisit untuk "int_data"
Hasil:

Seperti yang Anda lihat, satu bit terhubung, dan 7 bit sisanya tidak terhubung (NC). Untuk menghindari masalah ini, Anda perlu membuat sendiri kabelnya. Bukan tanpa alasan kompiler IcarusVerilog tidak menghasilkan peringatan, tetapi kesalahan jika kabel tidak ditentukan sebelumnya.

Kawat int_data; bbox bb_01(.in_data(8"d0240), .out_data(int_data)); other_bbox bb_02(.in_data(int_data), .out_data(out_data));

Komputer tidak akan menelusuri modul untuk melihat kapasitas port. Selain itu, kedalaman bit mungkin berbeda, dan tidak semua bit diambil dari input atau output modul, tetapi beberapa bit tertentu.

Anda tidak dapat menggunakan keluaran fungsi logika sebagai sinyal jam
Terkadang sebuah proyek memerlukan pengurangan frekuensi jam atau memperkenalkan penundaan waktu sebesar N siklus jam. Seorang pemula dapat menggunakan pencacah dan rangkaian tambahan untuk menentukan apakah pencacah telah mencapai nilai tertentu (rangkaian perbandingan). Namun, jika Anda langsung menggunakan keluaran dari rangkaian perbandingan sebagai jam, masalah mungkin timbul. Hal ini karena rangkaian logika membutuhkan waktu untuk menghasilkan nilai keluaran yang stabil. Penundaan ini menggeser bagian depan sinyal yang melewati berbagai bagian rangkaian logika relatif terhadap jam, sehingga menghasilkan balapan, metastabilitas, dan asinkron. Saya bahkan pernah mendengar komentar tentang hal ini sebagai kritik terhadap FPGA: "dengan FPGA selalu ada masalah - sinyal tidak stabil."

Jika Anda membaca setidaknya beberapa artikel:
Memicu metastabilitas dan sinkronisasi jam ke jam
Beberapa kata tentang jaringan pipa di FPGA

Kemudian menjadi jelas bagaimana perangkat FPGA dikembangkan: seluruh tugas dibagi menjadi blok-blok perangkat keras, dan data di antara mereka bergerak sepanjang konveyor, secara serempak melekat pada register berdasarkan sinyal clock. Jadi, dengan mengetahui frekuensi clock umum, synthesizer menghitung frekuensi operasi maksimum semua rangkaian kombinatorial, menentukan apakah kecepatannya sesuai dengan periode jam, dan menyimpulkan apakah rangkaian di FPGA akan berfungsi atau tidak. Semua ini terjadi pada tahap sintesis. Jika sirkuit sesuai dengan parameter, maka Anda dapat mem-flash FPGA.

Dengan demikian, semua metodologi yang diperlukan telah dibuat untuk pengembang perangkat berbasis FPGA, dan jika Anda mematuhinya, tidak akan ada masalah.

Bagaimana jika saya ingin melawan sistem?
Urutan pengembangan dan perilaku synthesizer sirkuit membawa kita pada kesimpulan tentang apa itu FPGA pada tingkat perangkat keras. Ini adalah sirkuit sinkron. Oleh karena itu, salah satu tujuan synthesizer adalah memenuhi interval waktu. Untuk melakukan ini, ia, misalnya, menyederhanakan ekspresi logika, menghilangkan bagian sintesis dari rangkaian yang tidak digunakan oleh rangkaian lain dan tidak terikat dengan keluaran fisik FPGA. Solusi asinkron dan trik analog tidak diterima, karena pengoperasiannya tidak dapat diprediksi dan bergantung pada apa pun (tegangan, suhu, proses teknis, batch, pembangkitan FPGA), dan oleh karena itu tidak memberikan hasil yang terjamin, dapat diulang, dan dapat ditransfer. Namun setiap orang membutuhkan hasil yang stabil dan pendekatan desain yang umum!

Tetapi apa yang harus dilakukan jika Anda tidak setuju dengan pendapat synthesizer bahwa Anda perlu membuang register yang tidak dapat diubah dan memperpendek rangkaian logika? Bagaimana jika Anda ingin membuat rangkaian dengan logika asynchronous? Butuh penyesuaian yang bagus? Atau mungkin Anda sendiri ingin merakit rangkaian menggunakan komponen FPGA level rendah? Mudah! Terima kasih kepada pengembang Altera atas kesempatan ini dan dokumentasi mendetailnya!

Bagaimana cara melakukan ini? Anda dapat mencoba editor sirkuit grafis. Anda mungkin pernah mendengar bahwa Quartus memungkinkan Anda menggambar diagram? Anda dapat memilih sendiri blok standar dan menghubungkannya. Tapi ini bukanlah solusi! Bahkan sirkuit yang ditarik akan dioptimalkan oleh synthesizer, jika memungkinkan.

Hasilnya, kita sampai pada kebenaran lama: jika semuanya gagal, baca instruksinya. Yaitu Buku Pegangan Altera bagian yang disebut "Opsi Sintesis Quartus II".

Mari kita mulai dengan fakta bahwa dengan mendeskripsikan arsitektur di Verilog dengan cara tertentu, Anda bisa mendapatkan hasil tertentu. Berikut adalah contoh kode untuk mendapatkan pemicu RS sinkron dan asinkron:

//modul modul pemicu RS sinkron rs(clk, r, s, q); kabel masukan clk, r,s; keluaran reg q; selalu @(pose clk) mulai jika (r) mulai q<= 0; end else if (s) begin q <= 1; end end endmodule
Dalam hal ini, Anda mendapatkan pemicu sinkron.

Jika Anda mengabaikan sinyal jam dan beralih tergantung pada perubahan apa pun dalam r dan s, hasilnya adalah elemen dengan nilai set asinkron - sebuah kait.

//contoh modul pemicu RS asinkron ModuleTester(clk, r, s, q); kabel masukan clk, r,s; keluaran reg q; selalu @(r atau s) mulai jika (r) mulai q<= 0; end else if (s) begin q <= 1; end end endmodule

Modul ModuleTester(clk, r, s, q); kabel masukan clk, r,s; keluaran reg q; DLATCH lt(.q(q), .clrn(~r), .prn(~s)); modul akhir

Akibatnya, semua "body kit" pada input latch, yang dianggap perlu oleh synthesizer, akan hilang dan kita akan mendapatkan apa yang kita inginkan:

Daftar primitif yang ada dapat ditemukan di situs Altera.

Dan sekarang contoh kecil tentang asinkroni dan reduksi. Saya memutuskan, misalnya, untuk membuat generator dengan prinsip yang sama seperti yang biasa dilakukan sebelumnya, tetapi hanya pada FPGA:

Tetapi untuk menambah periode, saya akan mengambil 4 elemen, tetapi hanya satu yang memiliki inversi:

Modul ModulPenguji(q); keluaran kawat q; kawat a,b,c,d; tetapkan a = b; tetapkan b = c; tetapkan c = d; tetapkan d = ~a; tetapkan q = a; modul akhir

Namun hasilnya adalah pengurangan (1 elemen, bukan empat). Itu logis. Tapi kami merencanakan jalur penundaan.

Namun jika kita menetapkan syarat pada synthesizer bahwa baris a, b, c, d tidak boleh diperpendek, maka kita akan mendapatkan apa yang kita inginkan. Arahan digunakan untuk memberikan petunjuk kepada synthesizer. Salah satu cara untuk menunjukkan hal ini adalah melalui teks dalam komentar:

Modul ModulPenguji(q); keluaran kawat q; kawat a,b,c,d /* penyimpanan sintesis */; // ^^^--- ini adalah arahan untuk penugasan synthesizer a = b; tetapkan b = c; tetapkan c = d; tetapkan d = ~a; tetapkan q = a; modul akhir
Dan inilah hasilnya - rangkaian empat elemen:

Dan bukan itu saja! Saya akan menyerahkannya pada kesenangan belajar mandiri: bekerja dengan sebuah kasus dan arahan untuk mengimplementasikannya sebagai RAM/ROM atau sirkuit logis; bekerja dengan blok memori internal (RAM/ROM); pilihan implementasi perkalian - pengganda perangkat keras atau rangkaian logika.

  • Pemrograman mikrokontroler
  • Apakah Anda menunggu tanda? Ini dia!

    Selama bertahun-tahun saya ragu untuk memulai pemrograman FPGA karena sulit, mahal dan menyakitkan (menurut saya). Namun ada baiknya jika Anda memiliki teman yang membantu Anda mengambil langkah pertama. Dan sekarang saya tidak mengerti satu hal - MENGAPA SAYA MENUNGGU SANGAT LAMA?

    Sekarang saya akan membantu Anda mengambil langkah pertama juga!

    Mengapa saya membutuhkannya?

    Apakah Anda lelah terus-menerus membaca dokumen di MK Anda atau menyimpan banyak informasi di kepala Anda. Anda menulis ulang semuanya dalam asm, tetapi kecepatannya masih belum cukup. Anda menghubungkan dua perangkat eksternal ke MK Anda, Anda menghubungkan perangkat ketiga, tetapi Anda kehabisan interupsi, modul-modul yang sudah berfungsi berhenti bekerja. Anda mengambil MK lain, yang lebih kuat dari baris yang sama, tetapi sekali lagi manual, register bendera, bit... sial. Anda mengubah platform: Anda beralih ke MK lain dan membuang pengetahuan Anda tentang platform sebelumnya. Apa pun yang Anda lakukan, itu sulit. Anda menemukan platform populer di mana Anda dapat dengan mudah merakit proyek dari komponen, tetapi Anda masih tidak dapat melampaui batasan perangkat keras MK ini... Di suatu tempat di tepi kesadaran Anda terkadang muncul pemikiran bahwa pada FPGA ini pasti akan bekerja dengan cepat dan paralel, apa ini "masalah sebenarnya yang perlu diselesaikan tolong", tapi saya terlalu tua/bodoh/sibuk/dll untuk bisa/mulai melakukan ini.

    Apakah Anda akhirnya ingin bernapas lega? Ayo lanjutkan!

    Kegembiraan mengembangkan FPGA

    Saya mengalami hari yang berat di tempat kerja. Dari satu pekerjaan saya datang ke pekerjaan kedua, lalu ke dacha, pekerjaan rumah, pekerjaan rumah di malam hari, lalu film keluarga, dan baru pada jam 11 malam saya benar-benar bebas! Mengatakan bahwa saya lelah berarti tidak mengatakan apa-apa. Namun dalam keadaan ini, saya duduk di depan laptop dengan tujuan yang kuat: membuat generator gelombang persegi 440 Hz. 20 menit berlalu dan saya sudah bisa mendengarnya di headphone saya. Aku tidak bisa mempercayai telingaku! Saya memerlukan waktu 15 menit lagi untuk membuat PWM dan mengubah volume. Saat itu, saya baru memiliki papan FPGA selama sekitar satu minggu, dan sebelumnya saya hanya membaca beberapa buku tentang Verilog.

    Malam itu saya menyadari: INILAH! Ini adalah platform di mana saya dapat dengan cepat dan mudah mengubah pemikiran saya menjadi perangkat keras yang benar-benar berfungsi!

    Mengapa demikian?

    Saya akan menjelaskan kelebihan yang ada dalam mempelajari dan menggunakan FPGA, walaupun semua orang sudah mengetahuinya:
    • Universalitas pengetahuan- saat mengganti model MK, Anda perlu membaca dokumentasi. Saat mengganti pabrikan MK, Anda perlu membaca dokumentasinya. Anda harus terus-menerus membaca dokumen, terus-menerus menyimpan banyak informasi di kepala Anda. Saat mengembangkan FPGA, jika Anda mengetahui Verilog atau VHDL, maka Anda tidak hanya dapat memprogram FPGA apa pun dari lini satu pabrikan, tetapi juga, jika Anda mau, beralih ke pabrikan lain (Altera, Xilinx). Meskipun akan ada saat-saat ketika menguasai lingkungan pengembangan yang berbeda dan masalah perangkat keras yang tidak kentara, inti dari pendekatan merancang perangkat dalam HDL tidak akan berubah dari ini.
    • Dari ide hingga perangkat keras- saat mengembangkan sebuah proyek, jika Anda kekurangan satu mikrokontroler, Anda harus memilih yang lain. Pada prinsipnya, Anda dapat membuat asumsi apakah MK ini akan mampu menangani proyek tersebut atau tidak. Atau ada MK tertentu dan Anda mencoba memasukkan proyek ke dalamnya. Hal ini paling sering terjadi. Ini sedikit mengingatkan saya pada pendekatan kakek saya, yang membuat tangga dari apa yang ada di dalam gudang. Meskipun Anda bisa mendesain tangga, belilah papan yang sesuai... Dari ide hingga perangkat keras, dan bukan sebaliknya.
    • Kemudahan penggunaan pengembangan orang lain- Anda dapat mengambil modul orang lain dan menerapkannya dalam proyek Anda. Dari kode tersebut Anda dapat memahami cara kerjanya. Meskipun itu untuk Xilinx, dan Anda melakukannya di bawah altera. Terkadang hal ini tidak berjalan dengan baik, namun lebih mudah daripada, misalnya, menambahkan pustaka biner ke proyek C++/Qt
    • Blokir independensi. Blok dalam HDL seperti fungsi murni dalam bahasa. Mereka hanya bergantung pada sinyal masukan. Modul yang dikembangkan dan di-debug akan terus berfungsi dengan benar, tidak peduli bagaimana proyek berkembang. Tidak ada sesuatu pun dari luar yang akan mempengaruhi pengoperasian yang benar dari dalam. Dan secara umum, Anda bisa melupakan cara kerjanya - ini adalah kotak hitam. Ditambah lagi, bloknya berfungsi paralel.

    Masalah pilihan

    Ada banyak pertanyaan tentang apa yang harus dipilih: Altera/Xilinx, Verilog/VHDL, papan debug apa yang harus digunakan. Tapi hal pertama yang pertama.

    Pabrikan

    saya memilih mengubah. Mengapa? Nah, begitulah saya dan teman saya memutuskan, meskipun nama Xilinx lebih indah bagi saya. TETAPI. Jika kamu tidak dapat memilih sekarang, maka aku akan melakukannya untukmu. Anda membutuhkan Altera! Mengapa? Aku tidak tahu. Hal terpenting saat ini adalah mengambil langkah: menentukan pilihan. Saya memilih Altera dan sejauh ini tidak menyesal.



    Bahasa

    Mari kita ambil Verilog - Karena... baiklah, Anda mengerti maksudnya.

    Papan pengembangan

    Memilih papan pengembangan memakan waktu paling lama. Jelas bahwa papan berbeda dalam chip FPGA yang dipasang. Dan chip FPGA berbeda satu sama lain dalam jumlah elemen. Namun sama sekali tidak jelas berapa banyak yang diperlukan untuk proyek pengujian Anda. Oleh karena itu, saya menghabiskan sebagian besar waktu saya mencari semua jenis proyek FPGA untuk mengetahui seberapa banyak proyek tersebut mengonsumsi sumber daya FPGA.

    Di keluarga Altera, dengan harga terjangkau kita dapat membeli papan dengan CPLD MAX II dengan elemen 240, 570 dan 1270, atau chip FPGA lama seperti Cyclone 1, 2, 3, 4 dengan hingga 10.000 sel atau lebih. Bagaimana cara memilih?

    Bahkan berdasarkan 240 sel, proyek Mars Rover hanya mengerjakan sejumlah besar proyek. Saya sangat menyarankan Anda membacanya untuk mendapatkan gambaran kasar tentang kompleksitas proyek yang dapat ditampung dalam 240 sel. Di sisi lain, ada proyek yang sepenuhnya diprogram untuk salinan perangkat keras PC tertentu, termasuk prosesor dan semua logika di sekitarnya (NES, Speccy, Orion, YuT-88, dll). Ini sudah membutuhkan lima, sepuluh ribu sel atau lebih. Ditambah lagi, papan ini berisi perangkat eksternal tambahan.

    Oleh karena itu, saya menyarankan untuk mengambil antara 240 dan 10.000 sel, dengan preferensi untuk sel yang lebih besar tergantung pada dana yang tersedia. Di papan debug, sel tambahan bukanlah masalah besar, tetapi jika jumlahnya tidak cukup, Anda tidak dapat melakukan apa pun. Kemudian, ketika perangkat di-debug, akan menjadi jelas berapa banyak sel yang dibutuhkan, beli dalam jumlah yang dibutuhkan, tanpa “body kit” yang tidak perlu, lebih murah dan biarkan di perangkat yang sudah jadi.

    Yang membedakan MAX dengan Cyclones selain jumlah selnya adalah:
    1) Seri MAX tidak memiliki PLL di dalamnya. Setiap papan pengembangan memiliki osilator, biasanya 50 MHz. Ini akan cukup untuk sebagian besar proyek. Semua sinkronisasi akan terjadi dengan membagi 50 MHz dengan nilai tertentu. Atau, Anda dapat mengambil generator eksternal dan memasukkannya ke input FPGA terpisah. Bagaimana jika Anda membutuhkan frekuensi lebih tinggi dari 50 MHz? Saya tidak dapat segera menemukan osilator di atas 50 MHz. Namun di sinilah PLL, yang dibangun dalam Cyclones, hadir untuk menyelamatkan. Di atasnya Anda dapat mengalikan frekuensi, misalnya hingga 100 MHz.
    2) Seri Cyclone memiliki unit perkalian perangkat keras bawaan. Jumlahnya tergantung pada model spesifik - di sini Anda masih dapat "melihat instruksi" untuk mengetahui jumlahnya. Jika Anda berencana membuat semacam DSP, maka itu akan berguna: mereka akan menghemat sel dan meningkatkan kecepatan. Di sisi lain, jika tidak ada pengganda, mereka dapat disintesis, namun FPGA kecil mungkin tidak memiliki sumber daya yang cukup untuk ini.

    Dalam semua hal lainnya, saya memiliki kriteria “cocok/tidak cocok”. Melakukan debug pada papan yang jelas lebih besar dari yang dibutuhkan, diikuti dengan mengisinya dengan jumlah minimum yang diperlukan untuk ini.

    Berapa banyak uang yang Anda butuhkan?


    Programmer
    Saya yakin saya tidak punya waktu untuk menyolder programmer secara massal.

    300 rubel. Saya mendapatkan milik saya di eBay, tampilannya seperti ini:

    Papan pengembangan
    Pilihannya luas, tergantung jumlah uangnya.

    Tingkat masuk 350 - 550 rubel. Ini adalah papan berdasarkan MAX II (atau sel). Mungkin cocok untuk pengenalan awal dan integrasi lebih lanjut ke perangkat akhir. Papan memiliki generator, beberapa tombol, beberapa LED, dan 80 pin sisanya sesuai kebijaksanaan Anda.

    satuan daya
    Itu harus dimiliki, tetapi tidak selalu disertakan. Anda membutuhkan catu daya 5 volt dan arus 2A.

    Tingkat menengah dari 900 hingga 1500 rubel. Ini adalah papan Topan 1, 2, 3, 4, berbeda terutama dalam jumlah sel.
    Mereka ditandai seperti ini:
    E.P. 2 C 5 T144 - Topan 2 sekitar 5k sel
    E.P. 4 M.E. 6 E22C8N - Topan 4 sekitar 6k sel
    E.P. 2 C 8 Q208C8N - Topan 2 sekitar 8k sel

    Anda mungkin memperhatikan bahwa Topan 3 mungkin memiliki lebih banyak sel daripada Topan 4.

    Berikut beberapa opsi:

    835 rubel.
    ALTERA FPGA CycloneII EP2C5T144 Papan Sistem Minimum untuk Belajar dengan baik

    880 rubel
    Altera CycloneII EP2C5T144 FPGA Mini Pengembangan Pelajari Papan Inti E081

    1265 rubel
    EP2C8 EP2C8Q208C8N ALTERA Cyclone II FPGA Papan Inti Pengembangan Evaluasi

    Papan tingkat lanjut . Ini adalah papan tempat modul tambahan (UTP, USB, AUDIO), konektor (SD, VGA), tombol, sakelar, LED, indikator tujuh segmen, dll. dipasang. Atau mungkin ada papan dasar, dan kartu ekspansi dapat dipasang secara terpisah.

    Saya memiliki set papan kerja + papan ekspansi berikut:
    Altrea EP4CE10E22 Papan Inti FPGA + Papan Perangkat USB/Suara/Ethernet/Kartu SD/VGA
    2760 rubel

    Ini papan utamanya. Ini memiliki 2 LED, 2 tombol, 4 sakelar, indikator tujuh segmen dan chip RAM.

    Papan ekspansi. Ini berisi SD, VGA, serta pengontrol USB (Chip USB2.0 Kecepatan Tinggi: CY7C68013A), AUDIO (Kartu Suara hingga 96kHz/32bit ADC/DAC: WM8731S), UTP (antarmuka Ethernet 100M: DM9000A):

    Papan-papan ini cukup disisipkan satu sama lain, tapi saya masih menyimpannya di laci. Untuk kerajinan saya, saya memiliki papan tempat memotong roti, yang saya sambungkan dengan kabel yang disertakan dengan kit. Catu daya 5 volt juga disertakan.

    • Sergei Savenkov

      semacam ulasan "pendek"... seolah-olah mereka sedang terburu-buru di suatu tempat