برای شروع، بهتر است با جمع کننده باینری (Binary Adder) آشنا شویم، این مدارات ترکیبی، دارای چند گیت پایه هستند، و جمع دو یا چند عدد باینری را انجام میدهند، به همین دلیل به آنها جمع کننده باینری میگویند.
ساده ترین شکل جمع دو عدد باینری تک بیتی، با استفاده از گیتهای AND و XOR ساخته می شود:
همان طور که در تصویر فوق میبینید این جمع کننده شامل دو خروجی Sum و Carry (Cout) یا رقم نقلی میباشد. برای درک سادهتر این دو، بهتر است دو عدد در مبنای ۱۰ را با یکدیگر جمع کنیم:
در جمع بالا، ۷۶ با ۵۸ جمع شده است، ما در جمع عادی ابتدا یکان را با هم جمع میکنیم و چون مبنا ۱۰ است اگر حاصل بزرگتر مساوی ۱۰ شد، باید قسمت یکان آن را در حاصل نهایی نوشته و قسمت دهگان که به آن رقم نقلی یا کری نیز میگویند را به مرحله بعد یا ستون با ارزش تر(ستون دهگان) بریم، تا در جمع دهگانها جمع شود، برای مثال جمع ۶ و ۸ (قسمت یکان) برابر با ۱۴ است که ۴ را در حاصل نهایی به عنوان یکان مینویسیم و ۱ را که رقم نقلی ما است به ستون با ارزش تر منتقل میکنیم و بعد با اعداد دهگان آن را جمع میزنیم و حاصل را مینویسیم، حاصل نهایی، در دو قسمت Sum و Carry میباشد. که دو رقم سمت راست آن به عنوان Sum و رقم سمت چپ (صدگان) همان Carry یا (Cout) است.
در واقع ما دو عدد دو رقمی را با هم جمع کردهایم و فضایی که برای حاصل در نظر گرفته بودیم دو رقم بوده، در حالی که حاصل نهایی سه رقمی شده است، رقمی که در حاصل دو رقمی ما نگنجیده است را به عنوان کری (Carry) یا رقم نقلی خارج شده از آخرین رقم، در نظر گرفتهایم.
جمع دو عدد باینری
قوانین بالا در جمع دو عدد باینری (دودویی) نیز صادق است، با این تفاوت که اعداد باینری در مبنای ۲ هستند و اگر حاصل بزرگتر مساوی ۲ باشد باید رقم نقلی به قسمت با ارزشتر (سمت چپاش) منتقل شود:
برای مثال در شکل بالا دو تا 1 به صورت باینری با هم جمع شده اند، که حاصل آن 2 می شود که به صورت باینری برابر است با 10، صفر آن به عنوان Sum و یک آن به عنوان Carry در نظر گرفته میشود (چون فضای حاصل دو عدد تک بیتی یک بیت است، در حالی که حاصل نهایی دو بیت شده است).
نیم جمع کننده (Half Adder)
اگر به یاد داشته باشید فهمیدیم که خروجی Sum جمع کننده تک بیتی توسط XOR، و Carry آن نیز توسط یک AND مشخص میشود.
XOR تابعی است فرد، که اگر یک های ورودی آن فرد باشند، خروجی یک میشود.
نیم جمع کننده یا به اختصار HA، یک مدار ترکیبی است که دو عدد تک بیتی را با هم جمع میکند و در خروجی Sum و Carry را محاسبه میکند
مدار نیم جمع کننده
مدار یک نیم جمع کننده (شکل داخلی یک نیم جمع کننده-HA) به صورت زیر است:
جدول صحت HA | |||
---|---|---|---|
Carry | Sum | b | a |
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 1 | 1 |
ما به دو حالت میتوانیم برای Sum و Carry تابع نویسی کنیم:
- جمع حاصل ضرب ها (SOP): در این حالت ما بر اساس یک های Sum و Carry تابع نویسی میکنیم (منظور از یکها، جاهایی است که Sum یا Carry در جدول صحت برابر یک شده است).
- ضرب حاصل جمع ها(POS): در این حالت بر اساس صفر های Sum و Carry تابع نویسی میکنیم.
تابع SOP خروجی های HA:
در این مدل از تابع نویسی، به ازای ۱، خود متغیر و به ازای ۰ بر روی متغیر، بار میگذاریم (Not متغیر را مینویسیم).
تابع POS خروجی های HA به شکل زیر است:
در این مدل از تابع نویسی، به ازای ۰ خود متغیر و به ازای ۱ بر روی متغیر، بار میگذاریم.
مهمترین عیب نیم جمع کنندهها یا HA این است که نمی توان رقم نقلی وارد شدهای را به آن داد و این باعث میشود که استفاده آن در جمع کننده های باینری چند بیتی محدود شود. تصور کنید که ما میخواهیم دو عدد ۲ بیتی را با یکدیگر جمع کنیم اگر قسمت کم ارزش آن رقم نقلی ای را تولید کرد، مسلما ما باید آن را با قسمت با ارزش تر عدد(بیت سمت چپ اش) جمع کنیم ولی چون HA ورودی سومی ندارد، این کار عملی نیست.
تمام جمع کننده (Full Adder)
با توجه به مشکلی که در نیم جمع کنندهها داشتیم، تمام جمع کننده راهحل مناسب تری برای این موضوع میباشد. تمام جمع کننده یا به اختصار FA، سه عدد تک بیتی را با یکدیگر جمع کرده و در خروجی Sum و Carry را محاسبه میکند. قبل از بررسی سخت افزار داخلی FA بهتر است که جدول صحت آن را مشاهده کنید:
Ci+1(Carry) | S(Sum) | Ci | B | A |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 0 |
0 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 1 |
شاید برایتان سوال باشد که چرا Carry را با Ci+1 نشان داده ایم، برای فهم این موضوع به تصویر زیر دقت کنید:
در تصویر بالا همان طور که مشاهده میکنید FA سه ورودی دریافت کرده که یکی از آنها به عنوان کری یا رقم نقلی (Ci) وارد شده است، که میتواند از رقم نقلی خارج شده از یک FA دیگر باشد. اگر به ارزش هر پایه توجه کنید میبینید که به جز Ci+1 که رقم نقلی خارج شده (Cout) است، همه پایه ها دارای ارزش یکسانی هستند. در شکل زیر فلسفه این موضوع را بهتر متوجه میشوید:
ما دو عدد دو بیتی داریم که ارزش پایهها، 20 و 21 است. اگر این جمع را توسط دو FA انجام دهیم، در FA اول A0، B0، C0 و S0 با ارزش پایه 20 و Ci+1 نیز با ارزش پایه 21 قرار میگیرد. مسلم است که کری خارج شده از این FA باید به قسمت با ارزشتر (سمت چپاش) منتقل شود، که ما آن را به عنوان کری وارد شده به FA دوم در نظر میگیریم. به همین علت است که کری خارج شده از آخرین بیت ارزش پایهاش بیشتر است، در آخر نیز اگر دقت کنید کری خارج شده از FA دوم در جایگاه 22 قرار گرفته است.
تابع Sum و Carry یک تمام جمع کننده (SOP):
تابع Sum، FA همان تابع XOR است:
اما تابع Carry ،FA را میتوان ساده کرد، ما در اینجا با استفاده از جدول کارنو این ساده سازی را انجام میدهیم، ابتدا تابع ها را درون جدول کارنو میریزیم و سپس دستههایی از یک که توانی از دو دارند را انتخاب میکنیم(در صورت تمایل به یادگیری جدول کارنو و ساده سازی توابع توسط آن به صفحه مدار منطقیآموزش مدار منطقی به زبان ساده - بررسی مدار منطقی و انواع آنامروزه درک صحیحی از مدارهای منطقی برای هر مهندس برق و کامپیوتر ضروری است. این مدارها عنصر اصلی کامپیوترها و بسیاری از وسایل الکترونیکی اطراف ما هستند، در این صفحه به بررسی و آموزش مدار منطقی پرداخته شده است مراجعه کنید):
تابع ساده شده توسط جدول کارنو بالا، به شکل زیر است:
Carry = bc + ac + ab
به تابع Carry تمام جمع کننده (FA)، تابع اکثریت (Majority) میگویند.
مدار تمام جمع کننده
مدار یک تمام جمع کننده (شکل داخلی یک تمام جمع کننده-FA) به صورت زیر است:
تابع XOR بالا در واقع از چهار AND سه ورودی و یک OR چهار ورودی تشکیل شده است.
ساخت FA با استفاده از HA
با استفاده از دو HA و یک گیت OR یا XOR میتوانیم یک FA بسازیم:
در خروجی Sum، نیم جمع کننده اول a با b ،XOR شده است و خروجی Cout آن نیز a.b است، حال خروجی Sum بدست آمده را به عنوان یکی از ورودیهای HA دوم قرار میدهیم در ورودی دیگر آن c میگذاریم. در خروجی Sum، HA دوم، خروجی Sum نیم جمع کننده اول با c، XOR میشود که با توجه به خاصیت شرکت پذیری XOR خروجی Sum برابر است با :
خروجی Cout ما نیز، جمع دو خروجی Cout هر دو HA است که بعد از ساده سازی بر اساس جدول کارنو یا جبر بول به تابع Majority میرسیم:
Cout = ab + ac + bc
اگر به یاد داشته باشید اگر ضرب دو طرف XOR برابر صفر بود، میتوانستیم به جای XOR، OR قرار دهیم. در اینجا نیز چون ضرب خروجی های Cout هر دو HA برابر صفر است می توانیم به جای OR، XOR قرار دهیم.
جمع بندی
جمع کننده باینری، مدارات ترکیبی هستند که دارای چند گیت پایه بوده و جمع دو یا چند عدد باینری را انجام میدهند. نیم جمع کننده، مداری است دارای دو ورودی و دو خروجی، در خروجی اول جمع دو عدد باینری را محاسبه و در خروجی دوم رقم نقلی خارج شده از آن را میدهد. تمام جمع کننده، مداری است مانند نیم جمع کننده، با این تفاوت که سه ورودی دارد که ورودی سوم را میتوان به عنوان رقم نقلی خارج شده از یک تمام جمع کننده دیگر در نظر گرفت.
تفاوت تمام جمع کننده و نیم جمع کننده چیست؟
تمام جمع کننده (FA)، مداری است که سه ورودی دارد و دو خروجی، که یکی از خروجیهای آن Sum و دیگری Carry است. نیم جمع کننده (HA) با این تفاوت که دو ورودی داشته و خروجیهایش مانند تمام جمع کننده است. تمام جمع کننده میتواند خروجی رقم نقلی خارج شده (Carry) از یک تمام جمع کننده دیگر را به عنوان ورودی سوم خود در نظر بگیرد، این موضوع در نیم جمع کنندهها باعث محدود شدن استفاده از آنها در جمع کننده باینری چند بیتی قلمداد میشود.