3 puan yazan GN⁺ 2024-04-10 | 1 yorum | WhatsApp'ta paylaş

Ayrık Mantık Ağ Kartı Yapımı

Bu yazı, ayrık mantık devreleri kullanarak tam bir bilgisayar sistemi kurma sürecini ele alan bir serinin parçası. Şimdiye kadar HTTP sunucusu veya LAN oyunu gibi ağ uygulamalarını çalıştırabilen bir bilgisayar yapıldı.

Genel bakış

  • Geçen yıl 10BASE-T Ethernet sinyalini SPI'a dönüştüren ve tersini de yapan bir fiziksel katman adaptörü yapıldı. O sırada çalışmayı test etmek için bir STM32 mikrodenetleyici kullanıldı; şimdi ise bunu kendi yapılmış bilgisayara bağlamak için MAC katmanı modülü uygulanıyor.
  • Her iki adaptör de tam çift yönlü ve bağımsız verici ile alıcı bölümlerine sahip.

Alıcı

Alıcı çalışma özeti:

  • SPI seri verisi bayt düzeyinde paralel veriye dönüştürülür ve bayt saati çıkarılır.
  • İlk 6 bayt, hedef MAC adresi ölçütüyle karşılaştırılır; eşleşmeyen çerçeveler reddedilir.
  • Baytlar statik RAM arabelleğine yazılır.
  • Çerçeve bittiğinde alıcı devre dışı bırakılır ve kullanıcı alıcıyı yeniden başlatana kadar ek çerçeveler reddedilir. Bayt sayacı durur ve değeri kullanıcıya sunulur.

Veri toplama

  • Seri SPI verisinin bir bayt akışına dönüştürülmesi gerekiyor.
  • Seri veri, kaydırma yazmacı (U32) içine kaydırılır. U30 ve U31 sırasıyla bitleri ve baytları sayar.
  • Statik RAM yazma sinyali recv_buf_we, D flip-flop U29B kullanılarak oluşturulur. Bu sinyal, giriş verisinin her 8 bitinden sonra kısa süreliğine düşük olur.
  • Alınan baytlar 6116 (U20) 2kB statik RAM arabelleğine yazılır.
  • U13, U16, U18 bir adres çoklayıcısı oluşturur ve SRAM (U20) adres girişine bayt sayacını veya sistem adres veriyolunu seçer.
  • Üç durumlu arabellek U21, alınan baytları RAM'e iletir.

MAC adresi filtreleme

  • Ethernet trafiğini analiz ederken çerçevelerin genellikle küçük gruplar halinde geldiği görüldü (kısa gecikmelerle ayrılmış 3-4 çerçeve). Bir gruptaki çerçeveler genellikle farklı hedef MAC adreslerine sahip.
  • Bu da bilgisayarın alınan çerçeveleri MAC'e göre filtreleyip alıcıyı yeterince hızlı yeniden başlatarak kendisine ait çerçeveyi yakalayamayacağı düşüncesini doğurdu. Donanım düzeyinde MAC adresi filtreleme gerekiyordu.
  • Kullanıcı tanımlı MAC adresini bir yerde saklayıp bunu alınan ilk 6 baytla karşılaştırmak fazla karmaşıktı. Tek bir baytın tekrarıyla da yapılabilirdi (ör. FE:FE:FE:FE:FE:FE), ama bu sıkıcıydı.
  • MAC adresine biraz çeşitlilik katmak için bunu bayt indeksinin bir fonksiyonu olarak yaptım:
    • Bit 0 sabit olarak 0
    • Bit 1 sabit olarak 1
    • Bit 2-4, bayt indeksinin terslenmiş hali
    • Bit 5-7 sabit olarak 1
  • Bu kuralla MAC adresi FE:FA:F6:F2:EE:EA oluyor. Ayrıca ARP ile çalışabilmek için yayın MAC'i FF:FF:FF:FF:FF:FF de kabul edilmeli.

Verici

  • Alıcıya benzer şekilde, verici de FCS üretimini uygulamıyor; bu yazılımda yapılıyor.
  • Vericiyi daha da basitleştirmek için yalnızca sabit uzunluklu çerçeveleri destekleme kararı alındı. Böylece karmaşık bir dijital karşılaştırıcıya gerek kalmıyor ve çerçeve iletim mantığı yalnızca bayt sayacının tek bir bitine bağlı oluyor.
  • Çerçeve uzunluğu 1024 bayt olarak seçildi; bu, yaygın MTU değeri olan 1500 bayta yakın.
  • 10BASE-T için gereken çerçeve önsözü de (0x55 dizisinin ardından 0xD5 gelmesi) 1024 bayta dahil ve yazılım tarafından yüklenmeli.

Sayaçlar

  • Alıcıda olduğu gibi bitleri (U12) ve baytları (U14) saymak için iki sayaç kullanılır.
  • İlk sayaç, tümleşik osilatörün 20MHz saat sinyaliyle beslenir.
  • 20MHz doğrudan kullanılmaz; en az 2'ye bölünür. Böylece osilatörün görev döngüsü çıkış sinyalini etkilemez.

Veri akışı

  • Alıcıdakiyle aynı üç adet 74HC157 çoklayıcı (burada gösterilmiyor), RAM (U22) adres girişini seçmek için kullanılır.
  • U23, veriyi RAM'e yüklemek için kullanılır.
  • U24, o anda iletilen bayt için ara depolama görevi görür. Buradaki fikir VGA hattıma benziyor.
  • Bayt sayacı 74HC4040 bir ripple sayacı olduğundan kararlı hale gelmesi zaman alır; U24, RAM çıkışı henüz geçerli değilken kararlı bir çıkış sağlar.
  • Bu veri kaydırma yazmacı U28e beslenir ve bit bit kaydırılır.

CPU arayüzü

Bir programcının bakış açısından, bu Ethernet adaptörünün arayüzü şöyle:

  • Her iki çerçeve arabelleği de 0xF000 adresine eşlenmiş.
  • İki adet salt okunur yazmaç var:
    • 0xFB00 adresindeki 8 bitlik durum yazmacında iki bayrak bulunur:
      • RX_FULL - çerçeve alındı
      • TX_BUSY - çerçeve iletiliyor
    • 0xFB02 adresindeki 16 bitlik alınan veri uzunluğu yazmacı
  • 0xFB00 adresine herhangi bir değer yazmak alıcıyı yeniden başlatır.
  • 0xFB01 adresine herhangi bir değer yazmak iletimi başlatır.
  • CPU'm kesmeleri desteklemediği için kesme yok.

Programlama

Ağ desteği istiyordum ama TCP/IP yığınını kendim uygulamak istemiyordum. Ayrıca ilk derleyicim berbattı ve assembly ile programlamak zahmetliydi; bu yüzden iyi bir C derleyicisi istedim. Bu nedenle bir C derleyicisi yaptım. Bu derleyici, küçük bir TCP/IP kütüphanesi olan uIP 1.0'ı derleyebilecek kadar olgunlaştı. CPU'mun kod yoğunluğu çok düşük olmasına rağmen uIP, RAM'e sığacak kadar küçük ve gerçek uygulamalar için hâlâ yer bırakıyor.

Ağ performansı çok düşük, ancak ticari bir CPU veya özel çip kullanılmadığı düşünülürse yine de oldukça memnun edici:

  • Ortalama ping gidiş-dönüş süresi 85ms
  • HTTP sunucusu indirme hızı 2.6kB/s (SD karttan statik dosya sunumu)

Proje deposu

Modeller, şema dosyaları ve PCB çizimleri GitHub'da bulunuyor.

GN⁺ görüşü

  • Bu proje, geliştiricinin donanım konusundaki derin anlayışını ve tutkusunu gösteriyor. Her şeyi doğrudan kendisinin uygulama çabası son derece etkileyici, ancak pratiklik açısından soru işaretleri yaratıyor.
  • Modern bilgi işlem sistemleri son derece karmaşık ve uzmanlaşmış olduğundan, her şeyi sıfırdan uygulamak çok verimsiz. Özellikle ağ protokol yığını gibi iyi oturmuş ve optimize edilmiş alanlarda mevcut uygulamaları kullanmak daha akıllıca.
  • Buna rağmen bu tür projelerin eğitsel değeri çok yüksek. Çünkü düşük seviyeli donanım ve yazılımın nasıl etkileştiğini, protokollerin nasıl uygulandığını doğrudan deneyimleme fırsatı veriyor.
  • Ayrıca günümüzde geliştiriciler arasında donanım anlayışının zayıfladığı bir ortamda, bu tür projeler bilgisayar sistemlerinin temelini hatırlatan değerli örnekler olabilir.
  • Eksik kalan taraf, performansın çok düşük olması. Gerçek kullanım olasılığını artırmak için daha optimize bir uygulama gerekli görünüyor. Ancak bu, projenin ana amacı gibi görünmüyor.

1 yorum

 
GN⁺ 2024-04-10
Hacker News yorumları
  • Bu proje, donanım tabanlı MAC adresi filtrelemeyi uygulayan özel yapım bir bilgisayar için bir Ethernet kartı üretmiş; çalışma sürecindeki akıl yürütme ve adım adım iz sürme oldukça eğitici ve harika.
  • Normal bir PC için Ethernet kartının en minimal uygulaması da benzer olurdu; ancak checksum hesaplamasını PC'nin CPU'sunun yapması ve USB gibi bir bağlantıyla bağlanması gerekirdi.
  • Bu proje için C derleyicisi, bağlayıcı, libc vb. araçların da bizzat yapılmış olması etkileyici.
  • Böyle projelere harcanan tutku ve emeğe hayranım; emeklilikten sonra ben de böyle donanım/yazılım projeleri yapmak isterim.
  • Geçmişte Etherlink 3c501 Ethernet kartının performansı iyi değildi.
  • Görünüşe göre yapılan şey ayrık mantıkla bir ağ kartı üretmek. (ayrık mantık ağ kartı değil)
  • Tüm ağ kartları ayrık mantık bileşenlerinden mi yapılır? (saf bir soru)
  • Bu bilgisayar kurulumunun modülerliği harika.
  • Bunu basit ve etkili biçimde anlatmış olması etkileyici ve büyük takdiri hak ediyor.