Pembuat kartu jaringan logika diskret
Tulisan ini adalah bagian dari sebuah serial yang membahas proses membangun sistem komputer lengkap menggunakan rangkaian logika diskret. Sampai saat ini, ia telah membuat komputer yang dapat menjalankan aplikasi jaringan seperti server HTTP atau game LAN.
Ringkasan
- Tahun lalu ia membuat adaptor lapisan fisik yang mengubah sinyal Ethernet 10BASE-T menjadi SPI dan juga sebaliknya. Saat itu pengoperasiannya diuji menggunakan mikrokontroler STM32, dan sekarang ia sedang mengimplementasikan modul lapisan MAC untuk menghubungkannya ke komputer rakitannya sendiri.
- Kedua adaptor sama-sama full-duplex dan memiliki bagian pemancar serta penerima yang terpisah dan independen.
Penerima
Ringkasan cara kerja penerima:
- Data serial SPI diubah menjadi data paralel per byte, dan clock byte diekstrak.
- Enam byte pertama dibandingkan dengan acuan alamat MAC tujuan, dan frame yang tidak cocok ditolak.
- Byte ditulis ke buffer RAM statis.
- Saat frame berakhir, penerima dinonaktifkan, dan frame tambahan ditolak sampai pengguna memulai ulang penerima. Penghitung byte berhenti dan nilainya diberikan kepada pengguna.
Akuisisi data
- Data SPI serial harus diubah menjadi aliran byte.
- Data serial digeser ke shift register (
U32).U30danU31masing-masing menghitung bit dan byte. - Sinyal penulisan RAM statis
recv_buf_wedibentuk menggunakan D flip-flopU29B. Sinyal ini sesaat turun rendah setelah masing-masing 8 bit data masukan. - Byte yang diterima ditulis ke buffer RAM statis 6116 (
U20) berukuran 2kB. U13,U16,U18membentuk multiplexer alamat untuk memilih antara penghitung byte atau bus alamat sistem sebagai masukan alamat ke SRAM (U20).- Buffer tri-state
U21meneruskan byte yang diterima ke RAM.
Penyaringan alamat MAC
- Saat menganalisis lalu lintas Ethernet, ia menemukan bahwa frame biasanya datang dalam kelompok kecil (3-4 frame yang dipisahkan oleh jeda singkat). Frame dalam satu kelompok biasanya memiliki alamat MAC tujuan yang berbeda-beda.
- Ini membuatnya berpikir bahwa komputernya tidak akan bisa memfilter frame yang diterima berdasarkan MAC dan me-restart penerima dengan cukup cepat untuk menangkap frame yang ditujukan kepadanya. Penyaringan alamat MAC di perangkat keras pun diperlukan.
- Menyimpan alamat MAC kustom di suatu tempat lalu membandingkannya dengan 6 byte pertama yang diterima terasa terlalu rumit. Membuatnya dari pengulangan satu byte (misalnya FE:FE:FE:FE:FE:FE) juga memungkinkan, tetapi membosankan.
- Untuk memberi sedikit variasi pada MAC-nya, ia membuatnya sebagai fungsi dari indeks byte:
- Bit 0 tetap 0
- Bit 1 tetap 1
- Bit 2-4 adalah inversi indeks byte
- Bit 5-7 tetap 1
- Dengan aturan ini, alamat MAC-nya menjadi
FE:FA:F6:F2:EE:EA. Selain itu, agar dapat bekerja dengan ARP, adaptor juga harus menerima MAC broadcastFF:FF:FF:FF:FF:FF.
Pemancar
- Mirip dengan penerima, pemancar tidak mengimplementasikan pembuatan FCS di perangkat keras dan melakukannya di perangkat lunak.
- Untuk lebih menyederhanakan pemancar, diputuskan untuk hanya mendukung frame dengan panjang tetap. Dengan begitu tidak diperlukan pembanding digital yang rumit, dan logika pengiriman frame hanya bergantung pada satu bit dari penghitung byte.
- Panjang frame dipilih 1024 byte, yang cukup dekat dengan MTU umum 1500 byte.
- Preamble frame yang dibutuhkan 10BASE-T (urutan
0x55diikuti0xD5) juga termasuk dalam 1024 byte tersebut dan harus dimuat oleh perangkat lunak.
Penghitung
- Seperti pada penerima, dua penghitung digunakan untuk menghitung bit (
U12) dan byte (U14). - Penghitung pertama diberi clock 20MHz dari osilator terintegrasi.
- 20MHz tidak digunakan secara langsung, melainkan setidaknya dibagi dua. Dengan begitu duty cycle osilator tidak memengaruhi sinyal keluaran.
Aliran data
- Tiga multiplexer 74HC157 yang sama seperti pada penerima (tidak ditampilkan di sini) digunakan untuk memilih masukan alamat RAM (
U22). U23digunakan untuk memuat data ke RAM.U24berfungsi sebagai penyimpanan sementara untuk byte yang sedang dikirim. Idenya di sini mirip dengan pipeline VGA miliknya.- Penghitung byte 74HC4040 adalah ripple counter dan membutuhkan waktu untuk stabil, jadi
U24menyediakan keluaran yang stabil saat keluaran RAM masih belum valid. - Data ini kemudian dimasukkan ke shift register
U28dan digeser per bit.
Antarmuka CPU
Dari sudut pandang programmer, antarmuka adaptor Ethernet ini adalah sebagai berikut:
- Kedua frame buffer dipetakan ke
0xF000. - Ada dua register read-only:
- Register status 8-bit di
0xFB00memiliki dua flag:RX_FULL- frame telah diterimaTX_BUSY- frame sedang dikirim
- Register panjang data terima 16-bit di
0xFB02
- Register status 8-bit di
- Menulis nilai apa pun ke
0xFB00akan memulai ulang penerima. - Menulis nilai apa pun ke
0xFB01akan memulai pengiriman. - Tidak ada interrupt karena CPU miliknya tidak mendukung interrupt.
Pemrograman
Ia menginginkan dukungan jaringan, tetapi tidak ingin mengimplementasikan sendiri stack TCP/IP. Selain itu, kompiler pertamanya sangat buruk dan memprogram dalam assembly terasa merepotkan, jadi ia menginginkan kompiler C yang layak. Maka ia pun membuat kompiler C. Kompiler ini sudah cukup matang untuk mengompilasi uIP 1.0 (library TCP/IP kecil). Meskipun kepadatan kode CPU miliknya sangat rendah, uIP cukup kecil untuk muat di RAM dan masih menyisakan ruang untuk aplikasi nyata.
Performa jaringannya memang sangat rendah, tetapi mengingat tidak ada CPU komersial atau chip khusus yang digunakan, ia tetap sangat puas:
- Rata-rata round-trip time ping 85ms
- Kecepatan unduh server HTTP 2.6kB/s (menyajikan file statis dari kartu SD)
Repositori proyek
Model, file skematik, dan gambar PCB tersedia di GitHub.
Opini GN⁺
- Proyek ini menunjukkan pemahaman mendalam dan antusiasme pengembang terhadap perangkat keras. Upaya untuk mengimplementasikan semuanya sendiri sangat mengesankan, meskipun dari sisi kepraktisan memang menimbulkan pertanyaan.
- Sistem komputasi modern sangat kompleks dan terspesialisasi, sehingga membangun semuanya dari nol sangat tidak efisien. Terutama untuk area yang sudah mapan dan teroptimasi seperti stack protokol jaringan, memanfaatkan implementasi yang sudah ada adalah pilihan yang bijak.
- Meski begitu, proyek seperti ini memiliki nilai edukasi yang sangat tinggi. Ini karena kita bisa mengalami langsung bagaimana perangkat keras dan perangkat lunak tingkat rendah saling berinteraksi, serta bagaimana protokol diimplementasikan.
- Selain itu, di tengah menurunnya pemahaman tentang perangkat keras di kalangan pengembang masa kini, proyek seperti ini dapat menjadi contoh berharga yang mengingatkan kembali pada fondasi sistem komputer.
- Kekurangannya adalah performanya sangat rendah. Untuk meningkatkan kemungkinan pemanfaatan nyata, tampaknya diperlukan implementasi yang lebih teroptimasi. Namun, itu tampaknya bukan tujuan utama proyek ini.
1 komentar
Komentar Hacker News