3 पॉइंट द्वारा GN⁺ 2024-04-10 | 1 टिप्पणियां | WhatsApp पर शेयर करें

डिस्क्रीट लॉजिक नेटवर्क कार्ड बनाने की कहानी

यह लेख उस श्रृंखला का हिस्सा है जो डिस्क्रीट लॉजिक सर्किट का उपयोग करके एक पूर्ण कंप्यूटर सिस्टम बनाने की प्रक्रिया को कवर करती है। अब तक लेखक ने ऐसा कंप्यूटर बनाया है जो HTTP सर्वर या LAN गेम जैसे नेटवर्क ऐप्लिकेशन चला सकता है।

अवलोकन

  • पिछले साल 10BASE-T Ethernet सिग्नल को SPI में और वापस SPI से 10BASE-T में बदलने वाला एक physical layer adapter बनाया गया। उस समय STM32 microcontroller का उपयोग करके उसका परीक्षण किया गया था, और अब उसे स्वयं बनाए गए कंप्यूटर से जोड़ने के लिए MAC layer module लागू किया जा रहा है।
  • दोनों adapter full-duplex हैं और इनमें transmitter तथा receiver के स्वतंत्र भाग हैं।

रिसीवर

रिसीवर के काम करने का सार:

  • SPI serial data को byte-स्तरीय parallel data में बदला जाता है, और byte clock निकाला जाता है।
  • पहले 6 bytes की तुलना destination MAC address मानदंड से की जाती है, और जो frame मेल नहीं खाते उन्हें अस्वीकार कर दिया जाता है।
  • bytes को static RAM buffer में लिखा जाता है।
  • frame समाप्त होने पर receiver निष्क्रिय हो जाता है, और जब तक उपयोगकर्ता receiver को फिर से शुरू नहीं करता तब तक अतिरिक्त frames अस्वीकार किए जाते हैं। byte counter रुक जाता है और उसका मान उपयोगकर्ता को उपलब्ध कराया जाता है।

डेटा संग्रह

  • serial SPI data को byte stream में बदलना आवश्यक है।
  • serial data को shift register(U32) में शिफ्ट किया जाता है। U30 और U31 क्रमशः bits और bytes की गिनती करते हैं।
  • static RAM write signal recv_buf_we को D flip-flop U29B का उपयोग करके बनाया जाता है। यह signal input data के प्रत्येक 8 bits के बाद थोड़ी देर के लिए low हो जाता है।
  • प्राप्त bytes को 6116(U20) 2kB static RAM buffer में लिखा जाता है।
  • U13, U16, U18 address multiplexer बनाते हैं जो byte counter या system address bus में से किसी एक को SRAM(U20) के address input के रूप में चुनते हैं।
  • tri-state buffer U21 प्राप्त bytes को RAM तक पहुँचाता है।

MAC address filtering

  • Ethernet traffic का विश्लेषण करते समय यह पाया गया कि frames अक्सर छोटे समूहों में आते हैं (कम विलंबता से अलग हुए 3-4 frames)। एक समूह के frames में आम तौर पर अलग-अलग destination MAC address होते हैं।
  • इससे लगा कि लेखक का कंप्यूटर MAC के अनुसार प्राप्त frames को फ़िल्टर करके receiver को पर्याप्त तेज़ी से पुनः आरंभ नहीं कर पाएगा ताकि अपने लिए बने frames को पकड़ सके। इसलिए hardware MAC address filtering की आवश्यकता थी।
  • किसी custom MAC address को कहीं संग्रहीत करके पहले 6 प्राप्त bytes से उसकी तुलना करना बहुत जटिल था। इसे एक ही byte की पुनरावृत्ति (जैसे FE:FE:FE:FE:FE:FE) से भी बनाया जा सकता था, लेकिन वह नीरस लगा।
  • MAC में थोड़ा बदलाव लाने के लिए इसे byte index के फ़ंक्शन के रूप में बनाया गया:
    • bit 0 को 0 पर स्थिर रखा गया
    • bit 1 को 1 पर स्थिर रखा गया
    • bits 2-4 byte index के inverted रूप हैं
    • bits 5-7 को 1 पर स्थिर रखा गया
  • इस नियम का उपयोग करने पर MAC address FE:FA:F6:F2:EE:EA बनता है। ARP के साथ काम करने के लिए broadcast MAC FF:FF:FF:FF:FF:FF को भी स्वीकार करना पड़ता है।

ट्रांसमीटर

  • receiver की तरह transmitter में भी FCS generation लागू नहीं की गई; यह software में किया जाता है।
  • transmitter को और सरल बनाने के लिए केवल fixed-length frames का समर्थन करने का निर्णय लिया गया। इससे जटिल digital comparator की आवश्यकता नहीं रहती, और frame transmission logic केवल byte counter के एक single bit पर निर्भर रहती है।
  • frame length 1024 bytes चुनी गई, जो सामान्य MTU 1500 bytes के काफ़ी करीब है।
  • 10BASE-T के लिए आवश्यक frame preamble (0x55 की sequence जिसके बाद 0xD5 आता है) भी 1024 bytes में शामिल है और इसे software में लोड करना पड़ता है।

काउंटर

  • receiver की तरह bits (U12) और bytes (U14) की गिनती के लिए दो counters उपयोग किए जाते हैं।
  • पहला counter integrated oscillator के 20MHz clock से संचालित होता है।
  • 20MHz का सीधे उपयोग नहीं किया जाता, बल्कि इसे कम-से-कम 2 से विभाजित किया जाता है। इससे oscillator का duty cycle output signal को प्रभावित नहीं करता।

डेटा प्रवाह

  • RAM(U22) के address input को चुनने के लिए receiver जैसे ही तीन 74HC157 multiplexers (यहाँ नहीं दिखाए गए) उपयोग किए जाते हैं।
  • U23 का उपयोग RAM में data लोड करने के लिए किया जाता है।
  • U24 वर्तमान में प्रसारित हो रहे byte के लिए मध्यवर्ती storage की तरह काम करता है। यहाँ की सोच लेखक की VGA pipeline जैसी है।
  • byte counter 74HC4040 एक ripple counter है और स्थिर होने में समय लेता है, इसलिए U24 तब तक स्थिर output देता है जब तक RAM output अभी valid नहीं हो जाता।
  • यह data shift register U28 को दिया जाता है और bit-दर-bit शिफ्ट किया जाता है।

CPU interface

प्रोग्रामर के दृष्टिकोण से Ethernet adapter का interface इस प्रकार है:

  • दोनों frame buffers 0xF000 पर mapped हैं।
  • दो read-only registers हैं:
    • 0xFB00 पर 8-bit status register में दो flags हैं:
      • RX_FULL - frame प्राप्त हो चुका है
      • TX_BUSY - frame प्रसारित हो रहा है
    • 0xFB02 पर 16-bit receive data length register
  • 0xFB00 पर कोई भी मान लिखने से receiver पुनः आरंभ हो जाता है।
  • 0xFB01 पर कोई भी मान लिखने से transmission शुरू हो जाता है।
  • चूँकि लेखक का CPU interrupts को support नहीं करता, इसलिए interrupts नहीं हैं।

प्रोग्रामिंग

लेखक नेटवर्क support चाहता था, लेकिन स्वयं TCP/IP stack लागू नहीं करना चाहता था। साथ ही पहला compiler बहुत खराब था और assembly में programming करना झंझट भरा था, इसलिए एक अच्छा C compiler चाहिए था। इसलिए उसने C compiler बनाया। यह इतना परिपक्व हो चुका है कि uIP 1.0 (एक छोटा TCP/IP library) को compile कर सकता है। लेखक के CPU की code density बहुत कम होने के बावजूद uIP इतना छोटा है कि RAM में फिट हो जाता है और वास्तविक applications के लिए भी जगह बचती है।

नेटवर्क प्रदर्शन बहुत कम है, लेकिन यह देखते हुए कि इसमें कोई commercial CPU या special chip इस्तेमाल नहीं हुई, परिणाम फिर भी काफी संतोषजनक हैं:

  • औसत ping round-trip time 85ms
  • HTTP server download speed 2.6kB/s (SD card से static files serve करते हुए)

प्रोजेक्ट रिपॉज़िटरी

मॉडल, schematic files और PCB drawings GitHub पर उपलब्ध हैं।

GN⁺ की राय

  • यह प्रोजेक्ट डेवलपर की hardware के प्रति गहरी समझ और जुनून को दिखाता है। सब कुछ खुद लागू करने की कोशिश बेहद प्रभावशाली है, लेकिन व्यावहारिकता के लिहाज़ से कुछ सवाल उठते हैं।
  • आधुनिक computing systems बहुत जटिल और specialized हैं, इसलिए सब कुछ शुरुआत से लागू करना बहुत अल्प-प्रभावी है। खासकर network protocol stack जैसे अच्छी तरह स्थापित और optimized क्षेत्रों में मौजूदा implementations का उपयोग करना समझदारी है।
  • फिर भी, ऐसे प्रोजेक्ट का शैक्षिक मूल्य बहुत अधिक है। इससे यह प्रत्यक्ष रूप से अनुभव किया जा सकता है कि low-level hardware और software कैसे परस्पर क्रिया करते हैं, और protocols कैसे लागू किए जाते हैं।
  • साथ ही, आजकल डेवलपर्स के बीच hardware की समझ कम होती जा रही है; ऐसे में यह प्रोजेक्ट कंप्यूटर सिस्टम की बुनियाद की याद दिलाने वाला एक मूल्यवान उदाहरण हो सकता है।
  • एक कमी यह है कि प्रदर्शन बहुत कम है। वास्तविक उपयोगिता बढ़ाने के लिए अधिक optimized implementation की आवश्यकता दिखती है। लेकिन लगता है कि यही इस प्रोजेक्ट का मुख्य उद्देश्य नहीं है।

1 टिप्पणियां

 
GN⁺ 2024-04-10
Hacker News राय
  • यह प्रोजेक्ट हार्डवेयर MAC address filtering को लागू करने वाले एक कस्टम कंप्यूटर के लिए Ethernet card बनाने का है, और काम की प्रक्रिया का reasoning stack trace शिक्षाप्रद और बेहतरीन है।
  • सामान्य PC के लिए Ethernet card का न्यूनतम implementation ऐसा ही होगा, लेकिन checksum की गणना PC के CPU पर करनी होगी और इसे USB आदि से जोड़ना होगा।
  • इस प्रोजेक्ट के लिए C compiler, linker, libc आदि खुद बनाना प्रभावशाली है।
  • ऐसे प्रोजेक्ट में डाले गए जुनून और मेहनत से मैं प्रभावित हूँ, और रिटायरमेंट के बाद ऐसा hardware/software प्रोजेक्ट करना चाहूँगा।
  • पहले Etherlink 3c501 Ethernet card का performance अच्छा नहीं था।
  • लगता है कि इसने discrete logic circuit से network card बनाया है। (ना कि discrete logic network card)
  • सभी network card discrete logic components से नहीं बनाए जाते। (naive question)
  • इस कंप्यूटर setup की modularity शानदार है।
  • इसे सरल और प्रभावी ढंग से समझाया गया है, जो बहुत प्रभावशाली है और बड़ी सराहना के योग्य है।