Relay kecil saya: Brainfuck computer adalah kenyataan



Tepat satu tahun telah berlalu sejak publikasi terakhir dan saya berpikir bahwa yang pertama bulan April adalah hari yang baik untuk intisari tahunan dari tiga proyek komputer gila saya. Pada saat itu, proyek itu hanya ada di atas kertas, tetapi sekarang sudah pasti menjadi kenyataan.


Blok relai dering, perhitungan relai tercepat di dunia (tapi ini tidak akurat), penutup, indikator vakum dan LED berkedip.


Latar belakang sejarah



Gambar 1: Volume "Radio-Electronic Toys" Wojciechowski, 1979, hancur oleh hidup saya dan saya sendiri.


Dahulu kala, ketika semuanya besar, dan saya masih kecil (tahun seperti itu pada tahun 2002), ayah saya memberi saya buku Wojciechowski Radio-Electronic Toys. Kemudian saya tidak memiliki komputer, tetapi saya sama sekali tidak mendengar tentang Internet, dan sebuah buku yang akrab bagi banyak orang ternyata hanyalah gudang penyimpanan perangkat elektronik yang menghibur. Diantaranya adalah deskripsi komputer elektronik dan rangkaian model sederhana pada relai telepon. Model ini, berada di tahun kedua saya di universitas pada tahun 2008, saya menyusun laporan tentang sejarah komputer.



Gambar 2: RCM - 4-bit ALU


Pada saat itu, saya sudah menjelajahi Internet yang luas dan menyadari keberadaan komputer relai Harry Porter , komputer relai nomor 2 dan komputer relai Zuse - saya sedang berpikir untuk membangun unit saya sendiri.


Bagi mereka yang kurang mengetahui apa yang dimiliki orang lain, saya sarankan untuk melihat ulasan video saya tentang komputer relai buatan sendiri. Sepanjang tahun, ini sedikit ketinggalan jaman, tetapi tidak berhenti menjadi kurang menarik:



Pada tahun 2008 yang sama, di kelas-kelas tentang dasar-dasar teoritis teknik elektro, saya memutuskan komponen utama - relay buluh. Di salah satu laboratorium, saya terkejut mengamati pada gelombang bagaimana bayi RES55 bekerja pada frekuensi 50 Hz. Ini membuat kesan abadi pada saya dan saya mulai mengumpulkan saklar buluh.


10 tahun telah berlalu ....


Dan setelah satu dekade, proyek ini bergerak dengan sangat cepat untuk dirilis. Semuanya bergerak dari titik mati pada November 2016, ketika arsitektur saat ini lahir. Sayangnya, saya memutuskan untuk membuat semua papan sirkuit cetak sendiri ... sebagai hasilnya, satu meter persegi seluruh PCB dua sisi berubah menjadi lubang hitam dan menyedot dirinya sendiri beberapa ratus jam kerja waktu luang, yaitu sekitar enam bulan untuk seorang karyawan. Dari April hingga November 2k17 praktis tidak terjadi apa-apa.


Infografis



Arsitektur mesin sesuai dengan mesin Turing. Ada rekaman dengan data - RAM untuk 64 kiloslov (kata 16 bit). RAM - chip cache dari beberapa jenis mat. motherboard untuk Intel Pentium. Untuk keaslian, buka bagian ... Keaslian. Microcircuit RAM digunakan di sebagian besar komputer relay buatan saya tahu.


Elemen sentral adalah penambah paralel 16-bit. Dia bertanggung jawab untuk menghitung jumlah instruksi berikutnya, dan bekerja dengan data dan sebuah pointer ke sana.
Pada input dari penambah adalah register sementara 16-bit dan register perintah 12-bit. 12 bit juga dikirim ke 4 bit penambah tinggi, yang menghasilkan 16 bit "penuh". Adalah penting bahwa penambah bekerja dengan benar dengan penambahan dan pengurangan angka 12-bit.


Kerugiannya sudah jelas - pada suatu waktu kita hanya bisa melompat 2 ^ 12 instruksi mundur atau maju, atau mengubah pointer atau data dengan nilai ini. Yang pertama - Anda perlu mempertimbangkan saat menulis program, yang kedua - Anda selalu dapat mengulangi prosedur.


Pengurangan ada dalam kode tambahan. Transfer paralel memberikan penundaan perhitungan yang konstan - hanya 3 seri yang berdiri. Ini tidak lebih dari 2ms.


Register IP dan register AP, serta input RAM, terhubung ke output adder melalui kait.


Perhitungan


Operasi utama persis dua potong. Dalam satu kasus, kami bekerja dengan perhitungan nilai pointer baru, yang lain, nilai data baru.


Setiap sisi naik memulai perhitungan nomor instruksi baru. Intinya, IP ++ sudah selesai. Setelah perhitungan, IP dimasukkan ke input alamat kartu memori dan melalui bus data instruksi memasuki register perintah. Tinggi 4 bit menentukan instruksi masa depan, 12 rendah kemungkinan besar bukan nol dan di masa depan penambah akan mengubah angka dalam register sementara persis dengan nilai ini.


Setiap ujung jatuh memulai operasi.


Untuk operasi dengan register AP dan IP, urutan tindakan terlihat seperti ini:


  1. Melalui bus alamat, isi register IP (AP) disalin ke register sementara;
  2. Register sementara dan perintah dimasukkan ke input dari adder. Setelah 2 ms, jawabannya akan siap pada output dari penambah.
  3. Respons dicatat dalam daftar IP atau AP.

Ada beberapa fitur. Untuk perintah AP + BIAS dan AP-BIAS, inilah kasusnya, untuk perintah bersyarat, ketika misalnya IP = (* AP == 0?) IP + 1: IP + -BIAS, kita masih perlu mengunggah nilai sel data saat ini ke bus data dan menghapus informasi dari detektor nol.


Untuk operasi AP + BIAS dan AP-BIAS, urutannya sedikit berbeda.


  1. Melalui bus data, nilai saat ini dari sel memori ditulis ke register sementara.
  2. Register sementara dan perintah dimasukkan ke input dari adder. Setelah 2 ms, jawabannya akan siap pada output dari penambah.
  3. Register AP terus diumpankan ke input kartu memori. Jawaban dari penambah ditulis langsung ke memori.

Komputasi selalu terjadi dalam mode 16-bit. Tetapi flag nol dari conditional branch didefinisikan sebagai:


Z = ((16bit?) *AP : (*AP) & 0x00FF == 0) ; 

Konstruksi


Tidak ada yang berubah sejak terakhir kali.


Modul



Gambar 3: Modul komputer. Kiri ke kanan: modul D-flip-flop, modul diode, modul 2AND / 2XOR


Pada intinya adalah modul kecil 40x64mm. Setiap modul adalah papan sirkuit cetak dengan 4 relay, yang di atasnya operasi logis sederhana dilaksanakan. Ada konektor untuk 16 kontak (ada modul untuk 12 dan 14 kontak) dan hingga 4 LED. Semua ukuran benar-benar diperbaiki.



Gambar 4: Modul selama perakitan


Sebagai contoh:


  1. Modul 2AND / 2XOR - 2 operasi logis independen - 2AND dan 2XOR. 32 buah digunakan di blok adder, dua modul per bit. Pada awalnya, semua 4 LED disolder, tetapi sirkuit modul sedemikian rupa sehingga dua relay pada setiap modul terhubung secara paralel, dan untuk mengurangi daya yang dikonsumsi oleh unit, setengah dari LED dilepas.
  2. Modul D-trigger - 64 buah menuju dua blok register. Dari jumlah tersebut, 60 adalah pemicu tanpa sinyal Aktifkan.
  3. Modul diode - hanya 8 dioda di papan tulis untuk menerapkan dioda multi-input ATAU. Peretasan yang kotor, tetapi memungkinkan penghematan baik pada relai (saya masih memiliki sekitar 400 relai dalam cadangan sekarang) dan tepat waktu - dibandingkan dengan relai, sinyal ditransmisikan ke output dari elemen logika seperti itu secara instan.
  4. Modul 2 & - Ini adalah bata dasar. Bahkan, ada 4 relay dengan kontak switching untuk benar-benar mengimplementasikan rangkaian logika apa pun. Mereka akan pergi ke blok logika dalam jumlah yang tidak diketahui.
  5. Universal 2AND / 2OR yang dibuat sedemikian rupa sehingga memungkinkan untuk mengimplementasikan hampir semua fungsi logis - 4AND, 4OR, 4AND-NOT, 4OR-NOT, dan sebagainya. Itu juga akan pergi ke blok logika dalam jumlah yang tidak diketahui.

Seperti yang saya katakan - setelah membuang banyak waktu membuat papan sirkuit cetak buatan rumah, saya panik dan memesan satu set papan sirkuit lengkap dari Cina. Pada minggu pertama saya mengumpulkan modul pertama. Dan sebulan kemudian, semua modul untuk blok adder sudah siap.



Gambar 5: Blok Adder


Blokir


32 modul dari 8 modul dalam 4 baris digabungkan menjadi blok fungsional. Ada total 5 blok (dalam kasus terburuk, 6):


  1. Blok penambah adalah penambah penuh 16-bit. Dua input 16-bit untuk angka, 1 jalur transfer nol-bit, Dua output. Satu adalah operasi penjumlahan, di sisi lain adalah XOR antara input. Ini dapat digunakan sebagai operasi independen.
  2. Blok Daftar IP / AP - Dua register 16-bit independen tanpa sinyal Aktifkan. Temuan Q dan ~ Q digunakan secara langsung dan diumpankan melalui kait ke tempat berikutnya. Dimungkinkan untuk menyolder 4 relay, tetapi demi menghemat relai, fungsinya dimasukkan ke kait eksternal.
  3. Blok register TMP / CMD - Ada tiga register di sini. Salah satunya adalah register sementara 16-bit. Persis sama dengan IP atau AP. Yang kedua adalah 12-bit, outputnya terhubung ke input penambah melalui kait. Yang ketiga adalah 4-bit, dengan sinyal Aktifkan bawaan. Ini digunakan untuk menyimpan instruksi saat ini.
  4. Blok logika - 2 buah. Atau tiga. Skema ini masih belum diketahui. Perhitungan awal menunjukkan bahwa 64 modul akan cukup (GOTO: Memory Board).

Di dasar setiap blok, papan dasar adalah 200x150 mm, tanpa kabel. Semua yang ada di dalamnya adalah 32 konektor dan pin persegi mencuat dari bawah untuk instalasi sampul.



Gambar 6: Papan dasar dan keranjangnya


Modul mencuat di konektor begitu saja tidak dapat diandalkan. Mereka akan menggantung di sana-sini, bergeser dari guncangan dan dengan cara apa pun mengurangi keandalan struktur. Untuk memperbaikinya, saya menggambar dan mencetak keranjang khusus dengan alur. Modul-modul itu tentunya tidak akan pergi ke mana pun di dalamnya - mereka selamat naik kereta ke Moskow dan kembali tanpa masalah.


Keranjang bisa ditarik lebih mudah - dengan lapisan 0,32 mm itu akan mencetak sedikit lebih dari 10 jam. Tiga keranjang dicetak dengan plastik PLA, dua lagi dengan HIPS. Yang terakhir, karena kurangnya casing untuk printer saya, tampak bengkok saat mencetak.


Anda mungkin memperhatikan bahwa blok penambah tidak memiliki telinga untuk lampiran. Keranjang untuknya dicetak pertama kali. Lalu saya akan menutup telinga ini atau mencetak keranjang baru.

Gambar 7: Blok adder dan blok logika.


Bungkus kawat


Di papan dasar, kami menunggu 600 kesimpulan yang perlu saling berhubungan. Untungnya, perlu untuk menghubungkan tidak hanya segalanya, tetapi hanya hampir semuanya. Di sisi lain, itu tidak menjadi lebih mudah.


Kami mengambil alat khusus, gulungan kawat dan satu kaki setelah satu kaki, kami menyelesaikan diagram koneksi.



Gambar 8: Pembungkus blok adder


Ini baru permulaan pekerjaan. Yah, sebagai permulaan. Pada mulanya ada horor yang tenang - kabel-kabel terbentang dengan sembarangan, beberapa jumper panjang, yang lain terlalu panjang ... Setelah belajar sedikit lebih baik dari sebelumnya, saya melepas sebagian besar jumper dan memutarnya lagi - saya mulai meregangkan jumper dengan seutas tali. Jadi kabel tidak nongkrong, dan hasilnya terlihat jauh lebih baik. Saya mencoba untuk meletakkan agar kabel tidak menekan sudut pin mereka. Akibatnya, bukan sirkuit tunggal. Dari upaya pertama hanya ada garis tanah.



Gambar 9: Pembungkus blok adder. Hasil akhir


Saat ini, itu tidak langsung, tetapi untuk papan pertama hasilnya sangat bagus, saya pikir. Sampai sekarang, saya belum belajar cara meletakkan kawat ke koil, atau alat kurva, atau tangan ...


Di kawan UA3MQJ memiliki artikel terperinci tentang metode pemasangan ini.


Selain blok adder, blok register diperlukan. Sebaliknya, dua blok register. Beberapa bulan lagi - dan 64 modul lainnya dirakit dan diuji. Tetap memutar papan dasar.



Bagaimana itu tadi?


Modul indikator



Gambar 10: Modul Indikator


Keadaan register prosesor saat ini perlu ditampilkan pada sesuatu dan saya memutuskan bahwa indikator vakum akan tepat. Di papan 100x100mm (untuk 10 buah ukuran ini Anda dapat memesan dari Cina dengan harga $ 5), ada 6 indikator IV-6, pemicu K155TM8, dan mikrokontroler. Indikasinya di sini dinamis.


Ada juga input 16-bit untuk membaca langsung status register dan port UART untuk menerima perintah dari kartu memori.


Sekarang firmware dapat membaca status port 16-bit dan dalam format HEX menampilkannya pada indikator. Secara total, saya perlu 4 buah modul tersebut. Tiga akan menampilkan status register saat ini - IP, AP dan CMD dari register untuk mendapatkan visualisasi yang lebih nyaman dari nilai yang disimpan saat ini. Keempat - akan menunjukkan jumlah total instruksi yang dieksekusi.


Kait



Gambar 11: Modul Latch


Modul kait terdiri dari 8 relai RES43. Di dalamnya ada dua kontak. Kiri dan kanan adalah LED yang menampilkan kondisi input dan output saat ini.


Ukuran kait adalah 100x100mm. Kuantitas yang dibutuhkan adalah 8 buah. Dua siap, masih mengumpulkan enam lagi.


Papan memori



Gambar 12: Papan Memori. Tampilan umum


Blok terbesar, yang utamanya berisi dua 64 Kbytes chip RAM statis dan skema yang cocok untuk input alamat dan port data. Papan ini menampung mikrokontroler ATmega1280. Dia memiliki dua tugas penting:


  1. Mengunduh program dan data awal ke RAM. Biner yang dikompilasi harus ditempatkan dalam memori. Untuk melakukan ini, Anda dapat menghubungkan ke kartu memori melalui UART atau telnet (melalui Wi-Fi) dan mengunduh file yang dapat dieksekusi. MK akan membaca header dan meletakkan bagian kode dan data dalam RAM. Saya benar-benar terlalu malas untuk melakukan ini dengan sakelar dan tombol sakelar - program brainfuck yang dapat melakukan sesuatu yang lebih rumit. HelloWorld berisi ribuan instruksi. Ada beberapa kartu truf di sarang dalam hal ini, tetapi tentang mereka di lain waktu.
  2. Itu mengimplementasikan perintah untuk membaca data dari konsol dan menulis untuk itu. Ya, ya instruksi. "" dan "," diimplementasikan menggunakan MK. Sebaliknya, logika relai memberi tahu MK bahwa sekarang perlu mentransfer status bus data ke konsol, atau sebaliknya untuk menampilkan nilai dari konsol ke bus data. Bahkan, MK berfungsi sebagai konverter antarmuka paralel di UART. Ya, sangat mungkin untuk mengeksekusi pada beberapa khusus. chip dan saya akan memikirkannya.

Saya masih belum memutuskan apa yang harus dilakukan dengan mode 16-bit. Tentu saja, sebagian besar program ditulis di bawah brainfuck 8-bit dan semuanya sederhana - kita membaca dan menulis byte rendah. Dan dalam mode 16-bit, apa yang harus saya lakukan? Tampilkan seluruh kata atau hanya byte rendah juga?


Selain yang utama, MK memiliki beberapa tugas sampingan, yang dapat Anda lakukan tanpa, pada prinsipnya, tetapi mereka ditujukan untuk kenyamanan menggunakan mesin:


  1. MK bertanggung jawab untuk menampilkan area kecil memori pada matriks LED 32x16 piksel. Dia melakukan ini sementara bus alamat dan data bus tidak ditempati oleh logika utama. Di sini saya tidak yakin bahwa untuk MK umumnya akan ada waktu di bus, jadi pertanyaannya perlu diperiksa. Tetapi dalam tajuk program akan ada alamat awal untuk tampilan dan saya akan mencoba membuatnya bekerja. Indikasi bersifat dinamis. Dua kolom data adalah output sekaligus dalam satu siklus clock.
  2. Ketika flag mode memori terproteksi diaktifkan dalam biner, jika ada upaya untuk mengeksekusi bagian data atau menulis ke bagian memori, MK akan menghasilkan pengecualian "Kesalahan Segmentasi". Jadi kita dapat memastikan bahwa program tidak berjalan sesuai dengan yang seharusnya. Membaca bagian memori tidak dilarang.
  3. Ketika bendera kendali kode diaktifkan, MK mengaktifkan simulator dan akan menjalankan instruksi yang sama seperti komputer, membandingkan hasil yang diharapkan dan yang diterima. Jika hasilnya berbeda, pengecualian "Kesalahan Mesin" akan dibuang. Ini berarti kesalahan telah terjadi dalam perhitungan dan mungkin satu modul sudah mulai gagal. Atau kami juga mengangkat frekuensi jam dan relay tidak lagi punya waktu untuk menghitung. Hanya dengan bantuan fungsi ini, saya akan mencoba memeras maksimal dari mobil - sesuatu harus mengendalikan operasi yang benar selama periode ini.

Masih ada fungsi sementara, tetapi masih vital, dari papan memori - meniru blok logika sementara itu tidak ada. Ada jalur input dan output pada papan memori dan kami dapat menyediakan sinyal yang diperlukan untuk blok. Jadi, dengan menghubungkan semua jalur kontrol ke papan memori dan menulis program yang mengeluarkan urutan perintah yang diperlukan, itu akan berubah dalam waktu sesingkat mungkin:


  1. jalankan program pertama untuk dieksekusi;
  2. algoritma debug dan sirkuit dari blok logika, yang akan meningkatkan kemungkinan perakitan dan operasi bebas kesalahannya nanti.

Kemudian, mengumpulkan modul yang diperlukan dari blok logika, semua fungsi akan secara bertahap ditransfer "ke besi". Ketika MK tidak lagi bertanggung jawab atas logika, proyek akan dianggap selesai.


Keaslian


Proyek ini awalnya tidak dianggap sebagai murni relay, tanpa menggunakan transistor dan sirkuit mikro. Di satu sisi, komputer itu ternyata hibrida dan kehilangan ketahanan radiasi, di sisi lain, kebanyakan komputer relay memiliki penyakit yang serupa. Versi final mesin akan menggunakan chip memori dan mikrokontroler. Memori ferit akan digunakan di proyek lain, yang sudah "Bebas Silicon".


Untuk mengimbangi efek non-kanon, saya mendapat mesin tik elektronik "Robotron S6130"



Gambar 13: Mesin tik elektronik tipe Camomile.


Sayangnya, mesin itu pergi kepada saya dalam kondisi kehidupan yang buruk. Itu digunakan untuk waktu yang lama dalam akuntansi, tetapi pada akhirnya ditinggalkan untuk mati dalam isolasi yang sangat bagus.



Saya merekomendasikan untuk melihat ulasan unik dari monster ini.


Secara langsung, mekanika berada dalam kondisi baik, tetapi papan prosesor, tempat sepasang baterai D-0,25 NiCd berdiri, banyak diambil. Mereka dengan aman bocor dan membanjiri semuanya dengan elektrolit.


Saya ingin mengembalikannya dan menggunakannya sebagai terminal input / output untuk komputer. Namun, selain kerusakan komponen elektronik, mesin memiliki daisy Rusia (drive dengan huruf) dan kunci Rusia. Yang kedua diputuskan oleh stiker, yang pertama harus dicari dan di sini saya belum beruntung. Tentang fakta bahwa kartrid dengan pita tinta diperlukan, saya biasanya diam. Setidaknya saya punya kertas untuknya ..


Jika diputuskan oleh elektronik bahwa ia akan hilang, maka saya akan mencoba mencari donor, atau saya akan mengembangkan pengisian elektronik baru. Membuat papan kendali segelintir shagovik bukanlah tugas yang paling sulit. Akan lebih sulit untuk menerjemahkan buku panduan dari Jerman dan memahami TK. Tentu saja, mesin ini layak mendapatkan artikel terpisah tentang hasil kebangunan rohani. Terhadap dirinya, sejauh ini adalah prioritas dari pekerjaan yang dilakukan.


Tes


Semua orang yang telah membaca tempat ini akan menerima hadiah dalam bentuk blok estafet cracking dan buzzing.


Untuk memulainya, mari kita coba menerapkan gelombang persegi ke input relai melalui kaskade transistor:



Gambar 14: Pengujian kecepatan tinggi dari saklar buluh RES55. Sinyal kuning ada di koil, biru ada di kontak


Karena input osiloskop memiliki kapasitansi tertentu, dan setelah kontak relai terbuka, ia tetap berada di udara dan self-discharge dimulai, kita melihat eksponen yang berlawanan. Pada frekuensi 1,7 kHz! Untuk relay! Untuk satu relay buluh kecil! Warung biasa di 20Hz atau sedikit lebih tinggi. Pada frekuensi nominal 100 Hz, tepi naik dan turun masing-masing sekitar 600 Ξs. Di sini mereka sangat kecil (200 mikrodetik), karena energi dari yang sebelumnya masih tetap di koil pada saat turn-on berikutnya.


Kami menerapkan tegangan ke blok, memotong sakelar dari instrumen pengukur Soviet ke input.



Gambar 15: Blok adder dan register block dalam operasi


Itu penting! Keren



Jadi itu terlihat dari tempat kejadian. Pada awalnya saya ingin membuat ulang switch untuk 16-bit. Hubungkan indikator ke input dan output, tapi ... Saya tidak bisa menolak.


Nah, karena semuanya bekerja, dan relay ternyata mampu menghasilkan kecepatan yang gila, kami memberi makan berliku-liku ke jalur transfer:



Dan kami memotong 500Hz. Sang penambah berupaya, meski suaranya tidak bisa diucapkan. Sebenarnya, suaranya jernih, tetapi mikrofon kondensor berpikir berbeda. Sejauh yang saya tahu, ini adalah penambah relai tercepat di dunia.


Untuk dilanjutkan



Gambar 16: Merancang bingkai komputer


Secara bertahap, keenam kait yang hilang dikumpulkan dan kerangka mesin di masa depan mulai dirancang. Ada enam blok dalam gambar jika 64 modul tidak cukup untuk logika. Dan jika cukup sudah cukup - tempat di bawah blok tengah bawah akan tetap kosong.


Pada saat yang sama, saya menulis firmware untuk kartu memori sehingga dapat menggantikan blok logika yang hilang. Di musim panas, komputer akan dapat menjalankan program pertamanya.


Tiga komputer ???


Ya tiga. Yang pertama adalah BrainfuckPC saat ini. Yang kedua adalah komputer pneumatik , bernama kode FluidicPC .


Tentang monster masa depan tahan radiasi ketiga Anda sudah dapat menemukan referensi di Internet, tapi saya tidak ingin menyemprot antara proyek dan pertama saya ingin menyelesaikan yang sekarang - saya belum membuat pengumuman tentang itu.


Gambar 17: Mengganti Decatron A101, A102 dan A103
Meski dari gambar ini Anda sudah bisa menebak apa yang akan dibahas.


MENGAPA ????




Referensi


Seluruh proyek terus sepenuhnya terbuka. Oleh karena itu, tautan utama untuk proyek:


  1. Repositori dengan diagram sirkuit dan tata letak PCB . Ada juga firmware untuk modul indikator dan kartu memori
  2. Di halaman ini saya menerbitkan mingguan dan tidak terlalu banyak laporan tentang apa yang telah dilakukan. Sekarang Anda membaca sebuah artikel, sedikit lebih dari sepenuhnya terdiri dari catatan-catatan ini. Dengan terjemahan, komentar, dan tambahan.
  3. Kompiler dan emulator .

Source: https://habr.com/ru/post/id411145/


All Articles