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?
Jawaban:
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.
sumber
"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) .
sumber
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.
sumber
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.
sumber
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).
sumber
X=(someComplexFormula)
danY=X & D
, dan jika kompiler menggantikan rumus untuk X dan menentukan yangX & D
setara denganA & 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.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.
sumber
Benar-benar ada TIGA jenis desain.
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
sumber
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.
sumber
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.
sumber