در قسمت قبل یاد گرفتیم که چگونه می توانیم داده را در یک مدار ذخیره کنیم. مثلا چگونه یک بیت داده را در یک D-latch ذخیره کنیم. در این قسمت رجیستر های کامپیوترمان را می سازیم.
رجیستر در طراحی کامپیوتر، سریع ترین حافظه است. رجیستر باید توانایی این را داشته باشد که در یک کلاک، داده هایش را به باس منتقل کند یا از باس بخواند. از دیگر حافظه ها می توان به ترتیب سرعت به حافظه کش سیپییو، حافظه رم و حافظه دیسک سخت کامپیوتر اشاره کرد. هر چه حافظه ما بخواهد سریع تر عمل کند پیچیدگی ساخت آن بیشتر و در نتیجه گران تر است. به همین دلیل کامپیوتر های ما از حافظه های سریع تر، مقدار کم تری در اختیار دارند. مثلا کامپیوتر من در سال ۱۳۹۸، ۶ مگابایت کش، ۱۲ گیگابایت رم و یک ترابایت، حافظه دیسک سخت دارد.
در سی پی یو های واقعی که سرعت شان بسیار بالاست، حافظه های دیگر نمی توانند در یک کلاک، داده ها را به باس منتقل کنند ( مثلا کامپیوتر من که فرکانس سی پی یو اش، 2.6GHz است، رجیستر باید بتواند در کمتر از ۰.۴ نانو ثانیه این کار را انجام دهد ) و از این رو، مجبور به جدا کردن رجیستر هستیم. اما در کامپیوتر ما که محدودیت های دیگر، باعث می شود تا سرعتش بسیار کم تر باشد، نیازی به جدا کردن رجیستر نداریم و میتوانستیم از رم به عنوان رجیستر استفاده کنیم ( طبعا کمی تغییرات در قسمت های دیگر نیاز است ) اما برای سادگی در طراحی و شبیه شدن کامپیوترمان به یک کامپیوتر واقعی، این کار را نمی کنیم.
ساخت رجیستر آ و ب
رجیستر آ و ب رجیستر هایی هشت بیتی هستند که با واحد پردازش ریاضی در ارتباط هستند. برای این که دو عدد را با هم جمع بزنیم یا تفریق کنیم، باید آن ها را در رجیستر های آ و ب لود کنیم. در ادامه خصوصیات رجیستر آ و نحوه ساخت آن را بررسی می کنیم. ( رجیستر ب هم مشابه است ).
پین های BUS_0 تا BUS_7 برای خواندن و نوشتن از باس استفاده می شوند. به این صورت که اگر AO مقدارش ۱ باشد ( پین هایی که علامت بار دارند ( بالایشان خط است ) یعنی با نقیض مقدارشان کار میکنند؛ به عبارت دیگر اگر به پتانسیل کم وصل شوند، مقدارشان ۱ و اگر به پتانسیل زیاد وصل شوند مقدارشان ۰ میشود. این پین های نقیض شده به این علت هستند که پیاده سازی اصلی از قطعاتی استفاده می کند که آن ها به نقیض مقدار این پین نیاز دارند و به جای این که با یک گیت NOT این مساله را حل کنیم، در تمام قسمت های کامپیوتر با نقیض این پین ها کار می کنیم و یک گیت NOT صرفه جویی می کنیم. اگر از نرم افزار های شبیه ساز برای پیاده سازی کامپیوتر استفاده می کنید یا فقط می خواهید با آن به صورت تئوری آشنا شوید، می توانید آنها را در نظر نگیرید. اما اگر واقعا در حال پیاده سازی آن هستید برای جزییات بیشتر قطعات مورد استفاده، به فیلم ها مراجعه کنید. ) رجیستر مقدار خودش را درون باس می نویسد و اگر AI مقدارش ۱ باشد و موج ساعت در لبه بالا رونده باشد ( اگر نمی دانید لبه بالارونده ساعت چیست، قسمت اول را بخوانید ) مقدار باس درون رجیستر نوشته می شود.
فلسفه وجود ساعت در کامپیوتر، راحت کردن زمان بندی کار هاست. بدون ساعت نیز می توان یک کامپیوتر ساخت اما کار به مراتب سخت تر می شود. فرض کنید می خواهیم عدد رجیستر آ را درون رجیستر ب کپی کنیم. اگر ساعت نبود و هر موقع که AI برابر ۱ بود رجیستر مقدارش را از باس می خواند، باید ابتدا AO برابر ۱ می شد، سپس BI برابر ۱ می شد، سپس BI برابر ۰ می شد، سپس AO برابر ۰ می شد و سپس بقیه کار ها انجام می شد. اگر ترتیب این کار ها را بهم بزنیم نتیجه دلخواه را نمی گیریم. مثلا اگر AO را قبل از ۰ کردن BI، برابر ۱ کنیم، مقدار B از باسی خوانده می شود که هیچ کس چیزی در آن نمی نویسد؛ که این مطلوب ما نیست.
اما اکنون می توانیم میان دو لبه بالارونده، هم زمان ( یعنی با ترتیب دلخواه ) AO و BI را 1 کنیم و فقط منتظر ساعت باشیم تا کپی انجام شود، و در کلاک بعدی، کار دلخواهی دیگر ( مثلا کپی از B به A ) را انجام دهیم. این موضوع هنگام بررسی منطق کنترل که هنگام لبه پایین رونده ساعت، پین های کنترلی مثل همین AI یا BO را تنظیم می کند، ملموس تر می شود.
فلیپ فلاپ نیز همانند لچ، برای ذخیره داده به کار می رود، با این تفاوت که مقدار فلیپ فلاپ، در لبه بالارونده ورودی ساعتش، برابر داده ورودی می شود. برای ساخت یک فلیپ فلاپ، باید لبه بالارونده ساعت را تشخیص دهیم.
در این مدار در حالت عادی خروجی همیشه ۰ است. چون ورودی و نقیض آن به یک گیت AND وصل شده اند. اما بیایید موقع تغییر ولتاژ ورودی از زیاد به کم و از کم به زیاد، با دقت بیشتری خروجی را بررسی کنیم.
در قسمت قبل گفتیم که همه تجهیزات، حتی سیم ها مقداری تاخیر دارند. این تاخیر در گیت ها مثل گیت NOT بسیار بیشتر ( اما باز هم بسیار کم و در حد نانو ثانیه ) است. این تاخیر باعث می شود تا هنگامی که ساعت از ۱ به ۰ تغییر می کند، برای مدت کوتاهی هر دو سر سیم ۰ شوند و وقتی ساعت از ۰ به ۱ تبدیل میشود، هر دو سر سیم ۱ شوند. این اتفاق باعث می شود تا خروجی این مدار، پالس کوچکی در هنگام لبه بالارونده ساعت درست کند. اگر این پالس را با ورودی ENABLE دی-لچ اند بگیریم، یک دی-فلیپ فلاپ ساخته می شود. دی-فلیپ فلاپ، مانند دی-لچ است با این تفاوت که مقدار آن، فقط وقتی تغییر می کند که ساعت در لبه بالارونده باشد و مقدار ENABLE آن یک باشد.
با گذاشتن هشت فلیپ فلاپ در کنار هم می توانیم یک رجیستر بسازیم.
در طرح بالا، قطعه های U8 و U9 را می توانید معادل 4 عدد D-flip flop در نظر بگیرید و U7 قطعه ایست که کنترل می کند تا خروجی در باس نوشته شود یا خیر. این قطعه را در قسمت بررسی باس بیشتر بررسی خواهیم کرد. از طریق قسمت پایین، مقدار ذخیره شده در رجیستر به قسمت پردازش ریاضی منتقل می شود. ال ای دی ها نیز برای تست و اشکال زدایی کامپیوتر هست و اجباری در گذاشتن آن ها نیست.
با ساخت رجیستر به صورت کلی آشنا شدیم و رجیستر های آ و ب را بررسی کردیم. رجیستر دستورالعمل نیز مشابه همین رجیستر هاست اما از آن صرفا برای انقال دستورالعمل به منطق کنترل استفاده می کنیم. رجیستر آدرس حافظه یک رجیستر ۴ بیتی است ( بقیه رجیستر ها ۸ بیتی بودند ) که از آن برای تعیین آدرس در حال استفاده رم استفاده می کنیم. رجیستر آدرس مکانیزمی برای تعیین دستی نیز دارد، که از آن برای تغییر مقدار های رم به صورت دستی برای ذخیره کردن برنامه روی رم استفاده می کنیم.
در قسمت بعد واحد پردازش ریاضی را می سازیم و رجیستر های آ و ب را به آن وصل می کنیم. پس این سری را دنبال کنید.