جهاز الإرسال والاستقبال UART لجهاز كمبيوتر 8 بت على اللوح

في الآونة الأخيرة ، أصبحت مهتمًا أكثر فأكثر بتجميع أجهزة كمبيوتر 8 بت من رقائق TTL . لقد ألهمتني مقاطع الفيديو الرائعة لـ Ben Iter على YouTube ، بالإضافة إلى العديد من المشاريع من موقع Hackaday . في عملية تصميم وتجميع جهاز الكمبيوتر الخاص بي ذي 8 بتات ، فكرت في مدى صعوبة تنفيذ جهاز إرسال واستقبال UART استنادًا إلى سلسلة IC





7400. الدائرة النهائية: جهاز إرسال واستقبال UART جاهز تم تجميعه من سلسلة 7400 IC



أولاً وقبل كل شيء ، دعنا نتعرف على ما هو UART... إنه جهاز إرسال واستقبال عالمي غير متزامن - بروتوكول بسيط يسمح لك بإرسال واستقبال بيانات 8 بت بشكل غير متزامن بحيث يمكن للمعالج أو الكمبيوتر الاتصال بالعالم الخارجي. هذا مفيد في حد ذاته - يمكن لجهاز الكمبيوتر 8 بت الخاص بي الاتصال بجهاز كمبيوتر محمول واستخدام برنامج مراقبة المنفذ التسلسلي (مثل المعجون ) كواجهة لإدخال النص والإخراج. أكثر إثارة للاهتمام ، يمكنني برمجة أداة تحميل نظام التشغيل لجهاز الكمبيوتر الخاص بي 8 بت ، ثم برمجته عبر اتصال UART من الكمبيوتر المحمول! نظرًا لأن وحدات البلوتوث من النوع HC-05 تتواصل بشكل أساسي مع وحدة المعالجة المركزية عبر UART ، يمكنني حتى استخدام وحدة Bluetooth لبرمجة جهاز الكمبيوتر 8 بت الخاص بي من مسافة بعيدة! سيكون من المدهش.



قد يعتبر بعض الأصوليين برمجة جهاز كمبيوتر 8 بت باستخدام جهاز كمبيوتر أكثر قوة أسلوبًا احتياليًا - ولكن هذا هو مشروعي وهو يعمل وفقًا لقواعدي! يرجى برمجة الآلة المصنوعة يدويًا بمفاتيح DIP إذا كنت تستمتع بإدخال البيانات بدلاً من البرمجة وتريد تجربة عمل شاقة أصيلة.



مهما كان الأمر مع البرمجة ، فقد قررت على الأقل أن أقصر نفسي عند تطوير جهاز كمبيوتر على شرائح TTL البسيطة - لا يوجد Arduino و Raspberry Pi و ESP8266 ووحدات Turing-Complete أخرى (وإلا ما الذي سيكون ذا أهمية؟).



بروتوكول UART وقيود التصميم



أمامك هيكل إشارة UART. يحتوي على بت بداية ، يُشار إليه بانتقال الإشارة من أعلى إلى منخفض ، متبوعًا ببايت بيانات (LSB أولاً) ، ثم بت توقف ، مما يؤدي إلى ارتفاع الإشارة. في بعض الأحيان يكون هناك بت تكافؤ ، لكنه ليس مطلوبًا ، لذلك حذفته لأسباب تتعلق بالبساطة. يتم تحديد وقت الإرسال لكل بتة بواسطة معدل البث بالباود (في هذه الحالة ، بتات في الثانية). على سبيل المثال ، يعني معدل البث بالباود 9600 أنه يتم إرسال

البت في 1/9600 = 104 ميكرو ثانية. شكل الموجة بسيط للغاية ، لذا يمكننا تنفيذه بالكامل في الأجهزة على الشرائح المنطقية.







اضطررت إلى اختيار مذبذب بلوري من شأنه أن يمنحني الوصول إلى معدلات البث بالباود القياسية ، ويفضل أن يكون قابلاً للقسمة على قوى اثنين ، بحيث يكون مناسبًا للعمل مع عداد ثنائي. بعد بعض التفكير ، قررت استخدام مذبذب 2.4576 ميجاهرتز ، حيث يمكنه الإرسال بمعدل 38400 بت في الثانية (مقسومًا على 64) ، أو 9600 بت في الثانية (مقسومًا على 256).



الارسال UART



قائمة المكونات:



  • 2.4576 ميجا هرتز الكريستال مذبذب
  • 3 عدادات 74LS161 4 بت
  • 74LS674 سجل التحول 16 بت
  • 74LS06 و
  • 74LS74 D- الزناد
  • 74LS04 لا
  • الصمام الثنائي 1N4001
  • 470 فائق التوهج (!) مكثف (تنعيم الطاقة)


مخطط



يعتبر جهاز الإرسال UART هو الأسهل في الفهم. إنه في الأساس سجل نقل تحميل متوازي مع إخراج تسلسلي. يقوم بتحميل البيانات بايت ، وتتبع بتات البداية والنهاية ، ومزامنتها مع معدل الباود المطلوب. يوضح الرسم البياني أدناه هذه العملية. في الجزء (1) ، يتم إبطاء المذبذب البلوري 2.4576 ميجا هرتز إلى 38400 هرتز باستخدام عدادات 74LS161 4 بت. في الجزء (2) ، يتم استخدام سجل الإزاحة 74LS674 16 بت لمزامنة البيانات لـ UART. أستخدم هذا السجل لأنه كان في متناول يدي بالفعل. أنا أفهم أن هذا IC مكلف وقد يكون من الصعب العثور عليه ، لكنه بالتأكيد يبسط مخططي بالكامل.







مع ثلاثة فقط من هذه الدوائر المتكاملة (عدّادان من 4 بت وسجل إزاحة) ، يمكنك إرسال دفق مستمر من الأحرف إلى جهاز إرسال UART بمعدل 38400 بت في الثانية (بدون تماثل)! نعم ، إنه دفق مستمر - لم أضع في الاعتبار أن سجل التحول يقوم بتحديث المخزن المؤقت للتحميل في دائرة - عفوًا. لم أكن بحاجة إلى هذا السلوك - أردت أن يرسل المعالج بايتًا واحدًا في كل مرة. الأمور معقدة بسبب حقيقة أن نبضات الساعة للمعالج و UART غير متزامنة ، ولم أرغب في وضع افتراضات حول من يكون المؤقت أسرع ، وأي إشارة ستكون ذات صلة في أي لحظة ، وما إلى ذلك. نظرًا لأنني كنت بحاجة إلى التعامل مع عدم التزامن بشكل موثوق ، فقد قررت استخدام المخطط التالي الذي يعمل بشكل جيد:



  • (3) يرسل المعالج إشارة "نقل بايت" غير متزامنة مع المعالج وساعة UART.
  • «». ( AND 74LS06 D- 74LS74).
  • UART «» 4- 74LS161. UART.
  • (4) 16 , .


لاحظ أنني أقوم بتحويل 16 بت بدلاً من 10 بتات من إشارة جهاز الإرسال UART - ويرجع ذلك أساسًا إلى ملاءمة استخدام بتة الحمل لتعطيل دائرة الإرسال. يمكنني استخدام عداد عشري (على سبيل المثال ، 74LS162) ، لكن لم يكن لدي واحد في متناول اليد عندما قمت بتجميع الدائرة على لوح التجارب. ربما في المخطط النهائي سأنتقل إليه.



جهاز استقبال UART



قائمة المكونات:



  • مذبذب بلوري 2.4576 ميجا هرتز (يمكنك استخدام نفس المذبذب مثل جهاز الاستقبال)
  • عدادات 3 × 74LS161 4 بت (يمكن استخدام أحد الدوائر المتكاملة من جهاز الاستقبال)
  • 74LS74 D- الزناد
  • 74LS04 NOT (يمكن استخدام جهاز الاستقبال IC)
  • الصمام الثنائي 1N4001
  • 470 فائق التوهج (!) مكثف (تنعيم الطاقة)
  • مقاومات 220 أوم ومصابيح LED للجمال.


يبدو لي أنه إذا كان من السهل فهم جهاز الإرسال UART الموصوف أعلاه ، فسيكون جهاز الاستقبال أكثر تعقيدًا إلى حد ما. ومع ذلك ، فإن الشيء الجيد في المنطق الرقمي هو أنه يمكن تقسيمه إلى وحدات منفصلة ، ومن ثم لا يبدو كل شيء معقدًا بعد الآن!



توضح الأشكال الموجية الموجودة في الزاوية اليسرى السفلية من الرسم البياني أدناه ما يجب مراعاته عند استقبال بت واحد من جهاز الإرسال الرقمي. كيف نعرف ما إذا كان يتم إرسال بايت إلينا؟ سهل - تتم الإشارة إلى بت البداية من خلال انتقال عالي إلى منخفض ، لذلك يمكننا عكس ذلك واستخدام الانتقال المنخفض إلى العالي لتعيين D-flip-flop (74LS74) (2).



نحتاج الآن إلى البدء في كتابة الإشارة عن طريق تحويلها إلى سجلات التحول وأخذ العينات في مركز تسلسل بتات البيانات. من المهم أن نفهم: نظرًا لأننا لا نعرف متى سنبدأ في تلقي البيانات من UART ، فلن تكون هذه العملية متزامنة مع نبضات الساعة. لذلك ، كلما كانت نبضاتنا أسرع ، اقتربنا من الأصل الحقيقي لإشارة المرسل. للراحة ، تبلغ سرعة ساعتي 16 ضعف سرعة البث بالباود (1). هذا يعني أن كل بتة مرسلة تمر عبر 16 نبضة لهذا المولد. لذلك ، لأخذ عينة تقريبًا في منتصف البيانات المرسلة ، يجب أن نقوم بذلك عند العد 8 - لهذا نقوم بإنشاء إشارة SAMPLING_CLK (3).



بعد ذلك ، على الحافة الصاعدة لهذه الساعة الجديدة ، يمكننا مزامنة الإشارة المرسلة مع سجلي تحويل الإخراج المتوازي 8 بت المرتبطين (SIPO) في منتصف كل بت بيانات. في العدد السادس عشر ، ننتهي بتكوين بت رقمي ، لذلك قمنا بزيادة عداد آخر يتتبع العدد الإجمالي للبتات المتزامنة في (5). عندما يصل هذا العداد إلى 16 (يمكن أن يكون عدادًا عشريًا) ، يتم تعطيل دائرة الاستقبال عن طريق مسح D flip-flop. تفو! أعطي الرسم البياني أدناه ، وآمل أن تتمكن من تتبع منطق عملها باستخدام وصفي.







لسوء الحظ ، ليس لدي راسم ذبذبات ، وفي البداية أعطت دائري بعض النتائج الغامضة ، حيث تقبل بايتًا واحدًا ، ثم تقبل أخرى بطريقة مختلفة. لقد غيرت مذبذب 2.4576 ميغاهرتز إلى مذبذب 555 مدته ثانية واحدة للتحقق من منطق العد ، ووجدت مشكلة في إدخال عائم على أحد العدادات (كنت أقوم بتصحيح الأخطاء باستخدام مصابيح LED). لقد قمت بربط كل من دبابيس إعادة تعيين العداد بالإشارة RX_active ، مما تسبب في تبديل العدادات بين التشغيل وإعادة التعيين ، مما يؤدي إلى مسح ناتجها في نهاية كل دورة الحصول على البيانات. تعمل العدادات الآن كما هو متوقع ، وعندما أعدت المذبذب إلى 2.4576 ميجا هرتز بدأ كل شيء في العمل بشكل صحيح وموثوق.



سيكون لدائرة الكمبيوتر النهائية على اللوح سجل إخراج للتحكم في إخراج البيانات إلى الناقل. أخيرًا ، استخدمت D-flip-flop إضافيًا على 74LS74 لتنفيذ إشارة RX_READY ، والتي يمكن للمعالج قراءتها للتحقق مما إذا كانت البايتة جاهزة للقراءة (هذا صحيح فقط عندما يتم استلام البايت بالكامل).



يوجد أدناه صورة للكمبيوتر المجمع والعمل. واجهة UART-USB هي الدونجل في أعلى اليمين. تحتوي اللوحة الوسطى على مذبذب بلوري وعدادات 4 بت تولد نبضات مختلفة على مدار الساعة. في الجزء العلوي ، بجانب طاقة USB ، يوجد سجل إزاحة 16 بت. تحتوي اللوحة اليسرى على منطق الإرسال المتحكم فيه لبايت واحد (UART TX). يمكنك أن ترى الزر الذي قمت بمحاكاة إشارة التحكم في المعالج من خلاله ومؤقت 555 ، والذي يعمل كنبض ساعة المعالج. توجد وحدة UART RX على اللوحة اليمنى. تشير مصابيح LED الخضراء إلى استلام بايت عند الإدخال ، وتشير مصابيح LED الصفراء إلى استقبال البيانات (إشارة مشغول UART RX) ، وتضيء مصابيح LED الحمراء عندما يكون البايت جاهزًا لقراءة المعالج.





تبحث عن أجمل الألواح ومهارات الأسلاك



إضافة



لقد قمت بتحسين الدائرة قليلاً (على طول الطريق ، بعد أن تعلمت درسًا حول الفرق بين معالجة الأحداث غير المتزامنة والمتزامنة في منطق IC المنفصل). أردت تقليل عدد الرقائق باستخدام عداد عشري يحسب البتات الواردة ، ويحسب في 10 بتات وليس 16. ثم يمكنني إزالة سجل الإزاحة.



جربت عداد 74LS162 لأول مرة. لبايت واحد ، نجح كل شيء ، لكنني اكتشفت بسرعة أن لديها آلية إعادة تعيين متزامنة - أي أنها تستغرق دورة ساعة واحدة لإعادة ضبط الإشارة. منذ أن توقفت الساعة بعد استلام آخر بت ، لم يتم مسح العداد. كان للعداد 74LS161 4 بت الذي أزلته إعادة تعيين غير متزامن ، لذلك كان كل شيء يعمل من قبل. من الجيد أننا وجدنا عدادًا عشريًا مع إعادة تعيين غير متزامن - 74LS160. كل شيء يعمل بشكل جيد معه - راجع الرسم التخطيطي المحدث.







التحقق من وجود أخطاء في البايت المستلم



للتبسيط ، لم أقم بإضافة أي تدقيق للأخطاء في البايت الناتج. يمكنك أن تتخيل أننا أضفنا بت التكافؤ وقمنا بتبديل flip-flop في كل مرة يتم فيها تلقي الرقم "1". ثم سنعرف ما إذا كنا قد تلقينا عددًا زوجيًا أو فرديًا من البتات ، ويمكننا مقارنته بتكافؤ من خلال ضبط العلم على عدم تطابق. بالإضافة إلى ذلك ، يمكن أن يشمل ذلك التحقق من أن بت الإيقاف يساوي "1". لتوفير مساحة ، لم أقم بإضافة هذه الوظيفة ، لكنني أريد إضافتها في المستقبل. تسمح لك نمطية المشروع بالقيام بذلك حسب الحاجة.



ملاحظات



أحب أجهزة الكمبيوتر ذات 8 بت على ألواح التجارب واستمتعت بالقيام بهذا المشروع الصغير. لقد كنت أصمم هذه الدائرة لبعض الوقت ، وما زلت أشعر بالصدمة عندما وضعتها معًا وعمل كل شيء. هذا نوع من السحر! تقريبيا.



All Articles