400 likes | 837 Views
معماری سیستم های کامپیوتری. محاسبات کامپیوتری. مهدی ایل بیگی دانشگاه پیام نور دماوند. الگوریتم جمع وتفریق اعداد اندازه علامتدار. اعداد اندازه علامتدار، اعدادی هستند که مقدار آن ها در یک ثبات ذخیره می شود و علامت آن ها در یک فلیپ فلاپ ( 0 = مثبت و 1 = منفی).
E N D
معماری سیستم های کامپیوتری • محاسبات کامپیوتری مهدی ایل بیگی دانشگاه پیام نور دماوند
الگوریتم جمع وتفریق اعداد اندازه علامتدار • اعداد اندازه علامتدار، اعدادی هستند که مقدار آن ها در یک ثبات ذخیره می شود و علامت آن ها در یک فلیپ فلاپ (0 = مثبت و 1 = منفی). • در جدول زیر حالت های مختلفی که برای جمع و تفریق این اعداد ممکن است رخ بدهد، بهمراه نتیجه حاصل از هر حالت، آورده شده است.
الگوریتم جمع وتفریق اعداد اندازه علامتدار الگوریتم روبرو مراحل جمع و تفریق این اعداد را نمایش می دهد. نکته 1: در تفریق اگر اگر A>B باشد به دلیل انجام تفریق در سیستم مکمل 2، مقدار E (رقم نقلی) برابر یک خواهد شد. نکته 2: در تفریق اگر A = 0 باشد برای اینکه صفر منفی نداشته باشیم، علامت AS را صفر می نماییم. و اگر A<B باشد چون نتیجه در A یک عدد مکمل 2 است باید دوباره مکمل 2 بشود تا به نمایش ابتداییش بازگردد.
سخت افزار جمع وتفریق اعداد اندازه علامتدار • برای انجام جمع و تفریق اعداد اندازه علامتدار نیاز به امکانات سخت افزاری داریم که در شکل زیر نمایش داده شده است. در این شکل فلیپ فلاپ های As, Bs برای نگهداری علامت اعدا ذخیره شده در رجیستر A, B می باشند. فلیپ فلاپ AVF برای نمایش رخدادن سرریز است. سیگنال کنترلی M زمانی که صفر باشد A+B می شود و در صورتی که یک باشد A+B+1 خواهد شد.
جمع وتفریق اعداد مکمل 2 سخت افزار جمع و تفریق اعداد مکمل 2 الگوریتم جمع و تفریق اعداد مکمل 2
الگوریتم ضرب • برای انجام ضرب باینری به ازای هر بیت یک در مضروب فیه باید یک بار مضروب با نتیجه حاصلضرب جمع گردد و به ازای بررسی هر بیت باید نتیجه حاصلضرب جزعی یک بیت به راست شیفت داده شود. الگوریتم روبرو این روش را بیان می نماید. در شکل زیر نیز یک مثال برای ضرب باینری آورده شده است:
الگوریتم ضرب بوت (Booth) • الگوریتم ضرب بوت بر این اساس استوار است که رشته ای از صفرهای پشت سر هم در مضروب فیه نیازی به جمع ندارد و فقط به تعداد آن ها نیاز به شیفت وجود دارد، همچنین ارزش مقداری رشته ای از یک های متوالی در مضروب فیه که اولین یک رشته در جایگاه mام و آخرین یک رشته، در جایگاه kام باشد را می توان بصورت 2k+1 – 2m نوشت. • مثالا برای محاسبه 14×M ، چون 14 = 001110 است (پس k = 3, m = 1) این عدد معدل با 23+1 – 21 خواهد شد و در نهایت حاصلضرب برابر با M×24 – M×21 می شود. • با استفاده از این واقعیات برای ضرب دو عدد مراحل زیر با بررسی بیت های مضروب فیه صورت خواهد گرفت: • به محض برخورد با اولین 1 کم ارزش در رشته 1های مضروب فیه، مضروب از حاصلضرب جزیی کم خواهد شد. • به محض دیدن اولین 0 (بشرطی که قبل از آن 1 باشد) در رشته 0های مضروب فیه، مضروب با حاصلضرب جزیی جمع خواهد شد. • وقتی بیت جاری مضروب فیه همانند بیت قبلی بررسی شده باشد، حاصلضرب جزیی تغییری نمی کند.
الگوریتم ضرب بوت • نکته: اگر به ابتدای مضروب فیه یک صفر اضافه نماییم، سپس تعداد دنباله 01 در این عدد برابر با تعداد جمع های لازم برای عمل ضرب و تعداد دنباله 10 برابر با تعداد تفریق ها خواهد شد. تعداد عملیات شیفت دقیقا برابر تعداد بیت های مضروب فیه می باشد. • در شکل زیر سخت افزار لازم برای انجام ضرب باینری با استفاده از الگوریتم بوت آورده شده است.
الگوریتم ضرب بوت • شکل زیر مثالی برای انجام ضرب با استفاده از الگوریتم بوت را نمایش می دهد. • = -9 • = -13 • = 117
ضرب کننده آرایه ای • در ضرب کننده آرایه ای، سخت افزار مورد نیاز برای ضرب را بسته به تعداد بیت های مضروب و مضروب فیه دقیقا براساس نحوه ضرب دو عدد باینری بصورت دستی، طراحی می نماییم. درنتیجه ضرب بصورت موازی و با سرعت بالایی انجام می پذیرد. در شکل زیر یک ضرب کننده آرایه ای 2×2 نمایش داده شده اند.
ضرب کننده آرایه ای • اگر بخواهیم دو عدد چند بیتی را با استفاده از ضرب کننده آرایه ای ضرب نماییم، باید هر بیت از مضروب فیه با تمامی بیت های مضروب، بتعداد بیت های مضروب فیه، AND شود. سپس خروجی دودویی در هر یک از سطوح گیت های AND بطور موازی با حاصلضرب جزیی قبلی جمع می شود و حاصلضرب جزیی جدید را تشکیل می دهد و آخرین سطح حاصلضرب نهایی را ایجاد می نماید. • پس در نتیجه اگر مضروب فیه j بیتی و مضروب k بیتی باشد برای طراحی ضرب کننده آرایه ای برای ضرب این دو عدد نیاز به: • j × k گیت AND • (j - 1) جمع کننده k بیتی برای تولید حاصلضرب k + j بیتی، داریم.
ضرب کننده آرایه ای عدد 3بیتی در 4بیتی • بیت نقلی ورودی
ضرب کننده آرایه ای 4 بیتی • بطور کلی برای ضرب یک عدد j بیتی در یک عدد k بیتی با یک ضرب کننده آرایه، تعداد نیم جمع کننده (HA)های مورد نیاز برابر min{ j, k } و تعداد تمام جمع کننده (FA)ها لازم برابر با jk-(j+k) و تعداد گیت AND برابر با jk می باشد.
الگوریتم تقسیم باینری • مراحل انجام تقسیم بصورت زیر است: • ابتدا با کم کردن بیت های با ارزش مقسوم از مقسوم علیه در صورتی که بیت های با ارزش مقسوم، از مقسوم علیه بزرگتر باشد، فلگ E برابر یک می شود و متوجه رخداد سرریز در خارج قسمت می شویم، زیرا مقسوم عدد بزرگی خواهد بود و درنتیجه خارج قسمت در ریجیستر Q قابل ذخیره سازی نمی باشد. • در صورتی که فلگ E صفر باشد (سرریز رخ ندهد)، مقدار مقسوم علیه را به مقسوم اضافه می کنیم تا مقدار مقسوم را بازیابی نماییم. • در ادامه به ازای هر بیت یک با ارزش در مقسوم باید یک بار مقسوم علیه از مقسوم کم شود. برای این منظور مقسوم را یک بیت یک بیت به چپ شیفت می دهیم و بیت با ارزش آن را در E می ریزیم. • در صورتی که E برابر یک باشد، مقسوم علیه را از مقسوم کم می نماییم و در بیت کم ارزش Q یک می نویسیم. • در صورتی که E برابر صفر باشد، مقسوم علیه را از مقسوم کم می نماییم، اگر بیت E یک شود یعنی مقسوم از مقسوم علیه بزرگتر بوده و می توانیم بیت کم ارزش Q را یک کنیم. در صورتی که E صفر باشد یعنی مقسوم از مقسوم علیه کوچکتر است پس با جمع کردن مقسوم علیه و مقسوم، مقسوم را بازیابی می کنیم و همین روال ها را به تعداد بیت های مقسوم علیه ادامه می دهیم.
الگوریتم تقسیم اعداد اندازه علامت 0
الگوریتم تقسیم غیربازیافتی • الگوریتم شرح داده شده در اسلاید قبل معروف به روش بازیافتی (Restoring Method) می باشد، زیرا بعد از کم کردن مقسوم علیه (B) از مقسوم (A) در صورت کوچک تر بودن A از B، دو باره B را به A اضافه می کنیم تا A بازیابی شود. • در دور بعدی این عدد (A-B+B) به چپ شیفت داده می شود (ضرب در 2 می شود) و دو باره B از A کم می شود. پس خواهیم داشت:2(A-B+B)-B = 2A-B • بدلیل اینکه مقدار B که برای بازیافت A به آن اضافه شده، در مرحله بعد دوباره از A کم می شود، می توانیم مقدار B را به A اضافه نکنیم و در مرحله بعد A-B را به چپ شیفت دهیم و سپس B را به نتیجه بیفزاییم. در این صورت خواهیم داشت: 2(A – B) + B = 2A – B • پس درصورتی که مقدار قبلی Qn برابر یک باشد (A>B باشد)، B تفریق می شود و در غیر این صورت B جمع می شود و بازیابی باقیمانده جزئی (A-B)، لازم نیست. • این روش را روش غیر بازیافتی (Nonrestoring) می نمامند. پس در این روش جمع کردن B درصورتی که A<B باشد حذف می گردد ولی باید در اولین باری که مقسوم شیفت داده می شود B تفریق شود و در صورتی که آخرین بیت خارج قسمت صفر باشد B باید اضافه شود تا باقیمانده نهایی بازیابی گردد. • روش بازیافتی به n تفریق و n/2 جمع (تقریبا) نیاز دارد در صورتی که روش روش غیر بازیافتی به n+1 جمع یا تفریق نیاز دارد. پس روش غیربازیافتی سریع تر از روش بازیافتی می باشد.
1 sign bit 8 exponent 23 fraction 1 sign bit 11 exponent 52 fraction استاندارد IEEE 754 برای نمايش اعداد اعشاری ممیز شناور • اين استاندارد در اغلب كامپيوترها مورد استفاده است. • عدد اعشاري از نوع float داراي 32 بيت است. • بيت علامت نشان دهنده علامت عدد است ( 1: منفي و صفر: مثبت) • 23 بيت انتهايي نشان دهنده مانتيس است كه به صورت نرمال در آمده است. يعني رقم يك قبل از مميز آن نشان داده نمي شود. • 8 بيت مياني، نماي عدد را نشان مي دهد كه عدد 127به آن اضافه شده است تا توان منفی نداشته باشیم. • اعداد اعشاري double به صورت مشابهي در 64 بیت نگهداري مي شوند. • استاندارد 32 بیتی (Float) • استاندارد 64 بیتی (Double)
استاندارد IEEE 754 برای نمايش اعداد اعشاری ممیز شناور • در اعداد اعشاری double بدلیل اینکه قسمت توان 11 بیت می باشد، در نتیجه برای جلوگیری از منفی شدن این قسمت، توان را با 1023 جمع می نماییم. • در یک مانتیس نرمال شده همواره سمت چپ ترین بیت برابر با یک است در نتیجه از ذخیره سازی این بیت جلوگیری می شود. • حالات خاص: • اگر نما و مانتيس صفر باشند، عدد صفر است. • اگر نما حداكثر مقدار خود را داشته باشد و مانتيس صفر باشد، عدد بي نهايت است. • اگر نما حداكثر مقدار خود را داشته باشد و مانتيس غير صفر باشد، عدد “تعريف نشده” است. NaN = Not a Number
جمع و تفریق اعداد ممیز شناور • برای انجام جمع و تفریق اعداد ممیز شناور که عملوند اول در AC و عملوند دوم در BR است، مراحل زیر را باید طی کنیم: • تست صفر بودن عملوندها: اگر BR صفر باشد جواب همان AC خواهد بود و اگر AC صفر باشد جواب در عملیات جمع BR خواهد شد و در عملیات تفریق –BR می شود. • هم ردیف کردن توان ها: برای جمع و تفریق اعداد ممیز شناور، مقدار توان دو عدد باید برابر باشد، برای این منظور باید توان دو عدد با هم مقایسه شود و در صورتی هر کدام از عملوندها توان کوچکتری داشته باشند، باید در یک حلقه آنقدر مقدار مانتیس را به راست شیفت دهیم و توان را یکی یکی اضافه کنیم تا دو توان باهم مساوی شود. • جمع یا تفریق مانتیس ها • نرمالیزه کردن نتیجه: در صورتی که عمل جمع صورت گیرد و سرریز داشته باشیم (E=1)، باید مقدار حاصل جمع به راست شیفت داده شود و E در بیت با ارزش نتیجه ذخیره گردد و توان نتیجه نیز یک واحد افزایش یابد تا هیچ وقت سرریز نداشته باشیم. اگر عمل تفریق صورت گیرد و E=1 شود، پس A>B بوده و اگر E=0 شود یعنی A<B بوده و باید مقدار نتیجه را مکمل دو کنیم و علامت آن را منفی قرار دهیم. در تفریق ممکن است که فروریز (Underflow) داشته باشیم، یعنی بیت(های) با ارزش A برابر با صفر باشد. در این صورت باید آنقدر A را به چپ شیفت دهیم و توان را کاهش دهیم تا بیت با ارزش A یک شود.
ضرب اعداد ممیز شناور • برای انجام ضرب اعداد ممیز شناور که مضروب در BR، مضروب فیه در QR است و نتیجه در AC، مراحل زیر را باید طی کنیم: • تست صفر بودن عملوندها: اگر BR یا QR برابر صفر باشد نتیجه برابر صفر می شود. • جمع کردن نماها: نمای QR باید با نمای BR جمع شود و در نمای AC ذخیره گردد. به علت اینکه هر یک از نماها بایاس شده اند (با مقدار بایاس جمع شده اند)، پس مجموع توان ها دو بار با مقدار بایاس جمع شده است و باید از توان AC یک بار مقدار بایاس را کم کنیم. • ضرب مانتیس ها • نرمالیزه کردن نتیجه: در ضرب ممکن است که فروریز (Underflow) داشته باشیم، یعنی بیت(های) با ارزش A برابر با صفر باشد. در این صورت باید آنقدر A را به چپ شیفت دهیم و توان را کاهش دهیم تا بیت با ارزش A، یک شود.
تقسیم اعداد ممیز شناور • برای انجام تقسیم اعداد ممیز شناور که مقسوم علیه در BR، مقسوم در AC و خارج قسمت در QR است، مراحل زیر را باید طی کنیم: • تست صفر بودن عملوندها: اگر BR تقسیم بر صفر داریم چس کار خاتمه می یابد. اگر AC صفر باشد نتیجه صفر خواهد شد. • مقدار دهی اولیه به ثبات ها و تعیین علامت • هم ردیف کردن مقسوم: اگر بیت های با ارزش مقسوم از مقسوم علیه بزرگتر باشد سرریز در خارج قسمت رخ خواهد داد. برای جلوگیری از سرریز در صورتی که A>B بود، A را یک بار به راست شیفت می دهیم و توان آن را افزایش می دهیم، به این عمل Divident Alignment می گویند. • تفریق نماها: بعد از تفریق نماها بدلیل اینکه هر نما بایاس شده پس دو بار بایاس از نتیجه کم می شود و باید دو باره یک بار بایاس را با حاصل تفریق جمع کنیم. • تقسیم مانتیس ها
جدول حاصل جمع اعدادBCD در جمع اعداد BCD وقتی سرریز رخ می دهد که حاصل جمع باینری بیشتر از 9 شود، پس خواهیم داشت: C = K + Z8Z4 + Z8Z2 در صورت رخ دادن سرریز نتیجه باید تصحیح شود یعنی با 6 (0110)، جمع گردد.
تفریق BCD • برای تفریق دو عدد BCD می توان مفروق منه را با مکمل 9 یا 10 مفروق جمع کرد. ولی بدلیل اینکه BCD خود مکمل (Self Compliment) نیست، نمی توان با مکمل کردن هر بیت مکمل 9 عدد را بدست آوریم. • برای بدست آوردن مکمل 9 دو راه وجود دارد: • ابتدا عدد BCD را مکمل یک می کنیم و سپس نتیجه را با 10(1010) جمع می کنیم و از رقم نقلی چشم پوشی می کنیم. پس خواهیم داشت: (15 – N) + 10 = 9 – N + 16 • ابتدا عدد BCD را با 6 (0110) جمع می نماییم و سپس نتیجه را مکمل یک می نماییم. پس خواهیم داشت:15 - (N + 6) = 9 - N • می توان مداری ترکیبی برای بدست آوردن مکمل 9 عدد BCD دارای چهار بیت B1, B2, B4, B8 طراحی کرد و خروجی x1, x2, x3, x4 را بصورت زیر بدست آورد (اگر M=1 باشد مکمل 9 محاسبه می شود): x1 = B1M’ + B’1M x2 = B2 x4 = B4M’ + (B’4B2 + B4B’2)M x8 = B8M’ + B’8B’4M
سه نوع جمع کننده اعداد دهدهی • الف) در جمع کننده BCD تمام موازای سرعت محاسبات بالا است ولی به تعداد ارقام اعداد نیاز به جمع کننده BCD داریم. • ب) در جمع کننده Digit-Serial Bit-Parallel نیاز به یک جمع کننده BCD است ولی حاصلجمع در n مرحله (n برابر تعداد ارقام عملوندها است) بدست می آید. • ج) در جمع کننده تمام سری، بیت های هر رقم با هم جمع شده و در پایان جمع هر چهار بیت در صورت نیاز یک تصحیح نیز صورت می گیرد و یک رقم نقلی را نیز برای جفت رقم بعدی تولید می نماید. این جمع کننده از همه سخت افزار کمتری نیاز دارد ولی از همه کندتر است.
ثبات های مورد نیاز برای عملیات ضرب و تقسیم دهدهی • برای ضرب و تقسیم اعداد چهار رقمی BCD نیاز به دو ثبات 17بیتی A و B برای نگهداری عملوندها داریم (16بیت برای چهار رقم 4بیتی و یک بیت برای علامت). به یک ثبات 4بیتی بنام Ae برای جای دادن سرریز احتمالی حاصل از جمع مضروب و حاصلضرب جزئی در حین عمل ضرب و یک ثبات 4بیتی دیگر بنام Be برای تشکیل متمم 9 مقسوم علیه هنگام تفریق آن از باقیمانده جزئی در حین عمل تقسیم، نیاز داریم. • QL برای نگهداری مضروب فیه یا قسمتی از مقسوم استفاده می گردد.
الگوریتم ضرب اعداد دهدهی • برای ضرب اعداد دهدهی، برای بدست آوردن مقدار حاصلضرب، باید مضروب را با حاصلضرب جزئی به تعداد دفعاتی برابر با مقدار مضروب فیه جمع کنیم. • برای این منظور مضروب فیه را در Q قرار می دهیم و QL را بررسی می کنیم. اگر QL برابر صفر بود رقم اول از حاصلضرب صفر خواهد شد، پس فقط کافیست که یک شیفت به راست دسیمال انجام دهیم تا رقم اول نتیجه به AQ انتقال داده شود. • در صورتی که QL صفر نبود، مضروب را با حاصلضرب جزئی جمع می نماییم و QL را یک واحد کم می کنیم و این عمل را تا صفر شدن QL ادامه می دهیم.
الگوریتم تقسیم دهدهی BCD • در تقسیم اعداد BCD، هر بار مقسوم (AQ) را به چپ شیفت می دهیم در نتیجه رقم با ارزش مقسوم در Ae قرار می گیرد، سپس برای مقایسه مقدار مقسوم و مقسوم علیه، B را از A کم می کنیم در صورتی که E=1 بشود، A>B است پس خارج قسمت (QL) را یک واحد افزایش می دهیم و این اعمال را تا صفر شدن مقدار E ادامه می دهیم. • اگر E=0 بشود، A<B بوده و نیازی به افزایش خارج قسمت نیست، فقط باید با جمع کردن B با A، باقیمانده جزئی را بازیابی نماییم.