معماری و ساختار میکروکنترلرهای AVR

شکل زیر معماری میکروکنترلرهای AVR را نشان می دهد. به طور کلی یک میکروکنترلر AVR  از نظر  ساختار داخلی حداکثر دارای واحدهای زیر می باشد :

  • واحد پردازش مرکزی CPU
  • واحد حافظه برنامه Flash
  • واحد حافظه داده EEPROM
  • واحد حافظه داده SRAM
  • واحد ورودی و خروجی I/O
  • واحد کنترل کلاک ورودی
  • واحد کنترل وقفه
  • واحد تایمر و کانتر
  • واحد مبدل آنالوگ به دیجیتال
  • واحد مقایسه کننده آنالوگ
  • واحد تایمر سگ نگهبان
  • واحد ارتباطات سریال SPI ،TWI و USART
  • واحد برنامه ریزی و عیب یابی JTAG

هسته مرکزی CPU ( واحد پردازش مرکزی )

این واحد که بر مبنای معماری RISC  ساخته شده است ، تمام فعالیت های میکروکنترلر را مدیریت کرده و تمام عملیات لازم بر روی داده ها را انجام می دهد . همچنین و ظیفه ارتباط با حافظه ها و کنترل تجهیزات جانبی را بر عهده دارد . درون هسته AVR  به تعداد 32 رجیستر همه منظوره ، واحد محاسبه و منطق (ALU) ، واحد رمز گشایی دستور ID ، رجیستر دستورالعمل IR ، رجیستر شمارنده برنامه PC  ، رجیستر وضعیت SREG و اشاره گر پشته SP  قرار دارند .

در ساختار پردازنده ها ( CPU )  از دو معماری متفاوت CISC و RISC استفاده می شود .

CISC :  مخفف Complete Instruction Set Computer   به معنای کامپیوتر با دستورالعمل کامل می باشد . در این ساختار تعداد دستورالعمل ها بسیار زیاد است . دستورها پیچیده بوده و با  سرعت پایین اجرا می  شوند ولی برنامه نویسی آن ساده تر (سطح بالا) است. CPUهای میکروکامپیوترهای PC  و لپ تاپ ها از این نوع هستند .

RISC :  مخفف Reduced Instruction Set Computer   به معنای کامپیوتر با دستورالعمل کاهش یافته می باشد . در این ساختار تعداد دستورالعم ل ها کمتر بوده و دستورات ساده تر هستند و با سرعت بسیار زیادی اجرا می شوند اما برنامه نویسی آن دشوار تر (سطح پایین) است. CPU  های میکروکنترلرها از این نوع هستند .

گفتیم که یکی از مزیت های میکروکنترلرها  نسبت به میکروکامپیوترها سرعت انجام ب الای  دستورالعمل ها در آن ها است. این مزیت از همین معماری منحصر به فرد میکروکنترلرها ناشی می شود . در واقع نقطه قوت میکروکنترلرها که باعث شده که به عنوان نسل پنجم شناخته شوند همین RICS  بودن آنها است که باعث می شود دستورات ساده را در سیکل کلاک کمتری نسبت به CISC انجام دهند . ایده اصلی RISC   اولین بار توسط جان کوکی از IBM   و در سال 1974  شکل گرفت، نظریه او به این موضوع اشاره داشت که  یک کامپیوتر تنها از 20  درصد از دستورات نیاز دارد و 80  درصد دیگر، دستورات غیرضروری هستند. پردازنده های ساخته شده براساس این طراحی از دستورات کمی پشتیبانی می  کنند به این ترتیب به  ترانزیستور کمتری نیز نیاز دارند و ساخت آنها نیز کم هزینه است. با کاهش تعداد ترانزیستورها و اجرای دستورات کمتر، پردازنده در زمان کمتری دستورات را پردازش می کند. اما درCISC  مجموعه  ای از دستورات بصورت فشرده و با آدرس دهی مختلف به یکباره پردازش می شوند، مثل اع داد اعشاری یا تقسیم که در طراحیRISC   وجود ندارند. از آنجایی که دستورات درRISC  ساده تر هستند پس سریعتر اجرا می  شوند و نیاز به ترانزیستور کمتری دارند، ترانزیستور کمتر هم به معنی دمای کمتر، مصرف پایین تر و فضای کمتر ا ست که آن را برای ابزارهای موبایل مناسب می  کند. مثلا اگر عمل ضرب توسط یک میکروکنترلر در 2  سیکل کلاک  انجام شود و کلاک میکرو روی 10  مگاهرتز تنظیم شده باشد ، عمل ضرب دو عدد به مدت 200  نانو ثانیه  طول میکشد ، در حالی که همان عمل ضرب در کامپیوتر با 100 کلاک انجام  می شود که اگر کلاک آن را 1  گیگاهرتز در نظر بگیریم ، عمل ضرب 100 نانو ثانیه طول می کشد . این مثال نشان می دهد که دستور ضرب  در یک میکروکامپیوتر با قیمت مثلا یک میلیون تنها دو برابر سریعتر از یک میکروکنترلر با قیمت 10  هزار تومان است. پس یک کامپیوتر برای  کارهای بزرگ تر مناسب است و یک میکرو کنترلر برای کارهای کوچکتر ساخته شده است و کار کوچک را با هزینه پایین تر و کیفیت بهتری انجام می دهد .

واحد محاسبه و منطق  (Arithmetic Logic Unit)

ALU  یا واحد محاسبه و منطق در میکروکنترلر AVR  به صورت مستقیم با تمام 32 رجیستر همه منظوره  ارتباط دارد. این واحد وظیفه انجام کلیه اعمال  محاسباتی  و منطقی را با استفاده از  رجیسترهای همه منظوره  و در یک دوره تناوب از  کلاک بر عهده دارد. به طور کلی عملکرد ALU  را می توان به سه قسمت اصلی ریاضیاتی، منطقی و توابع بیتی تقسیم بندی کرد در برخی از ALU  های توسعه یافته در معماری میکروکنترلرهای AVR  از یک ضرب کننده با قابلیت ضرب اعداد بدون علامت و علامتدار و نیز اعداد اعشاری استفاده شده است.

مفهوم ثبات یا رجیستر :

رجیستر ها نوعی از حافظه های موقت هستند (مانند RAM )  که از فلیپ فلاپ ها ساخته می شوند و  میتوانند 8 بیتی ،16 بیتی ،32  بیتی یا بیشتر باشند. از رجیستر ها به صورت گسترده در تمام ساختار و واحد های میکروکنترلرها استفاده می‌شود. میکروکنترلرهای AVR  هشت بیتی هستند.  بدین معنا که تمامی  رجیستر ها در آن ، 8  بیتی هستند.  مهمترین مسئله که در هنگام برنامه نویسی میکروکنترلرها با آن مواجه هستیم نحوه صحیح مقدار دهی رجیسترهای آن میکروکنترلر می باشد اگر میکروکنترلر را به یک کارخانه  تشبیه کنیم که این کارخانه دارای بخشهای زیادی است و در هر بخش یک اتاق کنترل وجود دارد و در هر  اتاق  کنترل تعدادی کلیدهای کنترلی وجود دارد ، این کلیدهای کنترلی همان رجیسترها هستند که مهمترین وظیفه یک برنامه نویس شناختن این کلیدها و مقداردهی مناسب آنها در برنامه است.

رجیسترهای CPU

رجیستر های عمومی  General Purpose Registers

میکروکنترلرهایAVR   دارای 32 رجیستر همه منظوره هستند این رجیسترها قسمتی از حافظه SRAM  میکروکنترلر می باشند . تعداد این رجیستر ها 32 عدد بوده و از R0 تا R31  شماره گذاری می شوند . هر  رجیستر دارای 8  بیت است که به طور مستقیم با واحد ALU در ارتباط است . رجیستر های R26 تا R31  به منظور آدرس  دهی غیر مستقیم ، در فضای حافظه داده و برنامه استفاده میشوند که به آن ها رجیستر های اشاره گر می گویند و به ترتیب به صورت XL  ،XH  ،YL  ،YH  ،ZL  و ZH  نامگذاری می شوند . یک امکان برای دو رجیستر جدا از هم فراهم شده است که بتوان توسط یک دستورالعمل خاص در یک س یکل کلاک به  آن دسترسی داشت . نتیجه این معماری کارایی بیشتر کدها تا ده برابر سریع تر از میکروکنترلر های با معماری CISC است .

رجیستر دستور Instruction Register

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

واحد رمز گشایی دستور Instruction Detector

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

رجیستر شمارنده برنامه Program Counter

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

رجیستر وضعیت Status & Control Register

این رجیستر 8 بیتی واقع در هسته اصلی میکرو بوده و بیت های آن تحت تاثیر برخی عملیات CPU  فعال  میشوند . این بیت ها به ترتیب از بیت 0  تا بیت 7 به صورت زیر هستند :

پرچم کری C : این پرچم هنگامی که عملیات محاسباتی کری دهد یک می شود

پرچم صفر Z : این پرچم هنگامی که نتیجه یک عملیات محاسباتی یا منطقی صفر شود فعال می شود

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

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

پرچم علامت S : این پرچم همواره نتیجه XOR بین دو پرچم N و V می باشد

پرچم نیم کری H :  اگر هنگام عملیات جمع یک انتقال از بیت 3  به 4  در یکی از رجیستر های عمومی یا  نتیجه   نیم بایت پایین ( بیت های 0  تا 3  ) بزرگتر از 9 باشد ، این پرچم فعال خواهد شد.

بیت T :  از این بیت در هنگام استفاده از دستورات اسمبلی BLD و BST  به عنوان مقصد یا مبدا استفاده  می  شود .  بیت فعالساز وقفه سراسری I :  در صورت یک بودن این بیت وقفه سراسری فعال می شود و در غیر این صورت هیچ وقفه ای رخ نمی دهد . این بیت در هنگام رخ دادن وقفه صفر و دوباره یک می شود

 رجیستر اشاره گر پشته Stack Pointer

پشته قسمتی از فضای حافظه داده SRAM  است که جهت ذخیره اطلاعات و معمولا در اجرای دستور فراخوانی (CALL) و یا اجرای برنامه وقفه نیاز می باشد . همچنین به کمک دستورات اسمبلی PUSH و POP میتوان به این قسمت نفوذ داشت. اشاره گر پشته یا SP  دارای 16  بیت است و از دو رجیستر . بیتی SPL و SPH تشکیل شده است. در ابتدا وقتی سیستم روشن می شود CPU  از محل استقرار حافظه پشته اطلاعی ندارد ) پیش فرض SP=0 ) بنابراین باید آدرسی از حافظه SRAM  که مربوط به فضای پشته است را به اطلاع سیستم رساند .

با اجرای دستور PUSH R0 ، محتوای رجیستر R0 با محتوای خانه ای از فضای پشته که SP  به آن اشاره میکند جایگزین شده و بعد از آن SP یک واحد کاهش می یابد . همچنین با اجرای دستور POP  محتوای حافظه پشته بیرون آمده و SP یک واحد افزایش می یابد .

نحوه عملکرد واحد CPU

در هنگام روشن شدن میکرو کنترلر یک مقدار از پیش تعیین شده در درون رجیستر PC  قرار می گیرد که  این مقدار از پیش تعیین شده همان آدرسی از حافظه فلش است که کد دستور اول در آن قرار دارد. سپس CPU فرآیند خواندن دستور العمل را انجام می دهد که به این مرحله Fetch می گویند. سپس CPU  بعد از خواندن کد دستور آن را در رجیستر IR قرار می دهد تا واحد رمز گشایی دستور (ID) کد موجود در IR  را تجزیه و تحلیل کرده و عملی که باید انجام گیرد را مشخص می کند ( Decode )  سپس با ارسال سیگنال های کنترلی ، سایر داده های مورد نیاز دستورالعمل را فراخوانی و واکشی کرده ( Memory Fetch )  و سرانجام ALU عملیات مشخص شده را بر روی داده ها انجام می دهد (Execute) . در نهایت مقدار PC تغییر کرده و آدرس بعدی که باید اجرا شود در آن قرار میگیرد و چرخه ادامه می یابد .

نکته :
برنامه نویس به رجیسترهای درون CPU  کاری ندارد . رجیسترهای درون هسته مرکزی ، رجیسترهای  خود سیستم هستند که هر یک وظیفه مشخصی دارند و مقدار آنها دائما تغییر می کند . رجیسترهای فوق الذکر فقط برای شناخت بهتر AVR  و درک عملکرد این واحد معرفی شدند و در عمل یک برنامه نویس نیازی به استفاده از آن ندارد  اما برای یک مهندس بهتر است فراتر از یک برنامه نویس باشد و درک عمیق تری از سخت افزار داشته باشد .

 

خط لوله Pipelining

مراحل اجرای یک دستور که توسط کاربر نوشته می شود به این صورت است که بعد از روشن شدن میکرو اولین آدرس حافظه فلش که حاوی اولین دستورالعمل است واکشی می شود. بعد از واکشی ترجمه یا رمز گشایی می شود ، معماری این میکرو به صورتی طراحی شده است که قابلیت واکشی (Fetch) ، رمز گشایی (Decode) و اجرای دستور (Execute)  را به صورت پشت سر هم  را دارد . به عبارت دیگر وقتی یک دستور در مرحله اجراست دستور بعدی در مر حله رمز گشایی و دستور بعد از آن در مرحله واکشی قرار دارد تا  همزمان همه واحد ها بیکار نباشند و سرعت پردازش چند برابر شود . به طور کلی معماری پایپ لاین در  پردازنده را می توان به خط تولید کارخانه تشبیه کرد طوری که وقتی خط تولید شروع به کار می کند هیچ  کدام از بخش ها بیکار نمی مانند و هر کدام وظایف مربوط به خود را به طور مداوم انجام می دهند.  در شکل زیر نحوه انجام پایپ لاین توسط میکرو نشان داده شده است . در سیکل اول کلاک ، تنها دستور اول از حافظه واکشی می شود ، در سیکل دوم کلاک ، دستور اول که واکشی شده بود ، به واحد رمزگشایی میرود و دستور دوم واکشی می شود . در سیکل سوم کلاک دستور اول وارد مرحله اجرا می شود در حالی که دستور دوم به

واحد رمزگشایی میرود و دستور سوم واکشی می شود و همین طور این کار دائما تکرار می شود . pipelining یکی از مزیت های بسیار مهم معماری RISC  محسوب می شود که باعث افزایش سرعت می شود . پایپ لاین  در میکروکنترلر های مختلف میتواند مراحل متفاوتی داشته باشد میکروکنترلرهای با 3، 5، 8 و حتی 13 مرحله پایپ لاین نیز وجود دارند اما در میکروکنترلرهای AVR  ، پایپ لاین  فقط 2 مرحله Fetch و Execute را دارد.