Show HN: Ayrık Mantık Ağ Kartı Yapımı
(qdiv.dev)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.U30veU31sırasıyla bitleri ve baytları sayar. - Statik RAM yazma sinyali
recv_buf_we, D flip-flopU29Bkullanı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,U18bir 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:EAoluyor. Ayrıca ARP ile çalışabilmek için yayın MAC'iFF:FF:FF:FF:FF:FFde 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 (
0x55dizisinin ardından0xD5gelmesi) 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
0xF000adresine eşlenmiş. - İki adet salt okunur yazmaç var:
0xFB00adresindeki 8 bitlik durum yazmacında iki bayrak bulunur:RX_FULL- çerçeve alındıTX_BUSY- çerçeve iletiliyor
0xFB02adresindeki 16 bitlik alınan veri uzunluğu yazmacı
0xFB00adresine herhangi bir değer yazmak alıcıyı yeniden başlatır.0xFB01adresine 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
Hacker News yorumları