zerotwo
zerotwo
خواندن ۱ دقیقه·۴ سال پیش

فصل3 معماری کامپیوتر(RTL)

خب میریم که باهم فصل 3 رو شروع کنیم و در کنار هم یادبگیریم.

با تعریف خود کلمه RTL شروع می کنیم که مخفف register transfer language به معنی زبان انتقال ثبات هست. در واقع RTL یک زبان برای توصیف سخت افزار هست مانند VHDL و Verilog منتهی سطح بالاتر به گونه ای که با RTL نمی توان مثلا ترانزیستور را توصیف کرد.

در واقع RTL از دو بخش مهم تشکیل شده به نام بخش کنترل و بخش ریزعملیات که در آن اگر بخش کنترل فعال بود ، بخش ریزعملیات اجرا می شود:

P : R2 <- R1

مثلا در خط بالا داریم اگر P فعال بود یعنی یک بود ، R1 رو بریز داخل R2!

حالا باهم می خوایم این دستور رو سنتز کنیم.


به کاری که در تصویر بالا انجام دادیم ، عمل سنتز می گویند.

الان در شکل بالا ما اومدیم سیگنال کنترلی P را به عنوان پایه load به رجیستر R2 وصل کردیم ، بدین معنا که هرگاه سیگنال P برابر یک بود ، محتوای R1 را وارد محتوای R2 کند. هر دو رجیستر هم به لبه مثبت کلاک حساس هستند.

برای این که ممکنه خیلی ها بحث رجیستر از مدارمنطقی رو به یاد نیارن ، با هم یه دوره روی این مبحث می کنیم.

همانطور که می دانید یک رجیستر 4 بیتی از 4 flipflop تشکیل شده است ، که معمولا از Dflipflop استفاده می کنند ، که باز کردن آن چندان به این موضوع مرتبط نیست!

هر رجیستر یه سری پایه می تونه داشته باشه :

پایه clk: جهت سنکرون کردن کل اعضا.
پایه load: وقتی فعال شود data در رجیستر load می شود.
پایه clear: هنگامی که فعال شود تمام flipflop ها درون رجیستر را صفر می کند.
پایه pre: زمانی که فعال شود تمامی flipflop ها درون رجیستر یک می شوند.
پایه inc: هنگامی که فعال می شود مقدار درون رجیستر یک واحد زیاد می شود.
پایه dec: هنگامی که فعال می شود ، مقدار درون رجیستر یک واحد کم می شود.
پایه shr: هنگامی که فعال می شود مقدار درون رجیستر یک واحد شیفت راست می خورد.
پایه shl: هنگامی که فعال می شود ، مقدار درون رجیستر یک واحد شیفت به چپ می خورد.

نکته مهم در مورد پایه ها این است که اکثر پایه ها با clk سنکرون هستند یعنی اگر مقدار آن ها یک باشد اما clk در لبه منفی خود قرار داشته باشد ، آن پایه ها عمل نمی کنند . به جز پایه های pre و clear.


یک نکته دیگر در مورد رجیستر این است که ، پایه ها در حالت کلی active high هستند یعنی وقتی مقدار آن ها یک است فعال هستند و وقتی مقدار آن ها صفر هست غیر فعال هستند ، اما می توانند active low هم باشند یعنی وقتی مقدار آن ها صفر است یعنی فعال هستند و زمانی که مقدار آن ها یک است به معنای این است که غیر فعال هستند.

یک رجیستر 4 بیتی ، 4 پایه ورودی و 4 پایه خروجی دارد، زمانی که می خواهیم چیزی درون رجیستر بنویسیم ، یا تغییری بر روی آن اعمال کنیم نیاز به زدن کلاک وجود دارد ، اما مقداری که در رجیستر هست روی پایه های خروجی آن نیز وجود دارد ، بنابراین خواندن از روی رجیستر نیازی به زدن کلاک ندارد.


الان در شکل بالا هنگامی که پایه load فعال شود و کلاک در لبه مثبت خود باشد مقدار 0011 وارد رجیستر می شود و در جای 1000 قرار می گیرد، و تا زمانی که 1000 درون رجیستر قرار دارد همین مقدار روی پایه های خروجی نیز وجود دارد و در هر لحظه قابل خواندن است.

مثال: عبارت زیر را سنتز کنید.

p+q: R1<-R1+R2 , R2<-R1

یک نکته که باید بهش توجه کنید اینه که عمل + در بخش کنترلی به معنای or و در بخش ریز عملیات ها به معنای جمع ریاضی است.

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

به ریزعمل هایی که در یک کلاک باهم انجام می شوند ریز دستور یا micro instruction می گویند.

نکته مهم در این سوال این است که مثلا فرض کنید مقدار اولیه R1 و R2 به ترتیب 40 و 50 است ، هنگامی که p برابر یک می شود مقدار بعدی R1 برابر 90 یعنی جمع R1 و R2 ، و مقدار نهایی R2 برابر 40 یعنی مقدار اولیه R1 است. به این علت این اتفاق می افتد که این دو عمل به صورت موازی انجام می شوند. بعدا در این باره بیشتر توضیح میدم!

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

برای سنتز کردن مرحله اول باید datapath رو رسم کنیم و سپس بخش کنترلی رو پیاده کنیم.

برای پیاده سازی بخش datapath بالا نگاه می کنیم می بینیم دو رجیستر داریم :


در شکل بالا datapath رو کامل کردیم و حالا نوبت به بخش کنترلی میرسه که باید به datapath سیگنال بده ، و در واقع سیگنال کنترلی ما به عنوان پایه load باید به رجیستر های R1 و R2 متصل بشه تا load در این رجیستر هارو کنترل کنه.

الان ما دو سیگنال کنترلی p و q را با گیت or به هم متصل کردیم و به پایه load دو رجیستر R1 و R2 متصل کردیم.

توجه: در RTL نیازی به رسم کلاک نیست.

در شکل بالا از کجا مشخص است که هر دو ریز عملیات ها در یک کلاک انجام می شوند؟

هنگامی که سیگنال های کنترلی در لبه مثبت کلاک فعال می شوند ، در همان لبه ریزعملیات ها انجام نمی شوند!!! بلکه در لبه مثبت بعدی انجام می شوند و در فاصله این دو لبه جمع کنده فرصت این را می یابد که عمل جمع خود را انجام دهد و همچنین خواندن از رجیستر اتفاق می افتد و در کل تاخیر ها سپری می شود.


حالا باهم چند مثال دیگه رو بررسی می کنیم:

عبارت رو به رو را سنتز کنید:

p.q: R1<- R1+R , R1<-R3

این عبارت را نمی توان سنتز کرد ، زیرا دارای خطای conflict یا ناسازگاری است ، یعنی بر روی یک رجیستر نمی توان همزمان چند کار انجام داد.

عبارت زیر را سنتز کنید:

p.q: R1 <- R1+R2

p:R1 <-R2

یک نکته مهم که در رابطه با این سوال وجود دارد این است که در RTL ما ترتیب نداریم مثل زبان های دیگر ! یعنی چی ؟ یعنی دستورات به همان ترتیبی که نوشته می شوند به همان ترتیب اجرا نمی شوند . هر دستوری که سیگنال کنترلی آن فعال باشد اجرا می شود مثلا می شود دستور اول و آخر با هم اجرا شوند . پس در این سوال هم هیچ تضمینی وجود ندارد که p و q باهم یک نباشند ، زیرا اگر باهم یک باشند آنگاه ما خطای conflict داریم چون بر روی رجیستر R1 در یک زمان دو عمل دارد صورت می گیرد.

مثال: عبارت زیر را سنتز کنید:

p.q: R1<-R1+R2

p.q!: R1<-R2

در این جا خطای conflict نداریم زیرا هر دو سیگنال کنترلی نمی توانند با هم یک شوند ، پس قابل سنتز است.

طبق معمول اول datapath را می کشیم و سپس بخش کنترلی را :


حالا بیاید با هم بررسی کنیم چجوری load مربوط بهR1 را بدست آوردیم؟ خب چه زمانی بر روی R1 عملیات نوشتن انجام می شود؟ زمانی که یا p.q برابر یک شود و یاp.!q بنابراین :

p.q + p.q! = p ( q+ q!)= p. 1 = p

یعنی هرگاه p برابر یک باشد حالا چه q برابر یک باشد چه نه بر روی R1 عملیات نوشتن انجام می شود پس سیگنال کنترلی که باید به load رجیستر R1 متصل شود همان p است.

حالا باید بدانیم هرگاه بحث انتخاب وسط بود ، یعنی ما چند ورودی به یک رجیستر داشتیم و باید بین ورودی ها انتخاب کنیم نیاز به multiplexer داریم تا این انتخاب را برای ما انجام دهد ، پس به یک خط select برای mux خودمون نیاز داریم ، که آن را q می گذاریم ، زیرا هر وقت q صفر باشد باید عمل جمع اتفاق بیفتد و هروقت q برابر یک باشد باید محتوای رجیستر R2 در R1 لود شود.

به همین راحتی و خوشمزگی این مثال رو هم سنتز کردیم!

در قسمت بعدی با هم چند مثال دیگه رو سنتز می کنیم

پس فعلا ;)

rtlمعماری کامپیوترمدار منطقیکامپیوتر
می نویسم تا خودم یادبگیرم ; )
شاید از این پست‌ها خوشتان بیاید