پروژه, توصیه شده, مقاله های سیسوگ

بخش سوم ساخت شبیه ساز CPU: اضافه کردن دستورات دو مرحله ای

قسمت سوم شبیه ساز CPU

مقدمه

قبلا در این پست که رجیستر W را همراه با کدهای عملیاتی جدید اضافه کردیم، برای اولین بار رجیستر W معرفی شد، حالا کمی بیشتر با این رجیستر آشنا می شویم، و به نحوه کارکرد دستورات دو مرحله ای می پردازیم، و در نهایت این دستور ها را به شبیه ساز خود اضافه می کنیم.

معرفی دستورها و نحوه کارکرد آنها

دستورات زیر، دستورات دو مرحله ای هستند، به این معنی که ممکن است دستوری را اجرا نکنند و از آن بگذرند، توجه داشته باشید که در بعضی از دستور ها از حرف d استفاده شده که به معنی destination (فاصله) می باشد.

دستور INCF f, d

این دستور به مقدار رجیستر داده شده یکی اضافه می کند. و در صورتی که مقدار d برابر با 0 بود مقدار را در رجیستر W ذخیره می کنید و اگر مقدار برابر با 1 بود، نتیجه در خود آدرس داده شده ذخیره می شود.

در صورتی که مقدار بزرگتر از 255 بود مقدار رجیستر برابر با 0 می شود.

بخش سوم ساخت شبیه ساز CPU: اضافه کردن دستورات دو مرحله ای

دستور INCFSZ f, d

این دستور همانند دستور INCF یکی به مقدار رجیستر داده شده اضافه می کند. و در صورتی که d برابر با 0 بود مقدار را در رجیستر W و در غیر این صورت اگر برابر با 1 بود مقدار را در آدرس داده شده قرار می دهد.

تفاوت این دستور با دستور INCF این است که در صورتی که مقدار برابر با 0 شد دستور بعدی اجرا نمی شود و بجای آن یک NOP اجرا می شود (دو مرحله ای). و در صورتی که مقدار برابر با 0 نبود، دستور بعد از INCFSZ اجرا می شود (به صورت عادی)

بخش سوم ساخت شبیه ساز CPU: اضافه کردن دستورات دو مرحله ای

دستور DECF f, d

این دستور یکی از مقدار آدرس داده شده کم می کند. در صورتی که مقدار آدرس داده شده برابر با 0 نباشد. و مثل دستور های قبلی اگر مقدار d برابر با 0 بود نتیجه در رجیستر W ذخیره می شود و در غیر این صورت اگر برابر با 1 بود مقدار در آدرس داده شده ذخیره می شود.

بخش سوم ساخت شبیه ساز CPU: اضافه کردن دستورات دو مرحله ای

دستور DECFSZ f, d

این دستور نیز مانند دستور DECF یکی از مقدار آدرس داده شده کم میکند در صورتی که برابر با 0 نباشد، و اگر مقدار d برابر با 0 بود مقدار در جیستر W ذخیره می شود و در غیر این صورت مقدار اگر برابر با 1 بود مقدار در آدرس داده شده ذخیره می شود.

تفاوت این دستور با دستور DECF این است که اگر مقدار برابر با 0 بود بجای دستور بعدی یک NOP اجرا می شود، در غیر این صورت مثل DECF عمل می کند و دستور بعدی نیز به صورت عادی اجرا می شود.

بخش سوم ساخت شبیه ساز CPU: اضافه کردن دستورات دو مرحله ای

دستور BTFSC f, b

این دستور برای تست کردن بیت می باشد به صورتی که f برابر با آدرس و b برابر با شماره بیت (0 تا 7) می باشد، در صورتی که بیت مورد نظر در آدرس داده شده برابر با 0 بود، دستور بعدی اجرا نمی شود و بجای آن یک NOP اجرا می شود، در غیر این صورت (برابر با 1 بود) اتفاقی نمی افتد.

بخش سوم ساخت شبیه ساز CPU: اضافه کردن دستورات دو مرحله ای

دستور BTFSS f, d

این دستور نیز برای تست می باشد و همانند دستور BTFSC یک آدرس (f) و شماره بیت (b) را می گیرد. که شماره بیت می تواند بیت 0 تا 7 باشد.

تفاوت این دستور با BTFSC این است که در صورتی که مقدار بیت داده شده برابر با 1 بود بجای دستور بعدی یک NOP اجرا می شود و در صورتی که برابر با 0 بود اتفاق خاصی نمی افتد.

بخش سوم ساخت شبیه ساز CPU: اضافه کردن دستورات دو مرحله ای

اضافه کردن این دستور های به شبیه ساز

اول از همه باید بخش decode مربوط به CPU را به روز کنیم، که CPU قادر باشد دستورها را تشخیص دهد و مقدار های مورد نیاز را از instruction داده شده استخراج کند

حالا به تابع decode_inst دستورات زیر را اضافه می کنیم:

آپدیت کردن تابع execute

بعد از decode حالا زمان اجرا کردن دستورات توسط پردازنده می باشد، که توابعی را که قبلا در این پست نوشته ایم را آپدیت می کنیم:

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

کاری که این متغیر می کند:

بخش سوم ساخت شبیه ساز CPU: اضافه کردن دستورات دو مرحله ای

در خط 1 این متغیر تعریف شده و در خط 6 با توجه با تابع execute مقدار دهی می شود (یا 0 یا 1) و در خط 11 بررسی می شود که آیا متغیر bypass برابر است با 1، و در این صورت در خط 12 مقدار برابر با 0 می شود (تا از رد شدن از دستورات بعدی جلوگیری کند)، و در خط 13 مقدار شمارنده برنامه را یکی بیشتر می کند (باعث رد شدن از دستور بعدی می شود) و در نهایت در خط 14 باعث جلوگیری از اجرا شدن دستورات دیگر می شود و به اول حلقه باز می گردد.

بررسی کد Assembly

حالا برای آشنایی بیشتر با این دستور ها، به کدهای اسمبلی زیر توجه کنید:

بخش سوم ساخت شبیه ساز CPU: اضافه کردن دستورات دو مرحله ای

  • در خط 1 مقدار GPIO را برابر با 0x06 قرار داده ایم که رجیستر مربوط به ورودی/خروجی عمومی می باشد
  • در خط 3 یک لیبل با اسم start را تعریف کرده ایم
  • در خط 4 به مقدار GPIO، یکی اضافه می کنیم و در نهایت نتیجه را در GPIO ذخیره می کنیم
  • در خط 5 بیت شماره 7 مربوط به GPIO را تست می کنیم، در صورتی که شماره بیت داده شده برابر با 0 بود، دستور بعدی اجرا نمی شود، در غیر این صورت دستور خط شماره 6 که برابر با SLEEP می باشد، اجرا می شود
  • در خط 7، شمارنده برنامه (PC) را به موقعیت start میبریم، و این کار را تکرار میکنیم

در کد بالا مقدار GPIO مداوم افزایش می یابد تا با مقدار باینری 0b10000000 برابر شود (برابر با عدد 128) و بعد از آن میکروکنترلر به حالت SLEEP می رود.

برای تست دستور DECF نیز می توانیم کد زیر را داشته باشیم:

بخش سوم ساخت شبیه ساز CPU: اضافه کردن دستورات دو مرحله ای

  • مانند کد قبل در خط 1، مقدار 0x06 را در GPIO قرار می دهیم
  • در خط 3 به رجیستر W مقدار 0b11111111 به باینری یا 0xFF را می دهیم
  • در خط 4 مقدار رجیستر W را در GPIO قرار می دهیم
  • در خط 6 مانند کد قبل، یک لیبل به اسم start را تعریف می کنیم
  • در خط 7، از مقدار GPIO یکی کم می کنیم و نتیجه را در خود GPIO ذخیره می کنیم
  • در خط 8، با استفاده از دستور BTFSS، بیت شماره 7 را چک میکنیم، در صورتی که برابر با 1 بود، بجای دستور بعدی یک NOP اجرا می شود، در غیر این صورت اگر برابر با 0 بود دستور بعدی به صورت عادی اجرا می شود
  • در خط 9 دستور SLEEP برای متوقف کردن CPU تعریف شده است
  • در خط 10، از GOTO استفاده شده تا به start بازگردد و یک حلقه را ایجاد کند

کاری که این کد در مجموع انجام می دهد به این صورت می باشد که اول مقدار 255 (0b11111111) را در GPIO قرار میدهد (با استفاده از MOVLW و MOVWF)، بعد در هر حلقه یکی از 255 کم می کند، و در صورتی که مقدار برابر با 127 شد (با 0b01111111) دستور SLEEP اجرا می شود.

بخش سوم ساخت شبیه ساز CPU: اضافه کردن دستورات دو مرحله ای

کد های مربوط به این بخش را می توانید از لینک Github زیر دانلود و استفاده کنید:

https://github.com/empitrix/8bitcpu

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

دیدگاهتان را بنویسید

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