Wireworld'da bir dijital saat oluşturun


32

Bu Yaşam Oyunu sorusundan esinlenilmiştir .

Wireworld , basit düzenlemeleri tipik mantık geçidi davranışı üreten "tellerden" akan "elektronları" simüle eder.

Wireworld hücresel otomasyonunda dijital bir saat oluşturmak için size meydan okuyorum. Saatiniz her zamanki gibi 00: 00-23: 59 arasında veya AM / PM göstergeli 11: 59'a kadar sayılmalı ve ardından sıfırlanmalıdır.

Girişiniz gözle görülür şekilde iki bölüme ayrılmalıdır. A Kısmı, ekran dışı tüm mantığı, basamakları artırmak ve ilmek yapmakla ilgili tüm parçaları içermelidir. Bölüm B, ekran ve onu süren mantık olacaktır. Bu iki parça arasındaki tek bağlantı, BCD'deki zamanın dört basamağını temsil eden 16 kablo olmalıdır (AM / PM göstergesi için isteğe bağlı bir kablo ile ve sinyalleriniz sürekli değilse bir sinyal saati hattı için isteğe bağlı bir kablo ile). (EDIT: her zaman sıfır kablolar atlanabilir)

Saat davranışının zamanlaması tutarlı olmalıdır. Simülasyon, durumlar arasındaki 1440 geçişin her biri için aynı sayıda keneyi kullanmalıdır. 16 teldeki herhangi bir elektron, A bölümünden aynı anda yayılmalı ve paralel olarak açılmaya başlamalıdır.

Bu bir kod golf yarışması. Puanınız, A bölümünü çevreleyen eksen hizalı sınırlama kutusunun alanıdır.

Benzetmeyle, eğer bu bir metin dili olsaydı, puanınız, o çıktının kodunu çözen ve yazdıran işlevi değil, bir döngü ve 4 sayaç için mantık içeren dört adet 4-bit çıktı üreten saat yönetimi fonksiyonunun büyüklüğü olurdu.

B kısmınız istediğiniz kadar büyük veya küçük olabilir. Sadece gönderiminizin çıktısını çalıştıran biri tarafından görülebilmesi için gereklidir, çünkü çıktıları bir wireworld devresinden "hata ayıklamak" için kolay bir yol yoktur. Çevrimiçi olarak kullanılabilen birden fazla BCD-> 7 bölüm devre vardır. İstediğinizi kullanmaktan çekinmeyin veya saatli bir sinyal hattına ihtiyacınız varsa kendinize ait olun ve AM / PM göstergenizi rakamlara benzer bir ölçekte görüntüleyin.

EDIT: Bölüm B şimdi isteğe bağlıdır. A bölümünüzden BCD çıktıları almanız durumunda, bunu göndermekten çekinmeyin. Saatin çalıştığını teyit etmek daha sıkıcı olacak, fakat duraklatılmış bir simülasyonda sadece bir parça bit okuyabilirim.


İşte küçük bir çevrimiçi simülatör.
NonlinearFruit

Bunun üzerinde çalışıyorum ama geçen hafta gördüm bu yüzden muhtemelen ödülünü kaçıracağım. Wireworld bcd-> 7-segmentin 4 telli bir sürümünü bulamıyorum; popüler 2 telli 7 segmentli cihazın önünde (golly ile gelenler gibi) 4'e 2'lik bir dönüştürücü oluşturmak, yolunu açabilir. Bu cihazla ilgili bir sorun, güzel görünmekle birlikte, güncelleme işleminin yavaş olması, bu da Part A'nın boyutunu şişireceği için sayıları gösterilenden daha hızlı pompalayabiliyor ve yapay olarak yavaşlatılması gerekiyor.
wyldstallyns

İşleri kanıtlayabileceğim ancak şu anda kurallara uygun bir Kısım B'den yoksun olan 150.000 çalışan bir A
Bölümüm var

B bölümünün zor geçmesini beklemiyordum. A bölümündeki elektronlarınız ne kadar uzakta?
Sparr

1
@wyldstallyns 16/12/2016 03: 30: 35Z saatinde kapanır (tam zamanı elde etmek için 'yarının' üzerine gelebilirsiniz). Sana bol şans. Gerçekten saatini beğendim. Zarif bir fikir ve mükemmel bir uygulama. Kabul etmeliyim ki, sonunda mayının sonunda ne kadar yer kapladığına şaşırdım. Ve sizinkinde bulabileceğiniz herhangi bir gelişmeyi görmek isterim. Yani, iyi şanslar :)
niemiro

Yanıtlar:


36

Mandallama Saati

Skor - 53,508 (L şeklindeki tasarım nedeniyle aktif olarak yalnızca 36,828'i kullanılıyor)

Saat çalışan

Yüksek Kaliteli Kayıt - https://1drv.ms/u/s!ArQEzxH5nQLKhvt_HHfcqQKo2FODLQ
Golly desen - https://1drv.ms/u/s!ArQEzxH5nQLKhvwAmwCY-IPiBuBmBw

Rehber ilkeler -

  • Bu benim ilk kez hücresel bir otomat kullanmaktığım için, büyük hazır bileşenleri birbirine bağlamaktan kaçındım. Almadığım geçerli bir yaklaşım, sıfırdan başlayan ve sürekli olarak son çıkışa bir çift ekleyen bir ikili toplayıcı, ardından BCD dönüştürücüye, ekran demultipleksleyiciyi, 7-segment kod çözücüyü ve 7-parçalı göstergeyi izleyen bir ikili toplayıcı olacaktır.
  • Saati soğuk başlatmak mümkün olmalıdır. Kendime, belirli bir iletken hücreye yerleştirilmiş tek bir elektron başının saati doğru şekilde başlatması gerektiği konusunda ek kısıtlama getirdim. Simülasyona başlamadan önce birçok farklı flip-flop ve bireysel zamanlama elemanlarının manuel olarak senkronize edilmesini istemedim.

Bölüm I: Dakika Sayacı

Matematik

İkilik olarak 0 ile 9 arasında sayma (en az önemli dakika hanesi için) aşağıdaki şekildedir -

0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001

En az anlamlı olan (2 ^ 0 birim bit akımı) sütunlar halinde, 01010101, 2 ^ 1 birim akım 0011001100, 2 ^ 2 birim akım 0000111100 ve 2 ^ 3 birim akım ise 0000000011 gider.

İlki kolay - sonsuza dek sadece 01 flip-flip. Üçüncüsü, dört sıfır, altı 0 saniyeden oluşan bir fazdır, faz altı sıfır tarafından kaydırılır. Dördüncü, sekiz adet 0 ve iki adet 1 olan bir akıştır.

İkincisi, iğrenç bir asimetrisi olduğu için biraz daha zor. Ancak şunu farkettim (nerede. Concat operatörü):

0011001100. 0011001100 = 0011001100. (1100110011) = 00110011001100110011 XOR 00000000001111111111 = 5 (0011) XOR 00000000001111111111

(Bu arada, daha sonra söylendiği gibi, saatimin çoğunluğu 60 atımlık bir ticker ile çalışıyor. 00000000001111111111 çift uzunluklu dalga, 120 atım ticker ihtiyacının ortaya çıktığı yerdir).

tasarlamak

Çıktı, yukarıdan aşağıya doğru akar, Dakika Sayısı (2 ^ 0, 2 ^ 1, 2 ^ 2, 2 ^ 3), ardından Onlarca Dakika (2 ^ 0, 2 ^ 2, 2 ^ 1) olur. Alttaki iki kablonun geçtiğine dikkat edin.

Açıklamalı Dakika Sayacı

  1. 120-beat ana saat
  2. Soğuk bir başlangıç ​​için bir elektronun yerleştirileceği yer. Herhangi bir elektron kuyruğu olmadan iki yönde ayrılır, ancak hemen üzerindeki diyot bunlardan birini yakalar ve etrafta dolaşan ve 120-atım halkasının etrafında dönen güzel bir elektron verir.
  3. 12 saniyelik ikincil saat.
  4. İletken + diyot bobini ikincil 12 vuruş saatini başlatır. Kelimeler bu küçük parçanın ne kadar senkronize edileceğini tanımlayamaz. 120 ve 60 vuruş saatlerini senkronize etmeniz, ardından 12 vuruşlu ve frekans düşürücü 24 vuruşlu sözde saatleri senkronize etmeniz ve ardından 24 vuruşlu saati 120 vuruşlu saate geri bağlamanız gerekir, aksi takdirde XOR geçidi çalışmaz .
  5. Faz değişimi.
  6. Takla. Girişteki tek bir elektron önce ayar hattına, daha sonra belirli bir süre sonra vurur, sıfırlama hattına tam olarak bir darbe girer, bir darbe çıkarır.
  7. Buraya humps eklemek - sıfırlama satırında, flip-flop'ta ayarlanan ve sıfırlama arasındaki gecikmeyi artırır. Her ekstra kambur, ekstra bir darbe verir. Aşağıdaki flip-flopta dokuz ekstra kenet var, bu yüzden set ile reset arasında on vuruş.
  8. Zor 2 ^ 1 dakikalık dakika çizgim için XOR geçidi.
  9. AND-NOT geçit ve çok özel parça uzunlukları, geçmiş her elektron darbesinin kendiliğinden iki katına çıkar ve arkadaki elektronu yok eder. Frekans yarısı. 12 vuruşlu ikincil kaynaktan 24 vuruşlu bir saat oluşturur.
  10. 60-beat ikincil saat, aslında işin çoğunu yapıyor. Hızlı bir saati daha yavaş bir saatten başlatmak kolaydır, bu yüzden en yavaş saat (120 atış) çok az kullanılsa bile ustadır. 60 vuruşlu saat bu şeyin kalbidir.
  11. Elektronları taşıyan geri besleme teli, yalnızca 60 vuruşlu saat işaretlendiğinde. Saatin 120 atım master'ından tekrar tekrar başlatılmasını durdurmak için AND-NOT geçidi ile birlikte kullanılır. Aksi takdirde birçok korkunç şey olur ve Ctrl-Z kurtarıcıdır.
  12. 60 ritmi saatin başladığı diyot.
  13. Bu cihazın tamamı bir flip flop, AND geçidi ve AND-NOT geçidi birleşimidir. Bir mandal verir. Bir darbe, başlatır, bir darbe durur.
  14. Mandalı kalibre etmek için tel halkası 10 pals açık, on pals girişinde birer 10 pals kapalı. O olmadan 12 darbe, 8 darbe. Bu on on on mandal, on dakikalık blokların temel bileşenlerini oluştururken, aynı şekilde 6 mikron (1 darbeli) flip-flop'lar dakika birimlerinin temel bileşenlerini oluşturdu.
  15. Soğuk başlangıç ​​başlangıç ​​atımı, başladığı saatler ile iki faz atışı olmak da dahil olmak üzere her türlü soruna neden oldu. Bu mandalları mahvediyor. Bu AND geçidi, senkronizasyon dışı darbeleri yakalar ve atar - özellikle de başlangıç ​​darbesi.
  16. Bu, geçmişe bakıldığında biraz pişman olduğum tasarımın bir parçası. Bir elektron alır, beşe böler ve arkasındaki beş elektronu imha eder, 111111 ila 100000 alır.
  17. Bu bir elektron alır ve öne doğru diker. Kesin olmak için iki aşama ileride. 100000 alır ve 101000 yapar. Bölüm 16 ile birlikte 111111 -> 100000 -> 101000 alıyoruz. Geçmişe bakıldığında keşke 111111 -> 101010 -> 101000; aynı etkiyi daha az alanda başarırdı.
  18. Yukarıdaki modeller daha sonra 20 açık, 40 kapalı elde etmek için alt mandala itilir. Bu bölünmüş, yarısı 20 birim faz değiştirilmiştir ve bunlar onlarca dakikalık iki yüksek dereceli bit akışını oluşturur.

Bölüm II: Saat Sayacı

açıklama

Saat sayacına giriş, saatte bir olmak üzere tek bir elektron darbesidir. İlk adım, her on iki saatte bir, bunu tek bir elektron darbesine indirgemek. Bu birkaç "mandal ve yakala" ilkelleri kullanılarak elde edilir.

Bir "mandal", 6 mikronluk bir açma / kapama mandalı vermek üzere bir AND-NOT'a ve bir AND geçidine bağlı bir 6 mikron flip-flop'tur. Bir "yakalama" girdi olarak sürekli bir elektron akışını alır, ilk geçişe izin verir, ardından akım yakalamanın başladığı noktada sona erene kadar diğer tüm elektronları yok eder.

Bir mandalı, ardından bir mandalı yerleştirmek, seri olarak bir mandala açılan bir elektron dönüşü, bir ucu diğer ucundan dışarı elektron (sonuçta kalan tarafından tutulur). Sonra ikinci elektron girişi -> mandalı kapatır, sessizce sıfırlar. Net etki: ilk elektron geçer, ikinci elektron yok edilir ve bu elektronlar arasındaki gecikme süresine bakılmaksızın vb .

Şimdi seri olarak iki "mandal ve yakala" zincirleyin ve geçen dört elektronun sadece bir tanesi var.

Ardından, üçüncü bir "mandal ve yakala" alın, ancak bu sefer dördüncü bir mandalı gömün ve flip-flop SET satırında, AND-NOT geçidi ve flip-flop SET arasında tutun. Bunun nasıl çalıştığını düşünmenize izin vereceğim, ancak bu sefer gecikme ne kadar uzun olursa olsun üç elektrondan yalnızca biri geçiyor .

Son olarak, dört elektrondan birini alın ve üçte birini, bir AND geçidiyle birleştirin ve on iki elektrondan yalnızca biri geçer. Bu bölüm, aşağıdaki saat sayacının sol üst kısmındaki yolların dağınık dalgasıdır.

Daha sonra, her on iki saatte bir elektronu alın ve her saat başı bir tanesine geri bölün, ancak her birini farklı bir iletken tel üzerine verin. Bu, on üç çıkış noktasına sahip uzun sargılı iletken kullanılarak elde edilir.

Bu elektronları alın - farklı iletkenlerden bir saat sonra, ve bir flip-flop SET hattına basın. Aynı flip floptaki RESET çizgisine bir sonraki saat iletken tarafından çarpılarak saatte her kabloya altmış bakliyat verilir.

Son olarak - bu darbeleri alın ve doğru BCD bit akışlarını çıkarmak için yedi buçuk bayt ROM’a (Salt Okunur Bellek) geçirin. WireWorld ROM'un daha ayrıntılı bir açıklaması için buraya bakın: http://www.quinapalus.com/wires6.html

tasarlamak

Açıklamalı Saat Sayacı

  1. Saat başına bir elektron girişi.
  2. İlk mandal.
  3. İlk yakalamak.
  4. Dış "mandal ve yakala" SET satırında gömülü "mandal ve yakala".
  5. VE geçit.
  6. AM / PM mandalı (her on iki saatte bir kez açılır / kapanır).
  7. Her tel halkası 6x60 = 360 ünite uzunluğundadır.
  8. Flip / Flop daha küçük bir profil oluşturmak için kendi tarafında döndü.
  9. ROM'un yedi buçuk baytı.

notlar

  1. Dakikada bir elektronu olan 6 mikronluk tasarımı sayesinde simülasyonu gerçek zamanlı bir saat için dakikada altı nesilde (her 10 saniyede bir nesil) gerçekleştirin.
  2. AM / PM hattı AM için yüksek (1), PM için düşük (0). Bu seçim yapmak için alışılmadık bir yol gibi görünebilir, ancak gerekçesi var. Saatin soğuk başlatılması sırasında, AM / PM çizgisi başlangıçta doğal olarak düşüktür (0). AM / PM çizgisi en yükseğe çekildiğinde (1), bu sayım saat 12: 00'da başladığını gösterir. Bu noktadan önceki tüm çıktılar dikkate alınmamalıdır, bu noktadan sonraki tüm çıktılar anlamlı kabul edilir.

kullanışlı bağlantılar


Gereksinimleri değiştirildi, böylece her zaman sıfır çıkışlar çıkarılabilir. 4s ve 8'ler onlarca saat boyunca hiç kullanılmaz, 8ler de onlarca dakika boyunca kullanılamaz.
Sparr

Katı! Gerçek mühendislik Diğer mantık kapılarından herhangi biri faydalı olabilir mi? Bazılarını zorlamak üzereyim.
wyldstallyns

1
Bu çok güzel
Sparr

1
Var Ah aman Allahım sadece denemek ve optimize madeni mecbur değilim şimdi kapanacak yeterli. Ben tekrar eden var ben diğerlerini katlamayı yer açmak için kısaltabilir.
wyldstallyns

3
Metada ne kadar aktif olduğunuzu bilmiyorum, bu yüzden PPCG 2016'nın En İyisi için bu cevabı verdiğimi bilmenizi isterim .
Peter Taylor

5

Gecikmeli hat belleği - 51 x 2880 = 146880

görüntü

Uzaklaştır:

görüntü

Çıktı her döngünün üstünden çıkar.

Elektrotların gollybitler arasında ileriye çıkmasını sağlayan tüm telleri bu tel ile doğrudan telin üzerine koydum, böylece teli imleçle takip etmemize gerek kalmadı.

Bu naif yöntemi bir bar ve çarpışma rotasını wireworld, golly ve lua için kullandım.

local g = golly()

local minutes_in_day = 1440 -- 60x24
local interval = 4 -- how often to send electrons

local function bcd4(num)
    num=math.floor(num)
    local t={}
    for b=4,1,-1 do
        t[b]=math.floor(math.fmod(num,2))
        num=(num-t[b])/2
    end
    return table.concat(t)
end

local function makewire(x,y1,y2)
    for y1=1,y2 do g.setcell(x,y1,3) end
end

local function makeloop(x,y,size)
    local len = size/2 - 1
    makewire(x,y+1,len); makewire(x+2,y+1,len) -- main wires
    g.setcell(x+1,y,3); g.setcell(x+1,y+len,3) -- endcape
end

local function paint(x,y,pattern)
    for v in string.gmatch(pattern,".") do
        if v=="1" then g.setcell(x, y, 1); g.setcell(x, y-1, 2) end
        x = x + 4
    end
    g.show(pattern);g.update() -- slows things down but more interesting to watch
    for i=1,interval do g.step() end
end

for x=0,63,4 do makeloop(x,0,minutes_in_day * interval) end

for hour = 0,23 do
      for minute = 0,59 do
         paint( 0, 2, bcd4(hour/10) .. bcd4(hour%10) .. bcd4(minute/10) .. bcd4(minute%10) )
      end
end

Test için bu üst kabloları ekledim ve ipuçlarını izledim.

Imgur

İşte 4 telli BCD'nin 4 setini göz küresine toplamak için senaryo.

-- watches 16 wires spaced 4 apart starting at (0,-4)
local ticks = 1440 -- set to match the length of your 24 hour loop
local g = golly()
local output = ""
local nums = {  ["0000"] = "0", ["0001"] = "1", ["0010"] = "2", ["0011"] = "3", ["0100"] = "4",
                ["0101"] = "5", ["0110"] = "6", ["0111"] = "7", ["1000"] = "8", ["1001"] = "9",
                ["1010"] = "A", ["1011"] = "B", ["1100"] = "C", ["1101"] = "D", ["1110"] = "E",
                ["1111"] = "F" } -- full set in case we have errors (i did)

for i=0,ticks,1 do
   local text = ""
   for i=0,48,16 do -- set your X here, change the 0 and 48
       local word = ""
       for j=0,15,4 do
            local bit = g.getcell(i+j,-4) -- set your Y here, change -4
            if bit == 0 or bit == 3 then word = word .. "0" else word = word .. "1" end
       end
       text = text .. nums[word]
   end
   g.show(text); output = output..' '..text
   g.update(); g.step();g.step();g.step();g.step()
end
g.note(output)

Son cevap, daima sıfır çizgilerin budamasını ve gerisini doğru BCD girişlerine yönlendirmeyi gerektirir.


Gereksinimleri değiştirildi, böylece her zaman sıfır çıkışlar çıkarılabilir. 4s ve 8'ler onlarca saat boyunca hiç kullanılmaz, 8'ler onlarca dakika boyunca kullanılamaz.
Sparr

2
Bu eğlenceli ve harika bir uygulamadır!
Sparr

1
Tamam, 11. saatte başka bir işlevsel saatle dövüldüm. En uzun ve en kısa döngülere farklı numaralarla saldıracağım.
wyldstallyns

Çıkarmayacağım. 3 mikron darbeye geçerek boyutun 1 / 4'ünü koruyabilirim, ancak niemiro'yu yenecek kadar sıkı sarılmayacak.
wyldstallyns
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.