Sayısal mantıkta ayarlanmış bit sayısını alın


9

Bir alıştırma olarak, Conway'in Hayat Oyunu'nun basit dijital mantıkla bir uygulamasını tasarlamaya çalışıyorum. Her şeyi 9 değişkenli bir işlevi en aza indirerek yapabilirdim, ama bunun hala oldukça büyük olacağını hayal ediyorum. Algoritmanın temel öğelerinden biri, 8 komşunuzdan kaçının 'canlı' olduğunu belirlemektir.

8 giriş verildiğinde, kaç girdi ayarlandığını belirlemenin en kolay yolu nedir? Özellikle 2 ayarlandığında yüksek bir çıkışa ve 3 ayarlandığında yüksek bir çıkışa ihtiyacım var.

Ana fikrim şimdi bir PISO kaydırma yazmacı, bir sayaç ve 3: 8 kod çözücüden oluşuyor, ancak bunların hepsini sürmek için bir mikro denetleyiciye ihtiyacım var. Bir işlevin bu kadar karmaşık görünmüyor. Belki de 256x2'lik bir ROM da işe yarayacaktır, ancak aramalarım bu tür parçalardan herhangi birini ortaya çıkarmadı.

10 IO'lu herhangi bir resmin bunu önemsiz bir şekilde yapabileceğini biliyorum, ancak bunu mümkün olan en az şekilde uygulamak istiyorum.

Yanıtlar:


13

Hızlı Bit Sayma aydınlanmasında çeşitli algoritmalar bulabilirsiniz . Son ikisi: Şık Paralel Sayım ve MIT HAKMEM Sayımı kapılara dönüştürmek kolay olabilir. Nasıl çalıştığının iyi bir açıklaması için bu sayfaya bakın .

Bunu gates donanımını kullanarak yapabilirsiniz. Birlikte bit çiftleri eklemek için dört adet 1 bitlik toplayıcı kullanın. Bu size dört adet 3 bitlik sayı verir. Bunları iki 3-bit toplayıcı kullanarak çiftler halinde ekleyin. Bu, tek bir 4 bitlik toplayıcı kullanarak eklenecek iki adet 4 bitlik sayı verir. Bu size 5 bitlik bir değer bırakır, ancak üst biti yok sayabilirsiniz. Ardından, 2 ve 3 değerlerini test etmek için iki adet 4 bit karşılaştırıcı kullanın.

Minimum parça sayısı için neden Analog yapmıyorsunuz?

Bir direnç üstte olacak şekilde bir voltaj bölücü oluşturun ve 8 girişiniz paralel olarak 8 direnç ile alta bağlanır. Ardından, 2 veya 3 bitin üreteceği voltaj seviyelerini tespit etmek için iki karşılaştırıcıyı kullanın. Bu sadece 6 bölüm:

Bit sayısı dedektörü

8 dirençli ağ 0v (0 bitlik set için) ile 5v (8 bitlik setler için) arasında bir voltaj üretecektir. 2 bit 0,5v üretecektir. 3 bit 1.56v üretecektir.

  • 0 veya 1 bit ile çıkış 00 olacaktır.
  • 2 veya 3 bit ile çıkış 01 olacaktır.
  • 4 veya daha fazla bit ile çıkış 11 olur.

Katma:

Mükemmel bir öneri için DavidCary'e teşekkürler. Bir çok hesaplamadan sonra, işe yarayan bir dizi direnç bulduğumu düşünüyorum, ancak önce hesaplamalarımı dikkatlice kontrol etmelisiniz. Burada açık drenaj çıkışlı karşılaştırıcılar kullanıyorum ve sanırım tek bir çıkışa sahip olmayı başardım. Düşük, sonraki turda ölü anlamına gelir, Yüksek, sonraki turda canlı anlamına gelir.

Conway'in yaşam oyunu devre 2

Güzel olan şey, bu devrenin diğer devreden sadece iki bileşene daha sahip olmasıdır. Hepsi E8 serisi dirençlerdir, bu yüzden ele almak mümkün olmalıdır. Ayrıca, R6, 4.7k veya daha yüksek bir değer olmalıdır.


4
Cevabın sırf 1 değil "bir mikro kontrolör kullan". Buradaki varsayılan mod gibi görünüyor.
Connor Wolf

@FakeName: İlk referans yazılım çözümlerine yöneliktir. Tabii ki bir mikrodenetleyici üzerinde uygulamak zorunda değilsiniz, ayrıca bir süper bilgisayar kullanabilirsiniz :)
Federico Russo

@FedericoRusso - Bu çözümleri, donanımda nasıl uygulayabileceğine dair bir fikir veren yazılım çözümlerine verdim.
Rocketmagnet

3
Belki de: merkezi hücrenin mevcut durumundan Rocketmagnet devresindeki op-amp "+" toplama noktasına 20 kOhm'luk bir 9 "toplama direnci" ekleyin - yani, merkezi hücreye 1 ve 8 komşu hücrenin ağırlığını verin Sonra voltaj bölücüsünü "doğum" (3 canlı komşu ile merkezi ölü hücre; toplam = 6) ve "canlı kal" (2 veya 3 canlı komşu ile canlı ölü hücre, toplam = 5 veya 7) "01" çıktıları verir; ve diğer tüm durumlar (merkezi hücrenin öldüğü veya ölü kaldığı durumlarda) "00" veya "11" çıktıları verir. Daha sonra bir XOR geçidi merkezi hücrenin bir sonraki durumunu verir.
davidcary

1
Bazı deneyler yaparken bulduğum birkaç şey: dirençler pek doğru değil. Birkaç tane daha iyi kombinasyon buldum ama yine de optimize etmeye çalışıyorum. Ayrıca, bunların bir ızgarasını yaparken, akım summimg dirençlerinden geriye doğru akar ve işleri karıştırır. Bağlantılardaki diyotlar bunu önlemenin bir yoludur.
captncraig

6

Minimum nedir? Mikrodenetleyici sadece 1 parçasıdır ve minimum gecikme ile sonuç (<1 üretebilirμs). 54 sentte ATTiny20 , Digikey'de 10 I / O bulunan en ucuz mikrodenetleyicidir.

Arama tablosu da sadece 1 kısımdır ve mikrodenetleyiciden daha hızlıdır. Paralel EEPROM'ları unutun, pahalılar. Bayt çapında paralel bir Flash kullanın . Bu 512 kByte, ihtiyacınız olandan 2000 kat daha fazla, ancak en ucuz çözüm (1 dolar). Aynı fiyata 6 tane daha 1-bit fonksiyon ekleyebilirsiniz.

Ayrıca CPLD kullanabilirsiniz . İşlevi VHDL veya Verilog'a uzun bir SOP (Ürün Toplamı) ifadesi olarak yazın ve synthesizer'ın mantığı oluşturmasına izin verin.

Kaydırma yazmacı Eğer sonucu bekleyin eğer sorun yok; bu en yavaş çözümdür.

Son olarak, mantık kapıları ile yapabilirsiniz , ancak tüm temel gitmek istiyorsanız SOP'yi minimum formuna indirmek için çok zaman harcayacaksınız. Rocketmagnet toplayıcıları kullanarak doğru fikre sahiptir, ancak sayıları kapalıdır: 1 bitlik bir yarım toplayıcı 3 değil 2 bit verir. Bu nedenle, yarım toplayıcıların çıktılarını ikişer ikişer eklemek, iki 3-bit yarım toplayıcı gerektirir. bit sonuçları. 4 bitlik sonucu elde etmek için 3 bitlik yarım toplayıcı kullanın. 1 bitlik tam toplayıcılar kullanarak yalnızca bir adet 2 bitlik toplayıcı gerekir.


1

Hibrit paralel sıralı devre, tamamen paralel devreden çok daha kompakt olmaya eğilimlidir. Örneğin, kuralları 3x3'den az canlı hücre veya dörtten fazla varsa 3x3'lük bir kutu merkezdeki hücreyi ölü kılacak ve tam olarak üç canlı hücre varsa canlı hale getirecek şekilde ayarlarsanız (bunların altındaki davranış) yeni kurallar orijinalle eşleşir), iki adımlı bir dizi yaparak mantığı basitleştirebiliriz:

tempVal [x, y] = orig [x-1, y] + orig [x, y] + orig [x + 1, y] 'Üç bir bitlik sayının iki bit toplamı
orig [x, y] = LiveDeadFunc (orig [x, y], tempval [x, y-1] + tempVal [x, y] + tempVal [x, y + 1])

Dizinin tempVal[x,y]hücre başına iki biti vardır; ikinci işlem, 0-9 arasında bir değer üretmek için bu dört sayıyı toplar (dördü aşan tüm değerler eşdeğer olsa da), bu da sonraki nesil için tek bitli canlı / ölü durumunu hesaplamak için kullanılabilir.

İkinci aşamada aritmetik bir toplam yapmanın ve değeri incelemenin bir alternatifi olan BTW, tempVal [x, y] 'i tek bir temsile dönüştürmek ve daha sonra üç verim sağlayacak dokuz değer kombinasyonundan birini açıkça kontrol etmek olacaktır. hücreleri ya da dördünü verecek oniki hücreden birini içerir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.