Show HN: डिस्क्रीट लॉजिक नेटवर्क कार्ड बनाना
(qdiv.dev)डिस्क्रीट लॉजिक नेटवर्क कार्ड बनाने की कहानी
यह लेख उस श्रृंखला का हिस्सा है जो डिस्क्रीट लॉजिक सर्किट का उपयोग करके एक पूर्ण कंप्यूटर सिस्टम बनाने की प्रक्रिया को कवर करती है। अब तक लेखक ने ऐसा कंप्यूटर बनाया है जो 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-flopU29Bका उपयोग करके बनाया जाता है। यह signal input data के प्रत्येक 8 bits के बाद थोड़ी देर के लिए low हो जाता है। - प्राप्त bytes को 6116(
U20) 2kB static RAM buffer में लिखा जाता है। U13,U16,U18address 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 MACFF: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 टिप्पणियां
Hacker News राय