بخشی از مقاله
چكيده
در اواسط دهه 70 ريزپردازنده ها ساختار ساده اي داشتند و در اين زمان هر ريزپردازنده از يك واحد پردازشگر مركزي (cpu) و يك تراشه LSI (شامل 5/000 ترازيستور) تشكيل شده بود و با فركانس 1 تا 5 مگاهرتز در يك سيستم 8 بيتي كار مي كرد و اين ريزپردازنده ها داراي 2 الي 7 ثبات 8 بيتي بودند. به خاطر قيمت و بهاي اندك و اندازه كوچك ريزپردازنده ها، در بيشتر سيستم هاي كامپيوتري از آنها استفاده مي شد و به جائي رسيد كه جايگزين سيستم هاي mainframe و ميكروكامپيوترها شدند. با ظهور ريزپردازنده ها هر خانه اي داراي يك كامپيوتر ديجيتالي است.
از دهه 70 به بعد ريزپردازنده ها تغييرات زيادي كرده اند و در دهه 90 ريزپردازنده ها 32 بيتي تا 64 بيتي شدند. و با فركانس هايي از 25 تا 200MHZ كار مي كردند و عملاً داراي تراشه هايي با سه ميليون ترازيستور بودند (VLSI). اكثر اين ريزپردازنده ها قادر بودند بيشتر از يك دستورالعمل را در يك چرخه اجرا كنند. تمامي ريزپردازندههاي پيشرفته داراي يك تراشه FPU هستند و اكثر آن ها داراي 16تا 32 ثبات همه منظوره در CPU و يك رجيستر فايل با 32 ثبات براي IU و يك رجيستر فايل با 32 ثبات جداگانه براي FPU هستند.
خيلي از ريزپردازنده ها براي عمليات شناور و عمليات صحيح داراي Operational Unit هستند و مقدار قابل توجهي Cache دارند. در اكثر آنها Cache شامل Cache داده و Cache دستورالعمل است . كارآيي ريزپردازنده هاي پيشرفته امروز مساوي يا بيشتر از Mainframe و يا سوپر كامپيوترهاي دوران قبل مي باشد.
تعداد زيادي كارخانه سازنده ريزپردازنده وجود دارد كه داراي ويژگي هاي خاص خود مي باشند و دو گروه از گسترده ترين خانواده ريزپردازنده كه در دهه 70 ساخته شده اند عبارتند از اينتل X86 يا 80X86 و خانواده موتورولا M680X0.
نزديك به دهه 80 ما شاهد يك توسعه موازي روي معماري هاي جديد بوده ايم كه تمايل به كامپيوترهائي با مجموعه دستورالعمل كاهش يافته يا RISC بوده اند. خانواده هاي اينتل X86 و موتورولا M68000 از كلاس غيرRISC يعني كامپيوترهايي با مجموعه دستورهاي پيچيده يا CISC تشكيل شده اند.
اينتل، يك ريزپردازنده 4 بيتي به نام 4004 در سال 1971 شروع كرد كه در يك ماشين حساب معمولي بكار ميرفت، و به آساني محاسبات BCD را انجام ميداد. در سال 1972 ريزپردازنده 8 بيتي 8008 توسعه يافت و در سال 1974 يك ريزپردازنده قدرتمند 8 بيتي به نام 8080 تولد يافت و به دنبال آن 8085 در سال 1976 به بازار آمد. بخشي از معماري 8085/8080 همانند مجموعه ثبات ها در خانواده X86 همچنان استفاده مي شود. اينتل ساخت ريزپردازنده هاي خانواده X86 را با يك ريزپردازنده 16 بيتي به نام 8086 در 1978 آغاز كرد و عملاً تمامي كارخانه هاي معروف ريزپردازنده هاي 16 بيتي بعد از دهه 70 و تا نزديك دهه 80 از يك تراشه ارزان قيمت و يك گذرگاه خارجي 8 بيتي با يك معماري داخلي 16 بيتي استفاده مي كردند.
در سال 1969 ريزپردازنده 8080 با باس خارجي 8 بيتي و گذرگاه داخلي 16 بيتي ايجاد شد و براي گذرگاه داده خود 50% به تراشه هاي مياني كمتري در مقايسه با پردازنده هاي 16 بيتي نياز داشتند و هزينه آن ها نيز كمتر بود.
در واقع 8080 به پردازنده اصلي شركت IBM روي كامپيوتر هاي شخصي (PC) تبديل و در تمامي توليدات بعدي در جهان منتشر گرديد. به دنبال 8086، تكامل يافته آن يعني 80186 ساخته شد كه همان 8086 همراه با تعدادي اينترفيس I/O و واحدهاي منطقي وي يك تراشه بود و تعداد كمي دستورالعمل به آن اضافه شده بود.
وقتي 80286 به عنوان يك ريزپردازنده 16 بيتي در سال 1982 شناخته شد، مرحله جديدي در توسعه ريزپردازنده ها پديد آمد كه قابليت Protected Mode ناميده شد. اين شيوه در تمامي محصو.لات ديگر خانواده اينتل بكار گرفته شد.
اولين پردازنده 32 بيتي اينتل در سال 1985 بود كه i386 نام داشت. اينتل يك پردازنده 32 بيتي به نام 432 كه با خانواده X86 ناسازگار بود را زودتر از دهه 80 بيرون داده بود كه هرگز تجاري نشد. در سال 1989 ريزپردازنده i486 توسعه يافت كه سرعت عملكرد آن در مدل DX2 به 66MHZ ميرسيد. i486 داراي يك واحد FPU و يك Cache به اندازه 8KB در داخل تراشه است.
محصول بعدي خانواده اينتل پنتيوم بود كه در سال 1993 ساخته شد و قبل از گسترش به آن i586 يا P5 گفته مي شد اما اينتل تصميم گرفت نام آن را پنتيوم بگذارد. پنتيوم يك سوپر اسكالر دو سطحي است يعني دو دستورالعمل را موازي واكشي و كدگشايي و اجرا مي كند و داراي گذرگاه داخلي 64 بيتي و يك cache به اندازه 16KB است(8K data cache + 8K inst.cache).
اينتل مرتباً روي محصولات بعدي كار مي كرد و P6 ناميده شد كه طبق وعده آن كارآيي پنتيوم را حد اقل 2 برابر كرد و پس از آن به ترتيب Pentium II، Pentium III و Pentium IV نيز ساخته شدند.
توسعه ريزپردازنده هاي موتورولا نيز شبيه اينتل است. موتورولا در سال 1974 خانواده 8 بيتي 6800 را ايجاد كرد كه در سال 1977 به يك محصول 8 بيتي ويژه به نام 6809 تبديل شد. موتورولا نخستين ريزپردزنده 16 بيتي خود را در سال 1979 به نام M68000 به بازار عرضه كرد. از ويژگي هاي مهم خانواده M68000 آن است كه ريزپردازنده MC68000 به طور پايه اي يك سيستم 16 بيتي با گذرگاه داده 16 بيتي و 16 ثبات پردازنده UPRS و شمارنده برنامه 32 بيتي است. در سال 1984 ريزپردازنده 32 بيتي MC60000 ناميده شد. هم چنين موتورولا روايت هاي توسعه يافته محصولات MC68000 را تحت عنوان MC68010 .و MC68012 ايجاد كرد. MC68010 از نظر پايه ها كاملاً با MC68000 سازگار بود بنابراين از نظر طراحي سيستم، يك MC68000 مي توانست با يك MC68010 جايگزين شود.
موتورولا ساخت ريزپردازنده هاي 32 بيتي خانواده M68000 را در سال 1984 با نام MC68020 شروع كرد. اين ريزپردازنده ها در سال 1978 به ريزپردازنده MC68030 و در سال 1989 به MC68040 توسعه پيدا كردند. 68020 داراي يك Cache دستور كوچك 256 بايتي در داخل تراشه بود. 68030 داراي يك حافظه Cache دستور كوچك 256 بايتي در داخل تراشه بود. 68030 داراي يك حافظه Cache دوگانه نسبتاً كوچك (256 data + 256 B inst.) .و 68040 داراي Cache 4KB دستور و Cache 4KB داده در يك تراشه مي باشد.
عضو بعدي خانواده M68000 كه در سال 1994 ساخته شد MC68060 نام گرفت كه يك سوپر اسكالر 2 سطحي با Cache 8KB دستور و Cache داده در تراشه بود و دستورالعمل ها با سرعت 66MHZ كار مي كرد.
البته چندين خانواده از ريزپردازنده ها وجود دارد كه به آن ها اشاره اندكي خواهد شد، مانند Z-80 مربوط به شركت Zilog كه ريزپردازنده معر وف 8 بيتي است و توسط گروهي از طراحان متخصص اينتل كه 8080 و 8085 را ساخته بودند ايجاد شد و از اينرو Z-80 شبيه معماري اينتل 8080 است ولي زبان اسمبلي هر دو متفاوت مي باشد و Z-80 داراي دستورهاي بيشتري نسبت به 8080 است. شركت Zilog خانواده 16 بيتي خود را با نام Z8000 موازي با اينتل 8086 منتشر كرد و Z80000 يك محصول 32 بود كه به توليد نرسيد.
توسعه ريزپردازنده هاي RISC به شكل مو ازي با اينتل و موتورولا انجام شد. اولين مستندات RISC در دانشگاه بركلي در سال 1980 توسط Pattersonو Ditzel ارايه شد و لغت RISC توسط كارلو اسكوئين لرپرت اولين مقاله RISC عنوان شد. طراحيس سيستم محاسباتي از نوع RISC بدون استفاده از واژه RISC خيلي پيشتر توسط IBM در دهه 70 آغاز شد كه با نام IBM801 شناخته مي شد. هم چنين دانشگاه استنفورد در سال 1981 سيستم RISC خود را ايجاد كرد و به نام MIPS (Microprocessor without interlocked Pipeline Stage) ناميد.
شركت MIPS روايت هاي تجاري را تحت خانواده RX000 (X=6,4,3,2) منتشر ساخته است. در برخي از خصوصيات اوليه طرح RISC بركلي در Sparc از شركت Sun Micro System به كار رفته است. شركت اينتل خانواده RISC خود را با نامI860 و شركت موتورولا با نام M88000 شروع كردند. شركت IBM كامپيوتر RISC خود را با نام ROMP (Research Office Product Division Microprocessor) ادامه داد و به سيستم RS6000 منجر شد. معماري RS6000 با خصوصيت جديد ريزپذدازنده هاي IBM و موتورولا و اپل تركيب شد و Power PC ساخته گرديد. اولين محصول 601 است كه در 1991 منتشر شد و به دنبال آن 620 با توانائيهاي بيشتري ايجاد گرديد.
Intel 8086
در اين فصل معماري داخلي، شيوه هاي آدرس دهي، مجموعه دستورالعمل ها و تكنيك هاي I/O مرتبط با ريزپردازنده 8086 را معرفي خواهيم كرد.
مقدمه
8086 اولين ريزپردازنده 16 بيتي اينتل بود. طراحي آن بر اساس 8080 ولي مستقيماً با آن سازگار نبود. 8086 با استفاده از فناوري HMOS طراحي شده بود و شامل 29000 ترانزيستور بود. 8086 در يك بسته 40 پايه اي قرار داشت و با منبع تغذيه +5V كار مي كرد. 8086 در سه مد و سرعت مختلف Clock كار مي كند. 8086 استاندارد با فركانس كلاك داخلي 5MHZ و 8086-2 و 8086-4 با فركانس هاي داخلي به ترتيب 4MHZ , 8 كار مي كنند. به همين دليل از يك مولد / درايور تراشه مثل Intel 8284 براي توليد سيگنال ورودي كلاك 8086 استفاده مي شود. 8086 كلاك خارجي در پايه CLK را به 3 تقسيم مي كند. اين جمله به اين معني است كه براي كلاك داخلي 5MHZ، 8284 بايد كلاك خروجي 15MHZ را توليد كند تا به پايه CLK تراشه 8086 متصل شود.
8086 داراي آدرس 20 بيتي است و از اينرو مي توان حداكثر تا 220 dh 1MB از حافظه را آدرس دهي كند. 8086 از حافظه قطعه بندي شده استفاده مي كند. نكته جالب توجه در 8086 اين است كه مي تواند حداكثر تا 6 بايت دستورالعمل را از حافظه پيش واكشي (PreFetch) كند و آن ها را به ترتيب به صف كند و بدين ترتيب سرعت اجراي دستورالعمل را بهبود بخشد.
حافظه ريزپردازنده بر اساس 8086 برحسب بايت پيكره بندي مي شود. هر بايت مي تواند منحصراً با آدرس هاي 20 بيتي آدرس دهي شود. هر كلمه 16 بيتي 8086 شامل هر دو بايت مجاور يكديگر است. بايت آدرس كمتر (L.O.B) و بايت آدرس بيشتر (H.O.B) به شكل زير مي باشند:
بايت با ارزش كمتر بايت با ارزش بيشتر
07H 26H
آدرس
آدرس
بنابراين كلمه 16 بيتي ذخيره شده در آدرس زوج 00520عبارت است از:
اكنون كلمه اي را با آدرس فرد در نظر بگيريد:
L.O.B H.O.B
05H 3FH
آدرس
آدرس
كلمه ذخيره شده در آدرس فرد عباتست از 3F0SH
معماري 8086
همانطوري كه در شكل مي بينيم، ريزپردازنده 8086 از نظر داخلي به دو بخش تابعي جدا تقسيم مي شود. اين دو بخش واحد واسط گذرگاه (BIU) و واحد اجرا (EU) مي باشند. واحد BIU دستورها را واكشي مي كند، داده ها را از حافظه و پورت ها ميخواند و داده ها را به حافظه و پورت هاي I/O مي نويسد. Eu دستورهايي را كه اخيراً توسط BIU واكشي شده اند را اجرا مي كند. وظايف واحدهاي BIU و Eu از يكديگر مستقل هستند. BIU پردازنده 8086 را به دنياي بيرون مرتبط مي سازد. BIU تمامي عمليات گذرگاه خارجي را آماده مي سازد. BIU شامل ثبات هاي سگمنت، اشاره گر به دستور (IP)، صف دستورالعمل و مدارهاي كنترل گذرگاه و توليد آدرس مي باشد و اعمالي چون واكشي و صف بندي دستورها و كنترل گذرگاه را انجام ميدهد.
صف دستور BIU به شكل FIFO است و گروهي از ثبات هايي است كه شامل 6 بايت كد دستور واكشي شده از جافظه هستند. اين امر با توجه به تسريع (Speed up)، اجراي برنامه را با همپوشاني (Over lupping) واكشي دستور با اجرا انجام ميدهد. اين مكانيزم را به عنوان پايپ لاين مي شناسيم. چنانچه صف پر باشد و Eu براي دستيابي بحافظه درخواستي به BIU ندهد، BIU هيچ سيكل گذرگاهي را انجام نمي دهد. از طرف ديگر، اگر BIU پر نباشد و حداقل بتواند دو بايت را ذخيره سازد و Eu درخواستي را براي دستيابي بحافظه ندهد، BIU مي تواند دستورالعمل ها را پيش واكشي كند. هرچند كه اگر BIU براي دستيابي بحافظه توسط Eu وقفه داده شود درحاليكه BIU در حال پردازش واكشي يك دستورالعمل باشد، BIU ابتدا واكشي را كامل مي كند و سپس به Eu سرويس مي دهد. چنانچه دستوري مانند Jump يا Subroutine Call داشته باشيم، BIU صف را reset ميكند و پر كردن مجدد را پس از ارسال دستور جديد به Eu از نو شروع خواهد كرد.
همانطوري كه مي بينيم BIU شامل يك جمع كننده اختصاصي است كه براي توليد آدرس 20 بيتي استفاده مي شود. منطق كنترل گذرگاه BIU تمامي سيگنال هاي كنترل گذرگاه همچون سيگنال هاي خواندن و نوشتن را براي حافظه و I/O توليد مي كند.
BIU داراي چهار ثبات سگمنت 16 بيتي است. اين ثبات عبارتند از:
• ثبات سگمنت كد (CS)
• ثبات سگمنت داده (DS)
• ثبات سگمنت پشته (SS)
• ثبات فوق العاده (ES)
حافظه يك مگابايتي 8086 به سگمنتهايي حداكثر تا 64KB تقسيم ميشود. 8086 مي تواند مستقيماً چهار سگنمت را در يك زمان ويژه (256 كيلوبايت در حافظه يك مگابايتي) آدرس دهي كند. برنامه ها دستيابي به كد و داده را در سگمنت ها با تغيير محتويات ثبات سگمنت براي اشاره كرن به سگمنت هاي مطلوب، فراهم مي سازد. تمامي دستورالعمل هاي جافظه بايد در حافظه اصلي ذخيره شوند كه توسط ثبات 16 بيتي CS و افست 16 بيتي در سگمنتي كه در اشارهگر دستور (IP) 16 بيتي گنجانده شده به آن ااشره مي شود. BIU آدرس فيزيكي 20 بيتي داخلي را به وسيله آدرس منطقي فراهم شده توسط برنامه نويس (16 بيت CS و 16 بيت IP) توليد ميكند. اين كار با شيفت منطقي چهار بيتي CS به چپ و افزودن محتواي 16 بيتي IP توليد مي شود. به عبارت ديگر CS توسط BIU براي توليد آدرس فيزيكي 20 بيتي در 16 ضرب مي شود. به اين معني كه تمامي دستورالعمل هاي برنامه نسبت به محتويات CS در 16 ضرب شده و سپس به آفست به دست آمده از 16 IP بيتي اضافه ميشود.
دقت كنيد كه براي آدرس هاي كلمه، برنامه نويس از آدرس هاي مرتبه كمتر (زوج يا فرد) براي مشخص ساختن كلمه 16 بيتي استفاده مي كند.
8086 هميشه به يك كلمه 16 بيتي به / از حافظه دستيابي پيدا مي كند. 8086 مي تواند در صورتيكه اولين بايت كلمه در آدرس زوج واقع شده باشد، در يك عمليات كلمه 16 بيتي را بخواند. به عبارت ديگر اگر اولين بايت كلمه يك آدرس فرد باشد، 8086 بايد دو دستيابي به حافظه را براي خواندن دو بايت متوالي از حافظه انجام دهد. در اين حالت 8086 از بايت يا بايت هايي كه مورد نظرش نيست صرفنظر مي كند. بطور مثال، دستور ADDR و MOV BX را در نظر بگيريد. دقت كنيد وجود X (H يا L) به دنبال ثبات 8086 نشان دهندة آن است كه انتقال 16 بيتي يا 8 بيتي است.
اين دستور محتواي مكان حافظه 20 بيتي آدرس دهي شده فيزيكي را كه توسط ADDR آدرس دهي مي شود به ثبات 16 بيتي BX منتقل مي كند. اگر ADDR آدرس 20 بيتي زوج مثل باشد دستور MOV محتواي BL را با محتواي خانه حافظه و محتوي ثبات BH را با محتوي آدرس در يك بار دستيابي پر مي كند. اما اگر از ADDR در آدرس فرد مثلاً باشد، دستور فوق BL را با محتواي در و BH را با محتوي در دو بار دستيابي حافظه Load مي كند. دقت كنيد 8086 به آدرس و دستيابي پيدا ميكند ولي محتوي را كنار مي گذارد و نيز در عمل دوم به و دستيابي مي كند ولي از محتواي چشم پوشي مي كند.
اكنون دستوري مانند ADDR و MOV BH را در نظر بگيريد. اگر آدرس ADDR زوج (مثل50002) باشد، اين دستور MOV به هر دو خانه 50002 و 50003 دستيابي مي كند ولي BH را با محتواي 50002 پر كرده و از محتوي 50003 صرفنظر مي كند. اما اگر ADDR در آدرس فرد باشد (مثل 5003) دستور MOV ثبات BH را با 50003 پر كرده و از 50002 صرفنظر مي كند.
خانواده 8086 داراي دو نوع ريزپردازنده 16 بيتي است: 8086 و 8088. اختلاف مهم اين است كه پردازنده چگونه با دنياي بيرون ارتباط برقرار مي كند. 8088 داراي يك مسير داده (data path) 8 بيتي به حافظه I/O است ولي 8086 داراي يك مسير داده خارجي 16 است. پس 8088 مجبور به دوبار عمل براي خواندن يك كلمه 16 بيتي در حافظه است. البته در بيشتر حالات اين دو پردازنده مشابه هستند. از 8088 در طراحي كامپيوترهاي شخصي IBM استفاده شده است.
8086 مي تواند به شكل يك سيستم تك پردازنده كوچك (مي نيمم مد در صورتيكه پايه به high تنظيم شود) و يا به شكل يك سيستم چند پردازنده اي (ماكزيمم مد در صوتيكه پايه به low تنظيم شود) پيكره بندي مي گردد. در يك سيستم مفروض، پايه دائماً به high يا low متصل مي شود. برخي از پايه هاي 8086 داراي توابعي دوگانه بسته به نوع انتخاب سطح ولتاژ پايه هستند. در مد مي نيمم اين پايه ها سيگنال هاي كنترلي را مستقيماً به حافظه و وسايل I/O انتقال مي دهند. از مد ماكزيمم اين پايه ها داراي وظايف متفاوتي براي نسهيلات سيستم هاي مالتي پروسسور است. در مد ماكزيمم توابع كنترلي كه معمولاُ در مد مي نيمم نشان داده مي شوند، فرض مي شود كه به وسيله تراشه اي مثل كنترل گذرگاه 8288 پشتيباني مي شوند.
پس از پيشرفت هاي فناوري، اينتل پردازنده اي پيشرفته تر 80186 و 80188 را كه نسخه هاي پيشرفته تري از 8086 و 8088 بودند عرضه كرد. سرعت كلاك اين ها 8MHZ بود كه تقريباً دو برابر پردازنده هاي قبلي بودند. در روي اين پردازندههاي جديد از واحدهاي جانبي مانند كنترل كننده DMA با تايمر 16 بيتي و واحد كنترل كننده وقفه استفاده مي كنند. شبيه 8086، 80186 داراي گذرگاه داده 16 بيتي و 80188 داراي گذرگاه داده 8 بيتي است و به غير از اين، معماري و مجموعه دستورهاي 80186 و 80188 مشابه است. هم چنين 80186 و 80188 داراي يك مولد كلاك موجود در تراشه است كه فقط از يك كريستال براي توليد كلاك استفاده مي كند. مشابه 8085، فركانس كلاك از نظر داخلي به 2 تقسيم مي شود. يعني كريستال خارجي 12 يا 16MHZ بايد براي توليد فركانس داخلي كلاك 6MHZ يا 8MHZ استفاده شود. 80186/80188 در يك بسته 68 پايه اي ساخته شده و هر دو پردازنده داراي مدارهاي كنترل كننده اولويت وقفه براي فراهم ساختن 5 پايه وقفه هستند. مشابه 8086/8088 پردازنده هاي 80186/80188 مي توانند مستقيماً 1MB از حافظه را آدرس دهي كنند. و داراي 10 دستورالعمب جديد نسبت به مجموعه دستورهاي 8086/8088 هستند. مثلاً دستورهاي IN و OUT براي گرفتن و يا نوشتن بايت يا كلمه رشته به كار مي روند. از سوي ديگر 80286 داراي قابليت هاي اضافي چون حفاظت (Protection) و مديريت حافظه نسبت به معماري 8086 است. 80286 با سرعت 8MHZ داراي throughput تا 6 برابر در مقايسه با 8086 با سرعت 5MHZ است. 80286 در بسته 68 پايه اي ساخته شده است و مي تواند در سرعتهاي كلاك 4، 6 يا 8 مگاهرتز كار كند و به مولد كلاك خارجي 82284 براي توليد كلاك نياز دارد. پردازنده 80286 كلاك خارجي را به 2 براي توليد كلاك داخلي تقسيم مي كند و نوعاً در سيستم هاي multiuser و multitasking استفاده مي شود. 80286 در دو مد مختلف كار مي كند. Real Addr و آدرس مجازي حفاظت شده.
در واقع آدرس فيزيكي تقليدي از 8086 با كارآيي بالا است. در اين مد 80286 مستقيماً تا 16 مگابايت حافظه را آدرس دهي كند. مد آدرس دهي مجازي، مديريت حافظه مجازي، مديريت Task و حفاظت را فراهم مي سازد. برنامه نيس مي تواند يكي از اين دو مد را، با بارگذاري مناسب داده با دستورهاي Load و Store در ثبات كلمه حالت ماشين (MSW) (Machine Status Word)كه 16 بايتي است، انتخاب كند.
مثلاً دستورهاي
Load MSW register = LMSW
Store MSW register = SMSW
80286 به عنوان CPU در كامپيوترهاي شخصي IBM PC/AT به كار گرفته شد. نسخه هاي پيشرفته تري مانند 386 و 486 و ... بعداً بررسي خواهد شد.
مثال:
20 بيت آدرس فيزيكي به شكل زير محاسبه مي شود
محتواي CS چهار بيت به يك شكل منطقي به چپ شيفت داده مي شود
آدرس فيزيكي 20 بيتي
BIU هميشه چهار صفر را در چهار بيت مرتبة پائين آدرس فيزيكي (سگمنت) درج مي كند. به عبارت ديگر CS شامل base يا store سگمنت كد جاري و IP شامل فاصله يا distanc از اين آدرس به بايت دستور بعدي است كد مناسب واكشي شود. دقت كنيد كه داده هاي بلافاصله بعدي به عنوان بخشي از سگمنت كد در نظر گرفته مي شوند.
ثبات SS به پشته جاري اشاره مي كند. آدرس فيزيكي 20 بيتي پشته از ss و sp براي دستورهاي پشته مانند push و pop محاسبه مي شود. برنامه نويس مي تواند از ثبات BP به عوض sp براي دستيابي به پشته در مد آدرس دهي پايه استفاده كند. در اين حالت آدرس فيزيكي 20 بيتي از BP و ss محاسبه مي شود.
ثبات DS به سگمنت داده جاري اشاره مي كند. براي اغلب دستورها، عملوندها از اين سگمنت واكشي مي شوند. محتوي 16 بيتي SI (شاخص مبدأ) و DI (شاخص مقصد به عنوان آفست براي محاسبه آدرس فيزيكي 20 بيتي استفاده مي شوند.
ثبات ES به سگمنت اضافي (Extra Segment) كه دادهها ذخيره ميشوند اشاره دارد (علاوه بر 64K اشاره شده توسط DS). دستورهاي رشته معمولاً از ES و DI براي تعيين آدرس فيزيكي 20 بيتي مقصد استفاده مي كنند.
سگمنت ها مي توانند داراي چهار وضعيت باشند:
• Continious
• Partially Over lapped
• Fully overlapped
• Disjoint
شكل زير پنج سگمنت (#0 تا #4) را نشان ميدهد كه در حافظه فيزيكي ذخيره شده اند:
نكته <= هر سگمنت بايد از مرزهاي حافظه 16 بايتي آغاز شود.
مثالهايي از مقادير سگمنت براساس آدرسفيزيكي شروع شده در ، ، ، ، … و باشد. هر مكان حافظه فيزيكي مي تواند به يك يا چند سگمنت منطقي Map شود.
يك سگمنت ممكن است با بيش از يك ثبات سگمنت اشاره دهي شود. مثلاً، DS و ES ممكن است به سگمنت مشابهي در حافظه اشاره كنند اگر رشته گنجانده شده در آن سگمنت به عنوان يك سگمنت Source در يك دستور رشته و به عنوان سگمنت مقصد در دستور رشته اي ديگر باشد. دقت كنيد كه در يك دستور رشته سگمنت مقصد بايد توسط ES اشاره دهي شود.
قابل يادآوري است كه كدها نبايد در 6 بايت آخر حافظه فيزيكي نوشته شوند. نقص اين مسأله ممكن است منجر به واكشي opcode از حافظه غيرموجود شوند و سبب hang كردن cpu گردد.
طراحي سيستم با استفاده از 8086
در اين بخش مي خواهيم مفاهيم اصلي مربوط به اينترفيس 8086 را به تراشه هاي جانبي مانند حافظه و I/O بررسي كنيم.
پايه ها و سيگنال هاي 8086
پايه ها و سيگنال هاي 8086 در شكل زير نشان داده شده است.
سيگنالهاي معمولي
نوع تابع نام
دوطرفه باس آدرس / داده ADI5-AD0
خروجي سه حالته آدرس/وضعيت A19/56-A16/S3
خروجي سه حالته Status/Bus high enable
ورودي Minimum/Maximum در كنترلي
خروجي سه حالته كنترل خواندن
ورودي انتظار براي كنترل تست TEST
ورودي كنترل وضعيت انتظار READY
ورودي Reset سيستم RESET
ورودي Interrupt request INTR
ورودي كلاك سيستم CLK
ورودي زمين GND
سيگنالهاي مد مي نيمم
نوع تابع نام
ورودي Hold request HOLD
خروجي Hold ACK HLDA
خروجي سه حالته كنترل نوشتن
خروجي سه حالته Memory/IO Control
خروجي سه حالته Data Transmit/Recive
خروجي سه حالته Data Enable
خروجي سه حالته Address Latch enable ALE
خروجي Interrput ACK INTA
سيگنال مد ماكزيمم
نوع تابع نام
دوطرفه Hold request
Access Control
خروجي سه حالته Bus priority lock
Control
خروجي سه حالته Bus cycle status , ,
خروجي Instruction Queve
Status QS1, QS0
تمامي پايه هاي 8086 از نوع TTL هستند. همانطوري كه قبلاً گفتيم 8086 مي تواند در دو مد مختلف عمل كند. مي نيمم مد (تك پردازنده) و ماكزيمم مد (چند پردازنده اي). پايه ورودي براي انتخاب يكي از اين دو مد بكار مي رود. اگر باشد، 8086 در مد مي نيمم كار مي كند. در اين مد، 8086 براي پشتيباني مي نيمم در سيستم هاي تك پردازنده اي كه داراي وسايل كمي هستند كه از باس استفاده مي كنند، به كار مي رود.
اگر باشد، 8086 در مد ماكزيمم تعريف مي شود تا از سيستم هاي چند پردازنده اي پشتيباني كند. در اين حالت اينتل 8288 كه يك باس كنترلر است به 8086 براي فراهم ساختن كنترل هاي باس و سازگاري با معماري چندگذرگاهي اضافه مي شود.
AD0-AD15 خطوط گذرگاه ادغام شده آدرس/داده 16 بيتي هستند. در اولين سيكل كلاك AD0-AD15 16 بيت مرتبه پائين آدرس مي باشند. 8086 آدرس 20 بيتي دارد و چهار خط مرتبه بالاي ادرس، با سيگنال هاي وضعيت 8086 مالتي پلكس هستند. اين سيگنال ها عهبارتتد از:
A16/S3 و A17/S4 و A18/S5 و A19/S6
در خلال اولين پريود كلاك از سيكل گذرگاه (سيكل نوشتن يا خواندن)، كل آدرس 20 بيتي در اين خطوط در دسترس است. در تمامي ديگر سيكل هاي كلاك براي عمليات حافظه و I/O، ADI5-AD0 شامل داده 16 بيتي است و S3 و S4 و S5 و S6 خطوط وضعيت هستند. خطوط S3 و S4 به شرح زير ديكلود مي شوند:
A17/S4 A16/S3 تابع
0 0 Extra Segment
0 1 Stack Segment
1 0 Code or no Segement
1 1 Data Segment
بنابراين پس از اولين سيكل كلاك اجراي دستورالعمل، پايه هاي A17/S4 و A16/S3 مشخص مي كنند كه كدام ثبات سگمنت بخش سگمنت آدرس 8086 را توليد مي كند. بدين ترتيب، با ديكود كردن اين خطوط و استفاده از خروجي هاي ديكودر به عنوان انتخاب كننده هاي تراشه (Chip Selects) براي تراشه هاي حافظه، حداكثر تا 4 مگابايت (1MB در هر سگمنت) را ميتوان فراهم ساخت. اين امر درجه اي از حفاظت را به وسيله اجتناب از عمليات نادرست نوشتن در يك سگمنت كه با سگمنت ديگر همپوشاني دارد و نابود كردن اطلاعات آن سگمنت فراهم مي آورد.
A18/S5 و A19/S6 به عنوان A18 و A19 در خلال اولين پريود كلاك از اجراي دستور، به كار ميروند. چنانچه يك دستور I/O اجرا شود، در خلال اولين پريود كلاك low باقي مي ماند. در خلال تمامي ديگر سيكل ها، A18/S5 وضعيت پرچم تواناساز وقفه 8086 را نشان مي دهد و A19/S6 به S6 تبديل مي شود و Low بودن پايه A19/S6 نشان مي دهد كه 8086 در گذرگاه است. در اثناي Hold Acknowledge پريود كلاك، 8086 پايه A19/S6 را سه حالته كرده وبدين ترتيب به bus master ديگر براي گرفتن كنترل گذرگاه سيستم اجازه مي دهد.
8086 ، AD0-AD15 را در خلال سيكل Interrupt ACK يا سيكل Hold ACK سه حالتي مي كند.
به عنوان Bus high enable در خلال اولين سيكل كلاك اجراي دستور به كار ميرود. 8086 در اين پايه در هنگام خواندن، نوشتن و Interrupt Ack كه داده ها به شكل مرتبه بالاي گذرگاه داده (AD15-AD8) انتقال مي يابند، low قرار ميدهد. هم چنين BHE مي تواند با اتصال با AD0 براي انتخاب بانك هاي حافظه استفاده شود. در خلال تمامي ديگر سيكل ها BHE/S7 به صورت S7 استفاده مي شود و 8086 داراي سطح خروجي اولين سيكل در اين پايه خواهد بود.
هنگامي كه 8086 داده ها را از حافظه يا يك مكان I/O مي خواند، خواهد بود.
يك پايه ورودي است و فقط به وسيله دستور WAIT استفاده يم شود. 8086 يك وضعيت Wait را پس از اجراي دستور WAIT تا هنگامي كه Low در پايه TEST باشد قرار ميدهد. اين ورودي به شكل داخلي در اثناي هر سيكل كلاك در لبه كلاك سنكرون مي شود.
INTR يك ورودي وقفه maskable است. اين خط latch نمي شود و بنابراين تا هنگام تشخيص و توليد وقفه بايد در high نگاه داشته شود.
NMI ورودي non maskable interrupt است. RESET سيگنال ورودي reset سيستم است و اين سيگنال بايد براي حداقل چهار سيكل تا هنگام تشخيص و شناسايي high باشد و سبب مي شود رجيسترهاي DS، SS، ES، , Ip و Flagها همگي صفر شوند.
هم چنين CS به FFFFH تنظيم مي گردد. پس از حذف reset از پايه RESET، 8086 دستورالعمل بعدي را از آدرس فيزيكي 20 بيتي FFFF0H يعني (CS:FFFFH,IP=0000) CS*16+IP واكشي مي كند.
هنگامي كه 8086 لبه هشت پالس را در RESET تنشخيص دهد، تمامي فعاليت هاي خويش را تا هنگام low شدن كلاك متوقف مي سازد. هرگاه reset برابر low گردد، 8086 سيستم را به شرح زير مقداردهي اوليه (initislize) مي كند.
مؤلفه هاي 8086 محتوي
پرچم ها Clear
IP 0000H
CS FFFFH
DS 0000H
SS 0000H
ES 0000H
Queue Empty
سيگنال reset براي 8086 را مي توان با 8284 توليد كرد. 8284 يك ورودي تريگر اشميت (Schmitt Trigger) به نام براي توليد reset از خروجي reset دارد.
براي توليد reset به شكل صحيح، ورودي بايد براي 50MS پس از اين كه Vcc به مي نيمم ولتاژ 4.5V رسيد زير 1.05 ولت نگاهداشته شود. سيگنال ورودي از 8284 را مي توان با مدار RC ساده اي شبيه شكل زير ساخت:
مقادير R و C به شرح زير قابل حصول هستند:
بطوريكه
ميكروثانيه
مثلاً اگر C را به شكل اختياري F 0.1 انتخاب كنيم R=1.88K
همانطوري كه قبلاً گفتيم 8086 مي تواند در مد مينيمم و ماكزيمم با استفاده از پايه پيكره بندي شود. در مد مي نيمم، 8086 بخودي خود تمامي سيگنال هاي كنترل گذرگاه را توليد مي كند. اين سيگنال ها عبارتند از:
• (Database Transmit/ReCeive)
يك سيگنال خروجي لازم براي مد 8086 مي نيمم است كه از 8286/8287 (data bus transceiver) استفاده مي كند و براي كنترل جهت جريان داده ها استفاده مي شود.
• (Data Enable)
به شكل يك output enable براي 8286/8287 در سيستم مي نيمم استفاده مي شود. در خلال هر دستيابي بحافظه و I/O براي سيكل هاي ، برابر low مي باشد.
• (Address Latch Enable) ALE
يك سيگنال خروجي فراهم شده توسط 8086 است و براي دي مالتي پلكس كردن AD0-AD15 به A0-A15 و D0-D15 در لبه پائين رونده ALE استفاده مي شود. سيگنال ALE در 8086 مشابه ALE در 8085 است.
• اين سيگنال خروجي براي تمايز دستيابي به حافظه ( =high) از ( =low) I/O استفاده مي شود. هنگامي كه 8086 يك دستور I/O را مانند IN يا OUT توليد مي كند، اين پايه را به low تنظيم مي كند و هنگامي كه رجوع به حافظه را مثل [SI] و MOV AX اجرا مي كند، اين پايه را به high تنظيم مي كند.
•
در هنگام نوشتن در حافظه يا I/O به low تنظيم مي شود.
• مانند در 8085 است. و براي سيكل هاي تأئيد وقفه اين پايه low مي شود.
• ورودي HOLD و خروجي HLDA
از اين پايه ها در DMA استفاده مي شود. High بودن اين پايه يعني اين كه يك master ديگري تقاضاي در اختيار گرفتن سيستم Bus را دارد و پايه HLDA را به عنوان ACK برابر high مي كند و به طور همزمان پردازنده، گذرگاه را سا حالته كرده تا هنگاميكه براي پايه HOLD سيگنال low را دريافت كند. در اين صورت پردازنده low را در پايه HLDA قرار ميدهد. HOLD يك ورودي آسنكرون نيست.
• CLK
ورودي فراهم كننده زمان بندي اصلي براي 8086 و كنترل كننده گذرگاه
در مد ماكزيمم برخي از پايه هاي 8086 به صورت دوباره تعريف مي شوند. مثلاً پايه هاي HOLD، HLDA، ، ، ، ، ALE و در مد مي نيمم به شكل ، ، ، ، ، ، QS0 و QS1 به ترتيب در مد ماكزيمم تعريف مي شوند. درمد ماكزيمم كنتلر 8288 اطلاعات وضعيت را از ، ، براي توليد زمان بندي گذرگاه و سيگنال هاي كنترل لازم براي سيكل گذرگاه ديكو.د مي كند. ، ، در خروجي 8086 به شرح زير ديكود مي شوند:
توضيح
0 0 0 int. ACK
0
0 1 خواندن پورت I/O
0 1 0 نوشتن در پورت I/O
0 1 1 halt
1 0 0 دستيابي به كد
1 0 1 خواندن حافظه
1 1 0 نوشتن در حافظه
1 1 1 غيرفعال
• و