خانه > آموزش > CPU چگونه کار می کند؟

CPU چگونه کار می کند؟

در جلسه قبل با ساختار داخلی یک میکروکنترلر و نحوه اتصال CPU به ادوات جانبی و حافظه ها آشنا شدیم. در این جلسه می خواهیم نگاه دقیق تری به CPU و نحوه عملکرد آن داشته باشیم. وظیفه اکثر CPU ها را می توان به طور خلاصه در یک جمله بیان کرد:

 وظیفه اصلی یک CPU این است که یک سری دستورالعمل ها به نام برنامه را که در یک حافظه خاص ذخیره شده اند اجرا کند.

در این جلسه در پی تشریح همین یک جمله هستیم!

ساختار داخلی CPU

در ابتدا ببینیم که یک CPU از چه بخش هایی تشکیل شده است. در شکل زیر نمایی خیلی ساده از CPU نشان داده شده است:

cpu of microcontroller

  • PC یا Program Counter شمارنده برنامه هست. CPU هر بار یک دستور را از حافظه برداشت کرده و آن را اجرا می کند. با اتمام اجرای آن دستور شمارنده برنامه یک واحد افزایش یافته و CPU دستور بعدی را اجرای می کند.

  • Instruction Decoder دیکدر یا رمزگشای دستورالعمل است. دستورالعمل هایی که در حافظه ذخیره شده اند و CPU آن ها را اجرا می کند به صورت اعدا باینری 0 و 1 هستند. بنابراین CPU هر بار تعدادی 0 و 1 (مثلا یک بایت) را از حافظه برداشت می کند. اینکه این 0 و 1 ها به چه معنی هستند به عهده دیکدر دستورالعمل هست. می توان به دیکدر دستورالعمل به عنوان یک دیکشنری نگاه کرد که معنی هر دستورالعمل و مراحلی را که CPU باید برای اجرای آن دستورالعمل انجام دهد ذخیره کرده است. طبیعی است که تعداد دستورالعملی را که یک دیکدر خاص می تواند ترجمه کند به طراحی آن CPU خاص بستگی دارد و برای CPU های مختلف متفاوت است.

  • ALU یا Arithmetic Logic Unit همان واحد محاسبه و منطق هست. در هر کجای اجرای برنامه لازم باشد که اعمال محاسباتی(جمع، تفریق و…) و منطقی(بزرگتر، کوچکترو…) انجام گیرد، CPU از این واحد کمک می گیرد.

  • رجیسترها حافظه های موقتی هستند که CPU از آن ها برای ذخیره سازی موقت داده ها کمک می گیرد.

عملکرد داخلی یک CPU

در فلوچارت زیر مراحلی را که یک CPU برای اجرای یک دستورالعمل انجام می دهد آورده شده است:

CPU work

طبق فلوچارت فوق کارهایی که CPU برای اجرای یک دستورالعمل انجام می دهد را می توان به سه مرحله کلی تقسیم کرد:

1- برداشت دستورالعمل از حافظه:  واکشی یا Fetch

2- رمزگشایی و ترجمه دستورالعمل توسط دیکدر دستورالعمل:  رمزگشایی یا  Decode

3- اجرای دستورالعمل رمزگشایی شده و طی کردن مراحل لازم جهت اجرا: اجرا یا Execute

حال می خواهیم با یک مثال ساده با این مراحل بیشتر آشنا شویم. ابتدا سیستم فرضی که در بخش قبل با آن آشنا شدیم را دوباره در نظر می گیریم:

microcontroller architecture

آدرس های 0 تا 15 مختص حافظه و از 16 به بالا برای ادوات جانبی می باشند. این CPU قرار است دستورالعمل هایی که در حافظه ذخیره شده اند را اجرا کند. فرض کنید CPU می خواهد دستورات زیر را اجرا کند:

1- محتویات آدرس 17 را به رجیستر A منتقل کند.      معادل باینری: 31h

2- محتویات رجیستر A را در رجیستر B کپی کند.         معادل بانیری: C4h

3- محتویت آدرس 6 را به رجیستر A منتقل کند.         معادل باینری: 26h

4- رجیستر A را با رجیستر B جمع کرده حاصل را در رجیستر A قرار دهد.      معادل باینری: 81h

5- محتویات رجیستر A را در آدرس 7 قرار دهد.        معادل باینری: EAh

همانطور که قبلا گفتیم دستورالعمل های 5گانه فوق به صورت باینری در حافظه ذخیره می شوند. معادل باینری هر یک از دستورالعمل ها هم به صورت هگزادسیمال در مقابل آن ها نوشته شده است. به عنوان مثال وقتی مقدار 31 هگزادسیمال و یا معادل آن 00110001 باینری را به دیکدر دستورالعمل می دهیم تفسیر آن دستورالعمل شماره 1 یعنی انتقال محتویات آدرس 17 به رجیستر A می شود.  

به این ترتیب می توان تصور نمود که محتویات حافظه قبل از متصل نمودن تغذیه میکرو به صورت زیر می باشد:

memory content

در خانه های 0  تا 4 دستورالعمل ها ذخیره شده اند. چون یکی از دستورالعمل ها مربوط به خواندن از آدرس 6 حافظه هست فرض کردیم در این خانه هم مقدار 5 هگزادسیمال ذخیره شده است. در دیگر خانه های حافظه هم اهمیتی ندارد که چه داده ای ذخیره شده اند. حال CPU برای اجرای این دستورالعمل ها باید مراحل زیر را طی کند:

1-  محتویات آدرس 17 را به رجیستر A منتقل کند.     

  واکشی: در ابتدا که تغذیه CPU وصل می شود PC با مقدار 0 بارگذاری می شود. در این مرحله همین مقدار 0 بر روی باس آدرس قرار گرفته و محتویات خانه 0 حافظه خوانده شده و تحویل رمزگشای دستورالعمل قرار می گیرد.

رمزگشایی: رمزگشای دستورالعمل دستور را ترجمه کرده و می فهمد که باید محتویات آدرس 17 که مربوط به ادوات جانبی است را به رجیستر A منتقل کند.

اجرا: جهت اجرای این دستورالعمل لازم است که آدرس 17 روی باس آدرس قرار گرفته و و محتویات ادوات جانبی 17 به رجیستر A منتقل شود. فرض می کنیم که این محتویات مقدار 9 هگزادسیمال باشد. بنابراین پس از اجرای این دستور محتویات رجیستر A برابر 9 می باشد. در انتها شمارنده برنامه یک واحد افزایش می یابد.

2- محتویات رجیستر A را در رجیستر B کپی کند.         

واکشی: مقدار PC که در مرحله قبل به 1 افزایش یافت در باس آدرس قرار گرفته و دستورالعمل موجود در خانه 1 حافظه یعنی C4 به دیکدر دستورالعمل منتقل می شود.

رمزگشایی: دیکدر دستورالعمل C4 هگز را رمزگشایی کرده و می فهمد که محتویات رجیستر A باید در رجیستر B کپی شود.

اجرا: محتویات رجیستر A که همان 9 است در رجیستر B کپی می شود. بنابراین هر دو رجیستر A و B حاوی مقدار 9 می شوند. مقدار PC به 2 افزایش می یابد.

3- محتویت آدرس 6 را به رجیستر A منتقل کند.        

واکشی: مقدار PC که برابر 2 است در باس آدرس قرار گرفته و محتویات خانه 2 حافظه یعنی 26 هگز به دیکدر دستورالعمل منتقل می شود.

رمزگشایی: مقدار 26 هگز رمزگشایی شده و مشخص می شود که باید محتویات آدرس 6 که مربوط به حافظه است به داخل رجیستر A کپی شود.

اجرا: ابتدا مقدار 6 در باس آدرس قرار می گیرد. و سپس محتویات خانه 6 حافظه که برابر 5 هست به داخل رجیستر A منتقل می شود. در نهایت PC به 3 افزایش می یابد.

4- رجیستر A را با رجیستر B جمع کرده حاصل را در رجیستر A قرار دهد.      

واکشی: مقدار 3 در باس آدرس قرار گرفته و مقدار 81 هگز از خانه 3 حافظه به دیکدر دستورالعمل منتقل می شود.

رمزگشایی: پس از رمزگشایی 81 هگز توسط دیکدر دستورالعمل مشخص می شود که محتویات رجیستر های A و B باید با هم جمع شده و نتیجه در رجیستر A قرار گیرد.

اجرا: چون این دستورالعمل شامل یک عبارت محاسباتی می باشد CPU برای اجرای آن از ALU کمک می گیرد. محتویات رجیسترهای A و B را به ALU می دهد و حاصل جمع خروجی را که برابر 14 یا E هگزادسیمال هست در رجیستر A ذخیره می کند. PC به 4 افزایش می یابد.

5- محتویات رجیستر A را در آدرس 7 قرار دهد.       

واکشی: مقدار PC را در باس آدرس قرار داده و محتویات خانه 4 حافظه که همان EA هگز می باشد به دیکدر دستورالعمل منتقل می شود.

رمزگشایی: با رمزگشایی EA هگز مشخص می شود که باید مقدار رجیستر A که برابر 14 هست به آدرس 7 که همان خانه 7 حافظه هست منتقل شود.

اجرا: ابتدا آدرس 7 روی باس آدرس قرار می گیرد. سپس محتویات رجیستر A به خانه 7 حافظه منتقل می شود.

نحوه اجرای این مراحل را در پاورپویت زیر به زیبایی مشاهده نمایید:(برای اجرای افکت ها کافیست هربار روی اسلاید کلیک یا لمس نمایید)

دانلود پاورپوینت

اما فقط می ماند یک چیز! اینکه دستورالعمل ها چگونه توسط دیکدر دستورالعمل ترجمه می شوند. یعنی این دیکدر از کجا می فهمد که 31h یعنی محتویات آدرس 17 را در رجیستر A ذخیره کن! برای اینکه به این سوال پاسخ دهیم 31h را به صورت باینری در زیر مشاهده می کنید:

opcode operand

اگر بخش آبی رنگ را به دسیمال برگردانیم عدد 17 را به ما می دهد! بنابراین در داخل 31h عدد 17 نهفته است. اما بخش زرد به چه معناست؟ توضیح اینکه در میکروکنترلرها و اصولا در کامپیوترها دستورالعمل ها به دو بخش تقسیم می شوند. یک بخش که به آن کد دستور یا Opcode گفته می شود کد مختص هر دستورالعملی است. مثلا در دستور فوق کد 001 مربوط به دستورالعمل انتقال از یک آدرس به رجیستر A می باشد. حال اینکه چه آدرسی باید به رجیستر A منتقل شود توسط بخش دوم که به آن عملوند یا Operand گفته می شود مشخص می شود.  

بنابراین با 3 بیتی که برای کد دستور برای این CPU فرضی در نظر گرفتیم تنها 8 دستورالعمل توسط این دیکدر دستورالعمل قابل ترجمه می باشد. تعداد بیت های دستورالعمل در میکروکنترلرهای مختلف متفاوت است اما اصول بنیادین تفاوتی نمی کند.

خوانندگان علاقه مند می توانند برای بقیه دستورالعمل های گفته نیز دو بخش کد و عملوند را از هم جدا نموده و تحلیل نمایند.

در آماده سازی این بخش از فصل صفر کتاب avr microcontroller and embedded systems using assembly and c نوشته آقای مزیدی استفاده شده است. 

دانلود منبع فوق

موفق و موید باشید.

درباره ی مدیر سایت

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *