Dapatkan jumlah bit yang diatur dalam logika digital

9

Sebagai latihan, saya mencoba merancang implementasi Game of Life Conway dalam logika digital sederhana. Saya bisa melakukan semuanya dengan meminimalkan fungsi 9-Variable, tapi saya membayangkan itu masih cukup besar. Salah satu elemen inti dari algoritma ini adalah menentukan berapa banyak dari 8 tetangga Anda yang 'hidup'.

Diberikan 8 input, apa cara termudah untuk menentukan berapa banyak yang ditetapkan? Khususnya saya membutuhkan output yang tinggi ketika 2 diatur, dan output yang tinggi ketika 3 diatur.

Gagasan utama saya sekarang terdiri dari register geser PISO, penghitung, dan dekoder 3: 8, tetapi saya cukup membutuhkan mikrokontroler untuk menggerakkan semua itu. Sepertinya tidak rumit fungsi. Mungkin ROM 256x2 akan berfungsi juga, tetapi pencarian saya belum menemukan bagian seperti itu.

Saya tahu bahwa foto apa pun dengan 10 IO bisa melakukan ini secara sepele, tapi saya ingin menerapkannya dengan cara seminimal mungkin.

captncraig
sumber

Jawaban:

13

Anda mungkin menemukan berbagai algoritme aktif pencerahan Penghitungan Bit Cepat . Dua yang terakhir: Nifty Parallel Count dan MIT HAKMEM Count mungkin mudah dikonversi menjadi gerbang. Lihat halaman ini untuk penjelasan yang baik tentang cara kerjanya.

Anda bisa melakukan ini menggunakan perangkat keras gerbang. Gunakan empat adders 1-bit untuk menambahkan pasangan bit bersama-sama. Ini memberi Anda empat angka 3-bit. Tambahkan ini berpasangan menggunakan dua adders 3-bit. Ini memberi Anda dua angka 4-bit untuk ditambahkan menggunakan satu penambah 4-bit. Ini memberi Anda nilai 5-bit, tetapi Anda dapat mengabaikan bit teratas. Kemudian gunakan dua komparator 4-bit untuk menguji nilai 2 dan 3.

Untuk jumlah komponen minimal, mengapa tidak melakukannya Analog?

Buat pembagi tegangan dengan satu resistor di atas, dan 8 input Anda terhubung ke bawah dengan 8 resistor secara paralel. Kemudian cukup gunakan dua komparator yang diatur untuk mendeteksi level tegangan yang akan dihasilkan 2 atau 3 bit. Itu hanya 6 bagian:

Detektor jumlah bit

Jaringan 8-resistor akan menghasilkan tegangan antara 0v (untuk set 0-bit) hingga 5v (untuk set 8 bit). 2 bit akan menghasilkan 0,5v. 3 bit akan menghasilkan 1.56v.

  • Dengan 0 atau 1 bit, output akan menjadi 00.
  • Dengan 2 atau 3 bit, output akan menjadi 01.
  • Dengan 4 atau lebih bit, output akan menjadi 11.

Ditambahkan:

Terima kasih kepada DavidCary untuk saran yang bagus. Setelah banyak perhitungan, saya pikir saya telah menemukan serangkaian resistor yang berfungsi, tetapi Anda harus hati-hati memeriksa perhitungan saya terlebih dahulu. Di sini saya menggunakan komparator dengan output saluran terbuka dan saya pikir saya telah berhasil membuatnya memiliki output tunggal. Rendah berarti mati putaran berikutnya, Tinggi berarti putaran selanjutnya hidup.

Game Conway tentang sirkuit kehidupan 2

Yang menyenangkan adalah bahwa sirkuit ini hanya memiliki dua komponen lebih banyak daripada sirkuit lainnya. Mereka semua adalah resistor seri E8, jadi harus dimungkinkan. Juga, R6 seharusnya menjadi nilai yang lebih tinggi, seperti 4.7k atau sesuatu.

Roket
sumber
4
Memberi +1 hanya karena jawaban Anda bukan "Gunakan mikrokontroler". Itu tampaknya menjadi mode default di sekitar sini.
Connor Wolf
@FakeName: Referensi pertama adalah solusi perangkat lunak. Tentu saja Anda tidak perlu mengimplementasikannya pada mikrokontroler, Anda juga dapat menggunakan superkomputer :)
Federico Russo
@FedericoRusso - Saya memberikan referensi kepada solusi perangkat lunak yang memberikan beberapa wawasan tentang bagaimana ia dapat mengimplementasikannya dalam perangkat keras.
Rocketmagnet
3
Mungkin: Tambahkan "resistor penjumlahan" ke-9 sebesar 20 kOhm dari keadaan saat ini dari sel pusat ke op-amp "+" titik penjumlahan di sirkuit Rocketmagnet - yaitu, berikan sel pusat berat 1 dan 8 sel tetangga berat 2. Kemudian atur pembagi tegangan sehingga "lahir" (sel mati sentral dengan 3 tetangga hidup; jumlah = 6) dan "tetap hidup" (sel mati sentral hidup dengan 2 atau 3 tetangga hidup, jumlah = 5 atau 7) memberikan output "01"; dan semua kasus lainnya (di mana sel pusat mati atau tetap mati) memberikan output "00" atau "11". Kemudian sebuah gerbang XOR memberikan keadaan sel pusat selanjutnya.
davidcary
1
Beberapa hal yang saya temukan melakukan beberapa percobaan: resistensi tidak tepat. Saya menemukan beberapa kombinasi yang lebih baik tetapi saya masih mencoba untuk mengoptimalkan. Juga, ketika membuat kisi-kisi ini, arus akan mengalir mundur melalui sumimg resistor dan mengacaukan semuanya. Dioda pada interlink adalah salah satu cara untuk mencegah hal ini.
captncraig
6

μ

Tabel pencarian juga hanya 1 bagian, dan lebih cepat dari mikrokontroler. Lupakan EEPROM paralel, harganya mahal. Gunakan Flash paralel selebar-byte . Yang ini 512 kByte, itu 2000 kali lebih banyak dari yang Anda butuhkan, tapi ini solusi termurah (1 dolar). Dan Anda dapat menambahkan 6 fungsi 1-bit lainnya dengan harga yang sama.

Anda juga dapat menggunakan CPLD . Tulis fungsi dalam VHDL atau Verilog sebagai satu pernyataan SOP (Jumlah Produk) yang panjang, dan biarkan synthesizer membuat logika.

The Register geser adalah OK jika Anda dapat menunggu hasilnya; ini adalah solusi paling lambat.

Akhirnya, Anda bisa melakukannya dengan gerbang logika , tetapi Anda akan menghabiskan banyak waktu untuk mengurangi SOP ke bentuk seminimal mungkin jika Anda ingin semua dasar. Rocketmagnet memiliki ide yang tepat menggunakan adders, tetapi jumlahnya tidak aktif: penambah 1 bit setengah memberikan 2 bit, bukan 3. Jadi menambahkan output dari setengah penambah dua demi dua memerlukan dua penambah setengah 2-bit, memberikan dua hasil bit. Gunakan setengah penambah 3-bit untuk mendapatkan hasil 4-bit. Menggunakan 1-bit full adders, Anda hanya perlu satu penambah 2-bit.

stevenvh
sumber
1

Sirkuit paralel-sekuensial hibrida cenderung jauh lebih kompak daripada sirkuit paralel murni. Misalnya, jika Anda menyesuaikan aturan sehingga kotak 3x3 akan mengubah sel di tengah mati jika ada kurang dari tiga sel hidup atau lebih dari empat, dan mengubahnya hidup jika ada tepat tiga sel hidup (perilaku di bawah ini aturan baru akan cocok dengan aslinya), seseorang dapat menyederhanakan logika dengan melakukan urutan dua langkah:

tempVal [x, y] = orig [x-1, y] + orig [x, y] + orig [x + 1, y] 'Jumlah dua-bit dari tiga angka satu-bit
orig [x, y] = LiveDeadFunc (orig [x, y], tempval [x, y-1] + tempVal [x, y] + tempVal [x, y + 1])

Array tempVal[x,y] memiliki dua bit per sel; operasi terakhir menjumlahkan tiga angka tersebut untuk menghasilkan nilai 0-9 (meskipun semua nilai melebihi empat adalah setara), yang kemudian dapat digunakan untuk menghitung status hidup / mati satu bit untuk generasi berikutnya.

BTW, alternatif untuk melakukan penjumlahan aritmatika pada tahap kedua dan memeriksa nilainya adalah mengubah tempVal [x, y] menjadi representasi satu-panas, dan kemudian secara eksplisit memeriksa salah satu dari sembilan kombinasi nilai yang akan menghasilkan tiga sel, atau salah satu dari dua belas yang akan menghasilkan empat.

supercat
sumber