Dapatkah desain FPGA sebagian besar (atau sepenuhnya) tidak sinkron?

39

Kami memiliki kursus FPGA / Verilog yang sangat singkat di universitas (5 tahun yang lalu), dan kami selalu menggunakan jam di mana-mana.

Saya sekarang memulai dengan FPGA lagi sebagai hobi, dan saya tidak bisa tidak bertanya-tanya tentang jam itu. Apakah mereka benar-benar diperlukan, atau dapatkah desain berbasis FPGA sepenuhnya asinkron? Bisakah seseorang membangun sekelompok logika yang kompleks dan membuat barang bergoyang-goyang melewatinya secepat mungkin?

Saya menyadari bahwa ada banyak gotchas dengan ini, seperti mengetahui kapan sinyal telah menyebar ke seluruh bagian sirkuit dan output telah stabil. Itu intinya. Bukannya saya ingin benar-benar membangun desain yang sepenuhnya tidak sinkron, tetapi hanya untuk meningkatkan pemahaman saya tentang kemampuan.

Untuk mata pemula saya, tampak bahwa satu-satunya konstruksi yang benar-benar membutuhkan jam adalah reg, dan pemahaman saya adalah bahwa FPGA khas (katakanlah, Cyclone II) akan memiliki flip-flop-nya pra-kabel untuk sinyal jam tertentu. Apakah ini benar? Apakah ada jam implisit lain seperti ini dan bisakah mereka secara manual didorong oleh desain?

Roman Starkov
sumber
3
Saya tahu Simon Moore di Universitas Cambridge melakukan banyak penelitian dalam desain asinkron, termasuk membuat chip tes yang dibuat. Ini membutuhkan seperangkat alat desain yang sama sekali baru, dan memiliki efek samping yang aneh: kecepatan eksekusi berbanding terbalik dengan suhu, misalnya.
pjc50

Jawaban:

27

Jawaban singkatnya adalah: ya; jawaban yang lebih panjang adalah: itu tidak sepadan dengan waktu Anda.

FPGA sendiri dapat menjalankan desain yang sepenuhnya asinkron, tanpa masalah. Hasil yang Anda dapatkan adalah masalah karena pengaturan waktu melalui FPGA tidak dapat diprediksi. Masalah yang lebih besar adalah kenyataan bahwa waktu Anda dan desain yang dihasilkan akan hampir pasti bervariasi antara sesi tempat dan rute yang berbeda. Anda dapat menempatkan kendala pada jalur asinkron individu memastikan bahwa mereka tidak memakan waktu terlalu lama, tapi saya tidak yakin Anda dapat menentukan penundaan minimum.

Pada akhirnya itu berarti bahwa desain Anda akan tidak dapat diprediksi dan berpotensi sepenuhnya variabel bahkan dengan sedikit perubahan desain. Anda harus melihat seluruh laporan waktu setiap kali Anda mengubah apa pun hanya untuk memastikan bahwa itu masih berfungsi. Di sisi lain, jika desainnya sinkron, Anda hanya mencari celah atau kegagalan di akhir tempat dan rute (dengan asumsi kendala Anda diatur dengan benar, yang tidak butuh waktu lama sama sekali).

Dalam praktiknya orang-orang membidik desain yang sepenuhnya sinkron tetapi jika Anda hanya perlu buffer atau invert sinyal, Anda tidak perlu melalui flip flop selama Anda membuatnya dengan benar.

Semoga ini sedikit membersihkannya.

Andrey
sumber
3
Saya harus menggunakan beberapa perangkat dengan desain FPGA asinkron. Mereka sulit diajak bekerja sama. Harap setidaknya gunakan batasan waktu
Tim Williscroft
1
Meskipun benar bahwa mungkin untuk menerapkan desain asinkron dengan FPGA, sebagian besar FPGA dibuat untuk mendukung desain sinkron khusus. Mereka memiliki banyak sumber daya (PLL, sirkuit distribusi jam, dan sejumlah besar sandal jepit) yang akan terbuang sia-sia dalam desain asinkron.
Dmitry Grigoryev
2
Jawaban ini tidak memberikan saran yang sangat bagus. Anda dapat membuat FPGA tanpa jarum jam dan itu benar-benar menyederhanakan tempat dan rute, menghilangkan satu ton masalah mengenai persyaratan waktu, dan karena penyaringan pipa berbutir halus dapat memiliki throughput yang lebih tinggi secara terukur. Masalah sebenarnya datang ketika Anda mencoba memetakan sirkuit clock ke FPGA clockless karena mereka memiliki karakteristik waktu yang sangat berbeda. Ini bisa dilakukan, hanya memerlukan sedikit pemrosesan front-end untuk melakukan konversi. vlsi.cornell.edu/~rajit/ps/rc_overview.pdf
Ned Bingham
20

"Bisakah seseorang membangun sekelompok logika yang kompleks dan membuat barang bergesekan secepatnya?" Iya nih. Seluruh CPU telah dibangun yang sepenuhnya tidak sinkron - setidaknya satu di antaranya adalah CPU tercepat di dunia. http://en.wikipedia.org/wiki/Asynchronous_circuit#Asynchronous_CPU

Ini membuat saya kesal karena orang menolak teknik desain asinkron, meskipun secara teoritis mereka memiliki beberapa keunggulan dibandingkan teknik desain sinkron, hanya karena (seperti yang orang lain katakan) desain asinkron tidak didukung dengan baik oleh alat yang tersedia.

Bagi saya, itu seperti merekomendasikan bahwa semua jembatan terbuat dari kayu, karena lebih banyak orang memiliki alat-alat pertukangan daripada alat-alat pengerjaan baja.

Untungnya, beberapa keuntungan dari desain asinkron dapat diperoleh sementara masih menggunakan sebagian besar teknik desain sinkron dengan menggunakan desain global sinkron lokal sinkron (GALS) .

davidcary
sumber
Saya merasakan hal yang persis sama tentang kecenderungan modern untuk merutekan PCB pada kotak persegi , meskipun manfaat migrasi jauh lebih sedikit signifikan.
Roman Starkov
@romkyns - Itu lebih ke fakta bahwa menulis perangkat lunak PCB yang menggunakan grid non-bujursangkar itu sulit .
Connor Wolf
1
@ supercat: Saya curiga Anda menyinggung logika empat fase . Itu salah satu sinyal clock multi-fase yang sepertinya dilupakan.
davidcary
1
@davidcary: Agak, kecuali kedua "fase" pada satu kawat - satu fase dikendalikan oleh tepi naik, dan satu oleh tepi jatuh. Pada dasarnya, saya akan membagi jam kait menjadi empat kategori: naik bersih, bersih jatuh, naik terlambat, terlambat jatuh. Kait dengan jarum jam (L / CB) tepi naik atau turun yang bersih dapat mengambil data dari tepi naik atau turun. L / CB tepi naik terlambat dapat mengambil data dari L / CB membersihkan tepi naik setiap tepi jatuh. L / CB pada ujung jatuh dapat mengambil data dari L / CB jatuh bersih atau naik.
supercat
1
@davidcary: Asalkan waktu propagasi tercepat untuk semua kait melebihi waktu tahan paling lama, dan asalkan jalur sinyal terpanjang dari tepi jam, melalui logika gating jam dan kait "terlambat" yang dipicu oleh tepi itu, ke setiap kait yang dipicu oleh mengikuti tepi, tidak melebihi waktu minimum antara tepi jam, saya akan berpikir desain seperti itu harus benar-benar dapat diandalkan dan bebas dari metastabilitas yang dihasilkan secara internal di bawah kombinasi penundaan propagasi.
supercat
5

Salah satu faktor yang belum disebutkan adalah metastabilitas. Jika rangkaian kait dipukul dengan urutan input / transisi sedemikian rupa sehingga keadaan yang dihasilkan akan tergantung pada penundaan propagasi atau faktor tak terduga lainnya, tidak ada jaminan bahwa keadaan yang dihasilkan akan menjadi bersih "tinggi" atau "rendah". Pertimbangkan, misalnya, flip flop yang dipicu oleh tepi yang saat ini mengeluarkan "rendah", dan input inputnya berubah dari rendah ke tinggi pada waktu yang hampir bersamaan dengan waktu tepi tiba. Jika tepi jam terjadi cukup lama sebelum input berubah, output hanya akan duduk rendah sampai tepi jam berikutnya. Jika tepi jam terjadi cukup lama setelah input berubah, output akan dengan cepat beralih dari rendah ke tinggi dan tetap di sana sampai tepi jam berikutnya. Jika tidak satu pun dari kondisi tersebut berlaku,. Mungkin tetap rendah, atau dengan cepat beralih sekali dan tetap tinggi, tetapi mungkin tetap rendah untuk sementara dan kemudian beralih, atau beralih dan kemudian beberapa waktu kemudian beralih kembali, atau beralih bolak-balik beberapa kali, dll.

Jika suatu desain sepenuhnya sinkron, dan semua input disinkronkan dua kali, sangat kecil kemungkinannya bahwa timing timing akan mengenai kait pertama sinkronisasi sehingga menyebabkannya beralih pada waktu yang tepat untuk mengacaukan yang kedua memalangi. Secara umum, aman untuk menganggap hal-hal seperti "tidak akan terjadi". Namun, dalam desain asinkron, sering kali lebih sulit untuk berpikir tentang hal-hal seperti itu. Jika batasan waktu pada rangkaian kait (bukan hanya sandal jepit, tetapi kombinasi logika apa pun yang akan bertindak sebagai kait) dilanggar, tidak ada yang tahu apa yang akan dilakukan output hingga waktu berikutnya ada kondisi input yang valid yang memaksa kait ke negara yang dikenal. Sangat mungkin bahwa output yang tertunda akan menyebabkan kendala waktu input hilir dilanggar, yang mengarah ke situasi yang tidak terduga,

Cara paling aman untuk memodelkan sirkuit asinkron adalah dengan memiliki hampir setiap rangkaian output menghasilkan output "X" sebentar ketika setiap kali beralih antara "0" dan "1". Sayangnya, pendekatan ini sering menghasilkan hampir semua node yang menunjukkan "X", bahkan dalam kasus yang pada kenyataannya hampir pasti menghasilkan perilaku yang stabil. Jika suatu sistem dapat bekerja ketika disimulasikan karena memiliki semua output menjadi "X" segera setelah input berubah, dan tetap "X" sampai input stabil, itu pertanda bagus bahwa sirkuit akan bekerja, tetapi mendapatkan sirkuit asinkron untuk bekerja di bawah kendala seperti itu seringkali sulit.

supercat
sumber
4

Tentu saja jika persyaratan desain Anda cukup lambat sehingga banyak penundaan internal masih lebih besar daripada waktu yang Anda pedulikan, maka itu bukan masalah, dan Anda dapat melihat laporan waktu untuk mengawasi hal ini, tetapi ada batasan untuk apa yang dapat Anda lakukan dengan berguna tanpa info status internal. Jika Anda hanya ingin membuat sesuatu seperti multiplexer input 100 maka baik-baik saja, ingatlah bahwa setiap input akan memiliki penundaan propagasi yang berbeda. Bahkan Anda mungkin mendapatkan beberapa efek menarik dan kacau dengan sejumlah besar loop umpan balik osilasi tak terduga - mungkin sebuah synthesizer berbasis FPGA async sepenuhnya bisa menjadi 'analog' berikutnya.

mikeselectricstuff
sumber
4

Ya kamu bisa. Anda dapat mengabaikan flipflops sepenuhnya dan membangun semuanya dari LUT. Dan / atau Anda dapat menggunakan elemen keadaan pada sebagian besar Xilinx FPGAs sebagai (level triggered) latch bukan flipflop (edge-triggered).

Martin Thompson
sumber
3
Bahaya dengan itu adalah bahwa kecuali seseorang membatasi kompiler logika, itu dapat menghasilkan logika yang memiliki waktu propagasi negatif untuk beberapa gerbang. Sebagai contoh, jika seseorang menentukan X=(someComplexFormula)dan Y=X & D, dan jika kompiler menggantikan rumus untuk X dan menentukan yang X & Dsetara dengan A & D, kompiler dapat menggantikan compute Y dalam hal A dan D, daripada dalam hal X, sehingga memungkinkan perhitungan Y untuk melanjutkan lebih cepat daripada X. Pergantian seperti itu berlaku dengan logika kombinatorial, tetapi mendatangkan malapetaka pada logika sekuensial asinkron.
supercat
@supercat - Saya tidak pernah bekerja dengan alat-alat Xilinx, tetapi ketika saya bekerja dengan Altera FPGAs, Anda selalu memiliki opsi untuk menentukan jalur kritis apa saja sebagai modul gerbang yang terhubung daripada di RTL, di mana pada titik mana optimasi tersebut dilakukan cacat.
Jules
@ Jules: Semua desain logika yang dapat diprogram menggunakan Abel, yang merupakan bahasa yang agak konyol, tetapi memungkinkan untuk menentukan hal-hal dengan cara yang dapat diterapkan beberapa CPLD, tetapi yang mungkin menimbulkan kesulitan untuk alat sintesis VHDL atau Verilog. Sebagai contoh, pada salah satu proyek saya, saya mengeksploitasi fakta bahwa Xilinx parts memiliki clock, async set, dan async reset, untuk mengimplementasikan register shift async-loadable. Jika saya perlu melakukan hal-hal seperti itu dalam FPGA, karena tidak pernah menggunakan Verilog atau VHDL, bagaimana saya harus belajar apa yang diperlukan untuk melakukan itu? BTW, jika ingatanku, aku menggunakan jepit T untuk shifter, dan ...
supercat
... waktunya adalah sedemikian sehingga penulisan async hanya dapat terjadi pada saat-saat ketika input T rendah, dengan asumsi bahwa jika nop-clock terjadi di dekat awal pulsa tulis, penulisan async akan meluas cukup jauh di luarnya sebagai untuk memastikan nilai yang stabil, dan jika nop-clock terjadi di dekat ujungnya, itu hanya akan mengunci nilai yang masih stabil. Saya tidak yakin bagaimana seseorang dapat secara efisien menangani kasus-kasus seperti itu di VHDL atau Verilog.
supercat
@supercat - mengambil masalah yang sama, melihat Buku Pegangan Perangkat Siklon IV Saya melihat bahwa pendekatan terbaik untuk masalah yang sama adalah dengan menggunakan opsi "beban sinkron LAB-lebar" ("LAB" adalah sekelompok 16 elemen logika) , jadi jika ukuran register semacam itu tidak berakhir kelipatan 16 bit maka beberapa bit akan terbuang sia-sia, tetapi ini tampaknya merupakan pilihan yang paling berguna). Saya sekarang memiliki dua pilihan: aku dapat menulis Verilog fungsional yang akan membutuhkan alat sintesis untuk memilih cara menerapkan register diperlukan (yang biasanya akan menjadi pilihan terbaik), atau, jika saya memiliki waktu yang ketat ...
Jules
3

Seperti yang ditunjukkan @Andrey, itu tidak sepadan dengan waktu Anda. Khususnya alat tidak melakukan ini, sehingga Anda akan sepenuhnya sendiri. Plus karena mereka memiliki register bawaan, Anda tidak akan menyimpan apa pun dengan tidak menggunakannya.

Brian Carlton
sumber
3

Benar-benar ada TIGA jenis desain.

  1. Kombinatorial. Tidak ada jam dan tidak ada jalur umpan balik dan sistem tidak memiliki "memori". Ketika satu atau lebih input mengubah perubahan riak melalui logika. Setelah beberapa waktu, output berubah menjadi keadaan baru di mana tetap sampai input berubah lagi.
  2. Urutan sinkron. Suatu sistem dibangun dari register dan blok logika kombinatorial, register diberi clock oleh sejumlah kecil (seringkali 1) jam. Jika ada beberapa jam maka persiapan khusus mungkin diperlukan pada sinyal yang beralih dari satu domain jam ke yang lain.
  3. Urutan asinkron. Ada jalur umpan balik, kait, register atau elemen lain yang memberikan memori desain peristiwa masa lalu dan yang tidak di-clock oleh garis jam yang dianalisis dengan mudah.

Secara umum ketika mensintesis / mengoptimalkan logika kombinatorial, alat akan menganggap bahwa semua yang penting adalah apa hasil akhirnya dan waktu maksimum yang dibutuhkan untuk menyelesaikan hasil itu.

Anda dapat membangun desain yang murni kombinasi dan itu akan mencapai hasil yang tepat. Keluaran dapat berubah dalam urutan apa pun dan dapat berubah beberapa kali sebelum mencapai nilai akhir. Desain seperti itu sangat memboroskan sumber daya logika. Sebagian besar elemen logika akan menghabiskan sebagian besar waktunya untuk duduk diam sedangkan dalam sistem berurutan Anda bisa menggunakan kembali elemen-elemen itu untuk memproses beberapa item data.

Dalam sistem sinkron berurutan semua yang penting adalah bahwa output dari blok kombinatorial telah menetap ke keadaan yang benar ketika mereka clocked ke flip flop berikutnya. Tidak masalah urutan apa yang mereka ubah atau apakah itu gangguan di sepanjang jalan. Sekali lagi alat dapat dengan mudah mengubah ini menjadi logika yang menyediakan jam cukup lambat memberikan jawaban yang tepat (dan mereka dapat memberi tahu Anda jika jam yang ingin Anda gunakan cukup lambat).

Dalam sistem sekuensial asinkron, asumsi-asumsi itu keluar dari jendela. Gangguan bisa jadi masalah, urutan perubahan output bisa jadi masalah. Baik alat dan FPGA sendiri dirancang untuk desain sinkron. Ada banyak diskusi (google asynchrous desain FPGA jika Anda ingin tahu lebih banyak) tentang kemungkinan menerapkan sistem asynchrnous baik pada FPGA standar atau pada yang dirancang khusus tetapi masih ada di luar praktik desain yang diterima umum

Peter Green
sumber
2

Iya nih. Jika Anda tidak memiliki konstruk tipe proses maka itu tidak boleh melakukan hal-hal seperti menyimpulkan register. Akan ada hal-hal seperti memori onboard yang memerlukan jam, meskipun jika Anda benar-benar ingin Anda mungkin bisa menghasilkan ini secara tidak sinkron.

mikeselectricstuff
sumber
1
Apakah Anda bermaksud menjadikan ini sebagai satu jawaban?
Kevin Vermeer
1

FWIW saya pikir saya harus menambahkan bahwa satu tujuan yang jelas dalam solusi logika asinkron akan menjadi pengurangan global dalam konsumsi daya.

Clock / PLL / buffer global itu membakar banyak Joule.

Sebagai solusi FPGA berliku-liku ke arena bertenaga baterai (misalnya, Lattice Icestick) maka aspek ini akan mendapatkan lebih banyak perhatian.

Harrygoz
sumber
Ini adalah poin yang baik, walaupun perlu dipertimbangkan bahwa rangkaian kombinatorial yang dirancang dengan buruk melakukan operasi yang sama dengan rangkaian sekuensial dalam beberapa kasus dapat membuat banyak transisi sementara karena hasil parsial dihitung dan hasil akhir diperbarui untuk menjelaskannya, dan di sirkuit CMOS (seperti kebanyakan FPGA) konsumsi daya kira-kira sebanding dengan jumlah transisi. Jam dapat menyebabkan transisi yang tidak perlu, tetapi Anda juga dapat membuat banyak pengurangan daya dengan menonaktifkan jam di bagian sirkuit yang tidak diperlukan saat ini.
Jules