Terinspirasi oleh pertanyaan Game of Life ini .
Wireworld mensimulasikan "elektron" yang mengalir melalui "kabel", pengaturan sederhana yang menghasilkan perilaku gerbang logika yang khas.
Saya menantang Anda untuk membuat jam digital dalam otomat seluler Wireworld. Jam Anda harus dihitung dari 00:00 hingga 23:59 dengan cara yang biasa, atau hingga 11:59 dengan indikator AM / PM, lalu reset.
Entri Anda harus dibagi menjadi dua bagian. Bagian A harus berisi semua logika non-tampilan, semua bagian yang terlibat dalam penambahan dan perulangan digit. Bagian B akan menjadi tampilan dan logika yang menggerakkannya. Satu-satunya koneksi antara dua bagian ini adalah 16 kabel yang mewakili empat digit waktu dalam BCD (dengan satu kabel opsional untuk indikator AM / PM, dan satu kabel opsional untuk saluran jam sinyal jika sinyal Anda tidak kontinu). (EDIT: selalu-nol kabel dapat dihilangkan)
Waktu perilaku jam harus konsisten. Simulasi harus mengambil jumlah kutu yang sama untuk masing-masing 1440 transisi antar negara. Setiap elektron pada 16 kabel harus dipancarkan dari bagian A pada saat yang sama dan memulai perjalanannya secara paralel.
Ini adalah kompetisi kode-golf. Skor Anda adalah area kotak pembatas sumbu rata yang mengelilingi bagian A.
Dengan analogi, jika ini adalah bahasa tekstual, skor Anda akan menjadi ukuran fungsi manajemen jam yang menghasilkan empat output 4-bit, yang berisi loop dan logika untuk 4 penghitung, bukan fungsi yang menerjemahkan dan mencetak output tersebut.
Bagian B Anda bisa sebesar atau sekecil yang Anda inginkan. Ini hanya diperlukan agar output dari kiriman Anda dapat dilihat oleh seseorang yang menjalankannya, karena tidak ada cara mudah untuk hanya "men-debug" output dari sirkuit wireworld. Ada beberapa sirkuit BCD-> 7 yang tersedia secara online. Jangan ragu untuk menggunakan yang mana saja yang Anda suka, atau buat sendiri jika Anda membutuhkan garis sinyal clock, dan tampilkan indikator AM / PM Anda pada skala yang mirip dengan digit.
EDIT: Bagian B sekarang opsional. Jika Anda hanya memiliki output BCD dari bagian A Anda, jangan ragu untuk mengirimkannya. Akan lebih membosankan untuk mengkonfirmasi jam bekerja, tetapi saya bisa membaca deretan bit dengan baik dalam simulasi yang dijeda.
sumber
Jawaban:
Menempel Jam
Nilai - 53.508 (dimana hanya 36.828 digunakan secara aktif karena desain berbentuk L)
Rekaman Kualitas Tinggi - https://1drv.ms/u/s!ArQEzxH5nQLKhvt_HHfcqQKo2FODLQ
Pola hebat - https://1drv.ms/u/s!ArQEzxH5nQLKhvwAmwCY-IPiBuBmBww
Prinsip Panduan -
Bagian I: Penghitung Menit
Matematika
Menghitung dari 0 hingga 9 dalam biner (untuk digit menit paling signifikan) berlaku sebagai berikut -
0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001
Membaca itu sebagai kolom, yang paling signifikan (2 ^ 0 unit bit stream) pergi 01010101, aliran 2 ^ 1 unit pergi 0011001100, aliran 2 ^ 2 unit pergi 0000111100 dan aliran 2 ^ 3 unit pergi 0000000011.
Yang pertama mudah - cukup flip-flip 01 selamanya. Yang ketiga adalah aliran empat 1s, enam 0s, fase digeser oleh enam nol. Yang keempat adalah aliran delapan 0s dan dua 1s.
Yang kedua sedikit lebih sulit karena punya asimetri yang buruk. Namun, saya perhatikan (di mana. Adalah operator concat):
0011001100. 0011001100 = 0011001100. TIDAK (1100110011) = 00110011001100110011 XOR 0000000000111111111111 = 5 (0011) XOR 0000000000111111111111
(Kebetulan, seperti disinggung kemudian, sebagian besar jam saya berjalan pada ticker 60-beat. Gelombang panjang ganda 00000000001111111111 adalah di mana kebutuhan untuk ticker 120-beat masuk).
Desain
Output mengalir dari atas ke bawah pergi Unit Menit (2 ^ 0, 2 ^ 1, 2 ^ 2, 2 ^ 3) kemudian Puluhan Menit (2 ^ 0, 2 ^ 2, 2 ^ 1). Perhatikan bahwa dua kabel terbawah disilangkan.
Bagian II: Penghitung Jam
Penjelasan
Input ke penghitung jam adalah pulsa elektron tunggal, satu jam sekali. Langkah pertama adalah mengurangi ini menjadi satu pulsa elektron, sekali setiap dua belas jam. Ini dicapai dengan menggunakan beberapa primitif "latch & catch".
"Kait" adalah flip-flop 6 mikron yang terhubung ke gerbang AND-NOT dan AND untuk memberikan kait on / off 6 mikron. "Tangkapan" mengambil aliran elektron yang kontinu sebagai input, memungkinkan yang pertama melalui, kemudian memusnahkan setiap elektron lainnya di belakang, sampai aliran berakhir pada saat titik tangkapan diatur ulang.
Menempatkan kait, diikuti oleh tangkapan, secara seri, menghasilkan satu elektron di -> mengaktifkan kait, satu elektron keluar dari ujung lainnya (sisanya ditangkap oleh tangkapan). Kemudian elektron kedua di -> mematikan kait, menangkap ulang diam-diam. Efek bersih: elektron pertama melewati, elektron kedua dimusnahkan, dan seterusnya, terlepas dari berapa lama penundaan di antara elektron-elektron tersebut .
Sekarang rantai dua "kait & tangkap" secara seri, dan Anda hanya memiliki satu dari empat elektron yang melewatinya.
Selanjutnya, ambil "kait dan tangkap" ketiga, tetapi kali ini sematkan kait keempat dan tangkap pada garis SET flip-flop, antara gerbang AND-NOT dan SET flip-flop. Saya akan meninggalkan Anda untuk memikirkan bagaimana ini bekerja, tetapi kali ini hanya satu dari tiga elektron yang melewati, terlepas dari berapa lama penundaan di antara elektron tersebut .
Akhirnya, ambil satu dari empat elektron, dan satu dari tiga, gabungkan dengan gerbang AND, dan hanya satu dari dua belas elektron yang melewatinya. Seluruh bagian ini adalah percekcokan jalur ke kiri atas penghitung jam di bawah ini.
Selanjutnya, ambil elektron setiap dua belas jam dan pisahkan kembali menjadi satu setiap jam, tetapi output masing-masing ke kabel konduktor yang berbeda. Ini dicapai dengan menggunakan konduktor melingkar panjang dengan tiga belas titik keluar.
Ambil elektron ini - satu jam turun konduktor yang berbeda, dan tekan garis SET flip-flop. Garis RESET pada flip flop yang sama kemudian dipukul oleh konduktor jam berikutnya, memberikan enam puluh pulsa setiap kawat per jam.
Akhirnya - ambil pulsa-pulsa ini dan operasikan ke dalam tujuh setengah byte ROM (Read-Only Memory) untuk menghasilkan bitstream stream BCD yang benar. Lihat di sini untuk penjelasan lebih rinci tentang WireWorld ROM: http://www.quinapalus.com/wires6.html
Desain
Catatan
Tautan yang Berguna
Saya mempelajari dasar-dasar WireWorld dari http://www.quinapalus.com/wi-index.html . Sumber daya yang luar biasa.
Untuk membuat dan mensimulasikan otomat seluler saya menggunakan Golly: http://golly.sourceforge.net/
Saya mengambil desain gerbang AND dari http://mathworld.wolfram.com/WireWorld.html
Dan saya baru saja menemukan halaman web ini jadi tidak menggunakannya tetapi terlihat hebat: http://karlscherer.com/Wireworld.html
sumber
Memori saluran tunda - 51 x 2880 = 146880
Perkecil:
Output keluar dari bagian atas setiap loop.
Saya menempatkan semua status langsung pada kabel dengan lua ini, membiarkan
golly
langkah elektron maju di antara bit sehingga kita tidak harus mengikuti kawat dengan kursor.Saya menggunakan metode naif ini untuk mengatur bar dan kursus kilat wireworld, astaga dan lua.
Untuk pengujian saya menambahkan kabel top ini dan memperhatikan tip mereka.
Berikut skrip untuk mengumpulkan 4 set BCD 4 kawat ke bola mata.
Jawaban akhir membutuhkan pemangkasan garis selalu nol dan perutean sisanya ke input BCD yang benar.
sumber