نحوه عملکرد CPU چگونه است؟
وظیفه اصلی یک CPU این است که یک سری دستورالعمل ها به نام برنامه را که در یک حافظه خاص ذخیره شده اند اجرا کند.
در این جلسه در پی تشریح همین یک جمله هستیم!
ساختار داخلی CPU
در ابتدا ببینیم که یک CPU از چه بخش هایی تشکیل شده است. در شکل زیر نمایی خیلی ساده از CPU نشان داده شده است:
-
- PC یا Program Counter شمارنده برنامه هست. CPU هر بار یک دستور را از حافظه برداشت کرده و آن را اجرا می کند. با اتمام اجرای آن دستور شمارنده برنامه یک واحد افزایش یافته و CPU دستور بعدی را اجرای می کند.
- Instruction Decoder دیکدر یا رمزگشای دستورالعمل است. دستورالعمل هایی که در حافظه ذخیره شده اند و CPU آن ها را اجرا می کند به صورت اعدا باینری ۰ و ۱ هستند. بنابراین CPU هر بار تعدادی ۰ و ۱ (مثلا یک بایت) را از حافظه برداشت می کند. اینکه این ۰ و ۱ ها به چه معنی هستند به عهده دیکدر دستورالعمل هست. می توان به دیکدر دستورالعمل به عنوان یک دیکشنری نگاه کرد که معنی هر دستورالعمل و مراحلی را که CPU باید برای اجرای آن دستورالعمل انجام دهد ذخیره کرده است. طبیعی است که تعداد دستورالعملی را که یک دیکدر خاص می تواند ترجمه کند به طراحی آن CPU خاص بستگی دارد و برای CPU های مختلف متفاوت است.
- ALU یا Arithmetic Logic Unit همان واحد محاسبه و منطق هست. در هر کجای اجرای برنامه لازم باشد که اعمال محاسباتی(جمع، تفریق و…) و منطقی(بزرگتر، کوچکترو…) انجام گیرد، CPU از این واحد کمک می گیرد.
- رجیسترها حافظه های موقتی هستند که CPU از آن ها برای ذخیره سازی موقت داده ها کمک می گیرد.
عملکرد داخلی یک CPU
در فلوچارت زیر مراحلی را که یک CPU برای اجرای یک دستورالعمل انجام می دهد آورده شده است:
طبق فلوچارت فوق کارهایی که CPU برای اجرای یک دستورالعمل انجام می دهد را می توان به سه مرحله کلی تقسیم کرد:
۱- برداشت دستورالعمل از حافظه: واکشی یا Fetch
۲- رمزگشایی و ترجمه دستورالعمل توسط دیکدر دستورالعمل: رمزگشایی یا Decode
۳- اجرای دستورالعمل رمزگشایی شده و طی کردن مراحل لازم جهت اجرا: اجرا یا Execute
حال می خواهیم با یک مثال ساده با این مراحل بیشتر آشنا شویم. ابتدا سیستم فرضی که در بخش قبل با آن آشنا شدیم را دوباره در نظر می گیریم:
آدرس های ۰ تا ۱۵ مختص حافظه و از ۱۶ به بالا برای ادوات جانبی می باشند. این CPU قرار است دستورالعمل هایی که در حافظه ذخیره شده اند را اجرا کند. فرض کنید CPU می خواهد دستورات زیر را اجرا کند:
۱- محتویات آدرس ۱۷ را به رجیستر A منتقل کند. معادل باینری: ۳۱h
۲- محتویات رجیستر A را در رجیستر B کپی کند. معادل باینری: C4h
۳- محتویت آدرس ۶ را به رجیستر A منتقل کند. معادل باینری: ۲۶h
۴- رجیستر A را با رجیستر B جمع کرده حاصل را در رجیستر A قرار دهد. معادل باینری: ۸۱h
۵- محتویات رجیستر A را در آدرس ۷ قرار دهد. معادل باینری: EAh
همانطور که قبلا گفتیم دستورالعمل های ۵گانه فوق به صورت باینری در حافظه ذخیره می شوند. معادل باینری هر یک از دستورالعمل ها هم به صورت هگزا دسیمال در مقابل آن ها نوشته شده است. به عنوان مثال وقتی مقدار ۳۱ هگزادسیمال و یا معادل آن ۰۰۱۱۰۰۰۱ باینری را به دیکدر دستورالعمل می دهیم تفسیر آن دستورالعمل شماره ۱ یعنی انتقال محتویات آدرس ۱۷ به رجیستر A می شود.
به این ترتیب می توان تصور نمود که محتویات حافظه قبل از متصل نمودن تغذیه میکرو به صورت زیر می باشد:
در خانه های ۰ تا ۴ دستورالعمل ها ذخیره شده اند. چون یکی از دستورالعمل ها مربوط به خواندن از آدرس ۶ حافظه هست فرض کردیم در این خانه هم مقدار ۵ هگزادسیمال ذخیره شده است. در دیگر خانه های حافظه هم اهمیتی ندارد که چه داده ای ذخیره شده اند. حال CPU برای اجرای این دستورالعمل ها باید مراحل زیر را طی کند:
۱- محتویات آدرس ۱۷ را به رجیستر A منتقل کند.
واکشی: در ابتدا که تغذیه CPU وصل می شود PC با مقدار ۰ بارگذاری می شود. در این مرحله همین مقدار ۰ بر روی باس آدرس قرار گرفته و محتویات خانه ۰ حافظه خوانده شده و تحویل رمزگشای دستورالعمل قرار می گیرد.
رمزگشایی: رمزگشای دستورالعمل دستور را ترجمه کرده و می فهمد که باید محتویات آدرس ۱۷ که مربوط به ادوات جانبی است را به رجیستر A منتقل کند.
اجرا: جهت اجرای این دستورالعمل لازم است که آدرس ۱۷ روی باس آدرس قرار گرفته و و محتویات ادوات جانبی ۱۷ به رجیستر A منتقل شود. فرض می کنیم که این محتویات مقدار ۹ هگزادسیمال باشد. بنابراین پس از اجرای این دستور محتویات رجیستر A برابر ۹ می باشد. در انتها شمارنده برنامه یک واحد افزایش می یابد.
۲- محتویات رجیستر A را در رجیستر B کپی کند.
واکشی: مقدار PC که در مرحله قبل به ۱ افزایش یافت در باس آدرس قرار گرفته و دستورالعمل موجود در خانه ۱ حافظه یعنی C4 به دیکدر دستورالعمل منتقل می شود.
رمزگشایی: دیکدر دستورالعمل C4 هگز را رمزگشایی کرده و می فهمد که محتویات رجیستر A باید در رجیستر B کپی شود.
اجرا: محتویات رجیستر A که همان ۹ است در رجیستر B کپی می شود. بنابراین هر دو رجیستر A و B حاوی مقدار ۹ می شوند. مقدار PC به ۲ افزایش می یابد.
۳- محتویت آدرس ۶ را به رجیستر A منتقل کند.
واکشی: مقدار PC که برابر ۲ است در باس آدرس قرار گرفته و محتویات خانه ۲ حافظه یعنی ۲۶ هگز به دیکدر دستورالعمل منتقل می شود.
رمزگشایی: مقدار ۲۶ هگز رمزگشایی شده و مشخص می شود که باید محتویات آدرس ۶ که مربوط به حافظه است به داخل رجیستر A کپی شود.
اجرا: ابتدا مقدار ۶ در باس آدرس قرار می گیرد. و سپس محتویات خانه ۶ حافظه که برابر ۵ هست به داخل رجیستر A منتقل می شود. در نهایت PC به ۳ افزایش می یابد.
۴- رجیستر A را با رجیستر B جمع کرده حاصل را در رجیستر A قرار دهد.
واکشی: مقدار ۳ در باس آدرس قرار گرفته و مقدار ۸۱ هگز از خانه ۳ حافظه به دیکدر دستورالعمل منتقل می شود.
رمزگشایی: پس از رمزگشایی ۸۱ هگز توسط دیکدر دستورالعمل مشخص می شود که محتویات رجیستر های A و B باید با هم جمع شده و نتیجه در رجیستر A قرار گیرد.
اجرا: چون این دستورالعمل شامل یک عبارت محاسباتی می باشد CPU برای اجرای آن از ALU کمک می گیرد. محتویات رجیسترهای A و B را به ALU می دهد و حاصل جمع خروجی را که برابر ۱۴ یا E هگزادسیمال هست در رجیستر A ذخیره می کند. PC به ۴ افزایش می یابد.
۵- محتویات رجیستر A را در آدرس ۷ قرار دهد.
واکشی: مقدار PC را در باس آدرس قرار داده و محتویات خانه ۴ حافظه که همان EA هگز می باشد به دیکدر دستورالعمل منتقل می شود.
رمزگشایی: با رمزگشایی EA هگز مشخص می شود که باید مقدار رجیستر A که برابر ۱۴ هست به آدرس ۷ که همان خانه ۷ حافظه هست منتقل شود.
اجرا: ابتدا آدرس ۷ روی باس آدرس قرار می گیرد. سپس محتویات رجیستر A به خانه ۷ حافظه منتقل می شود.
نحوه اجرای این مراحل را در پاورپویت زیر به زیبایی مشاهده نمایید:(برای اجرای افکت ها کافیست هربار روی اسلاید کلیک یا لمس نمایید)
How-Computers-Work پاورپوینت
اما فقط می ماند یک چیز! اینکه دستورالعمل ها چگونه توسط دیکدر دستورالعمل ترجمه می شوند. یعنی این دیکدر از کجا می فهمد که ۳۱h یعنی محتویات آدرس ۱۷ را در رجیستر A ذخیره کن! برای اینکه به این سوال پاسخ دهیم ۳۱h را به صورت باینری در زیر مشاهده می کنید:
اگر بخش آبی رنگ را به دسیمال برگردانیم عدد ۱۷ را به ما می دهد! بنابراین در داخل ۳۱h عدد ۱۷ نهفته است. اما بخش زرد به چه معناست؟ توضیح اینکه در میکروکنترلرها و اصولا در کامپیوترها دستورالعمل ها به دو بخش تقسیم می شوند. یک بخش که به آن کد دستور یا Opcode گفته می شود کد مختص هر دستورالعملی است. مثلا در دستور فوق کد ۰۰۱ مربوط به دستورالعمل انتقال از یک آدرس به رجیستر A می باشد. حال اینکه چه آدرسی باید به رجیستر A منتقل شود توسط بخش دوم که به آن عملوند یا Operand گفته می شود مشخص می شود.
بنابراین با ۳ بیتی که برای کد دستور برای این CPU فرضی در نظر گرفتیم تنها ۸ دستورالعمل توسط این دیکدر دستورالعمل قابل ترجمه می باشد. تعداد بیت های دستورالعمل در میکروکنترلرهای مختلف متفاوت است اما اصول بنیادین تفاوتی نمی کند.