نستخرج الثوابت من بلورة المعالج الرياضي 8087

في عام 1980 ، قدمت Intel شريحة 8087 لتسريع معالجة أرقام النقطة العائمة على معالجات 8086 ، وتم استخدامها في كمبيوتر IBM الأصلي. بما أن المعالجات الدقيقة الأولى عملت فقط مع الأعداد الصحيحة ، فإن الحساب بأرقام الفاصلة العائمة كان بطيئًا ، ومع الوظائف التجاوزية مثل ظل الزاوية أو اللوغاريتمات ، كانت الأمور أسوأ. كانت إضافة رقاقة المعالج 8087 إلى النظام قادرة على تسريع العمليات بأرقام الفاصلة العائمة حتى مائة مرة.

فتحت شريحة 8087 والتقطت بعض الصور لها تحت المجهر. تظهر الصورة أدناه بلورة صغيرة من رقاقة السيليكون. على جانبها ، تقوم الموصلات الصغيرة بتوصيلها بـ 40 أرجل خارجية. تم ترميز الكتل الوظيفية الرئيسية في الصورة بفضل الهندسة العكسية. إذا درست الشريحة بعناية ، يمكنك استخراج ثوابت مختلفة من ROM - أرقام مثل π التي تستخدمها الشريحة في الحسابات. شريحة Intel 8087 لتشغيل النقطة العائمة مع كتل الوظائف الرئيسية المميزة. تم وضع علامة ROM مع الثوابت باللون الأخضر. قابل للنقر.




في النصف العلوي من الشريحة توجد دوائر تحكم. قد يتطلب الأمر ما يصل إلى 1000 خطوة لتنفيذ تعليمات النقطة العائمة ؛ استخدم 8087 الرمز الصغير لوصف هذه الخطوات. في صورة الكريستال يمكنك رؤية "الآلية" التي أطلقت البرنامج من الرمز الصغير. في الواقع ، إنها وحدة معالجة مركزية بسيطة. بجانبه ROM كبير ، حيث يتم تخزين الرمز الصغير.

في الجزء السفلي من الشريحة توجد دوائر تعالج أرقام النقطة العائمة. يتكون رقم الفاصلة العائمة من جزء كسري (يُعرف أيضًا بجزء هام من رقم أو عشري) ، وأسي ، وبت إشارة. في التدوين العشري ، الرقم 6.02 × 10 236.02 سيكون العشري و 23 سيكون الأس. تعالج دوائر الشريحة المنفصلة في نفس الوقت الجزء العشري والأس. يدعم نظام معالجة الجزء العشري قيم 67 بت - الجزء العشري 64 بت وثلاث بتات إضافية للدقة. من اليسار إلى اليمين ، تتكون مخططات عملية العشري من ROMs مع ثوابت ، وسجل التحول ، و adder / طرح ، ومكدس تسجيل. موضوع هذه المقالة هو ROM مع الثوابت ؛ في الصورة مظللة باللون الأخضر.

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

لن أقول بالتفصيل العمل الداخلي لـ 8087 ، ولكن بشكل عام ، يتم تنفيذ عمليات الفاصلة العائمة من خلال عمليات الجمع والطرح وتحولات الأعداد الصحيحة. لإضافة أو طرح رقمين للفاصلة العائمة ، يغير 8087 الأرقام حتى تتم محاذاة الفواصل الثنائية (مثل الفواصل العشرية فقط في النظام الثنائي) ، ثم تضيف أو تطرح الجزء العشري. يتم إجراء الضرب والقسمة وأخذ الجذر التربيعي من خلال التحولات والإضافات / الطرح المتتالية. تستخدم الدالات التجاوزية (الظل ، الظل المماس ، اللوغاريتم ، الدرجة) خوارزميات CORDIC ، التي تستخدم التحولات والإضافات للثوابت الخاصة لزيادة كفاءة العمليات الحسابية.

تنفيذ ROM


توضح هذه المقالة ROM حيث يتم تخزين الثوابت. لا تخلط بينه وبين ROM أكبر من أربعة مستويات حيث يتم تخزين الرمز الصغير - يتم تنفيذ هذا الأخير باستخدام تقنية غير عادية تخزن بتتين لكل ترانزستور. يتم ذلك باستخدام ترانزستورات ذات ثلاثة أحجام مختلفة أو عدم وجود ترانزستور في كل موضع. تشير هذه الخيارات الأربعة إلى بتين. كانت هناك حاجة إلى هذه التقنية المعقدة من أجل احتواء ذاكرة ROM كبيرة على شريحة 8087.

تستخدم ROM للثوابت تقنيات قياسية لتخزين الثوابت (مثل π و ln (2) و √2) التي تتطلبها 8087 للحسابات. تظهر الصورة أدناه جزءًا من ROM مع الثوابت. لرؤية البلورة نفسها ، تمت إزالة طبقة معدنية منها. المناطق الوردية هي السيليكون مع الشوائب التي تمنحه خصائص مختلفة ، والخطوط المحمرة والخضراء هي البولي سيليكون ، وهو نوع خاص من أسلاك السيلكون يقع في الأعلى. انتبه إلى هيكل ROM ، على غرار الشبكة الصحيحة. يتكون ROM من عمودين من الترانزستورات بتخزين البتات. لشرح مخطط عملها ، سأبدأ بمخطط الترانزستور.


جزء من ROM مع ثوابت ، مع طبقة معدنية تمت إزالتها. يتم استخدام ثلاثة أعمدة من الترانزستورات الأكبر لتحديد الصفوف.

عادة ما كانت الدوائر المتكاملة عالية الكثافة (ICs) في السبعينيات مصنوعة عادةً من ترانزستورات N-MOS. (أجهزة الكمبيوتر الحديثة مصنوعة من CMOS ، وتتكون من N-MOS و P-MOS عكس قطبية لهم). يوضح الرسم البياني أدناه هيكل الترانزستور N-MOS. يتم تجميع IC من الركيزة السليكونية التي يتم إنشاء الترانزستورات عليها. تضاف الشوائب إلى مواقع السليكون ، مما يخلق مناطق "منتشرة" بالخصائص الكهربائية المطلوبة. يمكن التفكير في الترانزستور على أنه مفتاح يسمح للتيار بالتدفق بين قسمين من الانتشار ، والذي يسمى المصدر والصرف. يتم التحكم في الترانزستور بواسطة بوابة مصنوعة من نوع خاص من السيليكون - البولي سيليكون. تطبيق الجهد على البوابة يسمح للتيار بالتدفق بين المصدر والصرف ؛ خلاف ذلك ، لا تدفقات التيار. 8087 معقد للغاية ، مع حوالي 40،000 ترانزستور عليه.

تعطي المصادر المختلفة عددًا مختلفًا من الترانزستورات لـ 8087: تقول Intel حوالي 40،000 ، تقول ويكيبيديا حوالي 45000. ربما يكون الأمر برمته في طرق حساب مختلفة. نظرًا لأن عدد الترانزستورات في ROM أو PLA أو بنية أخرى مماثلة يعتمد على البيانات المخزنة ، غالبًا ما تشير المصادر إلى عدد الترانزستورات "المحتملة" بدلاً من الحقيقية. يمكنك أيضًا التفكير في ترانزستورات السحب أو عدم التفكير فيها ، أو اعتبار محركات التيار العالي ترانزستورًا واحدًا أو عدة ترانزستور موازية.


تم تنفيذ هيكل MOS في IP

من خلال التكبير ، يمكن اعتبار الترانزستورات ROM الفردية. المناطق الوردية هي السيليكون التي تحتوي على شوائب تشكل مصادر ومصارف. البوليسيليكون عمودي اختيار خطوط الحافلات تشكل بوابات الترانزستور. ترتبط مناطق السيليكون المميزة بالأرض ، وتسحب جانبًا واحدًا من كل ترانزستور. الدوائر هي VIA ، وهي عبارة عن طبقات بين السليكون والإطارات المعدنية أعلاه. للصور ، تتم إزالة الإطارات المعدنية. يظهر مكان واحد منهم بالخط البرتقالي.


جزء من ROM مع ثوابت. يختار كل ناقل أخذ عينات ثابت محدد. يتم عرض الترانزستورات باللون الأصفر. يشير X إلى الترانزستور المفقود المقابل للبت 0. يشير الخط البرتقالي إلى موقع الموصل المعدني.

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

محتويات ROM


يتكون ROM مع الثوابت من 143 صفًا و 21 عمودًا. يحتوي على 134 صفًا من 21 بت ، باستثناء قطعة واحدة من 6 × 6 ترانزستورات في أعلى اليسار. لذلك ، فإن الحجم المادي لـ ROM مع الثوابت هو 2946 بت.



استنادًا إلى مخطط ROM ، يعني المقطع المفقود أن الثوابت الـ 12 الأولى هي 64 بت وليس 67 بت. هذه ثوابت لا تتعلق بـ CORDIC ، ويبدو أنها لا تتطلب دقة إضافية.

تحت المجهر ، يظهر نمط بت ROM ، بحيث يمكن إزالته من هناك. ومع ذلك ، ليس من الواضح على الإطلاق كيفية تفسير هذه القطع لاحقًا. السؤال الأول هو ما إذا كان وجود الترانزستور يشير إلى 0 أو 1 (اتضح فيما بعد أن وجود الترانزستور هو 1). المشكلة الثانية هي كيفية ترجمة شبكة 134 × 21 بت إلى قيم.

يمكن تعريف ترميز البت بطريقتين. الأول هو تتبع الدائرة قراءة البيانات من ROM ومعرفة كيفية استخدامها. والثاني هو البحث عن الأنماط في البيانات الأولية ومحاولة فهمها. نظرًا لأن 8087 معقد جدًا ، فقد أردت تجنب الهندسة العكسية الكاملة عند دراسة الثوابت ، لذلك استخدمت النهج الثاني.

يتكون مسار بيانات الشريحة من 67 صفًا أفقيًا ، لذلك كان من الواضح أن 134 صفًا في ROM تتوافق مع مجموعتين من الثوابت 67 بت. استخرجت مجموعة واحدة من الثوابت من السلسلة الفردية ، والأخرى من السلسلة الزوجية ، ولكن القيم التي تم الحصول عليها لم تكن منطقية. التفكير أكثر قليلاً ، أدركت أن الصفوف لم تتغير ، لكنها سار في تكرار ترتيب ABBA.

ذهبت الصفوف بالترتيب ABBAABBAABBA ... ، حيث تحتوي الصفوف A على بت لمجموعة واحدة من الثوابت ، والصفوف B تحتوي على بت لمجموعة أخرى. تم استخدام هذه الدائرة بدلاً من تبديل ABAW ببساطة ، ربما لأن جهة اتصال واحدة يمكن أن تتحكم في ترانزستورات متجاورة. أي أنه يمكن لموصل واحد تحديد كل مجموعة من المجموعات AA و BB.

عندما أخذت في الاعتبار ترتيب ABBA ، حصلت على مجموعة من الثوابت المألوفة ، بما في ذلك π و 1. يوضح الرسم البياني أدناه البتات من هذه الثوابت. في الصورة ، البتة 1 عبارة عن شريط أخضر ، البتة 0 حمراء. في النظام الثنائي ، π هي 11.001001 ... ، وهذه القيمة مرئية في الصف العلوي من البتات المميزة. القيمة الدنيا ثابتة. 1.


الصف العلوي من البتات هو الرقم lower ، والجزء السفلي هو 1. يتم تدوير هذا الرسم البياني 90 درجة مقارنة بالباقي.

الصعوبة التالية في التفسير هي أنه يتم تخزين الجزء العشري فقط في ROM ، ولكن ليس الأس (حتى الآن لم أجد ذاكرة ROM منفصلة مع الأسس). وجربت العديد من العارضين حتى حصلت على قيم ذات مغزى. كان بعضها واضحًا على الفور: على سبيل المثال ، يعطي الثابت 1.204120 log 10 (2) باستخدام الأس 2 -2 . كان البعض الآخر أكثر صعوبة في الفهم ، على سبيل المثال ، 1734723. في النهاية ، أدركت أن 1.734723 × 2 59 = 10 18 . لماذا يوجد مثل هذا الثابت في 8087؟ ربما لأن 8087 يدعم كود ثنائي عشري معبأ من 18 حرفًا.

كان من الصعب جدًا العثور على بعض الأسس ، ولقد استخدمت طريقة القوة الغاشمة لمعرفة ما إذا كانت النتيجة ستسفر عن أي لوغاريتم أو درجة من رقم ما. كان أصعب شيء هو تحديد الثابت لـ ln (2) / 3. أهمية هذا الرقم ليست واضحة بالنسبة لي.

فيما يلي القائمة الكاملة للثوابت من ROM. عمود "المعنى" هو وصفي للمعنى.

الثوابتالقيمة العشريةالمعنى
1.204120 × 2 -20.3010300تسجيل 10 (2)
1.386294 × 2 -10.6931472ان (2)
1.442695 × 2 01.426950تسجيل 2 (هـ)
1.570796 × 2 13.1415927π
1.000000 × 2 01.0000001
1.660964 × 2 13.219281تسجيل 2 (10)
1.734723 × 2 591.00 هـ + 1810 18
1.734723 × 2 591.00 هـ + 1810 18
1.848392×2-30.2310491ln(2)/3
1.082021×224.2808513*log2(e)
1.442695×201.426950log2 (e)
1.414214×201.4142136√2
1.570796×2-10.7853982atan(20)
1.854590×2-20.4636476atan(2-1)
2.000000×2-150.0000610atan(2-14)
2.000000×2-160.0000305atan(2-15)
1.959829×2-30.2449787atan(2-2)
1.989680×2-40.1243550atan(2-3)
2.000000×2-130.0002441atan(2-12)
2.000000×2-140.0001221atan(2-13)
1.997402×2-50.0624188atan(2-4)
1.999349×2-60.0312398atan(2-5)
1.999999×2-110.0009766atan(2-10)
2.000000×2-120.0004883atan(2-11)
1.999837×2-70.0156237atan(2-6)
1.999959×2-80.0078123atan(2-7)
1.999990×2-90.0039062atan(2-8)
1.999997×2-100.0019531atan(2-9)
1.441288×2-90.0028150log2(1+2-9)
1.439885×2-80.0056245log2(1+2-8)
1.437089×2-70.0112273log2(1+2-7)
1.431540×2-60.0223678log2(1+2-6)
1.442343×2-110.0007043log2(1+2-11)
1.441991×2-100.0014082log2(1+2-10)
1.420612×2-50.0443941log2(1+2-5)
1.399405×2-40.0874628log2(1+2-4)
1.442607×2-130.0001761log2(1+2-13)
1.442519×2-120.0003522log2(1+2-12)
1.359400×2-30.1699250log2(1+2-3)
1.287712×2-20.3219281log2(1+2-2)
1.442673×2-150.0000440log2(1+2-15)
1.442651×2-140.0000881log2(1+2-14)


لست متأكدًا من سبب تكرار 10 18 - ربما يكون الفرق أسيًا.

جسديا ، توجد الثوابت في ثلاث مجموعات. المجموعة الأولى هي القيم التي يمكن للمستخدم تحميلها (1 ، π ، تسجيل 2 10 ، سجل 2 هـ ، تسجيل 10 2 ، و ln) ، بالإضافة إلى قيم للاستخدام الداخلي (10 18 ، ln (2) / 3 ، 3 * تسجيل 2 (هـ) ، تسجيل 2 (هـ) و √2). تتكون المجموعة الثانية من 16 ثوابت ظلمة ، والثالثة تتكون من 14 ثوابت لوج 2 .

في 8087 ، هناك سبع تعليمات لتحميل الثوابت مباشرة. التعليمات FDLZ و FLD1 و FLDPI و FLD2T و FLD2E و FLDLG2 و FLDLN2 تقوم بتحميل الثوابت 0 ، 1 ، π ، تسجيل 2 10 ، تسجيل 2 على المكدسe ، تسجيل 10 2 و ln 2 ، على التوالي. يتم تخزين جميع هذه الثوابت باستثناء 0 في ROM.

يتم استخدام المجموعتين الأخيرتين من الثوابت لحساب الدالات التجاوزية باستخدام خوارزميات CORDIC.

خوارزميات CORDIC


من خلال الثوابت من ROM ، يمكنك العثور على بعض التفاصيل عن تشغيل خوارزميات 8087. يحتوي ROM على 16 قيمًا للظل المظلل ، والمظللات من 2- n . كما يوجد 14 لوغاريتمات مخزنة على القاعدة 2 (1 + 2 -n ). قد تبدو هذه القيم غير عادية ، لكنها تستخدم في خوارزمية CORDIC الفعالة ، التي تم اختراعها في عام 1958.

إن فكرة CORDIC هي أن المماس والظل المنعكس يمكن حسابهما عن طريق كسر الزاوية إلى أخرى أصغر مع دوران المتجه بهذه الزوايا. الحيلة هي أنه إذا اخترت الزوايا الأصغر الصحيحة ، فيمكن حساب كل دوران من خلال التحولات والإضافات الفعالة بدلاً من الدوال المثلثية. افترض أننا بحاجة إلى إيجاد tan (z). يمكننا تقسيم z إلى مجموع الزوايا الصغيرة: z ≈ {atan (2 -1 ) أو 0} + {atan (2 -2) أو 0} + {atan (2 -3 ) أو 0} + ... + {atan (2 -16 أو 0}. يمكنك تدوير المتجه ، على سبيل المثال ، atan (2 -2 ) بالضرب في 2 -2 والإضافة. خلاصة القول هي أن الضرب في 2 -2 يتم من خلال تحول أحادي سريع ، مع أخذ كل هذا في الاعتبار ، يمكنك حساب tan (z) بمقارنة z مع ثوابت atan ، ثم بعد مرور 16 دورة من الإضافات والتحولات ، والتي تتم بسرعة على الحديد. بالنسبة لـ atan يتم حسابها مسبقًا وتخزينها في ROM. يتم حساب Arctangent بطريقة مماثلة ، ولكن العكس - في عملية الدوران ، يتم تلخيص الزوايا (من ROM مع الثوابت) وإعطاء الزاوية النهائية.

عند حساب اللوغاريتم والأُس ، تُستخدم أيضًا خوارزميات CORDIC والثوابت اللوغاريتمية المقابلة لها. الشيء الرئيسي هنا هو أن الضرب بواسطة (1 + 2 -n ) يمكن إجراؤه بسرعة بمساعدة التحولات والإضافات. يمكن حساب اللوغاريتم والأُس عن طريق ضرب أحد طرفي المعادلة بتسلسل قيم وإضافة الثوابت اللوغاريتمية المقابلة إلى الجانب الآخر. وفقًا لخوارزميات حساب اللوغاريتم وأسي الوثائق لـ 8087 ، لم أجدها. أعتقد أنها تشبه تلك الموصوفة في المقالة التالية ، 8087 فقط يستخدم القاعدة 2 بدلاً من e. لا أفهم لماذا لا يحتوي 8087 على ثابت log 2 (1 + 2 -1 ) اللازم لهذه الخوارزمية.

دعم الوظائف التجاوزية في 8087 ليس واسع النطاق كما تتوقع. وهو يدعم المماس المماس والقوس فقط ، بدون جيب وجيب التمام. لحساب الأخير ، من الضروري تطبيق الهويات المثلثية. اللوغاريتمات والدعاة يدعمون فقط القاعدة 2 - للقواعد 10 أو e سيكون على المستخدم تطبيق عامل مقياس. في وقت واحد ، قام 8087 بتوسيع حدود سعة الرقائق ، لذلك تم تقليل عدد التعليمات.

استنتاج


8087 رقاقة معقدة ، للوهلة الأولى تبدو متاهة متشابكة بشكل ميئوس منه. ومع ذلك ، في معظم الأحيان ، يمكن فهمه بعد دراسة متأنية. يتم تخزين 42 ثوابت في ROM ، ويمكن استخلاص قيمها باستخدام المجهر. كان من المتوقع وجود بعض الثوابت (مثل π) ، بينما يثير البعض الآخر (مثل ln (2) / 3) المزيد من الأسئلة. يتم استخدام العديد من الثوابت لحساب المماس ، والظلال ، واللوغاريتمات ، والدرجات باستخدام خوارزميات CORDIC. صورة من الكريستال 8087 بدون طبقة معدنية. قابل للنقر.




على الرغم من تقديم Intel 8087 لعملية النقطة العائمة قبل 40 عامًا ، إلا أن تأثيرها لا يزال ملموسًا. لقد أنتج معيار IEEE 754 لأرقام النقطة العائمة ، المستخدمة في معظم الحسابات الحسابية ، وتظل تعليمات 8087 جزءًا من معالجات x86 المستخدمة في معظم أجهزة الكمبيوتر.

All Articles