Bermula dengan FPGAs: Lookup Tables and Flip-Flops

World's Best School Lunch ★ ONLY in JAPAN (Julai 2019).

$config[ads_text] not found
Anonim

Bermula dengan FPGAs: Lookup Tables and Flip-Flops


Hanya apa yang membuat FPGA begitu berbeza dari mikropengawal dan lagi begitu serba boleh? Artikel ini meneruskan penerokaan FPGAs, memfokuskan pada peranan flip-flop dan jadual carian (LUTs) dalam blok logik.

Blok bangunan asas di dalam FPGA adalah flip-flop dan jadual carian (LUT). Ini digabungkan untuk membentuk apa yang disebut sebagai blok logik. Blok logik bersambung ke satu sama lain, dan dunia luar, melalui interconnects diprogramkan. Flip-flop beroperasi lebih kurang seperti mana-mana flip-flop yang anda mungkin telah tersandung selama bertahun-tahun. Sebaliknya, LUTs tidak semestinya sebagai konsep universal.

maklumat sokongan

  • Gambaran Keseluruhan Keluarga Xilinx Spartan-6

Artikel Sebelumnya dalam Siri ini

  • Pandangan Pertama Penggemar Microcontroller di Logic Programmable
  • Bermula dengan FPGAs: Persekitaran Pembangunan dan "Hello World"

FPGA Internals

Sebelum saya memahami apa-apa tentang kerja dalaman FPGA, saya tertanya-tanya bagaimana peranti boleh dimuatkan dengan semua pintu rawak yang diperlukan untuk membuat peranti logik yang berfungsi. Itulah soalan yang munasabah untuk bertanya, tetapi saya sepatutnya memikirkan jadual carian. Saya telah menggunakannya dalam tetapan lain, saya sendiri.

Jika anda melihat lembaran kerja untuk pintu masuk logik, anda akan dapati jadual kebenaran. Ia cukup mudah. Letakkan kombinasi yang spesifik dari satu dan nol pada baris input, dan sama ada satu atau satu sifar keluar hujung yang lain.

Dalam LUT, bagaimanapun, anda benar-benar menukar alamat pada bank RAM satu-bit luas. Terdapat masa yang ringkas apabila bit input LUT berubah-alamat RAM sedang berubah-apabila RAM berkesan tidak tahu apa yang perlu diletakkan pada output. Jika, dalam tempoh ketidakpastian itu, output LUT berbeza daripada output yang dimaksudkan, kita menyebutnya sebagai gangguan.

Dengan cip logik diskret, anda boleh melakukan operasi secara asynchronously: hanya melakukan sesuatu pada input dan perubahan akan menyebarkan semua jalan melalui set logik anda. Walau bagaimanapun, dengan LUT, output yang anda inginkan mungkin tidak tepat sehingga tempoh glitch diluluskan.

Glitches tidak menjadi masalah dalam contoh hari ini, tetapi ia baik untuk bermula dengan beberapa kesedaran. Berurusan dengan mereka akan dibincangkan dalam artikel kemudian dalam siri ini.

Kembali ke Lembaga Pembangunan

Dalam ansuran terakhir saya, saya memilih papan pengembangan, memasang persekitaran pembangunan, dan mensintesis dan memuatkan "FPGA konfigurasi LED" Hello World "yang mudah. Dalam artikel ini, saya akan meneroka sedikit konfigurasi seperti apa di bawah hud, dan meneruskan jalan untuk menjelaskan perbezaan antara mikrokontroler dan FPGA.

Tetapi pertama, saya akan menambah sedikit perkakasan untuk membantu menggambarkan apa yang sedang berlaku. Saya memerlukan satu suis pushbutton dan empat LED (lima jika anda menyertakan LED1 onboard). Tombol tekan akan digunakan untuk membolehkan pengiraan, dan LED akan memaparkan output dari bahagian daftar.

Ditunjukkan adalah Papilio Pro saya dengan sayap butang / LED. Saya menggunakan empat LED, tetapi hanya satu butang push.

Anda boleh mengulangi langkah-langkah dalam ansuran terdahulu untuk membuat projek baru, tetapi gunakan nama "RegisterCounting" sebagai nama projek dan fail bukan "HelloWorld."

UCF dan Pelabuhan

Kod lengkap, baru, UCF berikut:

 NET clk_in LOC = P94 | IOSTANDARD=LVTTL | PERIOD=31.25ns; NET reset LOC = P121 | IOSTANDARD=LVTTL | PULLDOWN; NET ExtLEDs LOC = P112 | IOSTANDARD=LVTTL | DRIVE = 8 | SLEW = SLOW ; NET ExtLEDs LOC = P120 | IOSTANDARD=LVTTL | DRIVE = 8 | SLEW = SLOW ; NET ExtLEDs LOC = P118 | IOSTANDARD=LVTTL | DRIVE = 8 | SLEW = SLOW ; NET ExtLEDs LOC = P116 | IOSTANDARD=LVTTL | DRIVE = 8 | SLEW = SLOW ; NET ExtLEDs LOC = P114 | IOSTANDARD=LVTTL | DRIVE = 8 | SLEW = SLOW ; 

Baris pertama UCF tidak berubah dari versi terdahulu saya. Ia mewujudkan label untuk isyarat jam yang memasuki cip pada pin P94.

Selepas itu, saya telah membuat label "reset" untuk nombor 1 pada sayap. Butang 1 disambungkan kepada pin cip P121. Ia tidak ditetapkan sebagai input atau output di UCF. Itu berlaku dalam seksyen pengisytiharan modul kod Verilog, yang akan anda lihat tidak lama lagi. Parameter pada akhir garisannya, "PULLDOWN", adalah deskriptif yang tepat-perintang takat akan disambungkan ke pin P121.

Bahagian seterusnya menggambarkan salah satu konsep utama yang boleh menjadi masalah bagi mereka yang biasa bekerja dengan mikrokontroler. "ExtLEDs" kelihatan seperti array yang agak konvensional, tetapi tidak.

Di UCF, kami melabelkan sambungan (interconnects diprogramkan) ke pin cip yang menyambung ke dunia luar. BERSIH "ExtLEDs" lebih mirip dengan satu set wayar isyarat yang datang dari port I / O mikrokontroler daripada array. Kod untuk memasukkan data ke ExtLEDs, atau untuk mengakses setiap individu, kelihatan serupa dengan yang digunakan untuk memanipulasi pelbagai perisian. Walau bagaimanapun, setiap anggota ExtLED hanya mewakili wayar isyarat yang akan digunakan sebagai sambungan kepada bit tertentu dalam daftar. Dalam terminologi FPGA, setiap ahli yang kami merujuk kepada UCF betul disebut isyarat. ExtLEDs adalah satu set lima isyarat yang boleh dirujuk sebagai satu kumpulan.

Anda mungkin dapati bahawa P112 adalah pin cip yang sama seperti LED papan atas yang kami gunakan dalam artikel sebelumnya. Ia adalah. Dengan ExtLEDs, kami hanya menetapkan satu set isyarat, dan kami memberikan label kepada mereka. Tidak perlu pin menjadi berurutan atau berdekatan dengan fizikal. Palam cip yang lain yang berkaitan dengan ExtLEDs adalah wayar untuk pin pada penyambung I / O, yang menyambungkan ke LED pada butang / sayap LED yang telah saya pasang.

Verilog yang Diperluas

Kod Verilog berikut:

 `timescale 1ns / 1ps module RegisterCounting( input wire reset, input wire clk_in, output wire (4:0) ExtLEDs ); reg (25:0) freq_div; // 26-bit register that I will be using as the frequency dividing counter assign ExtLEDs(4:0) = freq_div(25:21); // connects the 4 led outputs to register bits at 25, 24, 23, and 22 always @(posedge clk_in) begin // Clocked on the rising clock edge if(reset) // Restart the counter at 0, if the button is pressed freq_div <= 0; else freq_div <= freq_div + 1'b1; // Increment the register by 1 end endmodule 

Dalam perisytiharan modul, reset dan clk_in ditakrifkan sebagai input. Isyarat lima bit "ExtLEDs" diisytiharkan sebagai output.

Saya telah memperluaskan daftar "freq_div" kepada 26 bit (dalam artikel sebelumnya yang ditakrifkan dengan 21: 0, iaitu 22 bit lebar). Lampu LED di atas masih menunjukkan nilai dalam bit 21 dari daftar, dan empat LED pada sayap Papilio saya menunjukkan nilai dalam bit 22:25. Setiap bit akan berkelip pada setengah kekerapan bit sebelumnya.

Dalam pernyataan seterusnya, "tetapkan ExtLEDs (4: 0) = freq_div (25:21);", lima isyarat (4: 0) dari "ExtLEDs" disambungkan kepada lima bit (25:21) "freq_div."

Sebab itu untuk berjaga-jaga lain. Jika anda berfikir dalam istilah kod MCU, anda mungkin mentafsirkan tugasan itu sebagai berlaku apabila baris kod itu dilaksanakan. Itu tidak betul. Kenyataan penyerahan mewujudkan hubungan yang mantap antara bit yang mendaftar dan output.

Saya cenderung untuk memvisualisasikan "menyerahkan" kenyataan Verilog sebagai sesuatu di sepanjang garisan menyambung wayar. Dalam kes ini, ia adalah kabel reben lima wayar antara lima isyarat keluaran dalam "ExtLEDs" dan lima bit paling penting dalam daftar "freq_div." Sambungan tersebut akan terbentuk dalam FPGA pada power-up dan akan sentiasa aktif.

Itu bererti dua perkara:

  • Satu, tidak banyak perkara di mana dalam kod yang anda masukkan pernyataan tugasan. Peralihan berlaku semasa langkah sintesis, bukan pada masa pelaksanaan. Kenyataannya adalah sah jika ia pada akhir kod. Anda boleh membuktikan bahawa dengan mengalihkan pernyataan itu ke tahap paling bawah "endmodule".
  • Dua, tidak kira di mana dalam kod HDL anda menetapkan nilai dalam daftar, ia akan serta-merta muncul pada output tersebut. Anda tidak perlu menyerah lagi, seperti yang anda lakukan dalam bahasa MCU. Walaupun penyata tugas anda berada di bahagian bawah kod anda, isyarat itu masih boleh diakses di mana-mana sahaja di dalam kod.

Notasi Numerik

Dalam artikel awal saya, saya menggunakan notasi yang sedikit berbeza dalam talian untuk menambah daftar. Dalam kod artikel ini, saya menggunakan (freq_div <= freq_div + 1'b1;), sedangkan dalam artikel sebelumnya saya menggunakan notasi numerik 1'd1. Kedua-duanya secara teknikalnya betul, tetapi sebagai commenter Bill menegaskan, 1'b1 lebih tepat.

Nombor pertama dalam notasi itu merujuk kepada bilangan bit yang digunakan untuk menyimpan nilai-lebar bit registri. Sebagai contoh, 1'b1 mencipta satu daftar yang satu lebar lebar dan meletakkan nombor 1 di dalamnya, dan 4'b1 mencipta daftar lebar empat-bit dan meletakkan nombor 0001 di dalamnya. "B" menandakan radix (atau pangkalan) untuk nombor jejak, dalam kes ini, perduaan; "d, " "h, " dan "o" mewakili perpuluhan, heksadesimal, dan oktaf. Ia bukan kes sensitif, jadi d sama dengan D.

Nombor pertama bermakna perkara yang sama, tanpa mengira radix itu. 1'd1 mencipta daftar satu-bit dengan nombor 1 di dalamnya. 4'd1 mencipta daftar dengan 0001, seperti juga notasi 4'b1. Nombor pertama selalu mewakili lebar bit daftar. Radix menunjukkan nombor yang anda gunakan untuk nombor itu, dan angka trailing adalah nilai.

Di sinilah penggunaan 1'd1 secara teknikal betul, tetapi boleh membawa kepada masalah. Notasi 1'd2 masih mencipta daftar satu bit. Itu berfungsi dengan baik untuk mewakili nilai 1. Tetapi, sejak perduaan untuk 2 adalah 10, MSB dijatuhkan, meninggalkan hanya 0. 1'2 akan sama dengan sifar. 1'd3 sama dengan 1, dan 1'd4 sama dengan sifar sekali lagi.

Ringkasan

Memeriksa penggunaan jadual carian, flip-flop, dan interconnects yang boleh diprogramkan jauh ke arah memahami bagaimana FPGA berfungsi.

Logik dicipta di LUT. Flip-flop digunakan untuk membuat daftar, yang menyimpan data. Laluan yang dapat diprogramkan dapat mengarahkan isyarat data dari logik dan mendaftar ke dunia luar.